工作台
2
.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
/unpackage
|
||||
/node_modules
|
||||
20
.hbuilderx/launch.json
Normal file
@@ -0,0 +1,20 @@
|
||||
{
|
||||
// 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" : [
|
||||
{
|
||||
"app-plus" : {
|
||||
"launchtype" : "local"
|
||||
},
|
||||
"default" : {
|
||||
"launchtype" : "local"
|
||||
},
|
||||
"type" : "uniCloud"
|
||||
},
|
||||
{
|
||||
"playground" : "standard",
|
||||
"type" : "uni-app:app-android"
|
||||
}
|
||||
]
|
||||
}
|
||||
13
App.vue
Normal file
@@ -0,0 +1,13 @@
|
||||
<script></script>
|
||||
|
||||
<style lang="scss">
|
||||
@import "uview-ui/index.scss";
|
||||
@import "@/static/iconfont.css";
|
||||
|
||||
.content{
|
||||
background: #f8f8f8;
|
||||
min-height: 100vh;
|
||||
padding: 0 0 1rpx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
</style>
|
||||
169
apis/index.js
Normal file
@@ -0,0 +1,169 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
*/
|
||||
|
||||
import store from '@/store'
|
||||
import router from '../router'
|
||||
|
||||
// 基础配置
|
||||
const config = {
|
||||
apiUrl : 'http://douhuo.douhuofalv.com/api/',
|
||||
timeout : 60000
|
||||
}
|
||||
|
||||
let loginHintState = false
|
||||
|
||||
// 网络请求
|
||||
const request = (parameter, hideLoding = true) => {
|
||||
// 检查url配置
|
||||
if(parameter.url === 'undefined' || parameter.url === ''){
|
||||
uni.showToast({
|
||||
title: '请求地址不能为空',
|
||||
icon : 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
// 注入header
|
||||
config.header = {
|
||||
'Accept': 'application/json',
|
||||
'Authorization': store.getters.getToken || uni.getStorageSync('token')
|
||||
}
|
||||
// 加载提示
|
||||
if(!hideLoding) uni.showLoading({
|
||||
title: '加载中',
|
||||
mask : true
|
||||
});
|
||||
|
||||
// 请求实例
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.request({
|
||||
url : config.apiUrl + parameter.url,
|
||||
timeout : config.timeout,
|
||||
header : config.header || {},
|
||||
data : parameter.data || {},
|
||||
method : parameter.method || 'GET',
|
||||
success : res => {
|
||||
if (res.header.Authorization){
|
||||
updateToken('token', res.header.Authorization)
|
||||
}
|
||||
if(res.statusCode === 200){
|
||||
uni.hideLoading()
|
||||
const resolveData = res.data
|
||||
if(resolveData.status_code === 200) {
|
||||
resolve(resolveData.data)
|
||||
return
|
||||
}
|
||||
if(resolveData.status_code === 401) {
|
||||
loginHint()
|
||||
return
|
||||
}
|
||||
reject(resolveData)
|
||||
return
|
||||
}
|
||||
errToast(res.statusCode)
|
||||
},
|
||||
fail(err) {
|
||||
uni.showToast({
|
||||
title: '网络错误,请检查您设备网络状态',
|
||||
icon : 'none'
|
||||
})
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 文件上传
|
||||
const uploading = (paths, formData, url) => {
|
||||
uni.showLoading({
|
||||
title: '上传中',
|
||||
mask : true
|
||||
});
|
||||
// 注入header
|
||||
config.header = {
|
||||
'Accept': 'application/json',
|
||||
'Authorization': store.getters.getToken || ''
|
||||
}
|
||||
// 上传图片
|
||||
return new Promise((resolve, reject) => {
|
||||
uni.uploadFile({
|
||||
url : config.apiUrl + (url || 'storage/uploads'),
|
||||
files : paths,
|
||||
header : config.header || {},
|
||||
formData: formData || {},
|
||||
success : res=>{
|
||||
if(res.statusCode === 200){
|
||||
uni.hideLoading()
|
||||
let updData = JSON.parse(res.data)
|
||||
if(updData.status_code === 200){
|
||||
resolve(updData.data)
|
||||
return
|
||||
}
|
||||
reject(updData)
|
||||
return
|
||||
}
|
||||
errToast(res.statusCode)
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
// 处理一些http请求错误提示
|
||||
const errToast = (code) => {
|
||||
switch (code){
|
||||
case 404:
|
||||
uni.showToast({
|
||||
title: code + '接口不存在,请联系系统管理员',
|
||||
icon : 'none'
|
||||
})
|
||||
break;
|
||||
case 405:
|
||||
uni.showToast({
|
||||
title: code + '请检查接口请求方式错误',
|
||||
icon : 'none'
|
||||
})
|
||||
break;
|
||||
case 500:
|
||||
uni.showToast({
|
||||
title: code + '服务端错误,请检查服务器信息',
|
||||
icon : 'none'
|
||||
})
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 更新token
|
||||
const updateToken = (token) => {
|
||||
store.commit('setToken', token)
|
||||
// 清除退出登录标识
|
||||
uni.removeStorageSync('isnew')
|
||||
}
|
||||
|
||||
// 处理登录提示
|
||||
const loginHint = () => {
|
||||
if( loginHintState ) return
|
||||
if(!loginHintState) loginHintState = true
|
||||
updateToken('')
|
||||
uni.showModal({
|
||||
title: '登录提示',
|
||||
content: '您的登录信息已过期,请重新登录',
|
||||
confirmColor: '#8b64fd',
|
||||
showCancel:false,
|
||||
success: res=> {
|
||||
loginHintState = false
|
||||
if (res.confirm) {
|
||||
uni.reLaunch({
|
||||
url:'/pages/auth/auth'
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
request,
|
||||
uploading,
|
||||
config
|
||||
}
|
||||
49
apis/interfaces/account.js
Normal file
@@ -0,0 +1,49 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 账户
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 火力值账户
|
||||
const score = (data) =>{
|
||||
return request({
|
||||
url : "user/account/score",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 活力值变动
|
||||
const log = data => {
|
||||
return request({
|
||||
url : "user/account/score",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 业绩账户
|
||||
const cash = data => {
|
||||
return request({
|
||||
url: "perf/lists",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 奖金账户
|
||||
const balance = data => {
|
||||
return request({
|
||||
url: "user/account/balance",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
score,
|
||||
log,
|
||||
cash,
|
||||
balance
|
||||
}
|
||||
|
||||
21
apis/interfaces/address.js
Normal file
@@ -0,0 +1,21 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 地址信息
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 城市列表
|
||||
const region = data => {
|
||||
return request({
|
||||
url : 'region/all',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
region
|
||||
}
|
||||
61
apis/interfaces/auth.js
Normal file
@@ -0,0 +1,61 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 鉴权
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 用户名密码登录
|
||||
const auth = (data) =>{
|
||||
return request({
|
||||
url : "user/auth/login",
|
||||
method : "POST",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 用户注册
|
||||
const register = data => {
|
||||
return request({
|
||||
url : "user/auth/register",
|
||||
method : "POST",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 图形验证码
|
||||
const captcha = () => {
|
||||
return request({
|
||||
url : "user/auth/captcha",
|
||||
method : "POST"
|
||||
})
|
||||
}
|
||||
|
||||
// 获取短信验证码
|
||||
const verifyCaptcha = data => {
|
||||
return request({
|
||||
url : "user/auth/verify_captcha",
|
||||
method : "POST",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 重置密码
|
||||
const resetPassword = data => {
|
||||
return request({
|
||||
url : "user/auth/reset_password",
|
||||
method : "POST",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
auth,
|
||||
register,
|
||||
captcha,
|
||||
verifyCaptcha,
|
||||
resetPassword
|
||||
}
|
||||
67
apis/interfaces/business.js
Normal file
@@ -0,0 +1,67 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 业务
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 主业务类型
|
||||
const business = () =>{
|
||||
return request({
|
||||
url: "business/index",
|
||||
})
|
||||
}
|
||||
|
||||
// 获取主业务机构
|
||||
const institution = id =>{
|
||||
return request({
|
||||
url: "business/" + id + "/institution",
|
||||
})
|
||||
}
|
||||
|
||||
// 获取机构表单数据
|
||||
const institutionType = id => {
|
||||
return request({
|
||||
url: "business/institution/" + id + "/type",
|
||||
})
|
||||
}
|
||||
|
||||
// 搜索办理业务用户
|
||||
const availableUser = (type, value) => {
|
||||
if(type === 'mobile'){
|
||||
return request({
|
||||
url : "user/relations/child_by_mobile",
|
||||
data: {
|
||||
mobile: value
|
||||
}
|
||||
})
|
||||
}
|
||||
if(type === 'name'){
|
||||
return request({
|
||||
url : "user/relations/child_by_name",
|
||||
data: {
|
||||
name: value
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// 提交用户办理信息
|
||||
const submitStore = data => {
|
||||
return request({
|
||||
url : "business/store",
|
||||
method : "POST",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
business,
|
||||
institution,
|
||||
institutionType,
|
||||
availableUser,
|
||||
submitStore
|
||||
}
|
||||
47
apis/interfaces/college.js
Normal file
@@ -0,0 +1,47 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 商学院
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 考试评测列表
|
||||
const evaluations = () => {
|
||||
return request({
|
||||
url : "evaluations",
|
||||
})
|
||||
}
|
||||
|
||||
// 考试题列表
|
||||
const questions = id => {
|
||||
return request({
|
||||
url : "evaluations/" + id + "/questions",
|
||||
})
|
||||
}
|
||||
|
||||
// 提交答案
|
||||
const answers = (id, data) => {
|
||||
return request({
|
||||
url : "evaluations/" + id + "/answers",
|
||||
method : "POST",
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 考试答案解析
|
||||
const report = id => {
|
||||
return request({
|
||||
url : "evaluations/" + id + "/report"
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
evaluations,
|
||||
questions,
|
||||
answers,
|
||||
report
|
||||
}
|
||||
|
||||
38
apis/interfaces/mailed.js
Normal file
@@ -0,0 +1,38 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 邮寄材料
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 获取物流公司列表
|
||||
const express = () => {
|
||||
return request({
|
||||
url : 'express',
|
||||
})
|
||||
}
|
||||
|
||||
// 获取订单邮寄地址
|
||||
const orderAddress = id => {
|
||||
return request({
|
||||
url : 'business/' + id + '/address'
|
||||
})
|
||||
}
|
||||
|
||||
// 提交邮寄物品
|
||||
const submitExpresses = (id, data) => {
|
||||
return request({
|
||||
url : 'business/' + id + '/expresses',
|
||||
method : 'POST',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
express,
|
||||
orderAddress,
|
||||
submitExpresses
|
||||
}
|
||||
155
apis/interfaces/order.js
Normal file
@@ -0,0 +1,155 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 订单管理
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 订单列表
|
||||
const lists = data => {
|
||||
return request({
|
||||
url : 'app/orders',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 配置服务包
|
||||
const service = orderId => {
|
||||
return request({
|
||||
url : 'business/' + orderId + '/service',
|
||||
method : 'POST'
|
||||
})
|
||||
}
|
||||
|
||||
// 添加服务包
|
||||
const serviceAdd = (orderId, items) => {
|
||||
return request({
|
||||
url : 'business/' + orderId + '/service/calculate',
|
||||
method : 'POST',
|
||||
data : {
|
||||
items
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 删除服务包
|
||||
const serviceRemove = (id, data) => {
|
||||
return request({
|
||||
url : 'business/' + id + '/service/remove',
|
||||
method : 'POST',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 完成分配
|
||||
const serviceOver = orderId => {
|
||||
return request({
|
||||
url : 'business/' + orderId + '/service/over',
|
||||
method : 'POST',
|
||||
})
|
||||
}
|
||||
|
||||
// 订单详情
|
||||
const info = orderId => {
|
||||
return request({
|
||||
url : 'app/orders/' + orderId
|
||||
})
|
||||
}
|
||||
|
||||
// 订单资料完善情况
|
||||
const perfect = orderId => {
|
||||
return request({
|
||||
url : 'app/orders/' + orderId + '/data',
|
||||
})
|
||||
}
|
||||
|
||||
// 订单基础资料信息
|
||||
const perfectBase = orderId => {
|
||||
return request({
|
||||
url : 'business/' + orderId + '/user/base'
|
||||
})
|
||||
}
|
||||
|
||||
// 提交基础资料信息
|
||||
const updPerfectBase = (orderId, data) => {
|
||||
return request({
|
||||
url : 'business/' + orderId + '/user/base',
|
||||
method : 'POST',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 订单机构资料
|
||||
const baseBase = baseId => {
|
||||
return request({
|
||||
url : 'business/' + baseId + '/user/bank'
|
||||
})
|
||||
}
|
||||
|
||||
// 更新机构资料
|
||||
const updBaseBase = (baseId, data) => {
|
||||
return request({
|
||||
url : 'business/' + baseId + '/user/bank',
|
||||
method : 'POST',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 待补差价订单
|
||||
const ordersDiffs = data => {
|
||||
return request({
|
||||
url : 'app/orders/diffs'
|
||||
})
|
||||
}
|
||||
|
||||
// 待修改订单
|
||||
const ordersEditorders = data => {
|
||||
return request({
|
||||
url : 'app/orders/editorders'
|
||||
})
|
||||
}
|
||||
|
||||
// 个人订单签约
|
||||
const orderSign = (id, data) => {
|
||||
return request({
|
||||
url : 'business/' + id + '/sign_url',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 查询订单签约状态
|
||||
const getOrderSignStatus = id => {
|
||||
return request({
|
||||
url: 'business/' + id + '/sign_status'
|
||||
})
|
||||
}
|
||||
|
||||
// 机构预估方案
|
||||
const getSchemes = id => {
|
||||
return request({
|
||||
url: 'business/' + id + '/item_scheme'
|
||||
})
|
||||
}
|
||||
|
||||
// 支付订单
|
||||
export {
|
||||
lists,
|
||||
service,
|
||||
serviceAdd,
|
||||
serviceRemove,
|
||||
serviceOver,
|
||||
info,
|
||||
perfect,
|
||||
perfectBase,
|
||||
updPerfectBase,
|
||||
baseBase,
|
||||
updBaseBase,
|
||||
ordersDiffs,
|
||||
ordersEditorders,
|
||||
orderSign,
|
||||
getOrderSignStatus,
|
||||
getSchemes
|
||||
}
|
||||
28
apis/interfaces/pay.js
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 收银台
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 抖火币支付
|
||||
const coinPay = orderId => {
|
||||
return request({
|
||||
url : 'pay/order/' + orderId + '/score',
|
||||
})
|
||||
}
|
||||
|
||||
// 抖火币补差价支付
|
||||
const diffCoinPay = orderId => {
|
||||
return request({
|
||||
url : 'pay/diff/' + orderId + '/score'
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
coinPay,
|
||||
diffCoinPay
|
||||
}
|
||||
59
apis/interfaces/transfers.js
Normal file
@@ -0,0 +1,59 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 转让订单管理
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 订单列表
|
||||
const lists = data => {
|
||||
return request({
|
||||
url : 'app/transfers',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 可转让对象
|
||||
const levels = id => {
|
||||
return request({
|
||||
url: 'app/transfer/' + id + '/levels',
|
||||
})
|
||||
}
|
||||
|
||||
// 转让
|
||||
const transfer = (id, level) => {
|
||||
return request({
|
||||
url : 'app/' + id + '/transfer',
|
||||
data: {
|
||||
level
|
||||
},
|
||||
method: 'POST'
|
||||
})
|
||||
}
|
||||
|
||||
// 接收订单
|
||||
const transferAgree = id => {
|
||||
return request({
|
||||
url : 'app/' + id + '/agree',
|
||||
method: 'POST'
|
||||
})
|
||||
}
|
||||
|
||||
// 拒绝接收
|
||||
const transferRefuse = id => {
|
||||
return request({
|
||||
url : 'app/' + id + '/refuse',
|
||||
method: 'POST'
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
lists,
|
||||
levels,
|
||||
transfer,
|
||||
transferAgree,
|
||||
transferRefuse
|
||||
}
|
||||
17
apis/interfaces/uploading.js
Normal file
@@ -0,0 +1,17 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 上传图片
|
||||
*/
|
||||
|
||||
import { uploading as upd } from '../index'
|
||||
|
||||
const uploads = (paths, fromData) => {
|
||||
return upd(paths, fromData)
|
||||
}
|
||||
|
||||
export {
|
||||
uploads
|
||||
}
|
||||
84
apis/interfaces/user.js
Normal file
@@ -0,0 +1,84 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 用户
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 我的下级用户
|
||||
const relations = data => {
|
||||
return request({
|
||||
url : 'user/relations',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 我的邀请码
|
||||
const code = () => {
|
||||
return request({
|
||||
url : 'user/invite',
|
||||
})
|
||||
}
|
||||
|
||||
// 用户信息
|
||||
const info = () => {
|
||||
return request({
|
||||
url : 'app/user/info'
|
||||
})
|
||||
}
|
||||
|
||||
// 更新用户资料
|
||||
const updInfo = (key, value) => {
|
||||
return request({
|
||||
url : 'user/setting/' + key,
|
||||
method : 'PUT',
|
||||
data : {
|
||||
value
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
// 用户认证状态
|
||||
const certified = () => {
|
||||
return request({
|
||||
url : 'user/certified'
|
||||
})
|
||||
}
|
||||
|
||||
// 用户认证
|
||||
const certification = data => {
|
||||
return request({
|
||||
url : 'user/certification',
|
||||
method : 'POST',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// 获取身份证认证信息
|
||||
const identityOcr = () => {
|
||||
return request({
|
||||
url : 'user/certification'
|
||||
})
|
||||
}
|
||||
|
||||
// 获取签名地址
|
||||
const eSigns = data => {
|
||||
return request({
|
||||
url : 'e-signs/authorize/psn',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
relations,
|
||||
code,
|
||||
info,
|
||||
updInfo,
|
||||
certified,
|
||||
certification,
|
||||
identityOcr,
|
||||
eSigns
|
||||
}
|
||||
28
apis/interfaces/work.js
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
* moduleName: 工作台
|
||||
*/
|
||||
|
||||
import { request } from '../index'
|
||||
|
||||
// 工作台首页
|
||||
const index = () => {
|
||||
return request({
|
||||
url : 'app/user',
|
||||
})
|
||||
}
|
||||
|
||||
// 会员权益
|
||||
const rights = () => {
|
||||
return request({
|
||||
url : 'app/rights'
|
||||
})
|
||||
}
|
||||
|
||||
export {
|
||||
index,
|
||||
rights
|
||||
}
|
||||
20
components/oct-checkbox.vue
Normal file
@@ -0,0 +1,20 @@
|
||||
<template>
|
||||
<view>
|
||||
选择组件
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name:"octcheckbox",
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
32
components/oct-input.vue
Normal file
@@ -0,0 +1,32 @@
|
||||
<template>
|
||||
<view>
|
||||
<input type="text" placeholder="输入框" @blur="blurInput">
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name:"octinput",
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
},
|
||||
props: {
|
||||
InputKey: {
|
||||
type: String,
|
||||
default: ''
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 触发信息给父组件
|
||||
blurInput(e){
|
||||
this.$emit('onValue', e.detail.value)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
38
components/oct-picker.vue
Normal file
@@ -0,0 +1,38 @@
|
||||
<template>
|
||||
<view>
|
||||
<picker mode="selector" :range="range" range-key="title">
|
||||
<view class=""></view>
|
||||
</picker>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
},
|
||||
props: {
|
||||
range: {
|
||||
type : Array,
|
||||
default : () => {
|
||||
return []
|
||||
}
|
||||
},
|
||||
id: {
|
||||
type : Number,
|
||||
default : ''
|
||||
}
|
||||
},
|
||||
watch(){
|
||||
id: (val, old) => {
|
||||
console.log(val, old)
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
20
components/oct-radio.vue
Normal file
@@ -0,0 +1,20 @@
|
||||
<template>
|
||||
<view>
|
||||
单选组件
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name:"octradio",
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
20
components/oct-textarea.vue
Normal file
@@ -0,0 +1,20 @@
|
||||
<template>
|
||||
<view>
|
||||
文本域组件
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name:"octtextarea",
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
22
main.js
Normal file
@@ -0,0 +1,22 @@
|
||||
import App from './App'
|
||||
|
||||
import Vue from 'vue'
|
||||
import uView from "uview-ui";
|
||||
|
||||
import store from './store'
|
||||
import { router, RouterMount } from 'router'
|
||||
import Mylink from './node_modules/uni-simple-router/dist/link.vue'
|
||||
|
||||
Vue.component('my-link',Mylink)
|
||||
|
||||
Vue.use(uView)
|
||||
Vue.use(router)
|
||||
|
||||
Vue.config.productionTip = false
|
||||
App.mpType = 'app'
|
||||
const app = new Vue({
|
||||
store,
|
||||
...App
|
||||
})
|
||||
|
||||
app.$mount()
|
||||
117
manifest.json
Normal file
@@ -0,0 +1,117 @@
|
||||
{
|
||||
"name" : "抖火",
|
||||
"appid" : "__UNI__C305C03",
|
||||
"description" : "",
|
||||
"versionName" : "1.0.3",
|
||||
"versionCode" : "100",
|
||||
"transformPx" : false,
|
||||
/* 5+App特有相关 */
|
||||
"app-plus" : {
|
||||
"usingComponents" : true,
|
||||
"nvueStyleCompiler" : "uni-app",
|
||||
"compilerVersion" : 3,
|
||||
"splashscreen" : {
|
||||
"alwaysShowBeforeRender" : true,
|
||||
"waiting" : true,
|
||||
"autoclose" : true,
|
||||
"delay" : 0
|
||||
},
|
||||
"safearea" : {
|
||||
"bottom" : {
|
||||
"offset" : "none"
|
||||
}
|
||||
},
|
||||
/* 模块配置 */
|
||||
"modules" : {
|
||||
"Barcode" : {},
|
||||
"Camera" : {}
|
||||
},
|
||||
/* 应用发布信息 */
|
||||
"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\"/>"
|
||||
],
|
||||
"schemes" : "doufire"
|
||||
},
|
||||
/* ios打包配置 */
|
||||
"ios" : {
|
||||
"dSYMs" : false
|
||||
},
|
||||
/* SDK配置 */
|
||||
"sdkConfigs" : {
|
||||
"ad" : {}
|
||||
},
|
||||
"icons" : {
|
||||
"android" : {
|
||||
"hdpi" : "unpackage/res/icons/72x72.png",
|
||||
"xhdpi" : "unpackage/res/icons/96x96.png",
|
||||
"xxhdpi" : "unpackage/res/icons/144x144.png",
|
||||
"xxxhdpi" : "unpackage/res/icons/192x192.png"
|
||||
},
|
||||
"ios" : {
|
||||
"appstore" : "unpackage/res/icons/1024x1024.png",
|
||||
"ipad" : {
|
||||
"app" : "unpackage/res/icons/76x76.png",
|
||||
"app@2x" : "unpackage/res/icons/152x152.png",
|
||||
"notification" : "unpackage/res/icons/20x20.png",
|
||||
"notification@2x" : "unpackage/res/icons/40x40.png",
|
||||
"proapp@2x" : "unpackage/res/icons/167x167.png",
|
||||
"settings" : "unpackage/res/icons/29x29.png",
|
||||
"settings@2x" : "unpackage/res/icons/58x58.png",
|
||||
"spotlight" : "unpackage/res/icons/40x40.png",
|
||||
"spotlight@2x" : "unpackage/res/icons/80x80.png"
|
||||
},
|
||||
"iphone" : {
|
||||
"app@2x" : "unpackage/res/icons/120x120.png",
|
||||
"app@3x" : "unpackage/res/icons/180x180.png",
|
||||
"notification@2x" : "unpackage/res/icons/40x40.png",
|
||||
"notification@3x" : "unpackage/res/icons/60x60.png",
|
||||
"settings@2x" : "unpackage/res/icons/58x58.png",
|
||||
"settings@3x" : "unpackage/res/icons/87x87.png",
|
||||
"spotlight@2x" : "unpackage/res/icons/80x80.png",
|
||||
"spotlight@3x" : "unpackage/res/icons/120x120.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
/* 快应用特有相关 */
|
||||
"quickapp" : {},
|
||||
/* 小程序特有相关 */
|
||||
"mp-weixin" : {
|
||||
"appid" : "",
|
||||
"setting" : {
|
||||
"urlCheck" : false
|
||||
},
|
||||
"usingComponents" : true
|
||||
},
|
||||
"mp-alipay" : {
|
||||
"usingComponents" : true
|
||||
},
|
||||
"mp-baidu" : {
|
||||
"usingComponents" : true
|
||||
},
|
||||
"mp-toutiao" : {
|
||||
"usingComponents" : true
|
||||
},
|
||||
"uniStatistics" : {
|
||||
"enable" : false
|
||||
},
|
||||
"vueVersion" : "2"
|
||||
}
|
||||
568
package-lock.json
generated
Normal file
@@ -0,0 +1,568 @@
|
||||
{
|
||||
"name": "dou_fire",
|
||||
"version": "1.0.0",
|
||||
"lockfileVersion": 2,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "dou_fire",
|
||||
"version": "1.0.0",
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"uni-read-pages": "^1.0.5",
|
||||
"uni-simple-router": "^2.0.7",
|
||||
"uview-ui": "^2.0.31",
|
||||
"vue-canvas-poster": "^1.2.1",
|
||||
"vuex": "^4.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/@babel/parser": {
|
||||
"version": "7.20.5",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz",
|
||||
"integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA==",
|
||||
"bin": {
|
||||
"parser": "bin/babel-parser.js"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=6.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-core": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
|
||||
"integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.16.4",
|
||||
"@vue/shared": "3.2.45",
|
||||
"estree-walker": "^2.0.2",
|
||||
"source-map": "^0.6.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-dom": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
|
||||
"integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-core": "3.2.45",
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-sfc": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
|
||||
"integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.16.4",
|
||||
"@vue/compiler-core": "3.2.45",
|
||||
"@vue/compiler-dom": "3.2.45",
|
||||
"@vue/compiler-ssr": "3.2.45",
|
||||
"@vue/reactivity-transform": "3.2.45",
|
||||
"@vue/shared": "3.2.45",
|
||||
"estree-walker": "^2.0.2",
|
||||
"magic-string": "^0.25.7",
|
||||
"postcss": "^8.1.10",
|
||||
"source-map": "^0.6.1"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/compiler-ssr": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
|
||||
"integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-dom": "3.2.45",
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/devtools-api": {
|
||||
"version": "6.4.5",
|
||||
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz",
|
||||
"integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ=="
|
||||
},
|
||||
"node_modules/@vue/reactivity": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz",
|
||||
"integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/reactivity-transform": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
|
||||
"integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.16.4",
|
||||
"@vue/compiler-core": "3.2.45",
|
||||
"@vue/shared": "3.2.45",
|
||||
"estree-walker": "^2.0.2",
|
||||
"magic-string": "^0.25.7"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/runtime-core": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz",
|
||||
"integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/reactivity": "3.2.45",
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/runtime-dom": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz",
|
||||
"integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/runtime-core": "3.2.45",
|
||||
"@vue/shared": "3.2.45",
|
||||
"csstype": "^2.6.8"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/server-renderer": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz",
|
||||
"integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-ssr": "3.2.45",
|
||||
"@vue/shared": "3.2.45"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": "3.2.45"
|
||||
}
|
||||
},
|
||||
"node_modules/@vue/shared": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
|
||||
"integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/core-js": {
|
||||
"version": "2.6.12",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
|
||||
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
|
||||
"deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
|
||||
"hasInstallScript": true
|
||||
},
|
||||
"node_modules/csstype": {
|
||||
"version": "2.6.21",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
|
||||
"integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/estree-walker": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
|
||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/magic-string": {
|
||||
"version": "0.25.9",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
|
||||
"integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"sourcemap-codec": "^1.4.8"
|
||||
}
|
||||
},
|
||||
"node_modules/nanoid": {
|
||||
"version": "3.3.4",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
|
||||
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==",
|
||||
"bin": {
|
||||
"nanoid": "bin/nanoid.cjs"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/picocolors": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
|
||||
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
|
||||
},
|
||||
"node_modules/postcss": {
|
||||
"version": "8.4.20",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
|
||||
"integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/postcss/"
|
||||
},
|
||||
{
|
||||
"type": "tidelift",
|
||||
"url": "https://tidelift.com/funding/github/npm/postcss"
|
||||
}
|
||||
],
|
||||
"dependencies": {
|
||||
"nanoid": "^3.3.4",
|
||||
"picocolors": "^1.0.0",
|
||||
"source-map-js": "^1.0.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": "^10 || ^12 || >=14"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/source-map-js": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
|
||||
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
|
||||
"engines": {
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/sourcemap-codec": {
|
||||
"version": "1.4.8",
|
||||
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
|
||||
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
|
||||
"deprecated": "Please use @jridgewell/sourcemap-codec instead",
|
||||
"peer": true
|
||||
},
|
||||
"node_modules/uni-read-pages": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/uni-read-pages/-/uni-read-pages-1.0.5.tgz",
|
||||
"integrity": "sha512-GkrrZ0LX0vn9R5k6RKEi0Ez3Q3e2vUpjXQ8Z6/K/d28KudI9ajqgt8WEjQFlG5EPm1K6uTArN8LlqmZTEixDUA==",
|
||||
"hasInstallScript": true
|
||||
},
|
||||
"node_modules/uni-simple-router": {
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/uni-simple-router/-/uni-simple-router-2.0.7.tgz",
|
||||
"integrity": "sha512-8FKv5dw7Eoonm0gkO8udprrxzin0fNUI0+AvIphFkFRH5ZmP5ZWJ2pvnWzb2NiiqQSECTSU5VSB7HhvOSwD5eA=="
|
||||
},
|
||||
"node_modules/uview-ui": {
|
||||
"version": "2.0.31",
|
||||
"resolved": "https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.31.tgz",
|
||||
"integrity": "sha512-I/0fGuvtiKHH/mBb864SGYk+SJ7WaF32tsBgYgeBOsxlUp+Th+Ac2tgz2cTvsQJl6eZYWsKZ3ixiSXCAcxZ8Sw==",
|
||||
"engines": {
|
||||
"HBuilderX": "^3.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/vue": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz",
|
||||
"integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==",
|
||||
"peer": true,
|
||||
"dependencies": {
|
||||
"@vue/compiler-dom": "3.2.45",
|
||||
"@vue/compiler-sfc": "3.2.45",
|
||||
"@vue/runtime-dom": "3.2.45",
|
||||
"@vue/server-renderer": "3.2.45",
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"node_modules/vue-canvas-poster": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/vue-canvas-poster/-/vue-canvas-poster-1.2.1.tgz",
|
||||
"integrity": "sha512-YY5ygbeQSqhiJyj6QXYgSRZ6Ywhvi1gVsfcvBIoCx4Yq9E/gAV32uOhnZz45qsklP86uGc9ypKJAXiX6Dzrdxw==",
|
||||
"dependencies": {
|
||||
"core-js": "^2.6.5",
|
||||
"vue": "^2.6.10"
|
||||
}
|
||||
},
|
||||
"node_modules/vue-canvas-poster/node_modules/@vue/compiler-sfc": {
|
||||
"version": "2.7.14",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz",
|
||||
"integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==",
|
||||
"dependencies": {
|
||||
"@babel/parser": "^7.18.4",
|
||||
"postcss": "^8.4.14",
|
||||
"source-map": "^0.6.1"
|
||||
}
|
||||
},
|
||||
"node_modules/vue-canvas-poster/node_modules/csstype": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
|
||||
"integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
|
||||
},
|
||||
"node_modules/vue-canvas-poster/node_modules/vue": {
|
||||
"version": "2.7.14",
|
||||
"resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz",
|
||||
"integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==",
|
||||
"dependencies": {
|
||||
"@vue/compiler-sfc": "2.7.14",
|
||||
"csstype": "^3.1.0"
|
||||
}
|
||||
},
|
||||
"node_modules/vuex": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz",
|
||||
"integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
|
||||
"dependencies": {
|
||||
"@vue/devtools-api": "^6.0.0-beta.11"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"vue": "^3.2.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@babel/parser": {
|
||||
"version": "7.20.5",
|
||||
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.20.5.tgz",
|
||||
"integrity": "sha512-r27t/cy/m9uKLXQNWWebeCUHgnAZq0CpG1OwKRxzJMP1vpSU4bSIK2hq+/cp0bQxetkXx38n09rNu8jVkcK/zA=="
|
||||
},
|
||||
"@vue/compiler-core": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.2.45.tgz",
|
||||
"integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@babel/parser": "^7.16.4",
|
||||
"@vue/shared": "3.2.45",
|
||||
"estree-walker": "^2.0.2",
|
||||
"source-map": "^0.6.1"
|
||||
}
|
||||
},
|
||||
"@vue/compiler-dom": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz",
|
||||
"integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@vue/compiler-core": "3.2.45",
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"@vue/compiler-sfc": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz",
|
||||
"integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@babel/parser": "^7.16.4",
|
||||
"@vue/compiler-core": "3.2.45",
|
||||
"@vue/compiler-dom": "3.2.45",
|
||||
"@vue/compiler-ssr": "3.2.45",
|
||||
"@vue/reactivity-transform": "3.2.45",
|
||||
"@vue/shared": "3.2.45",
|
||||
"estree-walker": "^2.0.2",
|
||||
"magic-string": "^0.25.7",
|
||||
"postcss": "^8.1.10",
|
||||
"source-map": "^0.6.1"
|
||||
}
|
||||
},
|
||||
"@vue/compiler-ssr": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz",
|
||||
"integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@vue/compiler-dom": "3.2.45",
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"@vue/devtools-api": {
|
||||
"version": "6.4.5",
|
||||
"resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.4.5.tgz",
|
||||
"integrity": "sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ=="
|
||||
},
|
||||
"@vue/reactivity": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.2.45.tgz",
|
||||
"integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"@vue/reactivity-transform": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz",
|
||||
"integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@babel/parser": "^7.16.4",
|
||||
"@vue/compiler-core": "3.2.45",
|
||||
"@vue/shared": "3.2.45",
|
||||
"estree-walker": "^2.0.2",
|
||||
"magic-string": "^0.25.7"
|
||||
}
|
||||
},
|
||||
"@vue/runtime-core": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.2.45.tgz",
|
||||
"integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@vue/reactivity": "3.2.45",
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"@vue/runtime-dom": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz",
|
||||
"integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@vue/runtime-core": "3.2.45",
|
||||
"@vue/shared": "3.2.45",
|
||||
"csstype": "^2.6.8"
|
||||
}
|
||||
},
|
||||
"@vue/server-renderer": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.2.45.tgz",
|
||||
"integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@vue/compiler-ssr": "3.2.45",
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"@vue/shared": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.2.45.tgz",
|
||||
"integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==",
|
||||
"peer": true
|
||||
},
|
||||
"core-js": {
|
||||
"version": "2.6.12",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
|
||||
"integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ=="
|
||||
},
|
||||
"csstype": {
|
||||
"version": "2.6.21",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-2.6.21.tgz",
|
||||
"integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==",
|
||||
"peer": true
|
||||
},
|
||||
"estree-walker": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
|
||||
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
|
||||
"peer": true
|
||||
},
|
||||
"magic-string": {
|
||||
"version": "0.25.9",
|
||||
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.9.tgz",
|
||||
"integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"sourcemap-codec": "^1.4.8"
|
||||
}
|
||||
},
|
||||
"nanoid": {
|
||||
"version": "3.3.4",
|
||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz",
|
||||
"integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw=="
|
||||
},
|
||||
"picocolors": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz",
|
||||
"integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ=="
|
||||
},
|
||||
"postcss": {
|
||||
"version": "8.4.20",
|
||||
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz",
|
||||
"integrity": "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g==",
|
||||
"requires": {
|
||||
"nanoid": "^3.3.4",
|
||||
"picocolors": "^1.0.0",
|
||||
"source-map-js": "^1.0.2"
|
||||
}
|
||||
},
|
||||
"source-map": {
|
||||
"version": "0.6.1",
|
||||
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
|
||||
"integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
|
||||
},
|
||||
"source-map-js": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
|
||||
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw=="
|
||||
},
|
||||
"sourcemap-codec": {
|
||||
"version": "1.4.8",
|
||||
"resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
|
||||
"integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
|
||||
"peer": true
|
||||
},
|
||||
"uni-read-pages": {
|
||||
"version": "1.0.5",
|
||||
"resolved": "https://registry.npmjs.org/uni-read-pages/-/uni-read-pages-1.0.5.tgz",
|
||||
"integrity": "sha512-GkrrZ0LX0vn9R5k6RKEi0Ez3Q3e2vUpjXQ8Z6/K/d28KudI9ajqgt8WEjQFlG5EPm1K6uTArN8LlqmZTEixDUA=="
|
||||
},
|
||||
"uni-simple-router": {
|
||||
"version": "2.0.7",
|
||||
"resolved": "https://registry.npmjs.org/uni-simple-router/-/uni-simple-router-2.0.7.tgz",
|
||||
"integrity": "sha512-8FKv5dw7Eoonm0gkO8udprrxzin0fNUI0+AvIphFkFRH5ZmP5ZWJ2pvnWzb2NiiqQSECTSU5VSB7HhvOSwD5eA=="
|
||||
},
|
||||
"uview-ui": {
|
||||
"version": "2.0.31",
|
||||
"resolved": "https://registry.npmjs.org/uview-ui/-/uview-ui-2.0.31.tgz",
|
||||
"integrity": "sha512-I/0fGuvtiKHH/mBb864SGYk+SJ7WaF32tsBgYgeBOsxlUp+Th+Ac2tgz2cTvsQJl6eZYWsKZ3ixiSXCAcxZ8Sw=="
|
||||
},
|
||||
"vue": {
|
||||
"version": "3.2.45",
|
||||
"resolved": "https://registry.npmjs.org/vue/-/vue-3.2.45.tgz",
|
||||
"integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==",
|
||||
"peer": true,
|
||||
"requires": {
|
||||
"@vue/compiler-dom": "3.2.45",
|
||||
"@vue/compiler-sfc": "3.2.45",
|
||||
"@vue/runtime-dom": "3.2.45",
|
||||
"@vue/server-renderer": "3.2.45",
|
||||
"@vue/shared": "3.2.45"
|
||||
}
|
||||
},
|
||||
"vue-canvas-poster": {
|
||||
"version": "1.2.1",
|
||||
"resolved": "https://registry.npmjs.org/vue-canvas-poster/-/vue-canvas-poster-1.2.1.tgz",
|
||||
"integrity": "sha512-YY5ygbeQSqhiJyj6QXYgSRZ6Ywhvi1gVsfcvBIoCx4Yq9E/gAV32uOhnZz45qsklP86uGc9ypKJAXiX6Dzrdxw==",
|
||||
"requires": {
|
||||
"core-js": "^2.6.5",
|
||||
"vue": "^2.6.10"
|
||||
},
|
||||
"dependencies": {
|
||||
"@vue/compiler-sfc": {
|
||||
"version": "2.7.14",
|
||||
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.14.tgz",
|
||||
"integrity": "sha512-aNmNHyLPsw+sVvlQFQ2/8sjNuLtK54TC6cuKnVzAY93ks4ZBrvwQSnkkIh7bsbNhum5hJBS00wSDipQ937f5DA==",
|
||||
"requires": {
|
||||
"@babel/parser": "^7.18.4",
|
||||
"postcss": "^8.4.14",
|
||||
"source-map": "^0.6.1"
|
||||
}
|
||||
},
|
||||
"csstype": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz",
|
||||
"integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw=="
|
||||
},
|
||||
"vue": {
|
||||
"version": "2.7.14",
|
||||
"resolved": "https://registry.npmjs.org/vue/-/vue-2.7.14.tgz",
|
||||
"integrity": "sha512-b2qkFyOM0kwqWFuQmgd4o+uHGU7T+2z3T+WQp8UBjADfEv2n4FEMffzBmCKNP0IGzOEEfYjvtcC62xaSKeQDrQ==",
|
||||
"requires": {
|
||||
"@vue/compiler-sfc": "2.7.14",
|
||||
"csstype": "^3.1.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"vuex": {
|
||||
"version": "4.1.0",
|
||||
"resolved": "https://registry.npmjs.org/vuex/-/vuex-4.1.0.tgz",
|
||||
"integrity": "sha512-hmV6UerDrPcgbSy9ORAtNXDr9M4wlNP4pEFKye4ujJF8oqgFFuxDCdOLS3eNoRTtq5O3hoBDh9Doj1bQMYHRbQ==",
|
||||
"requires": {
|
||||
"@vue/devtools-api": "^6.0.0-beta.11"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
15
package.json
Normal file
@@ -0,0 +1,15 @@
|
||||
{
|
||||
"dependencies": {
|
||||
"uni-read-pages": "^1.0.5",
|
||||
"uni-simple-router": "^2.0.7",
|
||||
"uview-ui": "^2.0.31",
|
||||
"vue-canvas-poster": "^1.2.1",
|
||||
"vuex": "^4.0.2"
|
||||
},
|
||||
"name": "dou_fire",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"repository": "https://git.yuzhankeji.cn/TmOct5/dou_fire.git",
|
||||
"author": "唐明明 <970899069@qq.com>",
|
||||
"license": "MIT"
|
||||
}
|
||||
404
pages.json
Normal file
@@ -0,0 +1,404 @@
|
||||
{
|
||||
"pages": [{
|
||||
"path": "pages/index/index",
|
||||
"name": "Index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "抖火法务咨询服务",
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/college/index",
|
||||
"name": "College",
|
||||
"style": {
|
||||
"navigationBarTitleText": "商学院",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/index",
|
||||
"name": "Work",
|
||||
"style": {
|
||||
"navigationBarTitleText": "工作台",
|
||||
"navigationStyle": "custom"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/user/index",
|
||||
"name": "User",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/auth/auth",
|
||||
"name": "Auth",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"disableScroll": false,
|
||||
"navigationStyle": "custom",
|
||||
"animationType": "slide-in-bottom"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/auth/registered",
|
||||
"name": "Registered",
|
||||
"style": {
|
||||
"navigationBarTitleText": "注册",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/auth/resetPassword",
|
||||
"name": "ResetPassword",
|
||||
"style": {
|
||||
"navigationBarTitleText": "重置密码",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/college/test",
|
||||
"name": "CollegeTest",
|
||||
"auth": true,
|
||||
"style": {
|
||||
"navigationBarTitleText": "考试",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
|
||||
}, {
|
||||
"path": "pages/richText/richText",
|
||||
"name": "RichText",
|
||||
"style": {
|
||||
"navigationBarTitleText": "-",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/create",
|
||||
"name": "OrderCreate",
|
||||
"auth": true,
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/orders",
|
||||
"name": "Orders",
|
||||
"auth": true,
|
||||
"style": {
|
||||
"navigationBarTitleText": "订单管理",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/service",
|
||||
"name": "OrdersService",
|
||||
"auth": true,
|
||||
"style": {
|
||||
"navigationBarTitleText": "分配服务包",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff",
|
||||
"app-plus": {
|
||||
"titleNView": {
|
||||
"buttons": [{
|
||||
"text": "添加",
|
||||
"color": "#446EFE",
|
||||
"fontSize": "32rpx",
|
||||
"width": "120rpx"
|
||||
}]
|
||||
}
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/available",
|
||||
"name": "OrderAvailable",
|
||||
"auth": true,
|
||||
"style": {
|
||||
"navigationBarTitleText": "搜索用户",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/generate",
|
||||
"auth": true,
|
||||
"name": "WorkGenerate",
|
||||
"style": {
|
||||
"navigationBarTitleText": "基础信息",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/user/info",
|
||||
"auth": true,
|
||||
"name": "UserInfo",
|
||||
"style": {
|
||||
"navigationBarTitleText": "编辑",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/user/code",
|
||||
"auth": true,
|
||||
"name": "UserCode",
|
||||
"style": {
|
||||
"navigationBarTitleText": "邀请二维码",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#1F25AE",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/user/certification",
|
||||
"auth": true,
|
||||
"name": "UserCertification",
|
||||
"style": {
|
||||
"navigationBarTitleText": "实名认证",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/user/team",
|
||||
"auth": true,
|
||||
"name": "UserTeam",
|
||||
"style": {
|
||||
"navigationBarTitleText": "我的客户",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/user/set",
|
||||
"auth": true,
|
||||
"name": "UserSet",
|
||||
"style": {
|
||||
"navigationBarTitleText": "设置",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/account/bonus",
|
||||
"auth": true,
|
||||
"name": "AccountBonus",
|
||||
"style": {
|
||||
"navigationBarTitleText": "奖金账户",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#926fff",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/account/cash",
|
||||
"auth": true,
|
||||
"name": "AccountCash",
|
||||
"style": {
|
||||
"navigationBarTitleText": "业绩账户",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#446EFE",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/account/integral",
|
||||
"auth": true,
|
||||
"name": "AccountIntegral",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff",
|
||||
"app-plus": {
|
||||
"titleNView": {
|
||||
"buttons": [{
|
||||
"text": "充值记录",
|
||||
"color": "#111",
|
||||
"fontSize": "32rpx",
|
||||
"width": "180rpx"
|
||||
}]
|
||||
}
|
||||
}
|
||||
}
|
||||
}, {
|
||||
"path": "pages/college/answer",
|
||||
"auth": true,
|
||||
"name": "CollegeAnswer",
|
||||
"style": {
|
||||
"navigationBarTitleText": "答题",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#446EFE",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/college/testResults",
|
||||
"auth": true,
|
||||
"name": "CollegeResults",
|
||||
"style": {
|
||||
"navigationBarTitleText": "考试结果",
|
||||
"navigationBarBackgroundColor": "#446EFE",
|
||||
"navigationBarTextStyle": "white",
|
||||
"enablePullDownRefresh": false
|
||||
}
|
||||
}, {
|
||||
"path": "pages/account/logs",
|
||||
"auth": true,
|
||||
"name": "AccountLogs",
|
||||
"style": {
|
||||
"navigationBarTitleText": "账户记录",
|
||||
"enablePullDownRefresh": false
|
||||
}
|
||||
|
||||
}, {
|
||||
"path": "pages/pay/pay",
|
||||
"auth": true,
|
||||
"name": "Pay",
|
||||
"style": {
|
||||
"navigationBarTitleText": "收银台",
|
||||
"enablePullDownRefresh": false
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/orderInfo",
|
||||
"auth": true,
|
||||
"name": "OrderInfo",
|
||||
"style": {
|
||||
"navigationBarTitleText": "详情",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#446EFE",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/user/eSign",
|
||||
"auth": true,
|
||||
"name": "ESign",
|
||||
"style": {
|
||||
"navigationBarTitleText": "人脸认证",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#FFFFFF"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/perfectChoose",
|
||||
"auth": true,
|
||||
"name": "WorkPerfectChoose",
|
||||
"style": {
|
||||
"navigationBarTitleText": "",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#446EFE",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/perfectInstitutions",
|
||||
"auth": true,
|
||||
"name": "WorkPerfectInstitutions",
|
||||
"style": {
|
||||
"navigationBarTitleText": "机构信息",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#446EFE",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/perfectBasis",
|
||||
"auth": true,
|
||||
"name": "WorkPerfectBasis",
|
||||
"style": {
|
||||
"navigationBarTitleText": "基础信息",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#446EFE",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/transfers/lists",
|
||||
"auth": true,
|
||||
"name": "TransfersOrders",
|
||||
"style": {
|
||||
"navigationBarTitleText": "转让订单",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/modifyOrder",
|
||||
"auth": true,
|
||||
"name": "ModifyOrder",
|
||||
"style": {
|
||||
"navigationBarTitleText": "修改资料订单",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
|
||||
}, {
|
||||
"path": "pages/work/poorOrder",
|
||||
"auth": true,
|
||||
"name": "PoorOrder",
|
||||
"style": {
|
||||
"navigationBarTitleText": "补差价订单",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
|
||||
}, {
|
||||
"path": "pages/work/refundOrder",
|
||||
"auth": true,
|
||||
"name": "RefundOrder",
|
||||
"style": {
|
||||
"navigationBarTitleText": "退款订单",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#ffffff"
|
||||
}
|
||||
|
||||
}, {
|
||||
"path": "pages/work/mailed",
|
||||
"auth": true,
|
||||
"name": "MailedOrder",
|
||||
"style": {
|
||||
"navigationBarTitleText": "邮寄材料",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#446EFE",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/mailedInfo",
|
||||
"auth": true,
|
||||
"name": "MailedOrderInfo",
|
||||
"style": {
|
||||
"navigationBarTitleText": "邮寄信息",
|
||||
"enablePullDownRefresh": false
|
||||
}
|
||||
}, {
|
||||
"path": "pages/work/schemes",
|
||||
"auth": true,
|
||||
"name": "OrderSchemes",
|
||||
"style": {
|
||||
"navigationBarTitleText": "预估方案",
|
||||
"enablePullDownRefresh": false,
|
||||
"navigationBarBackgroundColor": "#446EFE",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
}],
|
||||
"globalStyle": {
|
||||
"navigationBarTextStyle": "black",
|
||||
"navigationBarTitleText": "抖火",
|
||||
"navigationBarBackgroundColor": "#F8F8F8",
|
||||
"backgroundColor": "#F8F8F8"
|
||||
},
|
||||
"tabBar": {
|
||||
"backgroundColor": "white",
|
||||
"borderStyle": "white",
|
||||
"color": "#999999",
|
||||
"selectedColor": "#446EFE",
|
||||
"list": [{
|
||||
"iconPath": "static/icons/tabs_icon_00.png",
|
||||
"selectedIconPath": "static/icons/tabs_show_00.png",
|
||||
"pagePath": "pages/index/index",
|
||||
"text": "服务包"
|
||||
}, {
|
||||
"iconPath": "static/icons/tabs_icon_01.png",
|
||||
"selectedIconPath": "static/icons/tabs_show_01.png",
|
||||
"pagePath": "pages/college/index",
|
||||
"text": "商学院"
|
||||
}, {
|
||||
"iconPath": "static/icons/tabs_icon_02.png",
|
||||
"selectedIconPath": "static/icons/tabs_show_02.png",
|
||||
"pagePath": "pages/work/index",
|
||||
"text": "工作台"
|
||||
}, {
|
||||
"iconPath": "static/icons/tabs_icon_03.png",
|
||||
"selectedIconPath": "static/icons/tabs_show_03.png",
|
||||
"pagePath": "pages/user/index",
|
||||
"text": "我的"
|
||||
}]
|
||||
},
|
||||
"easycom": {
|
||||
"^u-(.*)": "uview-ui/components/u-$1/u-$1.vue"
|
||||
},
|
||||
"uniIdRouter": {}
|
||||
}
|
||||
188
pages/account/bonus.vue
Normal file
@@ -0,0 +1,188 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<!-- 账户余额 -->
|
||||
<view class="total" :style="'background-image: url(' + require('@/static/imgs/bonus_back.png') + ');'">
|
||||
<view class="total-left">
|
||||
<view class="total-value nowrap">{{total}}</view>
|
||||
<view class="total-text nowrap">账户余额</view>
|
||||
</view>
|
||||
<view class="total-btn">提现</view>
|
||||
</view>
|
||||
<!-- 账户记录 -->
|
||||
<view class="tabs">
|
||||
<u-tabs
|
||||
:list="tabs"
|
||||
:scrollable="false"
|
||||
:activeStyle="{color: '#906BFF', fontWeight: 'bold'}"
|
||||
lineColor="#8E6AFF"
|
||||
@click="onTabs"
|
||||
></u-tabs>
|
||||
</view>
|
||||
<view class="logs">
|
||||
<block v-if="list.length > 0">
|
||||
<view class="log-flex" v-for="(item, index) in list" :key="index">
|
||||
<view class="text">
|
||||
<view class="type nowrap">xxx奖金收益</view>
|
||||
<view class="time nowrap">2022-12-12 10:18</view>
|
||||
</view>
|
||||
<view class="price nowrap">+50000</view>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="list-null">
|
||||
<u-empty
|
||||
mode="history"
|
||||
icon="http://cdn.uviewui.com/uview/empty/history.png"
|
||||
text="暂无相关记录"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<u-loadmore v-if="pagesShow" :status="status" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { balance } from '@/apis/interfaces/account.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tabs: [
|
||||
{ name: '奖金收益明细', value: '' },
|
||||
{ name: '提现记录', value: '' },
|
||||
],
|
||||
total : '0.00',
|
||||
list : [],
|
||||
page : {
|
||||
current : 1,
|
||||
has_more: false,
|
||||
},
|
||||
pagesShow: false,
|
||||
status : ''
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList()
|
||||
},
|
||||
methods: {
|
||||
onTabs(e){
|
||||
console.log(e)
|
||||
console.log('这里需要之后处理提现记录')
|
||||
},
|
||||
getList(){
|
||||
balance({
|
||||
page: this.page.current
|
||||
}).then(res => {
|
||||
let { balance, logs } = res;
|
||||
let atList = logs.page.current == 1 ? [] : this.list
|
||||
this.total = balance
|
||||
this.list = atList.concat(logs.data)
|
||||
this.page = logs.page
|
||||
this.pagesShow = false
|
||||
})
|
||||
}
|
||||
},
|
||||
onReachBottom() {
|
||||
this.pagesShow = true;
|
||||
if(this.page.has_more){
|
||||
this.status = 'loading';
|
||||
this.page.current++
|
||||
this.getList()
|
||||
return
|
||||
}
|
||||
this.status = 'nomore';
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// tabs
|
||||
.tabs{
|
||||
border-radius: 20rpx 20rpx 0 0;
|
||||
padding: 5px 0;
|
||||
margin: -54px 30rpx 0;
|
||||
background: white;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
border-bottom: solid 1rpx #F6F6F6;
|
||||
}
|
||||
// 账户余额
|
||||
.total{
|
||||
background-size: cover;
|
||||
background-position: top center;
|
||||
padding: 50rpx 30rpx 170rpx;
|
||||
color: white;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.total-left{
|
||||
width: calc( 100% - 200rpx );
|
||||
}
|
||||
.total-value{
|
||||
font-weight: bold;
|
||||
font-size: 60rpx;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
.total-text{
|
||||
font-size: 30rpx;
|
||||
opacity: .7;
|
||||
line-height: 40rpx;
|
||||
padding-top: 20rpx;
|
||||
}
|
||||
.total-btn{
|
||||
background: white;
|
||||
color: #8E6AFF;
|
||||
line-height: 80rpx;
|
||||
border-radius: 40rpx;
|
||||
width: 170rpx;
|
||||
font-weight: bold;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
// 记录空
|
||||
.list-null{
|
||||
height: 70vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
// 记录
|
||||
.logs{
|
||||
box-sizing: border-box;
|
||||
background-color: white;
|
||||
margin: 0 30rpx;
|
||||
padding: 0 30rpx;
|
||||
border-radius: 0 0 20rpx 20rpx;
|
||||
.log-flex{
|
||||
padding: 25rpx 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-size: 30rpx;
|
||||
color: #666666;
|
||||
border-top: solid 1rpx #F6F6F6;
|
||||
&:first-child{
|
||||
border-top: none;
|
||||
}
|
||||
.text{
|
||||
width: calc(100% - 200rpx);
|
||||
}
|
||||
.price{
|
||||
width: 200rpx;
|
||||
text-align: right;
|
||||
font-weight: bold;
|
||||
color: #9675FF;
|
||||
}
|
||||
.type{
|
||||
font-weight: bold;
|
||||
font-size: 30rpx;
|
||||
color: #666666;
|
||||
}
|
||||
.time{
|
||||
font-size: 28rpx;
|
||||
color: gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
199
pages/account/cash.vue
Normal file
@@ -0,0 +1,199 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<u-sticky bgColor="#446EFE">
|
||||
<view class="type-tab">
|
||||
<text :class="{'active': type == 'self' }" @click="onTabs('self')">个人业绩</text>/
|
||||
<text :class="{'active': type == 'group' }" @click="onTabs('group')">团队业绩</text>
|
||||
</view>
|
||||
</u-sticky>
|
||||
<!-- 账户余额 -->
|
||||
<view class="total" :style="'background-image: url(' + require('@/static/imgs/cash_back.png') + ');'">
|
||||
<view class="total-value nowrap">{{total}}</view>
|
||||
<view class="total-text">个人总业绩</view>
|
||||
</view>
|
||||
<!-- 账户记录 -->
|
||||
<view class="logs">
|
||||
<view class="log-item">
|
||||
<view class="tabs">
|
||||
<u-tabs
|
||||
:list="tabs"
|
||||
:activeStyle="{'color': '#446EFE'}"
|
||||
lineColor="#446EFE"
|
||||
:scrollable="false"
|
||||
@click="onDayTab"
|
||||
></u-tabs>
|
||||
</view>
|
||||
<block v-if="list.length > 0">
|
||||
<view class="log-flex" v-for="(item, index) in list" :key="index">
|
||||
<view class="type nowrap">{{item.type}}</view>
|
||||
<view class="perf nowrap">{{item.perf}}</view>
|
||||
<view class="time nowrap">{{item.created_at}}</view>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="list-null">
|
||||
<u-empty
|
||||
mode="history"
|
||||
icon="http://cdn.uviewui.com/uview/empty/history.png"
|
||||
text="暂无相关账户记录"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<u-loadmore v-if="pagesShow" :status="status" />
|
||||
</view>
|
||||
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { cash } from '@/apis/interfaces/account.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tabs : [
|
||||
{ name: '当月业绩', value: 'month'},
|
||||
{ name: '当年业绩', value: 'year'}
|
||||
],
|
||||
dayType : 'month',
|
||||
type : 'self',
|
||||
total : '0.00',
|
||||
list : [],
|
||||
page : {
|
||||
current : 1,
|
||||
has_more: false,
|
||||
},
|
||||
pagesShow : false,
|
||||
status : ''
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getLog()
|
||||
},
|
||||
methods: {
|
||||
onTabs(e){
|
||||
if(this.type === e) return
|
||||
this.type = e
|
||||
this.page.current = 1
|
||||
this.getLog()
|
||||
},
|
||||
// 选择日期
|
||||
onDayTab(e){
|
||||
if(this.dayType === e.value) return
|
||||
this.dayType = e.value
|
||||
this.page.current = 1
|
||||
this.getLog()
|
||||
},
|
||||
// 获取列表
|
||||
getLog(){
|
||||
cash({
|
||||
day : this.type,
|
||||
type: this.dayType,
|
||||
page: this.page.current
|
||||
}).then(res => {
|
||||
let { total, lists } = res;
|
||||
let atList = lists.page.current == 1 ? [] : this.list
|
||||
this.list = atList.concat(lists.data)
|
||||
this.page = lists.page
|
||||
this.pagesShow = false
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
onReachBottom() {
|
||||
this.pagesShow = true;
|
||||
if(this.page.has_more){
|
||||
this.status = 'loading';
|
||||
this.page.current++
|
||||
this.getLog()
|
||||
return
|
||||
}
|
||||
this.status = 'nomore';
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// 统计类型选择
|
||||
.type-tab{
|
||||
text-align: center;
|
||||
padding-bottom: 20rpx;
|
||||
color: white;
|
||||
font-size: 30rpx;
|
||||
text{
|
||||
margin: 0 30rpx;
|
||||
line-height: 70rpx;
|
||||
&.active{
|
||||
font-weight: bold;
|
||||
font-size: 34rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 账户余额
|
||||
.total{
|
||||
margin: 30rpx 30rpx 0;
|
||||
background-size: cover;
|
||||
background-position: center;
|
||||
border-radius: 20rpx;
|
||||
padding: 50rpx 30rpx;
|
||||
color: white;
|
||||
.total-value{
|
||||
font-weight: bold;
|
||||
font-size: 60rpx;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
.total-text{
|
||||
font-size: 30rpx;
|
||||
opacity: .7;
|
||||
line-height: 40rpx;
|
||||
padding-top: 10rpx;
|
||||
}
|
||||
}
|
||||
// 记录空
|
||||
.list-null{
|
||||
height: 50vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
// 记录
|
||||
.logs{
|
||||
padding: 30rpx;
|
||||
box-sizing: border-box;
|
||||
.log-item{
|
||||
background: white;
|
||||
padding: 10rpx 30rpx;
|
||||
border-radius: 20rpx;
|
||||
margin-bottom: 20rpx;
|
||||
.tabs{
|
||||
border-bottom: solid 1rpx #F6F6F6;
|
||||
margin: 0 -30rpx 10rpx;
|
||||
}
|
||||
.log-flex{
|
||||
padding: 5rpx 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 70rpx;
|
||||
align-items: center;
|
||||
font-size: 30rpx;
|
||||
color: #666666;
|
||||
.type{
|
||||
width: 150rpx;
|
||||
}
|
||||
.time{
|
||||
width: 300rpx;
|
||||
text-align: right;
|
||||
}
|
||||
.perf{
|
||||
width: calc( 100% - 450rpx);
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
111
pages/account/integral.vue
Normal file
@@ -0,0 +1,111 @@
|
||||
<template>
|
||||
<view class="integral">
|
||||
<image class="icon" src="@/static/icons/work_icon_22.png" mode="aspectFill"></image>
|
||||
<view class="title">火力值</view>
|
||||
<view class="score">{{score}}</view>
|
||||
<view class="btns">
|
||||
<button class="btns-item" size="mini" @click="onNav('AccountLogs', { type: 0 })">消费记录</button>
|
||||
</view>
|
||||
<view class="footer">抖火法律</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { score } from '@/apis/interfaces/account.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
score: '0.00',
|
||||
logs : [],
|
||||
pages: {}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getScore()
|
||||
},
|
||||
methods: {
|
||||
getScore(){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
score().then(res => {
|
||||
this.score = res.score
|
||||
this.logs = res.logs
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
onNav(name, p){
|
||||
let params = p || {}
|
||||
this.$Router.push({name, params})
|
||||
}
|
||||
},
|
||||
onNavigationBarButtonTap() {
|
||||
this.onNav('AccountLogs', { type: 1 })
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.integral{
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
padding: 50rpx;
|
||||
box-sizing: border-box;
|
||||
.icon{
|
||||
width: 128rpx;
|
||||
height: 128rpx;
|
||||
border-radius: 50%;
|
||||
margin-bottom: 40rpx;
|
||||
background: #f1f1f1;
|
||||
}
|
||||
.title{
|
||||
font-size: 32rpx;
|
||||
color: #111;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
.score{
|
||||
padding-top: 20rpx;
|
||||
font-weight: bold;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 86rpx;
|
||||
}
|
||||
.btns{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 40vh;
|
||||
justify-content: flex-end;
|
||||
width: 100%;
|
||||
.btns-item[size="mini"]{
|
||||
width: 50vw;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
padding: 0;
|
||||
background: $main-color;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
font-size: 32rpx;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
&:last-child{
|
||||
background-color: #f1f1f1;
|
||||
margin-top: 30rpx;
|
||||
color: $main-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
.footer{
|
||||
font-size: 28rpx;
|
||||
color: gray;
|
||||
padding-top: 10vh;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
144
pages/account/logs.vue
Normal file
@@ -0,0 +1,144 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<u-sticky bgColor="#f8f8f8">
|
||||
<u-tabs
|
||||
:current="current"
|
||||
:list="tabs"
|
||||
:scrollable="false"
|
||||
lineColor="#446EFE"
|
||||
@click="onTabs"
|
||||
></u-tabs>
|
||||
</u-sticky>
|
||||
<!-- 账户记录 -->
|
||||
<view class="logs" v-if="list.length > 0">
|
||||
<view class="log-item" v-for="(item, index) in list" :key="index">
|
||||
<view class="log-flex">
|
||||
<view class="title nowrap">{{item.rule.title}}{{item.rule.remark}}</view>
|
||||
<view class="price">{{item.amount}}</view>
|
||||
</view>
|
||||
<view class="log-flex">
|
||||
<view class="time">{{item.created_at}}</view>
|
||||
<view class="state">{{item.frozen.text}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<u-loadmore v-if="pagesShow" :status="status" />
|
||||
</view>
|
||||
<view v-else class="list-null">
|
||||
<u-empty
|
||||
mode="history"
|
||||
icon="http://cdn.uviewui.com/uview/empty/history.png"
|
||||
text="暂无相关账户记录"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { log } from '@/apis/interfaces/account.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tabs : [
|
||||
{ val: 'out', name: '消费记录' },
|
||||
{ val: 'in', name: '充值记录' }
|
||||
],
|
||||
current : 0,
|
||||
list : [],
|
||||
page : {
|
||||
current : 1,
|
||||
has_more: false,
|
||||
},
|
||||
pagesShow : false,
|
||||
status : ''
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.current = this.$Route.query.type
|
||||
this.getLog()
|
||||
},
|
||||
methods: {
|
||||
onTabs(e){
|
||||
if(this.current === e.index) return
|
||||
this.current = e.index
|
||||
this.page.current = 1
|
||||
this.getLog()
|
||||
},
|
||||
// 获取列表
|
||||
getLog(){
|
||||
log({
|
||||
type: this.tabs[this.current].val,
|
||||
page: this.page.current
|
||||
}).then(res => {
|
||||
let { logs } = res;
|
||||
let atList = logs.page.current == 1 ? [] : this.list
|
||||
this.list = atList.concat(logs.data)
|
||||
this.page = logs.page
|
||||
this.pagesShow = false
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
onReachBottom() {
|
||||
this.pagesShow = true;
|
||||
if(this.page.has_more){
|
||||
this.status = 'loading';
|
||||
this.page.current++
|
||||
this.getLog()
|
||||
return
|
||||
}
|
||||
this.status = 'nomore';
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// 记录空
|
||||
.list-null{
|
||||
height: 80vh;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
// 记录
|
||||
.logs{
|
||||
padding: 30rpx;
|
||||
box-sizing: border-box;
|
||||
.log-item{
|
||||
background: white;
|
||||
padding: 30rpx;
|
||||
border-radius: 20rpx;
|
||||
margin-bottom: 20rpx;
|
||||
.log-flex{
|
||||
padding: 5rpx 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 40rpx;
|
||||
align-items: center;
|
||||
.title{
|
||||
font-weight: bold;
|
||||
font-size: 32rpx;
|
||||
width: calc(100% - 200rpx);
|
||||
}
|
||||
.price{
|
||||
font-size: 32rpx;
|
||||
width: 200rpx;
|
||||
text-align: right;
|
||||
font-weight: bold;
|
||||
color: $main-color;
|
||||
}
|
||||
.time{
|
||||
font-size: 28rpx;
|
||||
color: gray;
|
||||
}
|
||||
.state{
|
||||
font-size: 28rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
190
pages/auth/auth.vue
Normal file
@@ -0,0 +1,190 @@
|
||||
<template>
|
||||
<view class="auth-center">
|
||||
<view class="login-left" @click="onBack()">
|
||||
<u-icon name="close" color="#000" size="24"></u-icon>
|
||||
</view>
|
||||
<view class="login">
|
||||
<view class="logo">
|
||||
<image class="logo-src" src="@/static/imgs/logo.png"/>
|
||||
</view>
|
||||
<view class="hello">欢迎使用抖火法律</view>
|
||||
<view class="input input-phone">
|
||||
<label>+86</label>
|
||||
<input type="number" v-model="phone" placeholder="请输入手机号码">
|
||||
</view>
|
||||
<view class="input">
|
||||
<input type="safe-password" password v-model="password" placeholder="请输入密码">
|
||||
</view>
|
||||
<view class="btn">
|
||||
<button :disabled="phone.length < 11 || password == '' || agreement.length == 0" @click="onAuth()">登录</button>
|
||||
</view>
|
||||
<view class="agreement">
|
||||
<u-checkbox-group
|
||||
v-model="agreement"
|
||||
placement="row"
|
||||
>
|
||||
<u-checkbox shape="circle" name="agreement" activeColor="#446EFE"></u-checkbox>
|
||||
我已阅读并同意
|
||||
<my-link class="agreement-nav" :to="{name: 'richText', params: {id: 1}}">服务协议</my-link>、
|
||||
<my-link class="agreement-nav" :to="{name: 'richText', params: {id: 2}}">隐私权政策</my-link>
|
||||
</u-checkbox-group>
|
||||
</view>
|
||||
</view>
|
||||
<view class="footer">
|
||||
<my-link class="footer-nav" :to="{ name: 'Registered' }">注册账号</my-link>
|
||||
<my-link class="footer-nav" :to="{ name: 'ResetPassword' }">找回密码</my-link>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { auth } from '@/apis/interfaces/auth.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
phone : '',
|
||||
password : '',
|
||||
agreement : []
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
onAuth(){
|
||||
uni.showLoading({
|
||||
title: '登录中...'
|
||||
})
|
||||
auth({
|
||||
username: this.phone,
|
||||
password: this.password
|
||||
}).then(res => {
|
||||
// 存储登录凭证
|
||||
this.$store.commit('setToken', res.token_type + ' ' + res.access_token);
|
||||
this.onBack()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
onBack(){
|
||||
try{
|
||||
this.$Router.back()
|
||||
}catch(e){
|
||||
this.$Router.replaceAll({name: 'Index'})
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.auth-center{
|
||||
position: relative;
|
||||
background: white;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
min-height: 100vh;
|
||||
box-sizing: border-box;
|
||||
@extend .ios-bottom;
|
||||
@extend .ios-top;
|
||||
}
|
||||
// 关闭登录
|
||||
.login-left{
|
||||
position: absolute;
|
||||
right: $padding * 2;
|
||||
top: $padding;
|
||||
@extend .ios-top;
|
||||
}
|
||||
// 登录
|
||||
.login{
|
||||
padding: $padding * 2;
|
||||
.logo{
|
||||
padding-top: $padding * 2;
|
||||
padding-bottom: $padding / 2;
|
||||
.logo-src{
|
||||
width: 98rpx;
|
||||
height: 98rpx;
|
||||
border-radius: $radius;
|
||||
vertical-align: top;
|
||||
}
|
||||
}
|
||||
.hello{
|
||||
font-weight: bold;
|
||||
font-size: 54rpx;
|
||||
color: $text-color;
|
||||
padding-bottom: $padding * 2;
|
||||
}
|
||||
.input{
|
||||
border-bottom: solid 1rpx $border-color;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
margin-bottom: $margin;
|
||||
input{
|
||||
height: 100rpx;
|
||||
box-sizing: border-box;
|
||||
font-size: 32rpx;
|
||||
color: $text-color;
|
||||
}
|
||||
&.input-phone{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
label{
|
||||
border-right: solid 1rpx $border-color;
|
||||
padding: 0 $padding;
|
||||
box-sizing: border-box;
|
||||
width: 140rpx;
|
||||
height: 50rpx;
|
||||
line-height: 50rpx;
|
||||
font-size: 32rpx;
|
||||
color: $text-color;
|
||||
}
|
||||
input{
|
||||
padding: 0 $padding;
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
.btn{
|
||||
button{
|
||||
background: $main-color;
|
||||
border-radius: $radius-lg;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
color: white;
|
||||
font-size: 38rpx;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
&[disabled]{
|
||||
opacity: .5;
|
||||
}
|
||||
}
|
||||
}
|
||||
.agreement{
|
||||
padding-top: $padding * 2;
|
||||
font-size: 30rpx;
|
||||
color: $text-gray;
|
||||
&-nav{
|
||||
display: inline-block;
|
||||
font-size: 30rpx;
|
||||
color: $main-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 底部
|
||||
.footer{
|
||||
padding: 50rpx 50rpx 100rpx;
|
||||
height: 100rpx;
|
||||
text-align: center;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
&-nav{
|
||||
font-size: 30rpx;
|
||||
margin: 0 $margin;
|
||||
color: $text-gray;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
282
pages/auth/registered.vue
Normal file
@@ -0,0 +1,282 @@
|
||||
<template>
|
||||
<view class="registered-content">
|
||||
<view class="title">你好,欢迎使用抖火法律</view>
|
||||
<view class="submit-title">请填写账号信息</view>
|
||||
<view class="from">
|
||||
<view class="from-inpus from-input-phoen">
|
||||
<label>+86</label>
|
||||
<input type="number" v-model="username" placeholder="输入手机号码">
|
||||
</view>
|
||||
<view class="from-inpus">
|
||||
<label>登录密码</label>
|
||||
<input type="safe-password" password v-model="password" placeholder="设置登录密码">
|
||||
</view>
|
||||
<view class="from-inpus">
|
||||
<label>确认密码</label>
|
||||
<input type="safe-password" password v-model="confirmation" placeholder="请确认登录密码">
|
||||
</view>
|
||||
<view class="from-inpus from-input-code">
|
||||
<label>验证码</label>
|
||||
<input type="number" v-model="code" maxlength="4" placeholder="短信验证码">
|
||||
<button :disabled="username.length < 11 || getSms" @click="getCode">{{sendCode}}</button>
|
||||
</view>
|
||||
</view>
|
||||
<view class="button">
|
||||
<button @click="onRegistered()">注册并登录</button>
|
||||
</view>
|
||||
<!-- 显示图形验证码 -->
|
||||
<u-popup :show="captchaShow" mode="center" :round="10" closeable @close="captchaShow = false, captcha = ''">
|
||||
<view class="captcha-lay">
|
||||
<view class="captcha-title">图形验证</view>
|
||||
<view class="captcha-img">
|
||||
<image :src="captchaImg" mode="widthFix" @click="getCode()"></image>
|
||||
</view>
|
||||
<view class="captcha-input">
|
||||
<input type="text" placeholder="请输入验证码" v-model="captcha" maxlength="10">
|
||||
</view>
|
||||
<button class="captcha-btn" @click="getPhoneCode">验证</button>
|
||||
</view>
|
||||
</u-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
var outTime;
|
||||
import { register, captcha, verifyCaptcha } from '@/apis/interfaces/auth.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
username : '18245180131',
|
||||
password : '',
|
||||
confirmation: '',
|
||||
code : '',
|
||||
getSms : false,
|
||||
sendCode : '获取验证码',
|
||||
captcha : '',
|
||||
captchaImg : '',
|
||||
captchaKey : '',
|
||||
captchaShow : false
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
// 提交注册信息
|
||||
onRegistered(){
|
||||
uni.showLoading({
|
||||
title: '提交中...',
|
||||
mask : true
|
||||
})
|
||||
register({
|
||||
username : this.username,
|
||||
password : this.password,
|
||||
password_confirmation : this.confirmation,
|
||||
code : this.code
|
||||
}).then(res => {
|
||||
// 重置验证码与计时器
|
||||
this.getSms = false;
|
||||
this.sendCode = '获取验证码';
|
||||
clearInterval(outTime);
|
||||
// 存储登录凭证
|
||||
this.$store.commit('setToken', res.token_type + ' ' + res.access_token);
|
||||
try{
|
||||
this.$Router.back(2)
|
||||
} catch (err){
|
||||
this.$Router.replaceAll({name: 'Index'})
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 弹出图形验证码
|
||||
getCode(){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
captcha().then(res => {
|
||||
let { img, key } = res
|
||||
this.captchaImg = img
|
||||
this.captchaKey = key
|
||||
this.captchaShow = true
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 获取验证码
|
||||
getPhoneCode() {
|
||||
uni.showLoading({
|
||||
title : '加载中...',
|
||||
mask :true
|
||||
})
|
||||
let smsTime = 60;
|
||||
verifyCaptcha({
|
||||
mobileNo : this.username,
|
||||
captcha : this.captcha,
|
||||
captcha_key : this.captchaKey
|
||||
}).then(res => {
|
||||
uni.showToast({
|
||||
title: res.message,
|
||||
icon: "none",
|
||||
});
|
||||
this.captchaShow = false;
|
||||
this.captcha = '';
|
||||
this.getSms = true;
|
||||
this.sendCode = smsTime + 's后重新获取';
|
||||
outTime = setInterval(() => {
|
||||
if (smsTime <= 1) {
|
||||
this.getSms = false;
|
||||
this.sendCode = '重新获取';
|
||||
clearInterval(outTime);
|
||||
return
|
||||
}
|
||||
this.sendCode = smsTime + 's后重新获取';
|
||||
smsTime -= 1;
|
||||
}, 1000);
|
||||
}).catch((err) => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon: "none",
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// 图形验证码
|
||||
.captcha-lay{
|
||||
padding: 30rpx;
|
||||
width: 70vw;
|
||||
box-sizing: border-box;
|
||||
.captcha-title{
|
||||
text-align: center;
|
||||
font-size: 35rpx;
|
||||
font-weight: bold;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
.captcha-img{
|
||||
text-align: center;
|
||||
padding-bottom: 30rpx;
|
||||
image{
|
||||
width: 300rpx;
|
||||
}
|
||||
}
|
||||
.captcha-input{
|
||||
input{
|
||||
height: 100rpx;
|
||||
border:solid 1rpx #ddd;
|
||||
text-align: center;
|
||||
line-height: 98rpx;
|
||||
font-size: 34rpx;
|
||||
padding: 0 30rpx;
|
||||
box-sizing: border-box;
|
||||
border-radius: $radius-lg;
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
.captcha-btn{
|
||||
margin-top: 30rpx;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
font-weight: normal;
|
||||
font-size: 34rpx;
|
||||
border-radius: $radius-lg;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
&::after{
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 注册
|
||||
.registered-content{
|
||||
padding: 50rpx;
|
||||
.title{
|
||||
padding-top: 3vh;
|
||||
padding-bottom: 10rpx;
|
||||
font-weight: bold;
|
||||
font-size: 44rpx;
|
||||
}
|
||||
.submit-title{
|
||||
font-size: 30rpx;
|
||||
color: gray;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
// 注册单
|
||||
.from{
|
||||
margin-top: 80rpx;
|
||||
}
|
||||
.from-inpus{
|
||||
@extend .border-solid;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 20rpx;
|
||||
justify-content: space-between;
|
||||
label{
|
||||
width: 170rpx;
|
||||
line-height: 100rpx;
|
||||
font-size: 32rpx;
|
||||
}
|
||||
input{
|
||||
width: calc(100% - 200rpx);
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
font-size: 32rpx;
|
||||
}
|
||||
}
|
||||
.from-input-phoen{
|
||||
label{
|
||||
line-height: 60rpx;
|
||||
height: 60rpx;
|
||||
border-right: solid 1rpx $border-color;
|
||||
}
|
||||
}
|
||||
.from-input-code{
|
||||
button{
|
||||
font-size: 32rpx;
|
||||
width: 230rpx;
|
||||
padding: 0;
|
||||
height: 80rpx;
|
||||
line-height: 80rpx;
|
||||
border-radius: 0;
|
||||
margin: 0;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: $main-color;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
&[disabled]{
|
||||
opacity: .5;
|
||||
}
|
||||
}
|
||||
input{
|
||||
width: calc(100% - 460rpx);
|
||||
}
|
||||
}
|
||||
// 按钮
|
||||
.button{
|
||||
padding-top: 50rpx;
|
||||
button{
|
||||
background: $main-color;
|
||||
border-radius: $radius-lg;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
color: white;
|
||||
font-size: 38rpx;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
&[disabled]{
|
||||
opacity: .5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
284
pages/auth/resetPassword.vue
Normal file
@@ -0,0 +1,284 @@
|
||||
<template>
|
||||
<view class="registered-content">
|
||||
<view class="title">重置账户登录密码</view>
|
||||
<view class="submit-title">请填写账号信息</view>
|
||||
<view class="from">
|
||||
<view class="from-inpus from-input-phoen">
|
||||
<label>+86</label>
|
||||
<input type="number" v-model="username" placeholder="输入手机号码">
|
||||
</view>
|
||||
<view class="from-inpus">
|
||||
<label>新密码</label>
|
||||
<input type="safe-password" password v-model="password" placeholder="设置新的登录密码">
|
||||
</view>
|
||||
<view class="from-inpus">
|
||||
<label>确认密码</label>
|
||||
<input type="safe-password" password v-model="confirmation" placeholder="请确认登录密码">
|
||||
</view>
|
||||
<view class="from-inpus from-input-code">
|
||||
<label>验证码</label>
|
||||
<input type="number" v-model="code" maxlength="4" placeholder="短信验证码">
|
||||
<button :disabled="username.length < 11 || getSms" @click="getCode">{{sendCode}}</button>
|
||||
</view>
|
||||
</view>
|
||||
<view class="button">
|
||||
<button @click="onRegistered()">重置</button>
|
||||
</view>
|
||||
<!-- 显示图形验证码 -->
|
||||
<u-popup :show="captchaShow" mode="center" :round="10" closeable @close="captchaShow = false, captcha = ''">
|
||||
<view class="captcha-lay">
|
||||
<view class="captcha-title">图形验证</view>
|
||||
<view class="captcha-img">
|
||||
<image :src="captchaImg" mode="widthFix" @click="getCode()"></image>
|
||||
</view>
|
||||
<view class="captcha-input">
|
||||
<input type="text" placeholder="请输入验证码" v-model="captcha" maxlength="10">
|
||||
</view>
|
||||
<button class="captcha-btn" @click="getPhoneCode">验证</button>
|
||||
</view>
|
||||
</u-popup>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
var outTime;
|
||||
import { resetPassword, captcha, verifyCaptcha } from '@/apis/interfaces/auth.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
username : '',
|
||||
password : '',
|
||||
confirmation: '',
|
||||
code : '',
|
||||
getSms : false,
|
||||
sendCode : '获取验证码',
|
||||
captcha : '',
|
||||
captchaImg : '',
|
||||
captchaKey : '',
|
||||
captchaShow : false
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
// 提交修改信息
|
||||
onRegistered(){
|
||||
uni.showLoading({
|
||||
title: '提交中...',
|
||||
mask : true
|
||||
})
|
||||
resetPassword({
|
||||
username : this.username,
|
||||
password : this.password,
|
||||
password_confirmation : this.confirmation,
|
||||
code : this.code,
|
||||
}).then(res => {
|
||||
// 重置验证码与计时器
|
||||
this.getSms = false;
|
||||
this.sendCode = '获取验证码';
|
||||
clearInterval(outTime);
|
||||
uni.showModal({
|
||||
title : "提示",
|
||||
content : "登录密码已重置",
|
||||
showCancel : false,
|
||||
confirmColor: "#446EFE",
|
||||
success : modalRes => {
|
||||
this.$Router.back()
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 弹出图形验证码
|
||||
getCode(){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
captcha().then(res => {
|
||||
let { img, key } = res
|
||||
this.captchaImg = img
|
||||
this.captchaKey = key
|
||||
this.captchaShow = true
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 获取验证码
|
||||
getPhoneCode() {
|
||||
uni.showLoading({
|
||||
title : '加载中...',
|
||||
mask :true
|
||||
})
|
||||
let smsTime = 60;
|
||||
verifyCaptcha({
|
||||
mobileNo : this.username,
|
||||
captcha : this.captcha,
|
||||
captcha_key : this.captchaKey
|
||||
}).then(res => {
|
||||
uni.showToast({
|
||||
title: res.message,
|
||||
icon: "none",
|
||||
});
|
||||
this.captchaShow = false;
|
||||
this.captcha = '';
|
||||
this.getSms = true;
|
||||
this.sendCode = smsTime + 's后重新获取';
|
||||
outTime = setInterval(() => {
|
||||
if (smsTime <= 1) {
|
||||
this.getSms = false;
|
||||
this.sendCode = '重新获取';
|
||||
clearInterval(outTime);
|
||||
return
|
||||
}
|
||||
this.sendCode = smsTime + 's后重新获取';
|
||||
smsTime -= 1;
|
||||
}, 1000);
|
||||
}).catch((err) => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon: "none",
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// 图形验证码
|
||||
.captcha-lay{
|
||||
padding: 30rpx;
|
||||
width: 70vw;
|
||||
box-sizing: border-box;
|
||||
.captcha-title{
|
||||
text-align: center;
|
||||
font-size: 35rpx;
|
||||
font-weight: bold;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
.captcha-img{
|
||||
text-align: center;
|
||||
padding-bottom: 30rpx;
|
||||
image{
|
||||
width: 300rpx;
|
||||
}
|
||||
}
|
||||
.captcha-input{
|
||||
input{
|
||||
height: 100rpx;
|
||||
border:solid 1rpx #ddd;
|
||||
text-align: center;
|
||||
line-height: 98rpx;
|
||||
font-size: 34rpx;
|
||||
padding: 0 30rpx;
|
||||
box-sizing: border-box;
|
||||
border-radius: $radius-lg;
|
||||
background: transparent;
|
||||
}
|
||||
}
|
||||
.captcha-btn{
|
||||
margin-top: 30rpx;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
font-weight: normal;
|
||||
font-size: 34rpx;
|
||||
border-radius: $radius-lg;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
&::after{
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 注册
|
||||
.registered-content{
|
||||
padding: 50rpx;
|
||||
.title{
|
||||
padding-top: 3vh;
|
||||
padding-bottom: 10rpx;
|
||||
font-weight: bold;
|
||||
font-size: 44rpx;
|
||||
}
|
||||
.submit-title{
|
||||
font-size: 30rpx;
|
||||
color: gray;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
// 注册单
|
||||
.from{
|
||||
margin-top: 80rpx;
|
||||
}
|
||||
.from-inpus{
|
||||
@extend .border-solid;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 20rpx;
|
||||
justify-content: space-between;
|
||||
label{
|
||||
width: 170rpx;
|
||||
line-height: 100rpx;
|
||||
font-size: 32rpx;
|
||||
}
|
||||
input{
|
||||
width: calc(100% - 200rpx);
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
font-size: 32rpx;
|
||||
}
|
||||
}
|
||||
.from-input-phoen{
|
||||
label{
|
||||
line-height: 60rpx;
|
||||
height: 60rpx;
|
||||
border-right: solid 1rpx $border-color;
|
||||
}
|
||||
}
|
||||
.from-input-code{
|
||||
button{
|
||||
font-size: 32rpx;
|
||||
width: 230rpx;
|
||||
padding: 0;
|
||||
height: 80rpx;
|
||||
line-height: 80rpx;
|
||||
border-radius: 0;
|
||||
margin: 0;
|
||||
border: none;
|
||||
background: transparent;
|
||||
color: $main-color;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
&[disabled]{
|
||||
opacity: .5;
|
||||
}
|
||||
}
|
||||
input{
|
||||
width: calc(100% - 460rpx);
|
||||
}
|
||||
}
|
||||
// 按钮
|
||||
.button{
|
||||
padding-top: 50rpx;
|
||||
button{
|
||||
background: $main-color;
|
||||
border-radius: $radius-lg;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
color: white;
|
||||
font-size: 38rpx;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
&[disabled]{
|
||||
opacity: .5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
443
pages/college/answer.vue
Normal file
@@ -0,0 +1,443 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<!-- header -->
|
||||
<u-sticky zIndex="10">
|
||||
<view class="answer-header">
|
||||
<view class="flex">
|
||||
<view class="flex-item">答题进度<text>{{questionsIndex + 1}}</text>/{{questions.length}}</view>
|
||||
<view class="flex-item">
|
||||
剩余时间
|
||||
<u-count-down class="flex-item-down" :time="Number(outTime) * 60 * 1000" format="mm:ss" @finish="answerNext('time')"></u-count-down>
|
||||
</view>
|
||||
</view>
|
||||
<u-line-progress
|
||||
inactiveColor="rgba(255,255,255,.5)"
|
||||
:percentage="percentageVal"
|
||||
activeColor="#fff"
|
||||
></u-line-progress>
|
||||
</view>
|
||||
</u-sticky>
|
||||
<!-- 答题卡 -->
|
||||
<view class="block" v-if="questions.length > 0">
|
||||
<block v-if="isShowAnswer">
|
||||
<!-- 题目类型 -->
|
||||
<view class="answer-type">
|
||||
<text v-if="questions[questionsIndex].type == 1">单选题</text>
|
||||
<text v-if="questions[questionsIndex].type == 2">多选题</text>
|
||||
<text v-if="questions[questionsIndex].type == 3">判断题</text>
|
||||
</view>
|
||||
<!-- 题目 -->
|
||||
<view class="answer-q">{{questions[questionsIndex].title}}</view>
|
||||
<!-- 答案 -->
|
||||
<view class="answer-list">
|
||||
<!-- 对错/单选 -->
|
||||
<block v-if="questions[questionsIndex].type == 1 || questions[questionsIndex].type == 3">
|
||||
<radio-group @change="onAnswer">
|
||||
<label
|
||||
class="answer-item"
|
||||
v-for="(item, index) in questions[questionsIndex].options"
|
||||
:key="index"
|
||||
:class="{'active': item.option_id == answerArr[questionsIndex].option_ids}"
|
||||
>
|
||||
<radio class="answer-checkbox" :value="item.option_id" />
|
||||
<text class="answer-index">{{item.order.text}}.</text>
|
||||
<view class="answer-text">{{item.title}}</view>
|
||||
<view class="answer-icon">
|
||||
<u-icon v-if="item.option_id == answerArr[questionsIndex].option_ids" name="checkbox-mark" size="38rpx" color="#446EFE"></u-icon>
|
||||
</view>
|
||||
</label>
|
||||
</radio-group>
|
||||
</block>
|
||||
<!-- 多选题 -->
|
||||
<block v-if="questions[questionsIndex].type == 2">
|
||||
<checkbox-group @change="onAnswer">
|
||||
<label
|
||||
class="answer-item"
|
||||
v-for="(item, index) in questions[questionsIndex].options"
|
||||
:key="index"
|
||||
:class="{'active': isAnswer(item.option_id, answerArr[questionsIndex], 2)}"
|
||||
>
|
||||
<checkbox class="answer-checkbox" :value="item.option_id"></checkbox>
|
||||
<text class="answer-index">{{item.order.text}}.</text>
|
||||
<view class="answer-text">{{item.title}}</view>
|
||||
<view class="answer-icon">
|
||||
<u-icon v-if="isAnswer(item.option_id, answerArr[questionsIndex], 2)" name="checkbox-mark" size="38rpx" color="#446EFE"></u-icon>
|
||||
</view>
|
||||
</label>
|
||||
</checkbox-group>
|
||||
</block>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="answer-loding">
|
||||
<u-loading-icon mode="circle" text="加载中..."></u-loading-icon>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<!-- 答题卡 -->
|
||||
<!-- answerShow -->
|
||||
<u-popup :show="answerShow" closeable round @close="answerShow = false">
|
||||
<view class="answer-lay-content">
|
||||
<view class="answer-lay-title">答题卡</view>
|
||||
<view class="answer-lay-flex">
|
||||
<view class="answer-lay-flex-title">智能组卷(客观一)</view>
|
||||
<view class="answer-lay-flex-text">
|
||||
<text>未答题</text>
|
||||
<text>已答题</text>
|
||||
</view>
|
||||
</view>
|
||||
<scroll-view scroll-y style="height: 60vh;" v-if="answerArr.length > 0">
|
||||
<view class="answer-lay-list">
|
||||
<view class="answer-item" :class="{'active': item.option_ids != ''}" v-for="(item,index) in answerArr" :key="index">
|
||||
<view class="number">{{index + 1}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</scroll-view>
|
||||
</view>
|
||||
</u-popup>
|
||||
<!-- 下一题 -->
|
||||
<view class="footer-flex" v-if="questions.length > 0">
|
||||
<view class="footer-btn" @click="answerShow = true">
|
||||
<u-icon class="footer-icon" name="order" size="48rpx" color="#111"></u-icon>
|
||||
<view>答题卡</view>
|
||||
</view>
|
||||
<button class="footer-next" :disabled="answerArr[questionsIndex].option_ids == ''" @click="answerNext">{{(this.questionsIndex + 1) == this.questions.length ? '提交': '下一题'}}</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { questions, answers } from "@/apis/interfaces/college.js"
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
outTime : 0,
|
||||
percentageVal : 0,
|
||||
questionsIndex: 0,
|
||||
questions : [],
|
||||
answerArr : [],
|
||||
answerShow : false,
|
||||
isShowAnswer : true
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
isAnswer(){
|
||||
return (id, answer, type) => {
|
||||
let optionIds = answer.option_ids || []
|
||||
let isFindIndex = optionIds.findIndex(val => val == id)
|
||||
return isFindIndex >= 0
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.outTime = this.$Route.query.time || 60
|
||||
questions(this.$Route.query.id).then(res => {
|
||||
this.questions = res;
|
||||
this.percentageVal += Number((100 / res.length).toFixed())
|
||||
this.answerArr = new Array(res.length).fill({question_id:'', option_ids:''})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 选择答案
|
||||
onAnswer(e){
|
||||
let { value } = e.detail
|
||||
this.$set(this.answerArr, this.questionsIndex, {
|
||||
question_id: this.questions[this.questionsIndex].question_id,
|
||||
option_ids : value
|
||||
})
|
||||
},
|
||||
// 下一题
|
||||
answerNext(type){
|
||||
if(type != 'time'){
|
||||
if(this.answerArr[this.questionsIndex] == '') return
|
||||
if(this.questionsIndex < (this.questions.length - 1)){
|
||||
this.isShowAnswer = false
|
||||
setTimeout(() => {
|
||||
this.questionsIndex++
|
||||
this.percentageVal += Number((100 / this.questions.length).toFixed())
|
||||
this.isShowAnswer = true
|
||||
},200)
|
||||
return
|
||||
}
|
||||
}
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
answers(this.$Route.query.id, {
|
||||
type : 2,
|
||||
answers: this.answerArr
|
||||
}).then(res => {
|
||||
this.$Router.replace({
|
||||
name: 'CollegeResults',
|
||||
params: {
|
||||
id: res.answer_id
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.content{
|
||||
background-color: $main-color;
|
||||
padding-bottom: 200rpx;
|
||||
}
|
||||
// 加载题
|
||||
.answer-loding{
|
||||
height: 50vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
// 答题卡
|
||||
.answer-lay-content{
|
||||
.answer-lay-title{
|
||||
line-height: 70rpx;
|
||||
padding: 20rpx 30rpx;
|
||||
border-bottom: solid 1rpx #F6F6F6;
|
||||
font-size: 36rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.answer-lay-flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 30rpx 30rpx 20rpx;
|
||||
&-title{
|
||||
font-size: 30rpx;
|
||||
color: #111;
|
||||
width: 50%;
|
||||
@extend .nowrap;
|
||||
}
|
||||
&-text{
|
||||
font-size: 30rpx;
|
||||
width: 50%;
|
||||
text-align: right;
|
||||
text{
|
||||
margin-left: 30rpx;
|
||||
padding-left: 35rpx;
|
||||
color: #333;
|
||||
position: relative;
|
||||
&::after{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 50%;
|
||||
margin-top: -12rpx;
|
||||
height: 16rpx;
|
||||
width: 16rpx;
|
||||
content: " ";
|
||||
border-radius: 50%;
|
||||
background: $main-color;
|
||||
border:solid 7rpx #E4E8F7;
|
||||
}
|
||||
&:first-child::after{
|
||||
background-color: #999999;
|
||||
border-color: #e7e7e7;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.answer-lay-list{
|
||||
padding: 10rpx;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
.answer-item{
|
||||
width: calc(20% - 40rpx);
|
||||
padding-top: calc(20% - 42rpx);
|
||||
text-align: center;
|
||||
border-radius: 50%;
|
||||
background: white;
|
||||
border:solid 1rpx #EEEEEE;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
margin: 20rpx;
|
||||
color: #999999;
|
||||
font-weight: bold;
|
||||
.number{
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
margin-top: -22rpx;
|
||||
line-height: 40rpx;
|
||||
height: 40rpx;
|
||||
font-size: 32rpx;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
&.active{
|
||||
background: #E4E8F7;
|
||||
border-color: #E4E8F7;
|
||||
color: $main-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// header
|
||||
.answer-header{
|
||||
padding: 20rpx 30rpx 50rpx;
|
||||
.flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 60rpx;
|
||||
align-items: center;
|
||||
padding-bottom: 20rpx;
|
||||
color: rgba(255, 255, 255, .7);
|
||||
font-size: 30rpx;
|
||||
.flex-item{
|
||||
text{
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
font-size: 34rpx;
|
||||
margin-left: 10rpx;
|
||||
}
|
||||
.flex-item-down{
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// footer
|
||||
.footer-flex{
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
padding: 30rpx 30rpx 50rpx;
|
||||
background: white;
|
||||
height: 90rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
z-index: 9;
|
||||
.footer-next{
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
width: calc(100% - 150rpx);
|
||||
background: $main-color;
|
||||
border-radius: 45rpx;
|
||||
color: white;
|
||||
text-align: center;
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
&[disabled]{
|
||||
opacity: .7;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
.footer-btn{
|
||||
width: 100rpx;
|
||||
text-align: center;
|
||||
line-height: 30rpx;
|
||||
font-size: 26rpx;
|
||||
color: #111;
|
||||
text-align: center;
|
||||
.footer-icon{
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 答题卡
|
||||
.block{
|
||||
background: white;
|
||||
border-radius: 20rpx;
|
||||
margin: 0 30rpx 30rpx;
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
&::after{
|
||||
content: " ";
|
||||
width: 90%;
|
||||
height: 100rpx;
|
||||
background: rgba(255, 255, 255, .5);
|
||||
position: absolute;
|
||||
left: 5%;
|
||||
bottom: -30rpx;
|
||||
border-radius: 20rpx;
|
||||
z-index: -1;
|
||||
}
|
||||
// 类型
|
||||
.answer-type{
|
||||
padding: 30rpx;
|
||||
text{
|
||||
background: $main-color;
|
||||
color: white;
|
||||
display: inline-block;
|
||||
line-height: 50rpx;
|
||||
height: 50rpx;
|
||||
padding: 0 20rpx;
|
||||
border-radius: 10rpx;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
}
|
||||
// 题目
|
||||
.answer-q{
|
||||
padding: 0 30rpx;
|
||||
font-size: 34rpx;
|
||||
line-height: 50rpx;
|
||||
color: #111;
|
||||
}
|
||||
// 答题
|
||||
.answer-list{
|
||||
padding: 30rpx;
|
||||
.answer-item{
|
||||
display: block;
|
||||
background: #f8f8f8;
|
||||
margin-bottom: 20rpx;
|
||||
border-radius: 10rpx;
|
||||
padding: 20rpx 30rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
position: relative;
|
||||
.answer-checkbox{
|
||||
width: 0;
|
||||
height: 0;
|
||||
position: absolute;
|
||||
overflow: hidden;
|
||||
}
|
||||
.answer-index{
|
||||
width: 50rpx;
|
||||
height: 60rpx;
|
||||
line-height: 60rpx;
|
||||
display: block;
|
||||
text-align: center;
|
||||
font-size: 30rpx;
|
||||
color: #111;
|
||||
}
|
||||
.answer-text{
|
||||
width: calc(100% - 100rpx);
|
||||
line-height: 40rpx;
|
||||
font-size: 32rpx;
|
||||
}
|
||||
.answer-icon{
|
||||
width: 50rpx;
|
||||
text-align: right;
|
||||
}
|
||||
&.active{
|
||||
color: #446EFE;
|
||||
background: #E4E8F7;
|
||||
.answer-index{
|
||||
color: #446EFE;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
536
pages/college/index.vue
Normal file
@@ -0,0 +1,536 @@
|
||||
<template>
|
||||
<view>
|
||||
<!-- 状态栏 -->
|
||||
<u-sticky bgColor="#FFFFFF">
|
||||
<view class="status_bar"></view>
|
||||
<view class="college-bar">
|
||||
<view class="college-bar-title">商学院</view>
|
||||
<view class="college-bar-input">
|
||||
<navigator class="navigator" url="">
|
||||
<image class="navigator-icon" src="@/static/icons/search_icon.png"></image>
|
||||
搜索
|
||||
</navigator>
|
||||
</view>
|
||||
<view class="college-bar-icons">
|
||||
<u-icon class="icon" name="bell" color="#333" bold size="24"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
</u-sticky>
|
||||
<!-- 轮播图 -->
|
||||
<view class="banner">
|
||||
<view class="banner-swiper">
|
||||
<u-swiper
|
||||
class="uswiper"
|
||||
height="100%"
|
||||
indicator
|
||||
radius="6"
|
||||
bgColor="#fff"
|
||||
indicatorMode="dot"
|
||||
:list="bannerArr"
|
||||
></u-swiper>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 快捷入口 -->
|
||||
<view class="diamond-flex">
|
||||
<view class="diamond-item">
|
||||
<image class="icon" src="@/static/icons/diamond_icon_00.png" mode="widthFix"></image>
|
||||
<view class="text">公开课</view>
|
||||
</view>
|
||||
<view class="diamond-item">
|
||||
<image class="icon" src="@/static/icons/diamond_icon_01.png" mode="widthFix"></image>
|
||||
<view class="text">网授课</view>
|
||||
</view>
|
||||
<view class="diamond-item">
|
||||
<image class="icon" src="@/static/icons/diamond_icon_02.png" mode="widthFix"></image>
|
||||
<view class="text">面授班</view>
|
||||
</view>
|
||||
<view class="diamond-item">
|
||||
<image class="icon" src="@/static/icons/diamond_icon_03.png" mode="widthFix"></image>
|
||||
<view class="text">图书</view>
|
||||
</view>
|
||||
<view class="diamond-item">
|
||||
<image class="icon" src="@/static/icons/diamond_icon_04.png" mode="widthFix"></image>
|
||||
<view class="text">优选课程</view>
|
||||
</view>
|
||||
<view class="diamond-item">
|
||||
<image class="icon" src="@/static/icons/diamond_icon_05.png" mode="widthFix"></image>
|
||||
<view class="text">课表</view>
|
||||
</view>
|
||||
<view class="diamond-item">
|
||||
<image class="icon" src="@/static/icons/diamond_icon_06.png" mode="widthFix"></image>
|
||||
<view class="text">全国分校</view>
|
||||
</view>
|
||||
<view class="diamond-item">
|
||||
<image class="icon" src="@/static/icons/diamond_icon_07.png" mode="widthFix"></image>
|
||||
<view class="text">师资团队</view>
|
||||
</view>
|
||||
<view class="diamond-item">
|
||||
<image class="icon" src="@/static/icons/diamond_icon_08.png" mode="widthFix"></image>
|
||||
<view class="text">法律法规</view>
|
||||
</view>
|
||||
<view class="diamond-item">
|
||||
<image class="icon" src="@/static/icons/diamond_icon_09.png" mode="widthFix"></image>
|
||||
<view class="text">增补勘误</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 快捷入口 -->
|
||||
<view class="quick-flex">
|
||||
<view class="quick-flex-item" :style="'background-image: url(' + require('@/static/imgs/quick_back_00.png') + ');'">
|
||||
<view class="quick-colum">
|
||||
<view class="quick-title">考试习题</view>
|
||||
<view class="quick-sumit">海量学习包</view>
|
||||
<image class="quick-icon" src="@/static/icons/quick_icon.png" mode="widthFix"></image>
|
||||
</view>
|
||||
</view>
|
||||
<view class="quick-flex-item" :style="'background-image: url(' + require('@/static/imgs/quick_back_01.png') + ');'" @click="onNav('CollegeTest')">
|
||||
<view class="quick-colum">
|
||||
<view class="quick-title">考试</view>
|
||||
<view class="quick-sumit">专业考试题</view>
|
||||
<image class="quick-icon" src="@/static/icons/quick_icon.png" mode="widthFix"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 热门网授课 -->
|
||||
<view class="college-title">
|
||||
<view class="college-title-text">热门网授课</view>
|
||||
<navigator class="college-title-more" url="">
|
||||
更多<u-icon class="college-title-icon" name="arrow-right" size="28rpx" color="#ADADAD"></u-icon>
|
||||
</navigator>
|
||||
</view>
|
||||
<view class="hot">
|
||||
<view class="hot-scroll">
|
||||
<view class="hot-item" v-for="(item, index) in 3" :key="index">
|
||||
<view class="cover">
|
||||
<image src="@/static/imgs/hot_img.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
<view class="title nowrap">2022年至尊先锋VIP班</view>
|
||||
<view class="flex">
|
||||
<view class="price nowrap"><text>¥</text>2200</view>
|
||||
<view class="number nowrap">1698人购买</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 名师面授班 -->
|
||||
<view class="college-title">
|
||||
<view class="college-title-text">名师面授班</view>
|
||||
<navigator class="college-title-more" url="">
|
||||
更多<u-icon class="college-title-icon" name="arrow-right" size="28rpx" color="#ADADAD"></u-icon>
|
||||
</navigator>
|
||||
</view>
|
||||
<view class="famous">
|
||||
<view class="famous-item" v-for="(item, index) in 3" :key="index">
|
||||
<image class="famous-cover" src="@/static/imgs/famous_img.png" mode="aspectFill"></image>
|
||||
<view class="famous-content">
|
||||
<view class="title nowrap">e学主客一体延考上岸班(上海)</view>
|
||||
<view class="number nowrap">2028人报名</view>
|
||||
<view class="price nowrap"><text>¥</text>2200</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 热销图书 -->
|
||||
<view class="college-title">
|
||||
<view class="college-title-text">热销图书</view>
|
||||
<navigator class="college-title-more" url="">
|
||||
更多<u-icon class="college-title-icon" name="arrow-right" size="28rpx" color="#ADADAD"></u-icon>
|
||||
</navigator>
|
||||
</view>
|
||||
<view class="new-book">
|
||||
<view class="new-book-item" v-for="(item, index) in 4" :key="index">
|
||||
<view class="cover">
|
||||
<image src="@/static/imgs/new_book.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
<view class="new-content">
|
||||
<view class="title nowrap">2022年客观题精讲8...</view>
|
||||
<view class="flex">
|
||||
<view class="price"><text>¥</text>2200</view>
|
||||
<view class="number">1698人购买</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 法考资讯 -->
|
||||
<view class="college-title">
|
||||
<view class="college-title-text">法考资讯</view>
|
||||
<navigator class="college-title-more" url="">
|
||||
更多<u-icon class="college-title-icon" name="arrow-right" size="28rpx" color="#ADADAD"></u-icon>
|
||||
</navigator>
|
||||
</view>
|
||||
<view class="news-lists">
|
||||
<view class="news-lists-item" v-for="(item, index) in 3" :key="index">
|
||||
<view class="text">
|
||||
<view class="title">法律服务工作者</view>
|
||||
<view class="submit">2028人浏览</view>
|
||||
</view>
|
||||
<image class="cover" src="@/static/imgs/news_img.png" mode="aspectFill"></image>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
bannerArr: [
|
||||
'https://cdn.uviewui.com/uview/swiper/swiper3.png',
|
||||
'https://cdn.uviewui.com/uview/swiper/swiper2.png',
|
||||
'https://cdn.uviewui.com/uview/swiper/swiper1.png',
|
||||
]
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
onNav(e) {
|
||||
this.$Router.push({
|
||||
name: e
|
||||
})
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// 热门课程
|
||||
.hot{
|
||||
padding: 20rpx 0 30rpx;
|
||||
.hot-scroll{
|
||||
overflow-x: scroll;
|
||||
white-space:nowrap;
|
||||
.hot-item{
|
||||
display: inline-block;
|
||||
margin-left: 30rpx;
|
||||
width: 40vw;
|
||||
&:last-child{
|
||||
margin-right: 30rpx;
|
||||
}
|
||||
.cover{
|
||||
width: 100%;
|
||||
padding-top: 67%;
|
||||
position: relative;
|
||||
border-radius: $radius-lg;
|
||||
overflow: hidden;
|
||||
image{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.title{
|
||||
padding-top: 20rpx;
|
||||
line-height: 40rpx;
|
||||
color: #111111;
|
||||
}
|
||||
.flex{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
line-height: 40rpx;
|
||||
padding-top: 10rpx;
|
||||
.price{
|
||||
width: 50%;
|
||||
color: $text-price;
|
||||
font-weight: bold;
|
||||
font-size: 32rpx;
|
||||
text{
|
||||
font-size: 80%;
|
||||
}
|
||||
}
|
||||
.number{
|
||||
width: 50%;
|
||||
text-align: right;
|
||||
font-size: 26rpx;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 名师课程班
|
||||
.famous{
|
||||
padding: 20rpx 30rpx 0;
|
||||
.famous-item{
|
||||
margin-bottom: 30rpx;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
.famous-cover{
|
||||
width: 160rpx;
|
||||
height: 160rpx;
|
||||
border-radius: $radius;
|
||||
overflow: hidden;
|
||||
}
|
||||
.famous-content{
|
||||
width: calc(100% - 160rpx);
|
||||
padding-left: 30rpx;
|
||||
box-sizing: border-box;
|
||||
.title{
|
||||
line-height: 40rpx;
|
||||
font-weight: 400;
|
||||
}
|
||||
.number{
|
||||
margin-top: 10rpx;
|
||||
font-size: 26rpx;
|
||||
line-height: 40rpx;
|
||||
color: #999999;
|
||||
}
|
||||
.price{
|
||||
padding-top: 30rpx;
|
||||
line-height: 40rpx;
|
||||
font-weight: bold;
|
||||
color: $text-price;
|
||||
font-size: 32rpx;
|
||||
text{
|
||||
font-size: 80%;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
// 热销图书
|
||||
.new-book{
|
||||
padding: 20rpx 15rpx 20rpx;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
&-item{
|
||||
width: calc(50% - 30rpx);
|
||||
margin: 0 15rpx 30rpx;
|
||||
background: white;
|
||||
box-shadow: 0 0 10rpx 10rpx rgba(0, 0, 0, .02);
|
||||
border-radius: $radius;
|
||||
.cover{
|
||||
position: relative;
|
||||
width: 100%;
|
||||
padding-top: 67%;
|
||||
overflow: hidden;
|
||||
border-radius: $radius;
|
||||
image{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.new-content{
|
||||
padding: 20rpx;
|
||||
.title{
|
||||
font-size: 32rpx;
|
||||
padding-bottom: 10rpx;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
.flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
line-height: 40rpx;
|
||||
.price{
|
||||
width: 50%;
|
||||
text-align: left;
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
color: $text-price;
|
||||
text{
|
||||
font-size: 80%;
|
||||
}
|
||||
}
|
||||
.number{
|
||||
width: 50%;
|
||||
text-align: right;
|
||||
font-size: 26rpx;
|
||||
color: gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 法考资讯
|
||||
.news-lists{
|
||||
padding-bottom: 30rpx;
|
||||
&-item{
|
||||
padding: 20rpx 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
.text{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
width: calc(100% - 200rpx);
|
||||
.title{
|
||||
font-size: 32rpx;
|
||||
color: #111111;
|
||||
line-height: 50rpx;
|
||||
@extend .ellipsis;
|
||||
}
|
||||
.submit{
|
||||
line-height: 40rpx;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
.cover{
|
||||
width: 200rpx;
|
||||
height: 133rpx;
|
||||
border-radius: $radius;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 通用标题
|
||||
.college-title{
|
||||
padding: 20rpx 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
&-text{
|
||||
font-weight: bold;
|
||||
font-size: 36rpx;
|
||||
color: #111111;
|
||||
}
|
||||
&-more{
|
||||
background: #F5F5F5;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
height: 50rpx;
|
||||
line-height: 50rpx;
|
||||
padding: 0 15rpx 0 25rpx;
|
||||
border-radius: 25rpx;
|
||||
}
|
||||
.college-title-icon{
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-top: -8rpx;
|
||||
}
|
||||
}
|
||||
// 快捷入口
|
||||
.quick-flex{
|
||||
padding: 20rpx 15rpx 30rpx;
|
||||
display: flex;
|
||||
&-item{
|
||||
position: relative;
|
||||
width: calc(50% - 30rpx);
|
||||
padding-top: calc(24% - 10rpx);
|
||||
background-size: cover;
|
||||
border-radius: $radius;
|
||||
margin: 0 15rpx;
|
||||
.quick-colum{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0 30rpx;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
color: white;
|
||||
.quick-title{
|
||||
font-weight: bold;
|
||||
font-size: 32rpx;
|
||||
@extend .nowrap;
|
||||
}
|
||||
.quick-sumit{
|
||||
font-size: 24rpx;
|
||||
@extend .nowrap;
|
||||
}
|
||||
.quick-icon{
|
||||
margin-top: 10rpx;
|
||||
width: 26rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 金刚区
|
||||
.diamond-flex{
|
||||
padding: 20rpx;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
.diamond-item{
|
||||
width: 20%;
|
||||
padding: 20rpx 10rpx;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
.icon{
|
||||
width: 70rpx;
|
||||
height: 70rpx;
|
||||
}
|
||||
.text{
|
||||
padding-top: 15rpx;
|
||||
color: #111111;
|
||||
font-size: 28rpx;
|
||||
@extend .nowrap;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 轮播图
|
||||
.banner{
|
||||
padding: 10rpx 30rpx;
|
||||
.banner-swiper{
|
||||
width: 100%;
|
||||
padding-top: 43%;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
.uswiper{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 自定义状态栏
|
||||
.college-bar{
|
||||
height: 44px;
|
||||
padding: 5px 30rpx 9px;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
&-title{
|
||||
width: 150rpx;
|
||||
font-weight: bold;
|
||||
line-height: 30px;
|
||||
color: #111111;
|
||||
font-size: 36rpx;
|
||||
@extend .nowrap;
|
||||
}
|
||||
&-input{
|
||||
height: 30px;
|
||||
width: calc(100% - 210rpx);
|
||||
margin: 0 $margin;
|
||||
.navigator{
|
||||
position: relative;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
display: inline-block;
|
||||
background: #F6F6F6;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
border-radius: 15px;
|
||||
padding: 0 50rpx 0 60rpx;
|
||||
color: #999999;
|
||||
font-size: 30rpx;
|
||||
text-align: center;
|
||||
.navigator-icon{
|
||||
position: absolute;
|
||||
left: 20rpx;
|
||||
top: 50%;
|
||||
width: 36rpx;
|
||||
height: 36rpx;
|
||||
margin-top: -18rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
&-icons{
|
||||
width: 60rpx;
|
||||
text-align: right;
|
||||
.icon{
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
110
pages/college/test.vue
Normal file
@@ -0,0 +1,110 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<block v-for="(item, index) in testArr" :key="index">
|
||||
<view class="block">
|
||||
<image class="icon" v-if="item.answer.is_finish" src="@/static/icons/test_icon.png" mode="widthFix"></image>
|
||||
<view class="title">{{item.title}}</view>
|
||||
<view class="text">考试时间:{{item.time}}分钟</view>
|
||||
<view class="text">试卷满分:{{item.questions.all.score}}分</view>
|
||||
<view class="text">及格分数:{{item.total}}分</view>
|
||||
<view class="submit">
|
||||
<view class="submit-item" v-if="item.questions.radio.count > 0">·单选{{item.questions.radio.count}}道题,每道题{{item.questions.radio.score}}分</view>
|
||||
<view class="submit-item" v-if="item.questions.multi.count > 0">·多选{{item.questions.multi.count}}道,每道题{{item.questions.multi.score}}分</view>
|
||||
<view class="submit-item" v-if="item.questions.yesno.count > 0">·判断题{{item.questions.yesno.count}}道,每道题{{item.questions.yesno.score}}分</view>
|
||||
<view class="submit-item">·倒计时结束后系统将提示交卷</view>
|
||||
</view>
|
||||
<view class="btns">
|
||||
<button @click="$Router.push({name: 'CollegeResults', params: {id: item.answer.last_answer_id}})" v-if="item.answer.is_finish">查看成绩</button>
|
||||
<button @click="$Router.push({name: 'CollegeAnswer', params: {id: item.evaluation_id}})" v-else>开始答题</button>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { evaluations } from '@/apis/interfaces/college.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
testArr: []
|
||||
};
|
||||
},
|
||||
onShow(){
|
||||
evaluations().then(res => {
|
||||
this.testArr = res
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.content{
|
||||
padding-top: 1rpx;
|
||||
}
|
||||
.block{
|
||||
margin: 40rpx 30rpx;
|
||||
background: white;
|
||||
border-radius: $radius;
|
||||
padding: $padding;
|
||||
position: relative;
|
||||
.icon{
|
||||
width: 168rpx;
|
||||
height: 168rpx;
|
||||
position: absolute;
|
||||
right: 50rpx;
|
||||
top: 50rpx;
|
||||
opacity: .5;
|
||||
}
|
||||
.title{
|
||||
position: relative;
|
||||
line-height: 50rpx;
|
||||
font-size: 36rpx;
|
||||
margin-bottom: 30rpx;
|
||||
color: #111111;
|
||||
&::after{
|
||||
position: absolute;
|
||||
content: " ";
|
||||
height: 50rpx;
|
||||
left: -30rpx;
|
||||
top: 0;
|
||||
background: $main-color;
|
||||
width: 8rpx;
|
||||
}
|
||||
}
|
||||
.text{
|
||||
font-size: 32rpx;
|
||||
line-height: 40rpx;
|
||||
margin-top: 10rpx;
|
||||
color: #111111;
|
||||
}
|
||||
.submit{
|
||||
margin-top: 30rpx;
|
||||
padding-top: 20rpx;
|
||||
border-top: solid 1rpx #F6F6F6;
|
||||
.submit-item{
|
||||
line-height: 40rpx;
|
||||
margin-top: 10rpx;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
.btns{
|
||||
padding-top: 50rpx;
|
||||
button{
|
||||
background: $main-color;
|
||||
color: white;
|
||||
border-radius: $radius-lg;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
font-size: 34rpx;
|
||||
&::after{border: none;}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
286
pages/college/testResults.vue
Normal file
@@ -0,0 +1,286 @@
|
||||
<template>
|
||||
<view>
|
||||
<block v-if="title != ''">
|
||||
<view class="header"></view>
|
||||
<!-- 分数 -->
|
||||
<view class="results">
|
||||
<view class="results-title">
|
||||
<block v-if="isAnswer">
|
||||
<image src="/static/CollegeResults/CollegeResults_icon_00.png" mode="widthFix"></image>恭喜您考试通过了~
|
||||
</block>
|
||||
<block v-else>
|
||||
<image src="/static/CollegeResults/CollegeResults_icon_01.png" mode="widthFix"></image>未通过,请再接再厉~
|
||||
</block>
|
||||
</view>
|
||||
<view class="results-flex">
|
||||
<view class="results-flex-item">
|
||||
<view class="results-flex-number">{{total}}<text>分</text></view>
|
||||
<view class="results-flex-text">考试分数</view>
|
||||
</view>
|
||||
<view class="results-flex-item">
|
||||
<view class="results-flex-number">{{accuracy}}<text>%</text></view>
|
||||
<view class="results-flex-text">正确率</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="results-footer">
|
||||
<text>{{title}}(满分{{allTotal}}分)</text>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 答题概况 -->
|
||||
<view class="situation-flex">
|
||||
<view class="situation-item">
|
||||
<view class="situation-val">{{count}}</view>
|
||||
<view class="situation-text">题目数量</view>
|
||||
</view>
|
||||
<view class="situation-item">
|
||||
<view class="situation-val">{{created}}</view>
|
||||
<view class="situation-text">考试日期</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 答题情况 -->
|
||||
<view class="instructions">
|
||||
<view class="instructions-center">
|
||||
<text>正确</text>
|
||||
<text>错误</text>
|
||||
</view>
|
||||
<!-- instructions -->
|
||||
<view class="instructions-flex">
|
||||
<view class="instructions-item" :class="{'active': isWrong(item)}" v-for="(item, index) in count" :key="index">
|
||||
<view class="number">{{item}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 按钮 -->
|
||||
<view class="btns">
|
||||
<button size="default" @click="onBack">返回</button>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { report } from "@/apis/interfaces/college.js"
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
isAnswer: false,
|
||||
title : '',
|
||||
total : '',
|
||||
allTotal: '',
|
||||
accuracy: '',
|
||||
count : '',
|
||||
created : '',
|
||||
wrong : '',
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
isWrong(){
|
||||
return (e) => {
|
||||
return this.wrong.findIndex(val => val == e) >= 0;
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
report(this.$Route.query.id).then(res => {
|
||||
let { title, total, veidoos, created_at, isAnswer } = res;
|
||||
this.isAnswer = isAnswer;
|
||||
this.title = title;
|
||||
this.total = total;
|
||||
this.created = created_at;
|
||||
this.count = veidoos.count.all
|
||||
this.accuracy = (veidoos.count.accuracy).substring(0, (veidoos.count.accuracy).length - 1);
|
||||
this.allTotal = veidoos.allTotal;
|
||||
this.wrong = veidoos.wrong;
|
||||
}).catch(err => {
|
||||
console.log(err)
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : "none"
|
||||
})
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
onBack(){
|
||||
this.$Router.back()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.header{
|
||||
background-image: url('/static/CollegeResults/CollegeResults_back.png');
|
||||
background-position: top center;
|
||||
background-size: cover;
|
||||
padding: 30rpx 30rpx 0;
|
||||
height: 300rpx;
|
||||
}
|
||||
// 按钮
|
||||
.btns{
|
||||
padding: 0 30rpx 50rpx;
|
||||
box-sizing: border-box;
|
||||
button[size="default"]{
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
border-radius: $radius-lg;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
font-size: 32rpx;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 答题情况
|
||||
.instructions{
|
||||
padding: 0 30rpx 30rpx;
|
||||
.instructions-center{
|
||||
padding-bottom: 30rpx;
|
||||
text-align: center;
|
||||
font-size: 28rpx;
|
||||
color: #111;
|
||||
text{
|
||||
margin: 0 30rpx;
|
||||
padding-left: 35rpx;
|
||||
color: #333;
|
||||
position: relative;
|
||||
line-height: 70rpx;
|
||||
&::after{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 50%;
|
||||
margin-top: -12rpx;
|
||||
height: 16rpx;
|
||||
width: 16rpx;
|
||||
content: " ";
|
||||
border-radius: 50%;
|
||||
background: $main-color;
|
||||
border:solid 7rpx #E4E8F7;
|
||||
}
|
||||
&:last-child::after{
|
||||
background-color: #FF4D4D;
|
||||
border-color: #F7E4E4;
|
||||
}
|
||||
}
|
||||
}
|
||||
.instructions-flex{
|
||||
margin: 0 -20rpx;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
flex-direction: row;
|
||||
align-items: flex-start;
|
||||
.instructions-item{
|
||||
width: calc(20% - 40rpx);
|
||||
padding-top: calc(20% - 42rpx);
|
||||
text-align: center;
|
||||
border-radius: 50%;
|
||||
background: #E4E8F7;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
margin: 20rpx;
|
||||
color: #446EFE;
|
||||
font-weight: bold;
|
||||
.number{
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 0;
|
||||
margin-top: -22rpx;
|
||||
line-height: 40rpx;
|
||||
height: 40rpx;
|
||||
font-size: 32rpx;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
&.active{
|
||||
background: #F7E4E4;
|
||||
color: #FF4D4D;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 考试概况
|
||||
.situation-flex{
|
||||
background: #F6F6F6;
|
||||
padding: 30rpx;
|
||||
border-radius: $radius;
|
||||
margin: 30rpx;
|
||||
display: flex;
|
||||
.situation-item{
|
||||
text-align: center;
|
||||
width: 50%;
|
||||
box-sizing: border-box;
|
||||
&:last-child{
|
||||
border-left: solid 1rpx #ddd;
|
||||
}
|
||||
.situation-val{
|
||||
font-weight: bold;
|
||||
color: #111111;
|
||||
font-size: 34rpx;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
.situation-text{
|
||||
color: #999999;
|
||||
font-size: 28rpx;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 考试结果
|
||||
.results{
|
||||
background-color: white;
|
||||
border-radius: $radius;
|
||||
margin: -300rpx 30rpx 0;
|
||||
box-shadow: 0 0 15rpx 15rpx rgba(0, 0, 0, .02);
|
||||
padding: 50rpx 30rpx;
|
||||
box-sizing: border-box;
|
||||
.results-title{
|
||||
font-weight: bold;
|
||||
font-size: 36rpx;
|
||||
text-align: center;
|
||||
line-height: 90rpx;
|
||||
image{
|
||||
width: 68rpx;
|
||||
height: 68rpx;
|
||||
vertical-align: middle;
|
||||
margin-right: 10rpx;
|
||||
}
|
||||
}
|
||||
.results-flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding-top: 30rpx;
|
||||
padding-bottom: 20rpx;
|
||||
.results-flex-item{
|
||||
width: 50%;
|
||||
text-align: center;
|
||||
.results-flex-number{
|
||||
color: $main-color;
|
||||
font-weight: bold;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-size: 50rpx;
|
||||
text{
|
||||
font-size: 30rpx;
|
||||
padding-left: 10rpx;
|
||||
}
|
||||
}
|
||||
.results-flex-text{
|
||||
font-size: 28rpx;
|
||||
color: #111111;
|
||||
}
|
||||
}
|
||||
}
|
||||
.results-footer{
|
||||
text-align: center;
|
||||
padding-top: 30rpx;
|
||||
text{
|
||||
display: inline-block;
|
||||
background: #F6F6F6;
|
||||
height: 70rpx;
|
||||
border-radius: 40rpx;
|
||||
line-height: 70rpx;
|
||||
padding: 0 50rpx;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
328
pages/index/index.vue
Normal file
@@ -0,0 +1,328 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<!-- <video src="https://t12.cdn2020.com:12337/video/m3u8/2021/10/11/d647a87d/index.m3u8"></video> -->
|
||||
<view class="header">
|
||||
<view class="banner">
|
||||
<u-swiper
|
||||
class="banner-swiper"
|
||||
:list="bannerArr"
|
||||
:indicator="true"
|
||||
previousMargin="20"
|
||||
nextMargin="20"
|
||||
circular
|
||||
radius="10"
|
||||
bgColor="#ffffff"
|
||||
height="100%"
|
||||
></u-swiper>
|
||||
</view>
|
||||
<view class="notice">
|
||||
<view class="notice-title">
|
||||
<image class="notice-icon" src="@/static/imgs/notice-icon.png" mode="widthFix"></image>公告
|
||||
</view>
|
||||
<u-notice-bar
|
||||
icon=""
|
||||
:text="notice"
|
||||
direction="column"
|
||||
bgColor="#fff"
|
||||
color="#111111"
|
||||
></u-notice-bar>
|
||||
<view class="notice-more">更多<u-icon class="more-icon" size="28rpx" color="#999" name="arrow-right"></u-icon></view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 自由服务包 -->
|
||||
<view class="free">
|
||||
<image class="free-img" src="@/static/imgs/index-img.png" mode="widthFix"></image>
|
||||
</view>
|
||||
<!-- 经法产品 -->
|
||||
<view class="block">
|
||||
<view class="block-title">
|
||||
<view class="title">经法产品</view>
|
||||
<view class="more">更多<u-icon class="more-icon" size="28rpx" color="#999" name="arrow-right"></u-icon></view>
|
||||
</view>
|
||||
<view class="the-tabs">
|
||||
<block v-for="(item, index) in theTabs" :key="index">
|
||||
<view class="the-tabs-item" :class="{'active': item.id == theTabId}" @click="onTheTab(item)">{{item.title}}</view>
|
||||
</block>
|
||||
<view class="the-tabs-acitve-block" :style="theTabStyle"></view>
|
||||
</view>
|
||||
<view class="the-flex">
|
||||
<view class="the-flex-item" v-for="(item, index) in 3" :key="index">
|
||||
<view class="cover"></view>
|
||||
<view class="title nowrap">中国工商信用卡服务...</view>
|
||||
<view class="price nowrap"><text>¥</text>2200</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 综法产品 -->
|
||||
<view class="block">
|
||||
<view class="block-title">
|
||||
<view class="title">综法产品</view>
|
||||
<view class="more">更多<u-icon class="more-icon" size="28rpx" color="#999" name="arrow-right"></u-icon></view>
|
||||
</view>
|
||||
<view class="zong-list">
|
||||
<view class="zong-list-item" v-for="(item, index) in 4" :key="index">
|
||||
<image class="cover" src="@/static/imgs/index-pack-01.png" mode="aspectFill"></image>
|
||||
<view class="colum-flex">
|
||||
<view class="title nowrap">2022年尊享综法服务包</view>
|
||||
<view class="price nowrap"><text>¥</text>2200</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { region } from '@/apis/interfaces/address.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
theTabs : [
|
||||
{ id: 1, title: '全部' },
|
||||
{ id: 2, title: '信用卡' },
|
||||
{ id: 3, title: '网贷' },
|
||||
{ id: 4, title: '信用贷' },
|
||||
],
|
||||
theTabId : 1,
|
||||
theTabStyle : {
|
||||
left: '0%'
|
||||
},
|
||||
bannerArr : [
|
||||
'https://cdn.uviewui.com/uview/swiper/swiper1.png',
|
||||
'https://cdn.uviewui.com/uview/swiper/swiper2.png',
|
||||
'https://cdn.uviewui.com/uview/swiper/swiper3.png',
|
||||
],
|
||||
notice : [
|
||||
'王**信用卡法务咨询办理成功(今日)',
|
||||
'王**信用卡法务咨询办理成功(今日)',
|
||||
'王**信用卡法务咨询办理成功(今日)',
|
||||
]
|
||||
}
|
||||
},
|
||||
onLoad() {
|
||||
|
||||
},
|
||||
methods: {
|
||||
// 选择城市节点
|
||||
onCityPicker(e){
|
||||
console.log(e)
|
||||
this.getRegion(e.value);
|
||||
},
|
||||
// 获取城市数据
|
||||
getRegion(id){
|
||||
region({
|
||||
parent_id: id
|
||||
}).then(res => {
|
||||
console.log(res)
|
||||
})
|
||||
},
|
||||
// 经法产品筛选
|
||||
onTheTab(e){
|
||||
if(e.id != this.theTabId){
|
||||
let index = this.theTabs.findIndex(val => val.id === e.id)
|
||||
this.theTabStyle = {
|
||||
left: index * (100 / this.theTabs.length) + '%'
|
||||
}
|
||||
this.theTabId = e.id
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.header{
|
||||
background-color: white;
|
||||
padding-top: 20rpx;
|
||||
}
|
||||
// 轮播图
|
||||
.banner{
|
||||
position: relative;
|
||||
width: 100%;
|
||||
padding-top: 43%;
|
||||
.banner-swiper{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
// 轮播
|
||||
.notice{
|
||||
background: white;
|
||||
padding: $padding;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
.notice-title{
|
||||
background-color: #ECF0FF;
|
||||
color: #446EFE;
|
||||
height: 60rpx;
|
||||
line-height: 60rpx;
|
||||
width: 130rpx;
|
||||
text-align: center;
|
||||
font-size: 28rpx;
|
||||
font-weight: bold;
|
||||
border-radius: 20rpx;
|
||||
.notice-icon{
|
||||
width: 32rpx;
|
||||
vertical-align: middle;
|
||||
margin-bottom: 8rpx;
|
||||
margin-right: 5rpx;
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
.notice-more{
|
||||
font-size: 14px;
|
||||
height: 50rpx;
|
||||
border-radius: 25rpx;
|
||||
box-sizing: border-box;
|
||||
line-height: 50rpx;
|
||||
text-align: center;
|
||||
color: #999999;
|
||||
.more-icon{
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 自由服务包
|
||||
.free{
|
||||
padding: $padding;
|
||||
.free-img{
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
// 综法
|
||||
.zong-list{
|
||||
padding: 0 $padding 20rpx;
|
||||
margin-bottom: 30rpx;
|
||||
&-item{
|
||||
position: relative;
|
||||
margin-bottom: 30rpx;
|
||||
padding-left: 210rpx;
|
||||
height: 180rpx;
|
||||
.cover{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 180rpx;
|
||||
height: 180rpx;
|
||||
}
|
||||
.colum-flex{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-around;
|
||||
height: 180rpx;
|
||||
.title{
|
||||
line-height: 40rpx;
|
||||
font-size: 32rpx;
|
||||
color: #111111;
|
||||
}
|
||||
.price{
|
||||
line-height: 40rpx;
|
||||
font-weight: bold;
|
||||
color: $text-price;
|
||||
font-size: 34rpx;
|
||||
text{
|
||||
font-size: 80%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 经法
|
||||
.the-tabs{
|
||||
background: #ECF0FF;
|
||||
margin: 0 $margin;
|
||||
height: 70rpx;
|
||||
border-radius: 35rpx;
|
||||
display: flex;
|
||||
position: relative;
|
||||
&-item{
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
width: 25%;
|
||||
line-height: 70rpx;
|
||||
text-align: center;
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
transition: all .4s;
|
||||
&.active{
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
&-acitve-block{
|
||||
width: 25%;
|
||||
height: 70rpx;
|
||||
background: #446EFE;
|
||||
border-radius: 35rpx;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
transition: all .4s;
|
||||
}
|
||||
}
|
||||
.the-flex{
|
||||
padding: $padding 20rpx;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
&-item{
|
||||
width: calc(33.33% - 20rpx);
|
||||
margin: 0 10rpx;
|
||||
.cover{
|
||||
width: 100%;
|
||||
padding-top: 100%;
|
||||
background: #f8f8f8;
|
||||
border-radius: 10rpx;
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
.title{
|
||||
font-size: 32rpx;
|
||||
color: #111111;
|
||||
padding: 10rpx 0;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
.price{
|
||||
line-height: 40rpx;
|
||||
font-weight: bold;
|
||||
color: $text-price;
|
||||
font-size: 34rpx;
|
||||
text{
|
||||
font-size: 80%;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 模块
|
||||
.block{
|
||||
background-color: white;
|
||||
border-radius: $radius;
|
||||
margin: 0 $margin $margin;
|
||||
.block-title{
|
||||
padding: 0 $padding;
|
||||
height: 100rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.title{
|
||||
font-weight: bold;
|
||||
color: #111111;
|
||||
font-size: 36rpx;
|
||||
}
|
||||
.more{
|
||||
background-color: #F5F5F5;
|
||||
font-size: 28rpx;
|
||||
height: 50rpx;
|
||||
border-radius: 25rpx;
|
||||
width: 120rpx;
|
||||
padding-left: 10rpx;
|
||||
box-sizing: border-box;
|
||||
line-height: 50rpx;
|
||||
text-align: center;
|
||||
color: #999999;
|
||||
.more-icon{
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
230
pages/pay/pay.vue
Normal file
@@ -0,0 +1,230 @@
|
||||
<template>
|
||||
<view class="pay">
|
||||
<!-- 支付金额 -->
|
||||
<view class="header">
|
||||
<view class="header-title">实付金额</view>
|
||||
<view class="header-price"><text>¥</text>{{total}}</view>
|
||||
<view class="header-no">订单号:{{orderNo}}</view>
|
||||
</view>
|
||||
<!-- 选择支付方式 -->
|
||||
<view class="choose">
|
||||
<radio-group @change="payMethod = $event.detail.value">
|
||||
<label class="choose-item">
|
||||
<view class="choose-text nowrap">
|
||||
<image src="@/static/icons/pay_alipay.png" mode="aspectFill"></image>
|
||||
火力值支付
|
||||
</view>
|
||||
<radio class="choose-radio" value="coin" checked></radio>
|
||||
</label>
|
||||
<label class="choose-item nowrap">
|
||||
<view class="choose-text">
|
||||
<image src="@/static/icons/pay_code.png" mode="aspectFill"></image>
|
||||
付款码支付
|
||||
</view>
|
||||
<radio class="choose-radio" value="code"></radio>
|
||||
</label>
|
||||
<label class="choose-item nowrap">
|
||||
<view class="choose-text">
|
||||
<image src="@/static/icons/pay_wechat.png" mode="aspectFill"></image>
|
||||
微信支付
|
||||
</view>
|
||||
<radio class="choose-radio" value="wx"></radio>
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
<!-- 确认支付 -->
|
||||
<view class="payBtn">
|
||||
<button size="default" @click="onPay">支付</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { info } from '@/apis/interfaces/order.js'
|
||||
import { coinPay, diffCoinPay } from '@/apis/interfaces/pay.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
orderId : '',
|
||||
diffId : '',
|
||||
payMethod : 'coin',
|
||||
payType : 'price',
|
||||
total : '0.00',
|
||||
orderNo : ''
|
||||
};
|
||||
},
|
||||
created() {
|
||||
uni.showLoading({
|
||||
title: '获取订单信息...',
|
||||
mask : true
|
||||
})
|
||||
info(this.$Route.query.orderId).then(res => {
|
||||
let { total, order_no, business_order_id, diff_prices, diff } = res
|
||||
this.orderId = business_order_id
|
||||
this.diffId = diff.business_order_diff_price_id
|
||||
this.payType = this.$Route.query.paytype
|
||||
this.total = this.payType === 'diff' ? diff_prices: total
|
||||
this.orderNo = order_no
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 支付方式
|
||||
onPay(){
|
||||
switch(this.payMethod){
|
||||
case 'coin':
|
||||
if(this.payType == 'price') this.onCoinPay()
|
||||
if(this.payType == 'diff') this.onDiffCoinPay()
|
||||
break;
|
||||
case 'code':
|
||||
uni.showToast({
|
||||
title: '付款码支付暂未开放,请敬期待',
|
||||
icon : 'none'
|
||||
})
|
||||
break;
|
||||
case 'wx':
|
||||
uni.showToast({
|
||||
title: '微信支付暂未开放,请敬期待',
|
||||
icon : 'none'
|
||||
})
|
||||
break;
|
||||
}
|
||||
},
|
||||
// 火力值支付
|
||||
onCoinPay(){
|
||||
wx.showLoading({
|
||||
title: '支付中...',
|
||||
mask : true
|
||||
})
|
||||
console.log(this.orderId)
|
||||
coinPay(this.orderId).then(res => {
|
||||
wx.showModal({
|
||||
title : '提示',
|
||||
content : '待缴费成功,请提醒用户尽快签约并完善资料',
|
||||
showCancel : false,
|
||||
confirmColor: '#446EFE',
|
||||
success : () => {
|
||||
this.onRrmoveItem()
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
console.log(err)
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 活力值补差价支付
|
||||
onDiffCoinPay(){
|
||||
diffCoinPay(this.diffId).then(res => {
|
||||
wx.showModal({
|
||||
title : '提示',
|
||||
content : '补缴差价成功',
|
||||
showCancel : false,
|
||||
confirmColor: '#446EFE',
|
||||
success : () => {
|
||||
this.onRrmoveItem()
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 更新订单列表
|
||||
onRrmoveItem(){
|
||||
this.$store.commit('setOrderId', this.orderId)
|
||||
this.$Router.back()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.pay{
|
||||
background: #f8f8f8;
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
padding: 30rpx 30rpx 60rpx;
|
||||
box-sizing: border-box;
|
||||
.header{
|
||||
padding: 80rpx 0 100rpx;
|
||||
text-align: center;
|
||||
.header-title{
|
||||
font-size: 32rpx;
|
||||
padding-bottom: 10rpx;
|
||||
}
|
||||
.header-price{
|
||||
font-size: 68rpx;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
font-weight: bold;
|
||||
text{
|
||||
font-size: 60%;
|
||||
}
|
||||
}
|
||||
.header-no{
|
||||
padding-top: 20rpx;
|
||||
font-size: 28rpx;
|
||||
color: gray;
|
||||
}
|
||||
}
|
||||
// 选择支付方式
|
||||
.choose{
|
||||
background-color: white;
|
||||
border-radius: 20rpx;
|
||||
padding: 10rpx 30rpx;
|
||||
.choose-item{
|
||||
display: block;
|
||||
padding: 20rpx 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
&:last-child{
|
||||
border-bottom: none;
|
||||
}
|
||||
.choose-text{
|
||||
line-height: 80rpx;
|
||||
font-size: 32rpx;
|
||||
padding-left: 80rpx;
|
||||
position: relative;
|
||||
image{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 15rpx;
|
||||
width: 50rpx;
|
||||
height: 50rpx;
|
||||
border-radius: 10rpx;
|
||||
}
|
||||
}
|
||||
.choose-radio{
|
||||
transform:scale(0.8)
|
||||
}
|
||||
}
|
||||
}
|
||||
// 按钮
|
||||
.payBtn{
|
||||
padding: 50rpx 0;
|
||||
button[size="default"]{
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
padding: 0;
|
||||
border-radius: 20rpx;
|
||||
background-color: $main-color;
|
||||
color: white;
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
25
pages/richText/richText.vue
Normal file
@@ -0,0 +1,25 @@
|
||||
<template>
|
||||
<view>
|
||||
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
},
|
||||
created() {
|
||||
console.log(this.$Route.query.id)
|
||||
uni.setNavigationBarTitle({
|
||||
title: '服务协议'
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
320
pages/transfers/lists.vue
Normal file
@@ -0,0 +1,320 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<!-- tabs -->
|
||||
<u-sticky bgColor="#FFF" zIndex="9" >
|
||||
<u-tabs
|
||||
:current="tabsCurrent"
|
||||
:list="tabs"
|
||||
:scrollable="false"
|
||||
lineColor="#446EFE"
|
||||
:activeStyle="{
|
||||
color: '#111',
|
||||
fontWeight: 'bold',
|
||||
fontSize: '32rpx'
|
||||
}"
|
||||
:inactiveStyle="{
|
||||
color: '#606266',
|
||||
fontSize: '30rpx'
|
||||
}"
|
||||
@click="onTabs"
|
||||
></u-tabs>
|
||||
</u-sticky>
|
||||
<!-- 订单管理列表 -->
|
||||
<view class="orders" v-if="orders.length > 0">
|
||||
<view class="orders-item" v-for="(item, index) in orders" :key="index">
|
||||
<view class="orders-flex">
|
||||
<view class="no nowrap">{{item.order.order_no}}</view>
|
||||
<view class="state">{{item.status.text}}</view>
|
||||
</view>
|
||||
<view class="orders-content">
|
||||
<view class="orders-content-item">
|
||||
<label>业务类型</label>
|
||||
<view class="nowrap orders-content-type">
|
||||
<text v-for="(itemType, indexType) in item.order.item_type" :key="indexType" v-if="itemType.number > 0">{{itemType.title}}x{{itemType.number}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="orders-content-block">
|
||||
<view class="item-flex" v-for="(citem, cindex) in item.order.items" :key="cindex">
|
||||
<view class="item-flex-title">{{citem.institution.title}}</view>
|
||||
<view class="item-flex-value">¥{{citem.price}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="orders-content-item" v-if="item.order.total > 0">
|
||||
<label>咨询服务费</label>
|
||||
<view class="nowrap">¥{{item.order.total}}</view>
|
||||
</view>
|
||||
<view class="orders-content-item">
|
||||
<label>下单时间</label>
|
||||
<view class="nowrap">{{item.created_at}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="orders-flex">
|
||||
<view class="user">
|
||||
<image class="user-cover" :src="item.to.avatar" mode="aspectFill"></image>
|
||||
<view class="user-name">{{item.to.nickname}}</view>
|
||||
</view>
|
||||
<view class="btns">
|
||||
<block v-if="type == 'in' && tabsCurrent == 0">
|
||||
<view class="btns-item btns-red" @click="onRefused(item.business_order_id)">拒绝</view>
|
||||
<view class="btns-item btns-border" @click="onAgree(item.business_order_id)">接收</view>
|
||||
</block>
|
||||
<view class="btns-item" @click="$Router.push({name: 'OrderInfo', params: {orderId: item.business_order_id}})">查看</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 订单是空的 -->
|
||||
<view class="order-null" v-else>
|
||||
<u-empty
|
||||
mode="order"
|
||||
icon="http://cdn.uviewui.com/uview/empty/order.png"
|
||||
text="暂无相关订单"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { lists, transferAgree, transferRefuse } from '@/apis/interfaces/transfers.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tabsCurrent : 0,
|
||||
type : 'in',
|
||||
tabs : [
|
||||
{val: 1, name: '转让中'},
|
||||
{val: 3, name: '已转让'},
|
||||
{val: 2, name: '转让失败'},
|
||||
],
|
||||
orders : []
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.type = this.$Route.query.type;
|
||||
this.getList()
|
||||
},
|
||||
methods: {
|
||||
// 切换列表
|
||||
onTabs(e){
|
||||
this.tabsCurrent = e.index
|
||||
this.getList()
|
||||
},
|
||||
// 变更当前列表状态
|
||||
removeListVal(id){
|
||||
let ListArr = this.orders
|
||||
let ListIndex = ListArr.findIndex(val => val.business_order_id == id)
|
||||
if(ListIndex >= 0){
|
||||
this.orders.splice(ListIndex, 1)
|
||||
}
|
||||
this.$store.commit('setOrderId', null)
|
||||
},
|
||||
// 接收订单
|
||||
onAgree(id){
|
||||
uni.showModal({
|
||||
title : '接收提醒',
|
||||
content : '确认接收该订单嘛?',
|
||||
confirmText : '接收',
|
||||
success : ModalRes => {
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
if(ModalRes.confirm){
|
||||
transferAgree(id).then(res => {
|
||||
uni.showToast({
|
||||
title: res
|
||||
})
|
||||
// 移出操作后的订单
|
||||
this.removeItem(id)
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
// 拒绝订单
|
||||
onRefused(id){
|
||||
uni.showModal({
|
||||
title : '接收提醒',
|
||||
content : '确认接收该订单嘛?',
|
||||
confirmText : '拒绝',
|
||||
success : ModalRes => {
|
||||
if(ModalRes.confirm){
|
||||
transferRefuse(id).then(res => {
|
||||
uni.showToast({
|
||||
title: res
|
||||
})
|
||||
// 移出操作后的订单
|
||||
this.removeItem(id)
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
// 更新转让单
|
||||
removeItem(id){
|
||||
let index = this.orders.findIndex(val => val.business_order_id == id)
|
||||
if(index >= 0){
|
||||
this.orders.splice(index, 1)
|
||||
}
|
||||
},
|
||||
// 获取列表
|
||||
getList(){
|
||||
lists({
|
||||
status: this.tabs[this.tabsCurrent].val,
|
||||
type : this.type
|
||||
}).then(res => {
|
||||
let { data } = res;
|
||||
this.orders = data
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// 订单为空
|
||||
.order-null{
|
||||
height: 80vh;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
// 订单列表
|
||||
.orders{
|
||||
padding: 30rpx 0 10rpx;
|
||||
.orders-item{
|
||||
margin: 0 30rpx 20rpx;
|
||||
background-color: white;
|
||||
border-radius: $radius;
|
||||
}
|
||||
.orders-content{
|
||||
padding: 20rpx 30rpx;
|
||||
&-item{
|
||||
line-height: 70rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
font-size: 30rpx;
|
||||
color: #111111;
|
||||
label{
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
&-type{
|
||||
text{
|
||||
margin-right: 30rpx;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
&::after{
|
||||
position: absolute;
|
||||
content: "/";
|
||||
width: 30rpx;
|
||||
text-align: center;
|
||||
font-size: 30rpx;
|
||||
top: 0;
|
||||
right: -30rpx;
|
||||
}
|
||||
&:last-child{
|
||||
margin-right: 0;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
&-block{
|
||||
background: rgba(68, 110, 254, .03);
|
||||
padding: 20rpx;
|
||||
font-size: 28rpx;
|
||||
border-radius: 10rpx;
|
||||
margin: 10rpx 0;
|
||||
.item-flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.orders-flex{
|
||||
border-bottom: solid 1rpx #F6F6F6;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 20rpx $padding;
|
||||
&:last-child{
|
||||
border-top: solid 1rpx #F6F6F6;
|
||||
border-bottom: none;
|
||||
}
|
||||
.no{
|
||||
font-size: 30rpx;
|
||||
color: #111;
|
||||
line-height: 60rpx;
|
||||
width: calc(100% - 230rpx);
|
||||
}
|
||||
.state{
|
||||
color: $main-color;
|
||||
font-weight: bold;
|
||||
font-size: 30rpx;
|
||||
line-height: 60rpx;
|
||||
width: 200rpx;
|
||||
text-align: right;
|
||||
}
|
||||
.user{
|
||||
padding-left: 90rpx;
|
||||
position: relative;
|
||||
min-height: 70rpx;
|
||||
box-sizing: border-box;
|
||||
width: calc(100% - 400rpx);
|
||||
.user-cover{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 70rpx;
|
||||
height: 70rpx;
|
||||
border-radius: 50%;
|
||||
background: #ddd;
|
||||
}
|
||||
.user-name{
|
||||
line-height: 70rpx;
|
||||
font-size: 30rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.btns{
|
||||
width: 400rpx;
|
||||
text-align: right;
|
||||
.btns-item{
|
||||
display: inline-block;
|
||||
height: 70rpx;
|
||||
line-height: 70rpx;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
border-radius: 35rpx;
|
||||
padding: 0 30rpx;
|
||||
font-size: 28rpx;
|
||||
&.btns-border{
|
||||
line-height: 66rpx;
|
||||
box-sizing: border-box;
|
||||
border:solid 1rpx $main-color;
|
||||
background: white;
|
||||
color: $main-color;
|
||||
margin-right: 20rpx;
|
||||
}
|
||||
&.btns-red{
|
||||
line-height: 66rpx;
|
||||
box-sizing: border-box;
|
||||
border:solid 1rpx red;
|
||||
background: white;
|
||||
color: red;
|
||||
margin-right: 20rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
284
pages/user/certification.vue
Normal file
@@ -0,0 +1,284 @@
|
||||
<template>
|
||||
<view>
|
||||
<block v-if="!eSign">
|
||||
<!-- 上传身份证 -->
|
||||
<view class="identity-title">请拍摄并上传你的身份证照片</view>
|
||||
<view class="identity-flex">
|
||||
<view class="identity-item" @click="updImg('frontCard')">
|
||||
<view class="upd" style="background-image: url('/static/imgs/card_front.png');">
|
||||
<image v-if="frontCard.showpath != ''" :src="frontCard.showpath" class="idcardImg-img" mode="aspectFit"></image>
|
||||
</view>
|
||||
<view class="text">拍摄正面</view>
|
||||
</view>
|
||||
<view class="identity-item" @click="updImg('backCard')">
|
||||
<view class="upd" style="background-image: url('/static/imgs/card_verso.png');">
|
||||
<image v-if="backCard.showpath != ''" :src="backCard.showpath" class="idcardImg-img" mode="aspectFit"></image>
|
||||
</view>
|
||||
<view class="text">拍摄反面</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<!-- 身份证信息 -->
|
||||
<view class="identity-from" v-if="realData.name != ''">
|
||||
<view class="identity-inpus">
|
||||
<label>真实姓名</label>
|
||||
<input type="text" placeholder="-" v-model="realData.name" disabled>
|
||||
</view>
|
||||
<view class="identity-inpus">
|
||||
<label>身份证号</label>
|
||||
<input type="idcard" placeholder="-" v-model="realData.id_card" disabled>
|
||||
</view>
|
||||
<view class="identity-inpus">
|
||||
<label>户籍地</label>
|
||||
<input type="idcard" placeholder="-" v-model="realData.organ" disabled>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 按钮 -->
|
||||
<view class="btn" v-if="!eSign">
|
||||
<button size="default" @click="idCard && !isPathChange ? getSignUrl(): realInfo()">{{idCard && !isPathChange ? '人脸认证': '提交身份信息'}}</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { certification, identityOcr, certified, eSigns } from '@/apis/interfaces/user'
|
||||
import { uploads } from '@/apis/interfaces/uploading'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
idCard : false,
|
||||
eSign : false,
|
||||
isPathChange: false,
|
||||
frontCard : { showpath: '', path : '' }, // 身份证正面
|
||||
backCard : { showpath: '', path : '' }, // 身份证反面
|
||||
realData : {
|
||||
name : '',
|
||||
id_card : '',
|
||||
organ : ''
|
||||
}, // 个人信息
|
||||
signUrl : '',
|
||||
isRefresh : false
|
||||
}
|
||||
},
|
||||
onShow(){
|
||||
if(this.isRefresh){
|
||||
this.getCertified()
|
||||
this.isRefresh = false
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getCertified()
|
||||
},
|
||||
methods: {
|
||||
// 检查实名结果
|
||||
getCertified(){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
certified().then(res => {
|
||||
let { id_card, e_sign } = res;
|
||||
this.idCard = id_card;
|
||||
this.eSign = e_sign;
|
||||
if(this.idCard){
|
||||
this.getInfo()
|
||||
return
|
||||
}
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon: "none"
|
||||
})
|
||||
})
|
||||
},
|
||||
// 提交真实信息
|
||||
getInfo(){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
identityOcr().then(res => {
|
||||
this.frontCard.showpath = res.front_card
|
||||
this.backCard.showpath = res.back_card
|
||||
this.realData = res;
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon: "none"
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
// 提交照片认证信息
|
||||
realInfo() {
|
||||
uni.showLoading({
|
||||
title: '提交中信息...',
|
||||
mask : true
|
||||
})
|
||||
certification({
|
||||
front_card: this.frontCard.path,
|
||||
back_card : this.backCard.path,
|
||||
redirect_url: 'http://web.douhuofalv.com/app/e-sign?sign_type=personal',
|
||||
app_scheme: 'doufire://'
|
||||
}).then(res => {
|
||||
console.log(res)
|
||||
let certificationData = res;
|
||||
wx.showModal({
|
||||
title : '提示',
|
||||
content : '您的身份信息已上传,请完成人脸识别以确认您是本人',
|
||||
showCancel : false,
|
||||
success : () => {
|
||||
this.isPathChange = false
|
||||
this.realData = certificationData.certification
|
||||
this.signUrl = certificationData.sign.authShortUrl
|
||||
this.getSignUrl()
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon: "none"
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
// 人脸识别
|
||||
getSignUrl(){
|
||||
if(this.signUrl != ''){
|
||||
this.isRefresh = true
|
||||
plus.runtime.openURL(this.signUrl)
|
||||
return
|
||||
}
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
eSigns({
|
||||
redirect_url: 'http://web.douhuofalv.com/app/e-sign?sign_type=personal',
|
||||
app_scheme: 'doufire://'
|
||||
}).then(res => {
|
||||
this.isRefresh = true
|
||||
plus.runtime.openURL(res.authShortUrl)
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon: "none"
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
// 上传图片
|
||||
updImg(type){
|
||||
uni.chooseImage({
|
||||
count : 1,
|
||||
success : path => {
|
||||
uploads([{
|
||||
uri : path.tempFilePaths[0]
|
||||
}], {
|
||||
driver: "private-oss"
|
||||
}).then(res => {
|
||||
this.isPathChange = true
|
||||
this[type].showpath = res.url[0]
|
||||
this[type].path = res.path[0]
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// 身份信息
|
||||
.identity-from{
|
||||
border-bottom: 30rpx solid #f8f8f8;
|
||||
.identity-inpus{
|
||||
display: flex;
|
||||
border-bottom: solid 1rpx #F6F6F6;
|
||||
padding: 0 30rpx;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
font-size: 32rpx;
|
||||
&:last-child{
|
||||
border-bottom: none;
|
||||
}
|
||||
label{
|
||||
width: 180rpx;
|
||||
color: gray;
|
||||
}
|
||||
input{
|
||||
height: 100rpx;
|
||||
font-size: 32rpx;
|
||||
width: calc(100% - 180rpx);
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 身份证上传
|
||||
.identity-title{
|
||||
padding: 0 30rpx;
|
||||
line-height: 90rpx;
|
||||
font-size: 30rpx;
|
||||
color: #111111;
|
||||
border-top: 30rpx solid #f8f8f8;
|
||||
color: gray;
|
||||
}
|
||||
.identity-flex{
|
||||
display: flex;
|
||||
padding: 0 20rpx 30rpx;
|
||||
.identity-item{
|
||||
width: calc(50% - 20rpx);
|
||||
margin: 0 10rpx;
|
||||
background-color: rgba(68, 110, 254, .1);
|
||||
border-radius: 10rpx;
|
||||
overflow: hidden;
|
||||
.upd{
|
||||
padding-top: 63%;
|
||||
position: relative;
|
||||
background-size: 56%;
|
||||
background-position: center;
|
||||
background-repeat: no-repeat;
|
||||
.idcardImg-img{
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.text{
|
||||
text-align: center;
|
||||
line-height: 60rpx;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
}
|
||||
border-bottom: 30rpx solid #f8f8f8;
|
||||
}
|
||||
// 身份认证按钮
|
||||
.btn{
|
||||
padding: 30rpx;
|
||||
button[size="default"]{
|
||||
background: $main-color;
|
||||
color: white;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
padding: 0;
|
||||
font-size: 32rpx;
|
||||
border-radius: 10rpx;
|
||||
font-weight: bold;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
136
pages/user/code.vue
Normal file
@@ -0,0 +1,136 @@
|
||||
<template>
|
||||
<view class="code">
|
||||
<image class="code-back main-back" src="@/static/code/code_back.png" mode="widthFix"></image>
|
||||
<image class="code-back header-back" src="@/static/code/code_header.png" mode="widthFix"></image>
|
||||
<image class="code-back img-lay" src="@/static/code/code_img_lay.png" mode="widthFix"></image>
|
||||
<view class="code-content">
|
||||
<view class="header">
|
||||
<image class="sign" src="@/static/code/code_sign.png" mode="widthFix"></image>
|
||||
<image class="logo" src="@/static/code/code_logo.png" mode="widthFix"></image>
|
||||
</view>
|
||||
<view class="block">
|
||||
<view class="qrcode">
|
||||
<l-painter class="qrcode-src">
|
||||
<l-painter-qrcode
|
||||
:text="'http://web.douhuofalv.com/login/register?invite_code=' + invite"
|
||||
css="width: 260rpx; height: 260rpx; background-color:white; padding: 20rpx; border-radius: 10rpx;"
|
||||
/>
|
||||
</l-painter>
|
||||
<view class="qrcode-text">邀请码{{invite}}</view>
|
||||
</view>
|
||||
<image class="btn" src="@/static/code/code_btn.png" mode="widthFix"></image>
|
||||
</view>
|
||||
<image class="footer" src="@/static/code/code_footer.png" mode="widthFix"></image>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { code } from '@/apis/interfaces/user.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
invite: ''
|
||||
};
|
||||
},
|
||||
created() {
|
||||
code().then( res => {
|
||||
let { invite } = res;
|
||||
this.invite = invite
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.code {
|
||||
background: #1F25AE;
|
||||
height: 100vh;
|
||||
position: relative;
|
||||
|
||||
.code-back {
|
||||
width: 100%;
|
||||
position: absolute
|
||||
}
|
||||
|
||||
.main-back {
|
||||
top: 20vh;
|
||||
}
|
||||
|
||||
.header-back {
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.img-lay {
|
||||
width: 30vw;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.code-content {
|
||||
position: absolute;
|
||||
padding: 50rpx;
|
||||
z-index: 2;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
|
||||
.header {
|
||||
text-align: center;
|
||||
width: 100%;
|
||||
|
||||
.sign {
|
||||
width: 90%;
|
||||
vertical-align: top;
|
||||
margin-bottom: 30rpx;
|
||||
}
|
||||
|
||||
.logo {
|
||||
width: 25vw;
|
||||
}
|
||||
}
|
||||
|
||||
.block {
|
||||
text-align: center;
|
||||
margin-bottom: 30rpx;
|
||||
|
||||
.qrcode {
|
||||
display: inline-block;
|
||||
border: solid 2rpx #ECC997;
|
||||
background: #0E2660;
|
||||
border-radius: 20rpx;
|
||||
padding: 30rpx;
|
||||
.qrcode-src {
|
||||
width: 300rpx;
|
||||
height: 300rpx;
|
||||
}
|
||||
.qrcode-text {
|
||||
text-align: center;
|
||||
color: #FFF5C6;
|
||||
line-height: 50rpx;
|
||||
padding-top: 30rpx;
|
||||
}
|
||||
}
|
||||
.btn {
|
||||
width: 400rpx;
|
||||
margin-top: 30rpx;
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
width: 70%;
|
||||
vertical-align: top;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
22
pages/user/eSign.vue
Normal file
@@ -0,0 +1,22 @@
|
||||
<template>
|
||||
<view>
|
||||
<web-view :src="webUrl"></web-view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
webUrl: ''
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.webUrl = this.$Route.query.url
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
252
pages/user/index.vue
Normal file
@@ -0,0 +1,252 @@
|
||||
<template>
|
||||
<view>
|
||||
<view class="user-info">
|
||||
<block v-if="isAuth">
|
||||
<view class="user-info-left">
|
||||
<u-avatar
|
||||
shape="square"
|
||||
class="active"
|
||||
size="120rpx"
|
||||
:default-url="require('@/static/imgs/default-active.png')"
|
||||
:src="avatar"
|
||||
mode="aspectFill"
|
||||
@click="onNav('UserInfo')"
|
||||
></u-avatar>
|
||||
<view class="nickname nowrap" @click="onNav('UserInfo')">{{nickname}}</view>
|
||||
<view class="tags">
|
||||
<view class="tags-item" v-if="certification"><image class="tags-icon" src="@/static/icons/Identity_icon.png" mode="widthFix"></image>实名认证</view>
|
||||
<view class="tags-item">{{identity.name}}</view>
|
||||
</view>
|
||||
<view class="state">
|
||||
<view class="state-tag"><u-icon class="state-icon" size="28rpx" color="#555" name="plus"></u-icon>状态</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="user-info-right" @click="onUserCode">
|
||||
<image class="user-qrcode" src="@/static/icons/qrcode.png" mode="widthFix"></image>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="user-info-left">
|
||||
<u-avatar
|
||||
shape="square"
|
||||
class="active"
|
||||
size="120rpx"
|
||||
:default-url="require('@/static/imgs/default-active.png')"
|
||||
mode="aspectFill"
|
||||
@click="onNav('UserInfo')"
|
||||
></u-avatar>
|
||||
<view class="nickname nowrap" @click="onNav('UserInfo')">登录</view>
|
||||
<view class="tags">暂未登录</view>
|
||||
</view>
|
||||
<view class="user-info-right">
|
||||
<image class="user-qrcode" src="@/static/icons/qrcode.png" mode="widthFix"></image>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<view class="border-solid-empty"></view>
|
||||
<view class="nav-flex" @click="onNav('AccountIntegral')">
|
||||
<view class="nav-icon"><image class="nav-icon-src" src="@/static/icons/user_nav_00.png"></image>火力值</view>
|
||||
<u-icon name="arrow-right" color="#cacaca" size="34rpx" bold></u-icon>
|
||||
</view>
|
||||
<view class="nav-flex" @click="onNav('AccountCash')">
|
||||
<view class="nav-icon"><image class="nav-icon-src" src="@/static/icons/user_nav_01.png"></image>业绩账户</view>
|
||||
<u-icon name="arrow-right" color="#cacaca" size="34rpx" bold></u-icon>
|
||||
</view>
|
||||
<view class="border-solid-empty"></view>
|
||||
<view class="nav-flex" @click="onNav('UserTeam')">
|
||||
<view class="nav-icon"><image class="nav-icon-src" src="@/static/icons/user_nav_02.png"></image>我的客户</view>
|
||||
<u-icon name="arrow-right" color="#cacaca" size="34rpx" bold></u-icon>
|
||||
</view>
|
||||
<view class="nav-flex" @click="onNav('AccountBonus')">
|
||||
<view class="nav-icon"><image class="nav-icon-src" src="@/static/icons/user_nav_04.png"></image>奖金账户</view>
|
||||
<u-icon name="arrow-right" color="#cacaca" size="34rpx" bold></u-icon>
|
||||
</view>
|
||||
<view class="nav-flex" @click="onNav('UserCertification')">
|
||||
<view class="nav-icon"><image class="nav-icon-src" src="@/static/icons/user_nav_03.png"></image>实名认证</view>
|
||||
<u-icon name="arrow-right" color="#cacaca" size="34rpx" bold></u-icon>
|
||||
</view>
|
||||
<view class="border-solid-empty"></view>
|
||||
<view class="nav-flex" @click="onNav('UserSet')">
|
||||
<view class="nav-icon"><image class="nav-icon-src" src="@/static/icons/user_nav_05.png"></image>设置</view>
|
||||
<u-icon name="arrow-right" color="#cacaca" size="34rpx" bold></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { info } from '@/apis/interfaces/user.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
isAuth : false,
|
||||
nickname : '',
|
||||
identity : '',
|
||||
avatar : '',
|
||||
certification : ''
|
||||
};
|
||||
},
|
||||
onShow() {
|
||||
this.isAuth = this.$store.getters.getToken != ''
|
||||
if(this.$store.getters.getToken != '') this.getUserInfo()
|
||||
},
|
||||
methods: {
|
||||
// 获取用户信息
|
||||
getUserInfo(){
|
||||
uni.showLoading({
|
||||
title: '加载中...'
|
||||
})
|
||||
info().then(res => {
|
||||
let { nickname, identity, avatar, certification } = res
|
||||
this.nickname = nickname
|
||||
this.identity = identity
|
||||
this.avatar = avatar
|
||||
this.certification = certification
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 导航
|
||||
onNav(name){
|
||||
this.$Router.push({name})
|
||||
},
|
||||
// 分享码
|
||||
onUserCode(){
|
||||
if(this.identity.order > 1){
|
||||
this.$Router.push({ name: 'UserCode' })
|
||||
return
|
||||
}
|
||||
uni.showModal({
|
||||
title : '提示',
|
||||
content : '您当前非业务员身份无法分享',
|
||||
cancelColor : '确定',
|
||||
cancelColor : '#555',
|
||||
confirmText : '立即开通',
|
||||
confirmColor: '#446EFE',
|
||||
success : res => {
|
||||
if(res.confirm){
|
||||
this.$Router.pushTab({name: 'Work'})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.nav-flex{
|
||||
height: 120rpx;
|
||||
padding: 0 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-size: 34rpx;
|
||||
.nav-icon{
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.nav-icon-src{
|
||||
width: 48rpx;
|
||||
height: 48rpx;
|
||||
vertical-align: middle;
|
||||
margin-right: $margin;
|
||||
margin-top: 5rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 用户信息
|
||||
.user-info{
|
||||
padding: 50rpx $padding;
|
||||
display: flex;
|
||||
&-left{
|
||||
padding-left: 140rpx;
|
||||
position: relative;
|
||||
width: calc(100% - 150rpx);
|
||||
.active{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top:0;
|
||||
border-radius: $radius;
|
||||
overflow: hidden;
|
||||
}
|
||||
.nickname{
|
||||
font-size: 42rpx;
|
||||
line-height: 50rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
.tags{
|
||||
padding-top: 20rpx;
|
||||
.tags-item{
|
||||
@extend .border;
|
||||
display: inline-block;
|
||||
border-radius: 20rpx;
|
||||
padding: 0 15rpx;
|
||||
font-size: 24rpx;
|
||||
line-height: 40rpx;
|
||||
height: 40rpx;
|
||||
color: #555;
|
||||
font-weight: 400;
|
||||
margin-left: $margin - 10;
|
||||
&::after{
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
&:first-child{
|
||||
margin-left: 0;
|
||||
}
|
||||
.tags-icon{
|
||||
width: 32rpx;
|
||||
height: 32rpx;
|
||||
vertical-align: middle;
|
||||
margin-right: 5rpx;
|
||||
margin-bottom: 6rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.state{
|
||||
padding-top: 20rpx;
|
||||
.state-tag{
|
||||
@extend .border;
|
||||
display: inline-block;
|
||||
border-radius: 30rpx;
|
||||
padding: 0 20rpx;
|
||||
font-size: 30rpx;
|
||||
line-height: 50rpx;
|
||||
height: 50rpx;
|
||||
color: #555;
|
||||
font-weight: 400;
|
||||
&::after{
|
||||
border-radius: 50rpx;
|
||||
}
|
||||
.state-icon{
|
||||
display: inline-block;
|
||||
margin-right: 5rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
&-right{
|
||||
width: 150rpx;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
position: relative;
|
||||
text-align: center;
|
||||
&::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 1rpx;
|
||||
height: 100%;
|
||||
background-image: linear-gradient(90deg, $border-color 50%, transparent 50%);
|
||||
}
|
||||
.user-qrcode{
|
||||
width: 48rpx;
|
||||
height: 48rpx;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
163
pages/user/info.vue
Normal file
@@ -0,0 +1,163 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<view class="info-flex">
|
||||
<label>头像</label>
|
||||
<u-avatar
|
||||
class="upd-active"
|
||||
shape="square"
|
||||
:src="avatar.url"
|
||||
:default-url="require('@/static/imgs/default-active.png')"
|
||||
@click="updAvatar"
|
||||
></u-avatar>
|
||||
</view>
|
||||
<view class="info-flex">
|
||||
<label>昵称</label>
|
||||
<input class="info-input" maxlength="8" v-model="nickname" type="text" placeholder="昵称" @blur="onNickname">
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { info, updInfo } from '@/apis/interfaces/user.js'
|
||||
import { uploads } from '@/apis/interfaces/uploading.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
nickname: '', // 用户昵称
|
||||
avatar : {
|
||||
url : '',
|
||||
path: ''
|
||||
}, // 上传头像
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getInfo()
|
||||
},
|
||||
methods: {
|
||||
// 获取用户资料
|
||||
getInfo(){
|
||||
uni.showLoading({
|
||||
title: '加载中...'
|
||||
})
|
||||
info().then(res => {
|
||||
let { nickname, avatar} = res
|
||||
this.nickname = nickname
|
||||
this.avatar = {
|
||||
url : avatar,
|
||||
path: ''
|
||||
}
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 更新昵称
|
||||
onNickname(e){
|
||||
this.updInfo('nickname', this.nickname)
|
||||
},
|
||||
// 更新资料
|
||||
updInfo(key, val){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
updInfo(key, val).then(res => {
|
||||
uni.showToast({
|
||||
title: '修改成功',
|
||||
icon : 'none',
|
||||
})
|
||||
}).catch(err => {
|
||||
this.getInfo()
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 更新头像
|
||||
updAvatar(){
|
||||
uni.chooseImage({
|
||||
count: 1,
|
||||
crop : {
|
||||
width : 300,
|
||||
height : 300
|
||||
},
|
||||
success: res => {
|
||||
if(res.tempFilePaths.length > 0){
|
||||
uni.showLoading({
|
||||
title: '上传中...',
|
||||
mask : true
|
||||
})
|
||||
uploads([{
|
||||
name: 'avatar',
|
||||
uri : res.tempFilePaths[0]
|
||||
}]).then(updRes => {
|
||||
let { path, url } = updRes
|
||||
this.avatar = {
|
||||
url : url[0],
|
||||
path: path[0]
|
||||
}
|
||||
this.updInfo('avatar', path[0])
|
||||
}).catch(updErr => {
|
||||
uni.showToast({
|
||||
title: updErr.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
fail: err => {}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.content{
|
||||
padding-top: 30rpx;
|
||||
}
|
||||
// 编辑信息
|
||||
.info-flex{
|
||||
background: white;
|
||||
padding: 20rpx 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
line-height: 60rpx;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
&::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 30rpx;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 1rpx;
|
||||
z-index: 2;
|
||||
background-image: linear-gradient(0deg, $border-color 50%, transparent 50%);
|
||||
}
|
||||
&:last-child::after{
|
||||
display: none;
|
||||
}
|
||||
label{
|
||||
font-size: 30rpx;
|
||||
color: #111;
|
||||
width: 200rpx;
|
||||
}
|
||||
.info-input{
|
||||
width: calc(100% - 200rpx);
|
||||
text-align: right;
|
||||
}
|
||||
.upd-active{
|
||||
width: 88rpx;
|
||||
height: 88rpx;
|
||||
border-radius: $radius;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
27
pages/user/set.vue
Normal file
@@ -0,0 +1,27 @@
|
||||
<template>
|
||||
<view>
|
||||
<button @click="onLogout()">退出登录</button>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
},
|
||||
methods: {
|
||||
onLogout(){
|
||||
this.$store.commit('setToken', '');
|
||||
this.$Router.replaceAll({
|
||||
name: 'Auth'
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
130
pages/user/team.vue
Normal file
@@ -0,0 +1,130 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<view class="header">
|
||||
客户列表
|
||||
<text>共{{count.all}}客户</text>
|
||||
</view>
|
||||
<block v-if="users.length > 0">
|
||||
<view class="team-item" v-for="(item, index) in users" :key="index">
|
||||
<u-avatar :src="item.avatar" size="40"></u-avatar>
|
||||
<view class="name nowrap">
|
||||
{{item.nickname}}
|
||||
<text class="identity identity-2" v-if="item.identity.order == 2">业务员</text>
|
||||
<text class="identity identity-1" v-if="item.identity.order == 1">普通用户</text>
|
||||
<text class="identity identity-3" v-if="item.identity.order == 3">顾问</text>
|
||||
</view>
|
||||
<view class="mobile">{{item.username}}</view>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="list-null">
|
||||
<u-empty
|
||||
mode="data"
|
||||
icon="http://cdn.uviewui.com/uview/empty/data.png"
|
||||
text="暂无客户数据"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { relations } from '@/apis/interfaces/user.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
users: [],
|
||||
count: {
|
||||
all: 0
|
||||
}
|
||||
};
|
||||
},
|
||||
created() {
|
||||
relations({
|
||||
larer: 1
|
||||
}).then(res => {
|
||||
let { users, count } = res;
|
||||
this.users = users.data
|
||||
this.count = count
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.content{
|
||||
box-sizing: border-box;
|
||||
}
|
||||
// 统计数据
|
||||
.header{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 0 30rpx;
|
||||
line-height: 100rpx;
|
||||
font-weight: bold;
|
||||
text{
|
||||
font-size: 28rpx;
|
||||
color: gray;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
// 团队列表
|
||||
.team-item{
|
||||
background: white;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 30rpx;
|
||||
border-radius: 20rpx;
|
||||
margin: 0 30rpx 30rpx 30rpx;
|
||||
.name{
|
||||
width: calc(100% - 200rpx - 40px);
|
||||
padding: 0 20rpx;
|
||||
box-sizing: border-box;
|
||||
font-weight: bold;
|
||||
font-size: 30rpx;
|
||||
color: #333333;
|
||||
.identity{
|
||||
display: inline-block;
|
||||
background: #F6F6F6;
|
||||
color: #999999;
|
||||
font-weight: normal;
|
||||
margin-left: 20rpx;
|
||||
border-radius: 20rpx;
|
||||
height: 40rpx;
|
||||
line-height: 36rpx;
|
||||
padding: 0 10rpx;
|
||||
font-size: 24rpx;
|
||||
border:solid 1rpx #000;
|
||||
box-sizing: border-box;
|
||||
&.identity-2{
|
||||
background: #ECF0FF;
|
||||
border-color: #443DE2;
|
||||
color: #443DE2;
|
||||
}
|
||||
&.identity-1{
|
||||
background: #F6F6F6;
|
||||
border-color: #999999;
|
||||
color: #999999;
|
||||
}
|
||||
&.identity-3{
|
||||
background: #FFF7EC;
|
||||
border-color: #FEAD45;
|
||||
color: #FEAD45;
|
||||
}
|
||||
}
|
||||
}
|
||||
.mobile{
|
||||
width: 200rpx;
|
||||
color: #666666;
|
||||
text-align: right;
|
||||
font-size: 30rpx;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
211
pages/work/available.vue
Normal file
@@ -0,0 +1,211 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<view class="header-search">
|
||||
<input type="text" placeholder="输入用户名或手机号码搜索" v-model="searchValue" maxlength="11">
|
||||
<button size="mini" @click="onSearch">搜索</button>
|
||||
</view>
|
||||
<!-- 下级列表 -->
|
||||
<view class="available-user" v-if="searchValue.length <= 0">
|
||||
<block v-if="users.length > 0">
|
||||
<view class="user-item border-solid" v-for="(item, index) in users" :key="index" @click="onItem(item)">
|
||||
<image class="cover" :src="item.avatar" mode="aspectFill"></image>
|
||||
<view class="text">
|
||||
<view class="nickname nowrap">{{item.nickname}}</view>
|
||||
<view class="no nowrap">{{item.username}}</view>
|
||||
</view>
|
||||
<view class="icon">
|
||||
<u-icon class="icon-u" name="arrow-right" color="#ddd" size="20"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="search-null">
|
||||
<u-empty
|
||||
mode="list"
|
||||
icon="http://cdn.uviewui.com/uview/empty/list.png"
|
||||
text="暂无下级用户"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<!-- 搜索结果 -->
|
||||
<view class="available-user" v-else>
|
||||
<block v-if="searchResults.length > 0">
|
||||
<view class="user-item border-solid" v-for="(item, index) in searchResults" :key="index" @click="onItem(item)">
|
||||
<image class="cover" :src="item.avatar" mode="aspectFill"></image>
|
||||
<view class="text">
|
||||
<view class="nickname nowrap">{{item.nickname}}</view>
|
||||
<view class="no nowrap">{{item.username}}</view>
|
||||
</view>
|
||||
<view class="icon">
|
||||
<u-icon class="icon-u" name="arrow-right" color="#ddd" size="20"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="search-null">
|
||||
<u-empty
|
||||
mode="search"
|
||||
icon="http://cdn.uviewui.com/uview/empty/search.png"
|
||||
:text="searchText"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { availableUser } from '@/apis/interfaces/business.js'
|
||||
import { relations } from '@/apis/interfaces/user.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
isSearch : false,
|
||||
users : [],
|
||||
pages : {},
|
||||
searchValue : '',
|
||||
searchResults : [],
|
||||
searchText : '输入姓名或姓名搜索'
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getUsers()
|
||||
},
|
||||
// 监听搜索值变化重置搜索这状态
|
||||
methods: {
|
||||
// 我的伙伴
|
||||
getUsers(){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
relations().then(res => {
|
||||
let { users } = res;
|
||||
this.users = users.data
|
||||
this.pages = users.page
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 搜索用户
|
||||
onSearch(){
|
||||
if(this.searchValue == ''){
|
||||
uni.showToast({
|
||||
title: '请输入搜索关键字',
|
||||
icon : 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
let isNumber = new RegExp("[0-9]+");
|
||||
// 搜索信息
|
||||
uni.showLoading({
|
||||
title: '搜索中...',
|
||||
mask : true
|
||||
})
|
||||
availableUser(isNumber.test(this.searchValue) ? 'mobile': 'name', this.searchValue).then(res => {
|
||||
this.searchResults = res
|
||||
this.isSearch = true
|
||||
}).catch(err => {
|
||||
this.searchText = err.message
|
||||
}).finally(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
},
|
||||
// 选择用户
|
||||
onItem(userInfo){
|
||||
this.$store.commit('setUser', userInfo)
|
||||
this.$Router.back()
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// 搜索结果为空
|
||||
.search-null{
|
||||
height: 70vh;
|
||||
text-align: center;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
// 搜索用户
|
||||
.available-user{
|
||||
padding-top: 130rpx;
|
||||
.user-item{
|
||||
padding: 20rpx 30rpx;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background: white;
|
||||
|
||||
.cover{
|
||||
width: 88rpx;
|
||||
height: 88rpx;
|
||||
border-radius: $radius;
|
||||
}
|
||||
.text{
|
||||
width: calc(100% - 168rpx);
|
||||
padding-left: 30rpx;
|
||||
box-sizing: border-box;
|
||||
.nickname{
|
||||
line-height: 40rpx;
|
||||
font-size: 32rpx;
|
||||
color: #333;
|
||||
}
|
||||
.no{
|
||||
line-height: 40rpx;
|
||||
color: gray;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
}
|
||||
.icon{
|
||||
width: 80rpx;
|
||||
text-align: right;
|
||||
.icon-u{
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// header
|
||||
.header-search{
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
padding: 20rpx 30rpx;
|
||||
background: white;
|
||||
display: flex;
|
||||
input{
|
||||
background: #f8f8f8;
|
||||
height: 70rpx;
|
||||
line-height: 70rpx;
|
||||
border-radius: $radius-lg;
|
||||
padding: 0 30rpx;
|
||||
box-sizing: border-box;
|
||||
width: calc(100% - 170rpx);
|
||||
font-size: 30rpx;
|
||||
margin-right: 30rpx;
|
||||
}
|
||||
button[size="mini"]{
|
||||
width: 140rpx;
|
||||
height: 70rpx;
|
||||
line-height: 70rpx;
|
||||
padding: 0;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
font-size: 30rpx;
|
||||
font-weight: normal;
|
||||
|
||||
}
|
||||
}
|
||||
</style>
|
||||
211
pages/work/create.vue
Normal file
@@ -0,0 +1,211 @@
|
||||
<template>
|
||||
<view class="create-page">
|
||||
<view class="create-title">创建新的订单</view>
|
||||
<view class="create-submit">完善创建订单用户与订单类型</view>
|
||||
<view class="create-from">
|
||||
<block v-if="createType === 'other'">
|
||||
<view class="create-user" @click="() => this.$Router.push({name: 'OrderAvailable'})">
|
||||
<view class="cover">
|
||||
<image class="cover-src" v-if="user != ''" :src="user.avatar" mode="aspectFill"></image>
|
||||
<u-icon v-else name="plus" color="#ddd" size="24"></u-icon>
|
||||
</view>
|
||||
<view class="nickname nowrap" :class="{'hide': user == ''}">{{user.nickname || '请选择办理用户'}}</view>
|
||||
<view class="icon">
|
||||
<u-icon class="icon-u" name="arrow-right" color="#ddd" size="20"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<view class="create-type">
|
||||
<view class="create-type-title">选择业务类型</view>
|
||||
<block v-for="(item, index) in businessArr" :key="index">
|
||||
<view class="create-type-item" :class="{'active': item.business_id == businessId}" @click="onBusiness(item.business_id)">
|
||||
<image class="create-type-icon" :src="item.cover_url" mode="aspectFill"></image>
|
||||
<view class="create-type-text">
|
||||
<view class="title nowrap">{{item.title || '-'}}</view>
|
||||
<view class="submit nowrap">{{item.subtitle || '-'}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<view class="create-btn">
|
||||
<button size="default" @click="onNext()">下一步</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { business } from '@/apis/interfaces/business.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
createType : '',
|
||||
businessArr: [],
|
||||
businessId : '',
|
||||
user : ''
|
||||
};
|
||||
},
|
||||
onShow(){
|
||||
let user = this.$store.getters.getUser
|
||||
this.createType = this.$Route.query.type
|
||||
if(user != ''){
|
||||
this.user = user
|
||||
this.$store.commit('setUser', '')
|
||||
}
|
||||
},
|
||||
created() {
|
||||
business().then(res => {
|
||||
this.businessArr = res
|
||||
this.businessId = res[0].business_id
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 选择业务类型
|
||||
onBusiness(id){
|
||||
this.businessId = id
|
||||
},
|
||||
// 创建业务单
|
||||
onNext(){
|
||||
if(this.createType == 'other' && !this.user.user_id){
|
||||
uni.showToast({
|
||||
title: '请选择办理用户',
|
||||
icon : 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
let busines = this.businessArr.find(val => val.business_id === this.businessId)
|
||||
this.$Router.replace({
|
||||
name : 'WorkGenerate',
|
||||
params : {
|
||||
businessTitle : busines.title,
|
||||
businessId : busines.business_id,
|
||||
serviceUser : this.user.user_id,
|
||||
createType : this.createType
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.create-page{
|
||||
padding: 50rpx;
|
||||
box-sizing: border-box;
|
||||
height: 100vh;
|
||||
.create-title{
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
font-size: 44rpx;
|
||||
}
|
||||
.create-submit{
|
||||
text-align: center;
|
||||
font-size: 30rpx;
|
||||
color: gray;
|
||||
padding-top: 10rpx;
|
||||
}
|
||||
.create-from{
|
||||
padding-top: 50rpx;
|
||||
}
|
||||
// 目标用户
|
||||
.create-user{
|
||||
background: #f8f8f8;
|
||||
border-radius: $radius;
|
||||
padding: 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.cover{
|
||||
width: 88rpx;
|
||||
height: 88rpx;
|
||||
background: white;
|
||||
border-radius: $radius;
|
||||
margin-right: 20rpx;
|
||||
border: dashed 1rpx #ddd;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
overflow: hidden;
|
||||
.cover-src{
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.nickname{
|
||||
width: calc(100% - 188rpx);
|
||||
line-height: 70rpx;
|
||||
font-size: 32rpx;
|
||||
&.hide{
|
||||
color: gray;
|
||||
}
|
||||
}
|
||||
.icon{
|
||||
width: 80rpx;
|
||||
text-align: right;
|
||||
.icon-u{
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 选择业务类型
|
||||
.create-type{
|
||||
padding-top: 50rpx;
|
||||
.create-type-title{
|
||||
text-align: center;
|
||||
line-height: 50rpx;
|
||||
color: gray;
|
||||
font-size: 30rpx;
|
||||
}
|
||||
.create-type-item{
|
||||
background: #f8f8f8;
|
||||
border-radius: $radius;
|
||||
padding: 30rpx;
|
||||
margin-top: 30rpx;
|
||||
border:solid 1rpx #f8f8f8;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.create-type-icon{
|
||||
width: 88rpx;
|
||||
height: 88rpx;
|
||||
margin-right: $margin;
|
||||
background-color: white;
|
||||
border-radius: $radius;
|
||||
}
|
||||
.create-type-text{
|
||||
line-height: 40rpx;
|
||||
.title{
|
||||
font-size: 30rpx;
|
||||
}
|
||||
.submit{
|
||||
color: gray;
|
||||
font-size: 26rpx;
|
||||
}
|
||||
}
|
||||
&.active{
|
||||
border:solid 1rpx $main-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 按钮
|
||||
.create-btn{
|
||||
margin-top: 90rpx;
|
||||
button[size="default"]{
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
background: $main-color;
|
||||
font-size: 32rpx;
|
||||
color: white;
|
||||
font-weight: bold;
|
||||
&::after{
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
463
pages/work/generate.vue
Normal file
@@ -0,0 +1,463 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<block v-if="serviceArr.length > 0">
|
||||
<view class="block" v-for="(item, index) in serviceArr" :key="index">
|
||||
<view class="block-title">
|
||||
{{item.title}}
|
||||
<view class="block-remove" @click="onRemove(index)" v-if="serviceArr.length > 1">
|
||||
<u-icon class="block-remove-icon" size="15" color="#446EFE" name="minus-circle"></u-icon>移出
|
||||
</view>
|
||||
</view>
|
||||
<!-- 机构 -->
|
||||
<view class="block-item">
|
||||
<label class="block-item-label"><text>*</text>机构</label>
|
||||
<picker :range="item.institution" range-key="title" :value="item.institutionIndex" @change="institutionChange($event, item, index)">
|
||||
<view class="institution-picker">
|
||||
<view class="institution-picker-text nowrap">{{item.institution[item.institutionIndex].title}}</view>
|
||||
<u-icon size="12" color="#999" name="arrow-down-fill"></u-icon>
|
||||
</view>
|
||||
</picker>
|
||||
</view>
|
||||
<!-- 业务类型 -->
|
||||
<view class="block-item">
|
||||
<label class="block-item-label"><text>*</text>业务类型</label>
|
||||
<picker :range="item.fromType" range-key="title" :value="item.fromIndex" @change="businessChange($event, item, index)">
|
||||
<view class="institution-picker">
|
||||
<view class="institution-picker-text nowrap">{{item.fromType[item.fromIndex].title}}</view>
|
||||
<u-icon size="12" color="#999" name="arrow-down-fill"></u-icon>
|
||||
</view>
|
||||
</picker>
|
||||
</view>
|
||||
<!-- 表单信 -->
|
||||
<view
|
||||
class="block-item"
|
||||
v-for="(formItem, formIndex) in item.froms"
|
||||
:key="formIndex"
|
||||
v-if="item.subVal[formItem.pre_key] == formItem.pre_value"
|
||||
>
|
||||
<block v-if="formItem.type == 'price' || formItem.type == 'number'">
|
||||
<label class="block-item-label"><text v-if="formItem.is_required == 1">*</text>{{formItem.title}}</label>
|
||||
<view class="inputs-flex">
|
||||
<input
|
||||
class="input"
|
||||
v-model="item.subVal[formItem.key]"
|
||||
:type="formItem.type == 'price' ? 'digit': 'number'"
|
||||
:placeholder="'请输入' + formItem.title"
|
||||
>
|
||||
<text class="unit" v-if="formItem.type == 'price'">元</text>
|
||||
<text class="unit" v-if="formItem.type == 'number'">天</text>
|
||||
</view>
|
||||
</block>
|
||||
<block v-if="formItem.type == 'radio'">
|
||||
<view class="radio-flex">
|
||||
<view class="radio-title"><text v-if="formItem.is_required == 1">*</text>{{formItem.title}}</view>
|
||||
<radio-group @change="item.subVal[formItem.key] = $event.detail.value">
|
||||
<label class="radio-label" v-for="(radioItem, radioIndex) in formItem.options" :key="radioIndex">
|
||||
<radio class="radio-input" color="#446EFE" :checked="radioIndex === item.subVal[formItem.key]" :value="radioIndex"/>{{radioItem}}
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
</block>
|
||||
<block v-if="formItem.type == 'checkbox'">
|
||||
<label class="block-item-label"><text v-if="formItem.is_required == 1">*</text>{{formItem.title}}(可多选)</label>
|
||||
<checkbox-group @change="item.subVal[formItem.key] = $event.detail.value">
|
||||
<label class="checkbox-item" v-for="(checkboxItem, checkboxIndex) in formItem.options">
|
||||
<checkbox class="checkbox-input" :value="checkboxIndex" color="#446EFE"></checkbox>{{checkboxItem}}
|
||||
</label>
|
||||
</checkbox-group>
|
||||
</block>
|
||||
<block v-if="formItem.type == 'textarea'">
|
||||
<label class="block-item-label"><text v-if="formItem.is_required == 1">*</text>{{formItem.title}}</label>
|
||||
<textarea
|
||||
class="textarea"
|
||||
:placeholder="'请输入' + formItem.title"
|
||||
v-model="item.subVal[formItem.key]"
|
||||
></textarea>
|
||||
</block>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<view class="footer">
|
||||
<view class="footer-text">温馨提示:为了匹配最准确方案,请如实填写信息</view>
|
||||
<view class="footer-flex">
|
||||
<button @click="onAdd">添加新信息</button>
|
||||
<button @click="onSubmit">提交</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { institution, business, institutionType, submitStore } from '@/apis/interfaces/business.js';
|
||||
import { octpicker } from '@/components/oct-picker.vue'
|
||||
export default {
|
||||
components: { octpicker },
|
||||
data() {
|
||||
return {
|
||||
businessArr: [],
|
||||
serviceUser: '',
|
||||
serviceArr : [],
|
||||
};
|
||||
},
|
||||
created() {
|
||||
let { businessId, serviceUser, businessTitle } = this.$Route.query
|
||||
this.getInstitution(businessId, businessTitle)
|
||||
this.getBusiness()
|
||||
this.serviceUser = serviceUser
|
||||
},
|
||||
methods: {
|
||||
// 移出选项
|
||||
onRemove(index){
|
||||
this.serviceArr.splice(index, 1)
|
||||
},
|
||||
// 获取主业务
|
||||
getBusiness(){
|
||||
business().then(res => {
|
||||
this.businessArr = res
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 获取主业务机构
|
||||
getInstitution(businessId, businessTitle){
|
||||
uni.showLoading({
|
||||
title: '加载中...'
|
||||
})
|
||||
institution(businessId).then(institutionArr => {
|
||||
let forms = this.getForms(institutionArr[0].institution_id)
|
||||
forms.then(val => {
|
||||
this.servicePush( val, institutionArr, businessTitle, businessId )
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 获取业务类型
|
||||
async getForms(businessId){
|
||||
|
||||
return await institutionType(businessId)
|
||||
},
|
||||
// 组织业务表单数据
|
||||
servicePush( vals, institutionArr, businessTitle, businessId ){
|
||||
let fromType = [],
|
||||
fromsVal = {},
|
||||
froms = vals[0].params
|
||||
|
||||
fromType = vals.map((val) => {
|
||||
return {
|
||||
type_id: val.type_id,
|
||||
title : val.title
|
||||
}
|
||||
})
|
||||
froms.map(val => {
|
||||
fromsVal[val.key] = val.type === 'checkbox' ? [] : ''
|
||||
})
|
||||
// 新增卡片
|
||||
this.serviceArr.push({
|
||||
title : businessTitle,
|
||||
institution : institutionArr,
|
||||
allInstitution : vals,
|
||||
institutionIndex: 0,
|
||||
fromType : fromType,
|
||||
fromIndex : 0,
|
||||
froms : froms,
|
||||
subVal : {
|
||||
business_id : Number(businessId),
|
||||
institution_id : institutionArr[0].institution_id,
|
||||
type_id : fromType[0].type_id,
|
||||
...fromsVal
|
||||
}
|
||||
})
|
||||
},
|
||||
// 机构变更更新业务
|
||||
institutionChange(e, old, index){
|
||||
let { value } = e.detail;
|
||||
let businessId = old.subVal.business_id
|
||||
|
||||
// 获取机构的子业务类型
|
||||
let forms = this.getForms(old.institution[value].institution_id)
|
||||
forms.then(institutionVal => {
|
||||
let newObj = old
|
||||
let fromType = []
|
||||
let params = institutionVal[0].params
|
||||
let paramsVal = []
|
||||
|
||||
// 业务类型
|
||||
fromType = institutionVal.map(val => {
|
||||
return {
|
||||
type_id: val.type_id,
|
||||
title : val.title
|
||||
}
|
||||
})
|
||||
// 提交字段
|
||||
params.map(val => {
|
||||
paramsVal[val.key] = val.type === 'checkbox' ? [] : ''
|
||||
})
|
||||
// 更新数据
|
||||
newObj.allInstitution = institutionVal;
|
||||
newObj.institutionIndex = value;
|
||||
newObj.fromType = fromType;
|
||||
newObj.fromIndex = 0;
|
||||
newObj.froms = params;
|
||||
newObj.subVal = {
|
||||
business_id : old.subVal.business_id,
|
||||
institution_id : old.institution[value].institution_id,
|
||||
type_id : fromType[0].type_id,
|
||||
...paramsVal
|
||||
}
|
||||
this.$set(this.serviceArr, index, newObj)
|
||||
})
|
||||
},
|
||||
// 业务变更
|
||||
businessChange(e, old, index){
|
||||
let { value } = e.detail;
|
||||
let businessId = old.subVal.business_id;
|
||||
let allInstitution = old.allInstitution
|
||||
let newObj = old
|
||||
let params = allInstitution[value].params
|
||||
let paramsVal = {}
|
||||
|
||||
params.map(val => {
|
||||
paramsVal[val.key] = val.type === 'checkbox' ? [] : ''
|
||||
})
|
||||
|
||||
newObj.fromIndex = value;
|
||||
newObj.froms = params;
|
||||
newObj.subVal = {
|
||||
business_id : old.subVal.business_id,
|
||||
institution_id : old.subVal.institution_id,
|
||||
type_id : allInstitution[value].type_id,
|
||||
...paramsVal
|
||||
}
|
||||
this.$set(this.serviceArr, index, newObj)
|
||||
},
|
||||
// 添加主业务
|
||||
onAdd(){
|
||||
let businessTitle = this.businessArr.map(val => {
|
||||
return val.title
|
||||
})
|
||||
uni.showActionSheet({
|
||||
itemList: businessTitle,
|
||||
success : res=> {
|
||||
let { tapIndex } = res;
|
||||
this.getInstitution(this.businessArr[tapIndex].business_id, businessTitle[tapIndex])
|
||||
}
|
||||
})
|
||||
},
|
||||
// 提交订单数据
|
||||
onSubmit(){
|
||||
let dataVal = this.serviceArr.map(val => {
|
||||
return val.subVal
|
||||
})
|
||||
if(this.serviceUser == ''){
|
||||
uni.showToast({
|
||||
title: '服务用户不能为空',
|
||||
icon : 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
uni.showLoading({
|
||||
title: '提交中...',
|
||||
mask : true
|
||||
})
|
||||
submitStore({
|
||||
type : this.$Route.query.createType,
|
||||
user_id : this.serviceUser,
|
||||
data : dataVal,
|
||||
channel : 'app'
|
||||
}).then(res => {
|
||||
uni.showModal({
|
||||
title : '提示',
|
||||
content : '订单已创建,请尽快提醒用户完善用户资料',
|
||||
showCancel : false,
|
||||
success : () => {
|
||||
this.$Router.back()
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.content{
|
||||
padding-top: 20rpx;
|
||||
padding-bottom: 260rpx;
|
||||
}
|
||||
// 表单模块
|
||||
.block{
|
||||
background: white;
|
||||
border-radius: $radius;
|
||||
margin: 0 30rpx 20rpx;
|
||||
padding: 30rpx;
|
||||
.block-title{
|
||||
font-weight: bold;
|
||||
line-height: 60rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.block-remove{
|
||||
background: rgba(68, 110, 254, .1);
|
||||
color: #446EFE;
|
||||
font-size: 28rpx;
|
||||
font-weight: normal;
|
||||
height: 50rpx;
|
||||
line-height: 50rpx;
|
||||
border-radius: 25rpx;
|
||||
padding: 0 25rpx 0 20rpx;
|
||||
&-icon{
|
||||
display: inline-block;
|
||||
margin-right: 10rpx;
|
||||
margin-bottom: 5rpx;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
}
|
||||
.block-item{
|
||||
padding: 15rpx 0;
|
||||
&-label{
|
||||
padding-bottom: 10rpx;
|
||||
display: block;
|
||||
font-size: 30rpx;
|
||||
color: #111111;
|
||||
text{
|
||||
color: #FF0000;
|
||||
font-size: 28rpx;
|
||||
margin-right: 10rpx;
|
||||
}
|
||||
}
|
||||
// picker
|
||||
.institution-picker{
|
||||
background: #F6F6F6;
|
||||
height: 84rpx;
|
||||
line-height: 84rpx;
|
||||
border-radius: 10rpx;
|
||||
padding: 0 30rpx 0 30rpx;
|
||||
font-size: 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
&-text{
|
||||
width: calc( 100% - 60rpx );
|
||||
}
|
||||
}
|
||||
// input
|
||||
.inputs-flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.input{
|
||||
background: #F6F6F6;
|
||||
height: 84rpx;
|
||||
line-height: 84rpx;
|
||||
border-radius: 10rpx;
|
||||
padding: 0 30rpx 0 30rpx;
|
||||
font-size: 30rpx;
|
||||
box-sizing: border-box;
|
||||
width: calc( 100% - 64rpx );
|
||||
}
|
||||
.unit{
|
||||
width: 64rpx;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
// radio
|
||||
.radio-flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
padding: 10rpx 0;
|
||||
.radio-title{
|
||||
font-size: 30rpx;
|
||||
color: #111111;
|
||||
text{
|
||||
color: #FF0000;
|
||||
font-size: 28rpx;
|
||||
margin-right: 10rpx;
|
||||
}
|
||||
}
|
||||
.radio-label{
|
||||
margin-left: 20rpx;
|
||||
color: #999999;
|
||||
.radio-input{
|
||||
transform:scale(0.7);
|
||||
}
|
||||
}
|
||||
}
|
||||
// checkbox
|
||||
.checkbox-item{
|
||||
display: block;
|
||||
color: #999999;
|
||||
line-height: 70rpx;
|
||||
.checkbox-input{
|
||||
transform:scale(0.7);
|
||||
vertical-align: middle;
|
||||
margin-top: -5rpx;
|
||||
}
|
||||
}
|
||||
// textarea
|
||||
.textarea{
|
||||
background: #F6F6F6;
|
||||
width: 100%;
|
||||
height: 200rpx;
|
||||
border-radius: 10rpx;
|
||||
padding: 20rpx 30rpx;
|
||||
font-size: 30rpx;
|
||||
line-height: 40rpx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
}
|
||||
}
|
||||
// footer
|
||||
.footer{
|
||||
box-shadow: 0 0 10rpx 0 rgba(0, 0, 0, .05);
|
||||
background-color: white;
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
z-index: 99;
|
||||
padding: 30rpx 30rpx 70rpx;
|
||||
.footer-text{
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
font-size: 28rpx;
|
||||
color: #FEA044;
|
||||
line-height: 40rpx;
|
||||
padding-bottom: 30rpx;
|
||||
}
|
||||
.footer-flex{
|
||||
display: flex;
|
||||
margin: 0 -10rpx;
|
||||
button{
|
||||
width: calc(50% - 20rpx);
|
||||
margin: 0 10rpx;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
border-radius: $radius-lg;
|
||||
font-size: 32rpx;
|
||||
border:solid 1rpx $main-color;
|
||||
background-color: white;
|
||||
color: $main-color;
|
||||
&::after{
|
||||
border: none;
|
||||
}
|
||||
&:last-child{
|
||||
background-color: $main-color;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
556
pages/work/index.vue
Normal file
@@ -0,0 +1,556 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<view v-if="isAuth">
|
||||
<!-- 状态栏 -->
|
||||
<u-sticky bgColor="#FFFFFF">
|
||||
<view class="status_bar"></view>
|
||||
<view class="work-bar">
|
||||
<view class="work-bar-user">
|
||||
<image class="cover" :src="userInfo.avatar || require('@/static/imgs/default-active.png')" mode="aspectFill"></image>
|
||||
<view class="nickname">{{userInfo.nickname}}<text class="card" v-if="isManager">{{identity.name}}</text></view>
|
||||
</view>
|
||||
<view class="work-bar-add" @click="onCreateOrder" v-if="isManager">
|
||||
<uni-icons class="icon" type="plusempty" size="30rpx" color="#111"></uni-icons>创建订单
|
||||
</view>
|
||||
</view>
|
||||
</u-sticky>
|
||||
<!-- 未认证或未考试 -->
|
||||
<block v-if="!isManager">
|
||||
<view class="block open-interest">
|
||||
<view class="title">业务员专属权益</view>
|
||||
<view class="open-interest-flex">
|
||||
<view class="open-interest-item" v-for="(item, index) in rightsArr" :key="index" @click="onToast(item)">
|
||||
<image class="open-interest-icon" :src="item.icon"></image>
|
||||
<view class="open-interest-text">{{item.title}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="block open-interest">
|
||||
<view class="title">仅需两步即可成为业务员</view>
|
||||
<view class="open-interest-block">
|
||||
<image class="open-interest-icon" :src="isCertification ? require('@/static/icons/work_icon_25.png'): require('@/static/icons/work_icon_24.png')"></image>
|
||||
<view class="open-interest-text">
|
||||
<view class="open-interest-title">实名认证</view>
|
||||
<view class="open-interest-submit">通过身份证实名认证</view>
|
||||
</view>
|
||||
<button class="open-interest-btn" size="mini" :disabled="isCertification" @click="$Router.push({name: 'UserCertification'})">{{isCertification ? '已认证': '去认证'}}</button>
|
||||
</view>
|
||||
<view class="open-interest-block">
|
||||
<image class="open-interest-icon" :src="isAnswer ? require('@/static/icons/work_icon_25.png'): require('@/static/icons/work_icon_23.png')"></image>
|
||||
<view class="open-interest-text">
|
||||
<view class="open-interest-title">通过业务员考试</view>
|
||||
<view class="open-interest-submit">通过线上考试即可完成</view>
|
||||
</view>
|
||||
<button class="open-interest-btn" size="mini" :disabled="isAnswer" @click="$Router.push({name: 'CollegeTest'})">{{isAnswer ? '已通过': '去考试'}}</button>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 提示信息 -->
|
||||
<u-popup :show="privilegeShow" mode="center" bgColor="transparent">
|
||||
<view class="privilege-lay">
|
||||
<image class="privilege-lay-img" src="@/static/imgs/privilege-lay-header.png" mode="widthFix"></image>
|
||||
<view class="privilege-lay-content"><text>{{privilegeText}}</text></view>
|
||||
<view class="privilege-lay-remove">
|
||||
<u-icon class="privilege-lay-icon" name="close-circle" color="white" size="30" @click="privilegeShow = false"></u-icon>
|
||||
</view>
|
||||
</view>
|
||||
</u-popup>
|
||||
</block>
|
||||
<!-- 管理中台 -->
|
||||
<block v-else>
|
||||
<view class="block">
|
||||
<view class="block-title">统计数据</view>
|
||||
<view class="total-flex">
|
||||
<view class="total-item">
|
||||
<image class="icon" src="@/static/icons/work_icon_00.png"></image>
|
||||
<view class="title">预约咨询单</view>
|
||||
<view class="number">-<text>单</text></view>
|
||||
</view>
|
||||
<view class="total-item">
|
||||
<image class="icon" src="@/static/icons/work_icon_01.png"></image>
|
||||
<view class="title">已缴费</view>
|
||||
<view class="number">-<text>单</text></view>
|
||||
</view>
|
||||
<view class="total-item">
|
||||
<image class="icon" src="@/static/icons/work_icon_02.png"></image>
|
||||
<view class="title">办理完成</view>
|
||||
<view class="number">-<text>单</text></view>
|
||||
</view>
|
||||
<view class="total-item">
|
||||
<image class="icon" src="@/static/icons/work_icon_03.png"></image>
|
||||
<view class="title">退款中</view>
|
||||
<view class="number">-<text>单</text></view>
|
||||
</view>
|
||||
<view class="total-item">
|
||||
<image class="icon" src="@/static/icons/work_icon_04.png"></image>
|
||||
<view class="title">完成结案</view>
|
||||
<view class="number">-<text>元</text></view>
|
||||
</view>
|
||||
<view class="total-item">
|
||||
<image class="icon" src="@/static/icons/work_icon_05.png"></image>
|
||||
<view class="title">结案金额</view>
|
||||
<view class="number">-<text>元</text></view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="block">
|
||||
<view class="block-title">订单管理</view>
|
||||
<view class="tool-flex">
|
||||
<view class="tool-flex-item" @click="onNav('Orders', { 'type': 0 })">
|
||||
<image class="icon" src="@/static/icons/work_icon_06.png"></image>
|
||||
<view class="number" v-if="orderCount.a_init > 0">{{orderCount.a_init}}</view>
|
||||
<view class="text">待预约</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('Orders', { 'type': 2 })">
|
||||
<image class="icon" src="@/static/icons/work_icon_21.png"></image>
|
||||
<view class="number" v-if="orderCount.a_service > 0">{{orderCount.a_service}}</view>
|
||||
<view class="text">匹配服务包</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('Orders', { 'type': 3 })">
|
||||
<image class="icon" src="@/static/icons/work_icon_07.png"></image>
|
||||
<view class="number" v-if="orderCount.a_serviced > 0">{{orderCount.a_serviced}}</view>
|
||||
<view class="text">待缴服务费</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('Orders', { 'type': 4 })">
|
||||
<image class="icon" src="@/static/icons/work_icon_10.png"></image>
|
||||
<view class="number" v-if="orderCount.b_sign > 0">{{orderCount.b_sign}}</view>
|
||||
<view class="text">待签约</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('Orders', { 'type': 5 })">
|
||||
<image class="icon" src="@/static/icons/work_icon_08.png"></image>
|
||||
<view class="number" v-if="orderCount.a_bank > 0">{{orderCount.a_bank}}</view>
|
||||
<view class="text">待完善资料</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('Orders', { 'type': 6 })">
|
||||
<image class="icon" src="@/static/icons/work_icon_09.png"></image>
|
||||
<view class="number" v-if="orderCount.b_check > 0">{{orderCount.b_check}}</view>
|
||||
<view class="text">初审中</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('Orders', { 'type': 7 })">
|
||||
<image class="icon" src="@/static/icons/work_icon_12.png"></image>
|
||||
<view class="number" v-if="orderCount.b_recheck > 0">{{orderCount.b_recheck}}</view>
|
||||
<view class="text">复审中</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('Orders', { 'type': 8 })">
|
||||
<image class="icon" src="@/static/icons/work_icon_13.png"></image>
|
||||
<view class="number" v-if="orderCount.b_process > 0">{{orderCount.b_process}}</view>
|
||||
<view class="text">办理中</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('Orders', { 'type': 9 })">
|
||||
<image class="icon" src="@/static/icons/work_icon_14.png"></image>
|
||||
<view class="number" v-if="orderCount.b_confirm > 0">{{orderCount.b_confirm}}</view>
|
||||
<view class="text">待结案</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('Orders', { 'type': 10 })">
|
||||
<image class="icon" src="@/static/icons/work_icon_15.png"></image>
|
||||
<view class="number" v-if="orderCount.b_complete > 0">{{orderCount.b_complete}}</view>
|
||||
<view class="text">办理完成</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="block">
|
||||
<view class="block-title">转让订单管理</view>
|
||||
<view class="tool-flex">
|
||||
<view class="tool-flex-item" @click="onNav('TransfersOrders', { type: 'out' })">
|
||||
<image class="icon" src="@/static/icons/work_icon_26.png"></image>
|
||||
<view class="number" v-if="orderCount.transfer_out > 0">{{orderCount.transfer_out}}</view>
|
||||
<view class="text">转出订单</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('TransfersOrders', { type: 'in' })">
|
||||
<image class="icon" src="@/static/icons/work_icon_19.png"></image>
|
||||
<view class="number" v-if="orderCount.transfer_in > 0">{{orderCount.transfer_in}}</view>
|
||||
<view class="text">转入订单</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="block">
|
||||
<view class="block-title">特殊订单管理</view>
|
||||
<view class="tool-flex">
|
||||
<view class="tool-flex-item" @click="onNav('ModifyOrder', {})">
|
||||
<image class="icon" src="@/static/icons/work_icon_16.png"></image>
|
||||
<view class="number" v-if="orderCount.audit_bank > 0">{{orderCount.audit_bank}}</view>
|
||||
<view class="text">修改资料</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('PoorOrder', {})">
|
||||
<image class="icon" src="@/static/icons/work_icon_17.png"></image>
|
||||
<view class="number" v-if="orderCount.diff_prices > 0">{{orderCount.diff_prices}}</view>
|
||||
<view class="text">补差价</view>
|
||||
</view>
|
||||
<view class="tool-flex-item" @click="onNav('RefundOrder')">
|
||||
<image class="icon" src="@/static/icons/work_icon_18.png"></image>
|
||||
<view class="number" v-if="orderCount.refund > 0">{{orderCount.refund}}</view>
|
||||
<view class="text">退款订单</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<!-- 未登录 -->
|
||||
<view v-else class="auth-null">
|
||||
<u-empty
|
||||
mode="permission"
|
||||
icon="http://cdn.uviewui.com/uview/empty/permission.png"
|
||||
text="暂未登录"
|
||||
>
|
||||
</u-empty>
|
||||
<button class="auth-null-btn" size="mini" @click="onNav('Auth')">登录</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { index, rights } from '@/apis/interfaces/work.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
isAuth : false,
|
||||
rightsArr : [],
|
||||
userInfo : {
|
||||
nickname: '',
|
||||
avatar : ''
|
||||
},
|
||||
identity : {},
|
||||
isAnswer : false,
|
||||
isCertification : false,
|
||||
certification : null,
|
||||
isManager : false,
|
||||
orderCount : {},
|
||||
// 权益说明
|
||||
privilegeShow : false,
|
||||
privilegeText : ''
|
||||
};
|
||||
},
|
||||
onShow() {
|
||||
let i = 0;
|
||||
this.isAuth = this.$store.getters.getToken != ''
|
||||
if(this.isAuth){
|
||||
this.getIndex()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 显示业务员权益
|
||||
onToast(val){
|
||||
this.privilegeText = val.content
|
||||
this.privilegeShow = true
|
||||
},
|
||||
// 工作台信息
|
||||
getIndex(){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
Promise.all([rights(), index()]).then(res => {
|
||||
let rightsData = res[0],
|
||||
indexData = res[1]
|
||||
|
||||
let { nickname, avatar, business_orders_count, isCertification, certification, isManager, isAnswer, identity } = indexData
|
||||
this.rightsArr = rightsData
|
||||
this.userInfo = {
|
||||
nickname,
|
||||
avatar
|
||||
}
|
||||
this.isCertification = isCertification
|
||||
this.certification = certification
|
||||
this.isManager = isManager
|
||||
this.isAnswer = isAnswer
|
||||
this.orderCount = business_orders_count
|
||||
this.identity = identity
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 导航
|
||||
onNav(name, obj){
|
||||
let params = obj || {}
|
||||
this.$Router.push({name, params})
|
||||
},
|
||||
// 创建订单
|
||||
onCreateOrder(){
|
||||
uni.showActionSheet({
|
||||
itemList: ['个人订单', '客户订单'],
|
||||
success : res => {
|
||||
this.onNav('OrderCreate', {
|
||||
type: res.tapIndex === 0 ? 'self' : 'other'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.content{
|
||||
padding-bottom: 30rpx;
|
||||
}
|
||||
// 登录提示
|
||||
.auth-null{
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
background: white;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
.auth-null-btn{
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
padding: 0;
|
||||
width: 70vw;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
font-size: 32rpx;
|
||||
margin-top: 100rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
// 弹出特权
|
||||
.privilege-lay{
|
||||
width: 70vw;
|
||||
.privilege-lay-img{
|
||||
width: 70vw;
|
||||
vertical-align: top;
|
||||
}
|
||||
.privilege-lay-content{
|
||||
background: white;
|
||||
border-radius: 0 0 20rpx 20rpx;
|
||||
width: 70vw;
|
||||
padding: 80rpx 30rpx 50rpx;
|
||||
box-sizing: border-box;
|
||||
margin-top: -50rpx;
|
||||
line-height: 50rpx;
|
||||
color: #111111;
|
||||
font-size: 30rpx;
|
||||
}
|
||||
.privilege-lay-remove{
|
||||
padding-top: 30rpx;
|
||||
text-align: center;
|
||||
.privilege-lay-icon{
|
||||
display: inline-block;
|
||||
}
|
||||
}
|
||||
}
|
||||
// header
|
||||
.work-bar{
|
||||
padding: 30rpx;
|
||||
margin-bottom: 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
&-user{
|
||||
position: relative;
|
||||
line-height: 70rpx;
|
||||
height: 70rpx;
|
||||
width: calc(100% - 200rpx);
|
||||
padding-left: 90rpx;
|
||||
box-sizing: border-box;
|
||||
.cover{
|
||||
width: 70rpx;
|
||||
height: 70rpx;
|
||||
border-radius: 50%;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
}
|
||||
.nickname{
|
||||
font-weight: bold;
|
||||
font-size: 34rpx;
|
||||
.card{
|
||||
color: $main-color;
|
||||
font-size: 24rpx;
|
||||
display: inline-block;
|
||||
height: 40rpx;
|
||||
line-height: 38rpx;
|
||||
border-radius: 24rpx;
|
||||
padding: 0 15rpx;
|
||||
margin-left: 20rpx;
|
||||
margin-bottom: 2rpx;
|
||||
vertical-align: middle;
|
||||
border:solid 1rpx $main-color;
|
||||
font-weight: normal;
|
||||
}
|
||||
}
|
||||
}
|
||||
&-add{
|
||||
width: 200rpx;
|
||||
font-size: 30rpx;
|
||||
text-align: right;
|
||||
line-height: 70rpx;
|
||||
.icon{
|
||||
margin-right: 5rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 订单管理
|
||||
.tool-flex{
|
||||
padding: 0 10rpx;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
.tool-flex-item{
|
||||
width: 25%;
|
||||
text-align: center;
|
||||
margin-bottom: 30rpx;
|
||||
position: relative;
|
||||
.icon{
|
||||
width: 78rpx;
|
||||
height: 78rpx;
|
||||
background: #ddd;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
.number{
|
||||
position: absolute;
|
||||
right: 20%;
|
||||
background: #fe4444;
|
||||
top: -10rpx;
|
||||
height: 40rpx;
|
||||
line-height: 40rpx;
|
||||
min-width: 40rpx;
|
||||
font-size: 24rpx;
|
||||
color: white;
|
||||
border-radius: 50%;
|
||||
}
|
||||
.text{
|
||||
line-height: 40rpx;
|
||||
font-size: 26rpx;
|
||||
color: #111;
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 数据统计单
|
||||
.total-flex{
|
||||
padding: 0 20rpx 20rpx;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
flex-wrap: wrap;
|
||||
.total-item{
|
||||
margin: 0 10rpx 20rpx;
|
||||
background: #f8f8f8;
|
||||
width: calc(50% - 20rpx);
|
||||
padding: 20rpx 20rpx 20rpx 120rpx;
|
||||
box-sizing: border-box;
|
||||
border-radius: $radius;
|
||||
position: relative;
|
||||
min-height: 140rpx;
|
||||
.icon{
|
||||
position: absolute;
|
||||
left: 20rpx;
|
||||
top: 50%;
|
||||
width: 70rpx;
|
||||
height: 70rpx;
|
||||
margin-top: -35rpx;
|
||||
}
|
||||
.title{
|
||||
font-size: 28rpx;
|
||||
color: #111;
|
||||
@extend .nowrap;
|
||||
}
|
||||
.number{
|
||||
padding-top: 5rpx;
|
||||
font-weight: bold;
|
||||
font-size: 40rpx;
|
||||
color: #111;
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
@extend .nowrap;
|
||||
text{
|
||||
font-size: 80%;
|
||||
font-weight: normal;
|
||||
padding-left: 10rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 通用板块
|
||||
.block{
|
||||
background: white;
|
||||
margin: 0 30rpx 20rpx;
|
||||
border-radius: $radius;
|
||||
.block-title{
|
||||
padding: 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-weight: bold;
|
||||
color: '#111';
|
||||
font-size: 32rpx;
|
||||
}
|
||||
}
|
||||
// 开通业务员
|
||||
.open-interest{
|
||||
padding: 30rpx;
|
||||
margin-bottom: 30rpx;
|
||||
.title{
|
||||
text-align: center;
|
||||
font-size: 34rpx;
|
||||
font-weight: bold;
|
||||
line-height: 80rpx;
|
||||
}
|
||||
.open-interest-flex{
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
padding-top: 30rpx;
|
||||
justify-content: space-between;
|
||||
.open-interest-item{
|
||||
text-align: center;
|
||||
.open-interest-icon{
|
||||
width: 88rpx;
|
||||
height: 88rpx;
|
||||
vertical-align: top;
|
||||
margin-bottom: 15rpx;
|
||||
}
|
||||
.open-interest-text{
|
||||
font-size: 28rpx;
|
||||
color: #111111;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 开通步骤
|
||||
.open-interest-block{
|
||||
padding: 30rpx 0;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.open-interest-icon{
|
||||
width: 88rpx;
|
||||
height: 88rpx;
|
||||
}
|
||||
.open-interest-text{
|
||||
width: calc( 100% - 258rpx);
|
||||
padding:0 30rpx;
|
||||
box-sizing: border-box;
|
||||
.open-interest-title{
|
||||
font-weight: bold;
|
||||
color: #111111;
|
||||
line-height: 40rpx;
|
||||
font-size: 30rpx;
|
||||
}
|
||||
.open-interest-submit{
|
||||
color: #666666;
|
||||
font-size: 26rpx;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
}
|
||||
.open-interest-btn[size="mini"]{
|
||||
width: 170rpx;
|
||||
height: 70rpx;
|
||||
line-height: 70rpx;
|
||||
padding: 0;
|
||||
border-radius: 35rpx;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
font-size: 30rpx;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
&[disabled]{
|
||||
background: #EEEEEE;
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
304
pages/work/mailed.vue
Normal file
@@ -0,0 +1,304 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<view class="mailed-back"></view>
|
||||
<view class="receive" v-if="address != ''" @click="onCopy(address.name + ' ' + address.mobile + ' ' + address.full_address)">
|
||||
<text class="receive-icon">收</text>
|
||||
<view class="receive-text">
|
||||
<view class="receive-name">{{address.name}}<text>{{address.mobile}}</text></view>
|
||||
<view class="receive-add">{{address.full_address}}</view>
|
||||
</view>
|
||||
<uni-icons class="receive-right" type="right" color="gray"></uni-icons>
|
||||
</view>
|
||||
<view class="material">
|
||||
<view class="material-title">
|
||||
<text class="material-title-text">邮寄物品</text>
|
||||
<u-checkbox-group @change="onAll" v-model="checkboxAll">
|
||||
<u-checkbox name="all" activeColor="#446EFE" shape="circle" label="全选" labelSize="14" labelColor="#111"></u-checkbox></text>
|
||||
</u-checkbox-group>
|
||||
</view>
|
||||
<u-checkbox-group
|
||||
v-model="checkboxValue"
|
||||
iconPlacement="right"
|
||||
placement="column"
|
||||
@change="onCheckboxChange"
|
||||
>
|
||||
<view class="material-item" v-for="(item, index) in deliverCount" :key="index">
|
||||
<u-checkbox :name="item.value" activeColor="#446EFE" shape="circle" :label="item.title" labelSize="14" labelColor="#111"></u-checkbox>
|
||||
</view>
|
||||
</u-checkbox-group>
|
||||
</view>
|
||||
<view class="from">
|
||||
<view class="from-flex">
|
||||
<label>物流单号</label>
|
||||
<view class="from-inputs">
|
||||
<input class="from-inputs-input" v-model="no" type="text" placeholder="请填写">
|
||||
<uni-icons type="scan" color="#111" size="36rpx" @click="onScan"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
<view class="from-flex">
|
||||
<label>物流公司</label>
|
||||
<view class="from-inputs">
|
||||
<picker :range="expressArr" range-key="name" @change="onPicker">
|
||||
<view class="from-inputs-input" :class="{ 'hide': expressIndex == null }">{{expressIndex == null ? '请选择': expressArr[expressIndex].name}}</view>
|
||||
</picker>
|
||||
<uni-icons type="right" color="#999999" size="36rpx"></uni-icons>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="from-btn">
|
||||
<button @click="onSubmit">提交</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { express, orderAddress, submitExpresses } from '@/apis/interfaces/mailed.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
address : '',
|
||||
no : '',
|
||||
expressIndex : null,
|
||||
expressArr : [],
|
||||
checkboxAll : [],
|
||||
checkboxValue: [],
|
||||
deliverCount : []
|
||||
};
|
||||
},
|
||||
created() {
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
Promise.all([orderAddress(this.$Route.query.orderId),express()]).then(res => {
|
||||
let addressData = res[0],
|
||||
expressData = res[1],
|
||||
deliverOption = []
|
||||
|
||||
for(let key in addressData.deliver_count){
|
||||
if(key == 'mobile' && !addressData.deliver_count[key]){
|
||||
deliverOption.push({
|
||||
value: 1,
|
||||
title: '电话卡'
|
||||
})
|
||||
}
|
||||
if(key == 'metarial' && !addressData.deliver_count[key]){
|
||||
deliverOption.push({
|
||||
value: 2,
|
||||
title: '征信资料'
|
||||
})
|
||||
}
|
||||
}
|
||||
this.expressArr = expressData
|
||||
this.deliverCount = deliverOption
|
||||
this.address = addressData.address
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 选择框
|
||||
onCheckboxChange(e){
|
||||
this.checkboxAll = e.length == this.deliverCount.length ? ['all'] : []
|
||||
this.checkboxValue = e;
|
||||
},
|
||||
// 全选
|
||||
onAll(e){
|
||||
if(e.length > 0){
|
||||
this.checkboxValue = this.deliverCount.map(val => {
|
||||
return val.value
|
||||
})
|
||||
}else{
|
||||
this.checkboxValue = []
|
||||
}
|
||||
},
|
||||
// 提交订单物流
|
||||
onSubmit(){
|
||||
if(this.checkboxValue.length <= 0){
|
||||
uni.showToast({
|
||||
title: '请选择邮寄的物品',
|
||||
icon : 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
if(this.expressIndex != ''){
|
||||
uni.showToast({
|
||||
title: '请选择物流公司',
|
||||
icon : 'none'
|
||||
})
|
||||
return
|
||||
}
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
submitExpresses(this.$Route.query.orderId, {
|
||||
express_id : this.expressArr[this.expressIndex].express_id,
|
||||
number : this.no,
|
||||
type : this.checkboxValue,
|
||||
staff_address_id: this.address.address_id
|
||||
}).then(res => {
|
||||
uni.showModal({
|
||||
content : '材料已邮寄',
|
||||
showCancel : false,
|
||||
success : () => {
|
||||
if(this.deliverCount.length <= 1){
|
||||
this.$store.commit('setOrderId', this.$Route.query.orderId)
|
||||
}
|
||||
this.$Router.back()
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 选择物流公司
|
||||
onPicker(e){
|
||||
this.expressIndex = e.detail.value
|
||||
},
|
||||
// 扫码
|
||||
onScan(){
|
||||
uni.scanCode({
|
||||
scanType: ['barCode', 'qrCode'],
|
||||
success: res => {
|
||||
let { result } = res;
|
||||
this.no = result;
|
||||
}
|
||||
})
|
||||
},
|
||||
// 复制地址
|
||||
onCopy(e){
|
||||
uni.setClipboardData({
|
||||
data: e,
|
||||
success: res => {
|
||||
uni.showToast({
|
||||
title: '地址已复制',
|
||||
icon : 'none'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.mailed-back{
|
||||
background: $main-color;
|
||||
height: 150rpx;
|
||||
}
|
||||
// 按钮
|
||||
.from-btn{
|
||||
padding: 30rpx;
|
||||
button{
|
||||
background: $main-color;
|
||||
color: white;
|
||||
font-size: 32rpx;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
padding: 0;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
}
|
||||
// 表单
|
||||
.from{
|
||||
background: white;
|
||||
border-radius: 20rpx;
|
||||
padding: 10rpx 30rpx;
|
||||
margin: 30rpx;
|
||||
.from-flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-size: 30rpx;
|
||||
label{
|
||||
width: 150rpx;
|
||||
line-height: 90rpx;
|
||||
}
|
||||
.from-inputs{
|
||||
width: calc(100% - 150rpx);
|
||||
display: flex;
|
||||
justify-content: flex-end;
|
||||
align-items: center;
|
||||
.from-inputs-input{
|
||||
font-size: 30rpx;
|
||||
text-align: right;
|
||||
margin-right: 30rpx;
|
||||
flex: 1;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
&.hide{
|
||||
color: gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 邮寄物品
|
||||
.material{
|
||||
background: white;
|
||||
border-radius: 20rpx;
|
||||
padding: 30rpx;
|
||||
margin: 30rpx;
|
||||
.material-title{
|
||||
padding-bottom: 20rpx;
|
||||
font-size: 30rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
&-text{
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.material-item{
|
||||
padding: 20rpx 0;
|
||||
}
|
||||
}
|
||||
// 邮寄信息
|
||||
.receive{
|
||||
background-color: white;
|
||||
margin: -130rpx 30rpx 0;
|
||||
border-radius: 20rpx;
|
||||
padding: $padding;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.receive-icon{
|
||||
background: $main-color;
|
||||
color: white;
|
||||
width: 48rpx;
|
||||
height: 48rpx;
|
||||
line-height: 48rpx;
|
||||
border-radius: 10rpx;
|
||||
display: inline-block;
|
||||
font-size: 28rpx;
|
||||
text-align: center;
|
||||
}
|
||||
.receive-text{
|
||||
width: calc(100% - 130rpx);
|
||||
.receive-name{
|
||||
padding-bottom: 5rpx;
|
||||
font-weight: bold;
|
||||
font-size: 32rpx;
|
||||
text{
|
||||
font-size: 90%;
|
||||
margin-left: 20rpx;
|
||||
font-weight: normal;
|
||||
color: #111;
|
||||
}
|
||||
}
|
||||
.receive-add{
|
||||
font-size: 28rpx;
|
||||
color: #111;
|
||||
}
|
||||
}
|
||||
.receive-right{
|
||||
color: gray;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
19
pages/work/mailedInfo.vue
Normal file
@@ -0,0 +1,19 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
邮寄信息详情
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
|
||||
};
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
|
||||
</style>
|
||||
209
pages/work/modifyOrder.vue
Normal file
@@ -0,0 +1,209 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<block v-if="orders.length > 0">
|
||||
<view v-for="(item, index) in orders" :key="index" class="order-block">
|
||||
<view class="order-header">
|
||||
<view class="order-header-no nowrap">{{item.order_no}}</view>
|
||||
<view class="order-header-price nowrap">¥{{item.total}}</view>
|
||||
</view>
|
||||
<view class="order-content">
|
||||
<view class="order-content-item">
|
||||
<label>订单类型</label>
|
||||
<view class="order-content-val order-content-type nowrap">
|
||||
<text class="order-type" v-for="(citem, cindex) in item.item_type" :key="cindex" v-if="citem.number > 0">{{citem.title}}×{{citem.number}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="order-content-item">
|
||||
<label>客户姓名</label>
|
||||
<view class="order-content-val nowrap">{{ item.user.nickname }}</view>
|
||||
</view>
|
||||
<view class="order-content-item">
|
||||
<label>客户电话</label>
|
||||
<view class="order-content-val nowrap">{{ item.user.username }}</view>
|
||||
</view>
|
||||
<view class="order-content-item">
|
||||
<label>服务包数量</label>
|
||||
<view class="order-content-val nowrap">×{{ item.services.length }}</view>
|
||||
</view>
|
||||
<view class="order-content-item">
|
||||
<label>创建时间</label>
|
||||
<view class="order-content-val nowrap">{{item.created_at}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="order-btns">
|
||||
<button class="order-left-btn" size="mini" @click="onCallPhone(item.user.username)">联系客户</button>
|
||||
<view class="order-right">
|
||||
<button size="mini" @click="$Router.push({name: 'WorkPerfectChoose', params: {orderId: item.business_order_id, type: 'perfect'}})">修改</button>
|
||||
<button size="mini" @click="$Router.push({name: 'OrderInfo', params: {orderId: item.business_order_id}})">查看</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="null">
|
||||
<u-empty
|
||||
mode="order"
|
||||
icon="http://cdn.uviewui.com/uview/empty/order.png"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ordersEditorders } from '@/apis/interfaces/order.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
orders: [],
|
||||
page : ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getList()
|
||||
},
|
||||
onShow() {
|
||||
// 是否处理当前列表状态
|
||||
let isOrderId = this.$store.getters.getOrderId
|
||||
if(isOrderId != null){
|
||||
this.removeListVal(isOrderId)
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
// 联系客户
|
||||
onCallPhone(phone){
|
||||
uni.makePhoneCall({
|
||||
phoneNumber: phone
|
||||
})
|
||||
},
|
||||
// 获取订单列表
|
||||
getList(){
|
||||
ordersEditorders().then(res => {
|
||||
let { data, page } = res;
|
||||
this.orders = data
|
||||
this.page = page
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 变更当前列表状态
|
||||
removeListVal(id){
|
||||
let ListArr = this.orders
|
||||
let ListIndex = ListArr.findIndex(val => val.business_order_id == id)
|
||||
if(ListIndex >= 0){
|
||||
this.orders.splice(ListIndex, 1)
|
||||
}
|
||||
this.$store.commit('setOrderId', null)
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.content{
|
||||
padding: 1rpx 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.null{
|
||||
height: 100vh;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
// 订单模块
|
||||
.order-block{
|
||||
background-color: white;
|
||||
margin: 30rpx;
|
||||
border-radius: 20rpx;
|
||||
.order-header{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
border-bottom: solid 1rpx #f6f6f6;
|
||||
padding: 15rpx 30rpx;
|
||||
line-height: 80rpx;
|
||||
font-size: 30rpx;
|
||||
&-no{
|
||||
color: gray;
|
||||
width: calc(100% - 200rpx);
|
||||
}
|
||||
&-price{
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
width: 200rpx;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
.order-content{
|
||||
padding: 20rpx 30rpx;
|
||||
&-item{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 70rpx;
|
||||
font-size: 30rpx;
|
||||
label{
|
||||
width: 200rpx;
|
||||
color: gray;
|
||||
}
|
||||
.order-content-val{
|
||||
width: calc(100% - 200rpx);
|
||||
text-align: right;
|
||||
}
|
||||
.order-content-type{
|
||||
text{
|
||||
margin-right: 30rpx;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
&::after{
|
||||
position: absolute;
|
||||
content: "/";
|
||||
width: 30rpx;
|
||||
text-align: center;
|
||||
font-size: 30rpx;
|
||||
top: 0;
|
||||
right: -30rpx;
|
||||
}
|
||||
&:last-child{
|
||||
margin-right: 0;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.order-btns{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
border-top: solid 1rpx #f6f6f6;
|
||||
padding: 20rpx 30rpx;
|
||||
button[size="mini"]{
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 70rpx;
|
||||
line-height: 68rpx;
|
||||
border-radius: 40rpx;
|
||||
padding: 0 30rpx;
|
||||
font-size: 30rpx;
|
||||
background: white;
|
||||
color: $main-color;
|
||||
border:solid 1rpx $main-color;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.order-right{
|
||||
button[size="mini"]{
|
||||
margin-left: 30rpx;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
304
pages/work/orderInfo.vue
Normal file
@@ -0,0 +1,304 @@
|
||||
<template>
|
||||
<view class="content" v-if="order_no != ''">
|
||||
<view class="order-header"></view>
|
||||
<!-- 订单主要信息 -->
|
||||
<view class="order-back order-flex order-info">
|
||||
<view class="order-state">{{statusText}}</view>
|
||||
<view class="order-item">
|
||||
<label>服务类型</label>
|
||||
<view class="order-value nowrap">
|
||||
<text class="order-type" v-for="(item, index) in item_type" :key="index" v-if="item.number > 0">{{item.title}}×{{item.number}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="order-items">
|
||||
<view class="order-items-flex" v-for="(item, index) in items" :key="index" @click="$Router.push({ name: 'OrderSchemes', params: { id: item.business_order_item_id }})">
|
||||
<label>{{item.institution.title}}({{item.business_type.title}})</label>
|
||||
<view class="order-items-type nowrap">¥{{item.price}}<uni-icons type="right" color="gray" size="14px"></uni-icons></view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="order-item">
|
||||
<label>欠款总金额</label>
|
||||
<view class="order-value order-value-price nowrap">¥{{serviceTotal}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 订单服务包信息 -->
|
||||
<view class="order-back order-flex" v-if="services.length > 0">
|
||||
<view class="order-title">服务包</view>
|
||||
<view class="order-serve">
|
||||
<block v-for="(item, index) in services" :key="index">
|
||||
<view class="serve-header">
|
||||
{{item.title}}<text>¥{{item.price}}</text>
|
||||
</view>
|
||||
<view class="serve-item" v-for="(citem, cindex) in item.items" :key="cindex">
|
||||
<view class="services-flex">
|
||||
<label class="services-flex-label nowrap">服务类型</label>
|
||||
<view class="services-flex-val nowrap">{{citem.business}}({{citem.type}})</view>
|
||||
</view>
|
||||
<view class="services-flex">
|
||||
<label class="services-flex-title nowrap">{{citem.title}}</label>
|
||||
<view class="services-flex-price nowrap"><text>¥</text>{{citem.price}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 客户信息 -->
|
||||
<view class="order-back order-flex">
|
||||
<view class="order-title">客户信息</view>
|
||||
<view class="order-item">
|
||||
<label>客户姓名</label>
|
||||
<view class="order-value nowrap">{{user.nickname || '-'}}</view>
|
||||
</view>
|
||||
<view class="order-item">
|
||||
<label>客户性别</label>
|
||||
<view class="order-value nowrap">{{user.sex || '-'}}</view>
|
||||
</view>
|
||||
<view class="order-item">
|
||||
<label>客户电话</label>
|
||||
<view class="order-value nowrap">{{user.username || '-'}}</view>
|
||||
</view>
|
||||
<view class="order-btn" @click="onCallPhone(user.username)">联系客户</view>
|
||||
</view>
|
||||
<!-- 订单其他信息 -->
|
||||
<view class="order-back order-flex">
|
||||
<view class="order-title">订单信息</view>
|
||||
<view class="order-item">
|
||||
<label>订单编号</label>
|
||||
<view class="order-value nowrap">{{order_no || '-'}}</view>
|
||||
</view>
|
||||
<view class="order-item">
|
||||
<label>创建时间</label>
|
||||
<view class="order-value nowrap">{{created_at || '-'}}</view>
|
||||
</view>
|
||||
<view class="order-item">
|
||||
<label>订单金额</label>
|
||||
<view class="order-value nowrap">{{total || '-'}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { info } from '@/apis/interfaces/order.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
orderId : '',
|
||||
total : '0.00',
|
||||
order_no : '',
|
||||
statusText : '',
|
||||
created_at : '',
|
||||
user : {
|
||||
nickname : '',
|
||||
sex : '',
|
||||
username : ''
|
||||
},
|
||||
item_type : [],
|
||||
items : [],
|
||||
services : [],
|
||||
serviceTotal: ''
|
||||
};
|
||||
},
|
||||
onShow() {
|
||||
this.orderId = this.$Route.query.orderId
|
||||
this.getInfo()
|
||||
},
|
||||
methods: {
|
||||
// 订单详情
|
||||
getInfo(){
|
||||
info(this.orderId).then(res => {
|
||||
let { status, created_at, total, order_no, user, item_type, items, services, service_prices } = res
|
||||
this.statusText = status.text
|
||||
this.created_at = created_at
|
||||
this.total = total
|
||||
this.order_no = order_no
|
||||
this.user = user
|
||||
this.item_type = item_type
|
||||
this.items = items
|
||||
this.services = services
|
||||
this.serviceTotal = service_prices
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 刷新列表订单
|
||||
onRefreshOrder(){
|
||||
this.$store.commit('setOrderId', this.$Route.query.orderId)
|
||||
},
|
||||
// 拨打电话
|
||||
onCallPhone(phone){
|
||||
uni.makePhoneCall({
|
||||
phoneNumber: phone,
|
||||
fail(err) {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// header
|
||||
.order-header{
|
||||
background: #446EFE;
|
||||
height: 150rpx;
|
||||
}
|
||||
// 订单块
|
||||
.order-back{
|
||||
background: white;
|
||||
border-radius: 20rpx;
|
||||
margin: 0 30rpx 30rpx;
|
||||
}
|
||||
// 订单信息
|
||||
.order-info{
|
||||
margin: -100rpx 30rpx 30rpx;
|
||||
.order-state{
|
||||
font-weight: bold;
|
||||
font-size: 30rpx;
|
||||
margin: 0 -30rpx;
|
||||
padding: 0 30rpx;
|
||||
border-bottom: solid 1rpx #f6f6f6;
|
||||
padding-bottom: 20rpx;
|
||||
line-height: 80rpx;
|
||||
font-size: 48rpx;
|
||||
}
|
||||
}
|
||||
// 订单列表
|
||||
.order-flex{
|
||||
padding: 20rpx 30rpx;
|
||||
.order-title{
|
||||
font-weight: bold;
|
||||
font-size: 36rpx;
|
||||
line-height: 60rpx;
|
||||
}
|
||||
// 订单信息
|
||||
.order-item{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 80rpx;
|
||||
font-size: 30rpx;
|
||||
label{
|
||||
width: 200rpx;
|
||||
}
|
||||
.order-value{
|
||||
color: gray;
|
||||
width: calc(100% - 200rpx);
|
||||
text-align: right;
|
||||
.order-type{
|
||||
margin-right: 30rpx;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
&::after{
|
||||
position: absolute;
|
||||
content: "/";
|
||||
width: 30rpx;
|
||||
text-align: center;
|
||||
font-size: 30rpx;
|
||||
top: 0;
|
||||
right: -30rpx;
|
||||
}
|
||||
&:last-child{
|
||||
margin-right: 0;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
&.order-value-price{
|
||||
color: red;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 服务包信息
|
||||
.order-serve{
|
||||
background-color: rgba(68, 110, 254, .03);
|
||||
border-radius: 10rpx;
|
||||
margin: 15rpx 0;
|
||||
padding: 0 25rpx;
|
||||
.serve-header{
|
||||
display: flex;
|
||||
padding-top: 20rpx;
|
||||
padding-bottom: 20rpx;
|
||||
justify-content: space-between;
|
||||
font-weight: bold;
|
||||
border-bottom: solid 1rpx #f6f6f6;
|
||||
text{
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
.serve-item{
|
||||
border-bottom: solid 1rpx #f6f6f6;
|
||||
padding: 20rpx 0;
|
||||
&:last-child{
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
.services-flex{
|
||||
display: flex;
|
||||
font-size: 30rpx;
|
||||
line-height: 55rpx;
|
||||
.services-flex-label{
|
||||
width: 150rpx;
|
||||
color: #111111;
|
||||
}
|
||||
.services-flex-val{
|
||||
width: calc(100% - 150rpx);
|
||||
text-align: right;
|
||||
color: gray;
|
||||
}
|
||||
.services-flex-title{
|
||||
width: 50%;
|
||||
color: #111111;
|
||||
font-size: 30rpx;
|
||||
}
|
||||
.services-flex-price{
|
||||
font-size: 30rpx;
|
||||
width: 50%;
|
||||
text-align: right;
|
||||
font-weight: bold;
|
||||
color: #111111;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 订单服务项目
|
||||
.order-items{
|
||||
background-color: rgba(68, 110, 254, .03);
|
||||
border-radius: 10rpx;
|
||||
margin-bottom: 10rpx;
|
||||
padding: 20rpx 30rpx;
|
||||
.order-items-flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
flex-wrap: wrap;
|
||||
line-height: 60rpx;
|
||||
font-size: 28rpx;
|
||||
label{
|
||||
width: 340rpx;
|
||||
}
|
||||
.order-items-type{
|
||||
width: calc(100% - 340rpx);
|
||||
text-align: right;
|
||||
color: gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 订单按钮
|
||||
.order-btn{
|
||||
margin: 0 -30rpx;
|
||||
padding: 20rpx 30rpx 0;
|
||||
border-top: solid 1rpx #f6f6f6;
|
||||
text-align: center;
|
||||
line-height: 60rpx;
|
||||
color: $main-color;
|
||||
font-size: 32rpx;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
424
pages/work/orders.vue
Normal file
@@ -0,0 +1,424 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<!-- tabs -->
|
||||
<u-sticky bgColor="#FFF" zIndex="9" >
|
||||
<u-tabs
|
||||
:current="tabsCurrent"
|
||||
:list="tabs"
|
||||
lineColor="#446EFE"
|
||||
:activeStyle="{
|
||||
color: '#111',
|
||||
fontWeight: 'bold',
|
||||
fontSize: '32rpx'
|
||||
}"
|
||||
:inactiveStyle="{
|
||||
color: '#606266',
|
||||
fontSize: '30rpx'
|
||||
}"
|
||||
@click="onTabs"
|
||||
></u-tabs>
|
||||
</u-sticky>
|
||||
<!-- 订单管理列表 -->
|
||||
<view class="orders" v-if="orders.length > 0">
|
||||
<view class="orders-item" v-for="(item, index) in orders" :key="index">
|
||||
<view class="orders-flex">
|
||||
<view class="no nowrap">
|
||||
<text class="orders-tag" v-if="!item.is_my">客户</text>
|
||||
<text class="orders-tag order-tag-my" v-else>个人</text>
|
||||
{{item.order_no}}
|
||||
</view>
|
||||
<view class="state">{{item.status.text}}</view>
|
||||
</view>
|
||||
<view class="orders-content">
|
||||
<view class="orders-content-item">
|
||||
<label>业务类型</label>
|
||||
<view class="nowrap orders-content-type">
|
||||
<text v-for="(itemType, indexType) in item.item_type" :key="indexType" v-if="itemType.number > 0">{{itemType.title}}x{{itemType.number}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="orders-content-block">
|
||||
<view class="item-flex" v-for="(citem, cindex) in item.items" :key="cindex">
|
||||
<view class="item-flex-title">{{citem.institution.title}}({{citem.business_type.title}})</view>
|
||||
<view class="item-flex-value">¥{{citem.price}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="orders-content-item" v-if="item.total > 0">
|
||||
<label>咨询服务费</label>
|
||||
<view class="nowrap">¥{{item.total}}</view>
|
||||
</view>
|
||||
<view class="orders-content-item">
|
||||
<label>下单时间</label>
|
||||
<view class="nowrap">{{item.created_at}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="orders-flex">
|
||||
<view class="user">
|
||||
<image class="user-cover" :src="item.user.avatar" mode="aspectFill"></image>
|
||||
<view class="user-name">{{item.user.nickname}}</view>
|
||||
</view>
|
||||
<view class="btns">
|
||||
<view class="btns-item btns-border" v-if="item.deliver_count.can && item.deliver_count.num < item.deliver_count.all" @click="$Router.push({name: 'MailedOrder', params: {orderId: item.business_order_id}})">({{item.deliver_count.num}}/{{item.deliver_count.all}})邮寄材料</view>
|
||||
<view class="btns-item btns-border" v-if="item.can.transfer" @click="onTransfers(index, item)">转让</view>
|
||||
<view class="btns-item btns-border" v-if="item.status.value == 2" @click="onOrdersService(item.business_order_id)">匹配</view>
|
||||
<view class="btns-item btns-border" v-if="item.status.value == 4 && item.is_my" @click="onSign(item.business_order_id)">签约</view>
|
||||
<view class="btns-item btns-border" v-if="item.status.value == 3" @click="$Router.push({name: 'Pay', params: {orderId: item.business_order_id, type: 'acting', paytype: 'price'}})">缴费</view>
|
||||
<view class="btns-item btns-border" v-if="item.status.value == 5" @click="$Router.push({name: 'WorkPerfectChoose', params: {orderId: item.business_order_id, type: 'perfect'}})">完善</view>
|
||||
<view class="btns-item" @click="$Router.push({name: 'OrderInfo', params: {orderId: item.business_order_id}})">查看</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 订单是空的 -->
|
||||
<view class="order-null" v-else>
|
||||
<u-empty
|
||||
mode="order"
|
||||
icon="http://cdn.uviewui.com/uview/empty/order.png"
|
||||
text="暂无相关订单"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
<!-- 转让订单 -->
|
||||
<u-action-sheet
|
||||
:actions="actionLevels"
|
||||
description="请选择订单转让对象"
|
||||
cancelText="取消"
|
||||
round="10"
|
||||
:show="actionShow"
|
||||
@close="actionShow = false"
|
||||
@select="onActionSheet"
|
||||
></u-action-sheet>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { lists, orderSign, getOrderSignStatus } from '@/apis/interfaces/order.js'
|
||||
import { levels, transfer } from '@/apis/interfaces/transfers.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
tabsCurrent : 0,
|
||||
tabType : 0,
|
||||
tabs : [
|
||||
{val: 0, name: '待预约'},
|
||||
{val: 2, name: '匹配服务包'},
|
||||
{val: 3, name: '待缴服务费'},
|
||||
{val: 4, name: '待签约'},
|
||||
{val: 5, name: '待完善资料'},
|
||||
{val: 6, name: '初审中'},
|
||||
{val: 7, name: '复审中'},
|
||||
{val: 8, name: '办理中'},
|
||||
{val: 9, name: '待结案'},
|
||||
{val: 10, name: '办理完成'}
|
||||
],
|
||||
orders : [],
|
||||
actionShow : false,
|
||||
actionLevels: [],
|
||||
getSignState: false,
|
||||
getNextTab : false,
|
||||
};
|
||||
},
|
||||
created() {
|
||||
let { type } = this.$Route.query
|
||||
this.tabType = type;
|
||||
this.tabsCurrent = this.tabs.findIndex(val => val.val == type);
|
||||
this.getList()
|
||||
},
|
||||
onShow() {
|
||||
// 是否处理当前列表状态
|
||||
let isOrderId = this.$store.getters.getOrderId
|
||||
if(isOrderId != null){
|
||||
if(this.getSignState){
|
||||
this.onGetSign(isOrderId)
|
||||
return
|
||||
}
|
||||
// 匹配服务包变更了状态切换tab栏目获取新的列表数据
|
||||
if(this.getNextTab){
|
||||
this.tabsCurrent = this.tabsCurrent + 1
|
||||
this.tabType = this.tabs[this.tabsCurrent].val
|
||||
this.getList()
|
||||
this.getNextTab = false;
|
||||
this.$store.commit('setOrderId', null)
|
||||
return
|
||||
}
|
||||
this.getList()
|
||||
// this.removeListVal(isOrderId)
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
// 切换列表
|
||||
onTabs(e){
|
||||
this.tabsCurrent = e.index
|
||||
this.tabType = e.val
|
||||
this.getList()
|
||||
},
|
||||
// 变更当前列表状态
|
||||
removeListVal(id){
|
||||
let ListArr = this.orders
|
||||
let ListIndex = ListArr.findIndex(val => val.business_order_id == id)
|
||||
if(ListIndex >= 0){
|
||||
this.orders.splice(ListIndex, 1)
|
||||
}
|
||||
this.$store.commit('setOrderId', null)
|
||||
},
|
||||
// 获取列表
|
||||
getList(){
|
||||
this.$store.commit('setOrderId', null)
|
||||
lists({
|
||||
status: this.tabType
|
||||
}).then(res => {
|
||||
let { data } = res;
|
||||
this.orders = data
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 获取转让对象
|
||||
onTransfers(index, item){
|
||||
levels(item.business_order_id).then(res => {
|
||||
let ActionSheet = []
|
||||
for(let key in res){
|
||||
ActionSheet.push({
|
||||
key,
|
||||
name : res[key],
|
||||
val : item,
|
||||
index
|
||||
})
|
||||
}
|
||||
this.actionLevels = ActionSheet
|
||||
this.actionShow = true
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 转让订单
|
||||
onActionSheet(e){
|
||||
uni.showLoading({
|
||||
title: '提交中',
|
||||
mask : true
|
||||
})
|
||||
transfer(e.val.business_order_id, e.key).then(res => {
|
||||
uni.hideLoading()
|
||||
uni.showModal({
|
||||
title : '提示',
|
||||
content : res,
|
||||
showCancel : false,
|
||||
success: () => {
|
||||
e.val.can.transfer = false
|
||||
this.$set(this.orders, e.index, e.val)
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 匹配服务包
|
||||
onOrdersService(id){
|
||||
this.$Router.push({
|
||||
name: 'OrdersService',
|
||||
params: {
|
||||
orderId: id,
|
||||
},
|
||||
});
|
||||
this.getNextTab = true;
|
||||
},
|
||||
// 签约
|
||||
onSign(id){
|
||||
uni.showLoading({
|
||||
title: '获取签约信息...',
|
||||
mask : true
|
||||
})
|
||||
orderSign(id, {
|
||||
app_scheme: "doufire://"
|
||||
}).then(res => {
|
||||
this.$store.commit('setOrderId', id)
|
||||
this.getSignState = true
|
||||
plus.runtime.openURL(res.sign_url)
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 查询订单签约状态
|
||||
onGetSign(id){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
this.getSignState = false
|
||||
this.$store.commit('setOrderId', null)
|
||||
getOrderSignStatus(id).then(res => {
|
||||
if(res.status){
|
||||
this.removeListVal(id)
|
||||
}
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
// 订单为空
|
||||
.order-null{
|
||||
height: 80vh;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
// 订单列表
|
||||
.orders{
|
||||
padding: 30rpx 0 10rpx;
|
||||
.orders-item{
|
||||
margin: 0 30rpx 20rpx;
|
||||
background-color: white;
|
||||
border-radius: $radius;
|
||||
}
|
||||
.orders-content{
|
||||
padding: 20rpx 30rpx;
|
||||
&-item{
|
||||
line-height: 70rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
font-size: 30rpx;
|
||||
color: #111111;
|
||||
label{
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
&-type{
|
||||
text{
|
||||
margin-right: 30rpx;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
&::after{
|
||||
position: absolute;
|
||||
content: "/";
|
||||
width: 30rpx;
|
||||
text-align: center;
|
||||
font-size: 30rpx;
|
||||
top: 0;
|
||||
right: -30rpx;
|
||||
}
|
||||
&:last-child{
|
||||
margin-right: 0;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
&-block{
|
||||
background: rgba(68, 110, 254, .03);
|
||||
padding: 20rpx;
|
||||
font-size: 28rpx;
|
||||
border-radius: 10rpx;
|
||||
margin: 10rpx 0;
|
||||
.item-flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.orders-flex{
|
||||
border-bottom: solid 1rpx #F6F6F6;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 20rpx $padding;
|
||||
&:last-child{
|
||||
border-top: solid 1rpx #F6F6F6;
|
||||
border-bottom: none;
|
||||
}
|
||||
.orders-tag{
|
||||
display: inline-block;
|
||||
background: $main-color;
|
||||
font-size: 26rpx;
|
||||
color: white;
|
||||
border-radius: 10rpx;
|
||||
padding: 0 10rpx;
|
||||
height: 40rpx;
|
||||
line-height: 40rpx;
|
||||
margin-right: 10rpx;
|
||||
&.order-tag-my{
|
||||
background: $text-price;
|
||||
}
|
||||
}
|
||||
.no{
|
||||
font-size: 30rpx;
|
||||
color: #111;
|
||||
line-height: 60rpx;
|
||||
width: calc(100% - 150rpx);
|
||||
}
|
||||
.state{
|
||||
color: $main-color;
|
||||
font-weight: bold;
|
||||
font-size: 30rpx;
|
||||
line-height: 60rpx;
|
||||
width: 150rpx;
|
||||
text-align: right;
|
||||
}
|
||||
.user{
|
||||
padding-left: 90rpx;
|
||||
position: relative;
|
||||
min-height: 70rpx;
|
||||
box-sizing: border-box;
|
||||
width: calc(100% - 400rpx);
|
||||
.user-cover{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 70rpx;
|
||||
height: 70rpx;
|
||||
border-radius: 50%;
|
||||
background: #ddd;
|
||||
}
|
||||
.user-name{
|
||||
line-height: 70rpx;
|
||||
font-size: 30rpx;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
.btns{
|
||||
width: 400rpx;
|
||||
text-align: right;
|
||||
.btns-item{
|
||||
display: inline-block;
|
||||
height: 70rpx;
|
||||
|
||||
line-height: 70rpx;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
border-radius: 35rpx;
|
||||
padding: 0 30rpx;
|
||||
font-size: 30rpx;
|
||||
&.btns-border{
|
||||
line-height: 68rpx;
|
||||
box-sizing: border-box;
|
||||
border:solid 1rpx $main-color;
|
||||
background: white;
|
||||
color: $main-color;
|
||||
margin-right: 20rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
312
pages/work/perfectBasis.vue
Normal file
@@ -0,0 +1,312 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<block v-if="!loding">
|
||||
<view class="from">
|
||||
<view class="from-item from-item-50">
|
||||
<label><text>*</text>姓名</label>
|
||||
<input class="from-input" disabled v-model="baseInfo.name" type="text" placeholder="真实姓名">
|
||||
</view>
|
||||
<view class="from-item from-item-50">
|
||||
<label><text>*</text>性别</label>
|
||||
<input class="from-input" disabled v-model="baseInfo.sex" type="text" placeholder="性别">
|
||||
</view>
|
||||
<view class="from-item from-item-50">
|
||||
<label><text>*</text>年龄</label>
|
||||
<input class="from-input" disabled v-model="baseInfo.age" type="text" placeholder="年龄">
|
||||
</view>
|
||||
<view class="from-item from-item-50">
|
||||
<label><text>*</text>属相</label>
|
||||
<input class="from-input" disabled v-model="baseInfo.zodiak" type="text" placeholder="属相">
|
||||
</view>
|
||||
<view class="from-item from-item-100">
|
||||
<label>
|
||||
<text>*</text>婚姻
|
||||
<uni-icons v-if="baseInfo.check_params.marriage" class="from-icon" type="info" size="18" color="red" @click="modifyToast(baseInfo.check_params.marriage.description)"></uni-icons>
|
||||
</label>
|
||||
<picker
|
||||
:disabled="isCheck && !baseInfo.check_params.hasOwnProperty('marriage')"
|
||||
class="from-picker"
|
||||
:range="baseInfo.marriages"
|
||||
:value="baseInfo.marriage"
|
||||
@change="baseInfo.marriage = $event.detail.value"
|
||||
>
|
||||
<view class="from-picker-text">
|
||||
<view class="nowrap">{{baseInfo.marriages[baseInfo.marriage]}}</view>
|
||||
<u-icon class="icon" name="arrow-down-fill" color="#999" size="10"></u-icon>
|
||||
</view>
|
||||
</picker>
|
||||
</view>
|
||||
<view class="from-item from-item-100" v-if="baseInfo.marriage == 1">
|
||||
<label>
|
||||
<text>*</text>配偶姓名
|
||||
<uni-icons v-if="baseInfo.check_params.mate" class="from-icon" type="info" size="18" color="red" @click="modifyToast(baseInfo.check_params.mate.description)"></uni-icons>
|
||||
</label>
|
||||
<input
|
||||
class="from-input"
|
||||
v-model="baseInfo.mate"
|
||||
type="text"
|
||||
placeholder="输入配偶姓名"
|
||||
>
|
||||
</view>
|
||||
<view class="from-item from-item-50">
|
||||
<label>
|
||||
<text>*</text>学历
|
||||
<uni-icons v-if="baseInfo.check_params.marriage" class="from-icon" type="info" size="18" color="red" @click="modifyToast(baseInfo.check_params.education.description)"></uni-icons>
|
||||
</label>
|
||||
<picker class="from-picker" :range="baseInfo.educations" :value="baseInfo.education" @change="baseInfo.education = $event.detail.value">
|
||||
<view class="from-picker-text">
|
||||
<view class="nowrap">{{baseInfo.educations[baseInfo.education]}}</view>
|
||||
<u-icon class="icon" name="arrow-down-fill" color="#999" size="10"></u-icon>
|
||||
</view>
|
||||
</picker>
|
||||
</view>
|
||||
<view class="from-item from-item-50">
|
||||
<label>
|
||||
<text>*</text>毕业院校
|
||||
<uni-icons v-if="baseInfo.check_params.school" class="from-icon" type="info" size="18" color="red" @click="modifyToast(baseInfo.check_params.school.description)"></uni-icons>
|
||||
</label>
|
||||
<input class="from-input" type="text" v-model="baseInfo.school" placeholder="输入毕业院校">
|
||||
</view>
|
||||
<view class="from-item from-item-100">
|
||||
<label><text>*</text>身份证号</label>
|
||||
<input class="from-input" disabled type="text" v-model="baseInfo.id_card" placeholder="身份证号">
|
||||
</view>
|
||||
<view class="from-item from-item-100">
|
||||
<label><text>*</text>身份证地址</label>
|
||||
<input class="from-input" type="text" disabled v-model="baseInfo.address" placeholder="身份证地址">
|
||||
</view>
|
||||
<view class="from-item from-item-100">
|
||||
<label>
|
||||
<text>*</text>联系电话
|
||||
<uni-icons v-if="baseInfo.check_params.mobile" class="from-icon" type="info" size="18" color="red" @click="modifyToast(baseInfo.check_params.mobile.description)"></uni-icons>
|
||||
</label>
|
||||
<input class="from-input" type="number" v-model="baseInfo.mobile" placeholder="输入的联系电话">
|
||||
</view>
|
||||
<view class="from-item from-item-100">
|
||||
<label>
|
||||
<text>*</text>联系地址
|
||||
<uni-icons v-if="baseInfo.check_params.contact_address" class="from-icon" type="info" size="18" color="red" @click="modifyToast(baseInfo.check_params.contact_address.description)"></uni-icons>
|
||||
</label>
|
||||
<view class="from-city-picker">
|
||||
<uni-data-picker
|
||||
:localdata="cityPicker"
|
||||
:border="false"
|
||||
split="-"
|
||||
placeholder="选择城市"
|
||||
v-model="baseInfo.district_id"
|
||||
@change="onCityPicker"
|
||||
></uni-data-picker>
|
||||
</view>
|
||||
</view>
|
||||
<view class="from-item from-item-100">
|
||||
<textarea class="from-textarea" auto-height type="text" v-model="baseInfo.tmp_address" placeholder="输入详细地址"></textarea>
|
||||
</view>
|
||||
</view>
|
||||
<view class="btn">
|
||||
<button size="default" @click="onSubmit">提交基础资料</button>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { perfectBase, updPerfectBase } from '@/apis/interfaces/order.js'
|
||||
import { region } from '@/apis/interfaces/address.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
loding : true,
|
||||
orderId : '',
|
||||
baseInfo : {},
|
||||
cityPicker : [],
|
||||
isCheck : false
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.orderId = this.$Route.query.orderId
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
region().then(res => {
|
||||
this.cityPicker = res;
|
||||
this.getPerfectBase()
|
||||
}).then(err => {
|
||||
uni.showToast({
|
||||
title: '获取城市信息失败:' + err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
// 获取用户基础信息
|
||||
getPerfectBase(){
|
||||
perfectBase(this.orderId).then(res => {
|
||||
let { base, province } = res;
|
||||
console.log(res)
|
||||
|
||||
console.log(base.check_params.toString() != '')
|
||||
|
||||
this.baseInfo = base;
|
||||
this.isCheck = base.check_params.toString() != ''
|
||||
|
||||
console.log(base.check_params)
|
||||
|
||||
this.loding = false;
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 选择城市
|
||||
onCityPicker(e){
|
||||
let { value } = e.detail
|
||||
this.baseInfo.district_id = value[0].value
|
||||
this.baseInfo.city_id = value[1].value
|
||||
this.baseInfo.province_id = value[2].value
|
||||
},
|
||||
// 提交基础资料
|
||||
onSubmit(){
|
||||
let data = {
|
||||
mobile : this.baseInfo.mobile,
|
||||
marriage : this.baseInfo.marriage,
|
||||
mate : this.baseInfo.mate,
|
||||
education : this.baseInfo.education,
|
||||
school : this.baseInfo.school,
|
||||
tmp_address : this.baseInfo.tmp_address,
|
||||
province_id : this.baseInfo.district_id,
|
||||
city_id : this.baseInfo.city_id,
|
||||
district_id : this.baseInfo.province_id
|
||||
}
|
||||
updPerfectBase(this.orderId, data).then(res => {
|
||||
uni.showModal({
|
||||
title : '提示',
|
||||
content : '资料已保存',
|
||||
showCancel : false,
|
||||
success : ModalRes => {
|
||||
this.$Router.back()
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 修改提示信息
|
||||
modifyToast(text){
|
||||
uni.showModal({
|
||||
title : '驳回原因',
|
||||
content : text || '-',
|
||||
showCancel : false,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.content{
|
||||
padding-top: 30rpx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
// btn
|
||||
.btn{
|
||||
padding: 0 30rpx 60rpx 30rpx;
|
||||
button[size="default"]{
|
||||
color: white;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
border-radius: 45rpx;
|
||||
background-color: $main-color;
|
||||
padding: 0;
|
||||
border-radius: 20rpx;
|
||||
font-size: 34rpx;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
// form
|
||||
.from{
|
||||
margin:0 30rpx 30rpx 30rpx;
|
||||
background: white;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
border-radius: 20rpx;
|
||||
padding: 15rpx;
|
||||
.from-item{
|
||||
margin: 15rpx;
|
||||
&.from-item-50{
|
||||
width: calc(50% - 30rpx);
|
||||
}
|
||||
&.from-item-100{
|
||||
width: calc(100% - 30rpx);
|
||||
}
|
||||
label{
|
||||
color: #111111;
|
||||
font-size: 30rpx;
|
||||
padding-bottom: 20rpx;
|
||||
display: block;
|
||||
& > text{
|
||||
color: #FF0101;
|
||||
margin-right: 5rpx;
|
||||
display: inline-block;
|
||||
}
|
||||
.from-icon{
|
||||
vertical-align: top;
|
||||
margin-left: 10rpx;
|
||||
}
|
||||
}
|
||||
.from-input{
|
||||
background: #F6F6F6;
|
||||
width: 100%;
|
||||
height: 90rpx;
|
||||
border-radius: 10rpx;
|
||||
padding: 0 30rpx;
|
||||
box-sizing: border-box;
|
||||
font-size: 30rpx;
|
||||
}
|
||||
.from-textarea{
|
||||
padding: 20rpx 30rpx;
|
||||
background: #F6F6F6;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
font-size: 30rpx;
|
||||
line-height: 50rpx;
|
||||
border-radius: 10rpx;
|
||||
}
|
||||
.from-picker{
|
||||
.from-picker-text{
|
||||
position: relative;
|
||||
background: #F6F6F6;
|
||||
width: 100%;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
border-radius: 10rpx;
|
||||
font-size: 30rpx;
|
||||
padding: 0 90rpx 0 30rpx;
|
||||
box-sizing: border-box;
|
||||
& > .icon{
|
||||
position: absolute;
|
||||
right: 30rpx;
|
||||
top: 50%;
|
||||
margin-top: -10rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.from-city-picker{
|
||||
@extend .from-picker;
|
||||
.from-picker-text{
|
||||
text{
|
||||
margin-left: 10rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
192
pages/work/perfectChoose.vue
Normal file
@@ -0,0 +1,192 @@
|
||||
<template>
|
||||
<view class="perfect">
|
||||
<view class="perfect-header">
|
||||
<text v-if="isFinish == 0">完善订单资料</text>
|
||||
<text v-if="isFinish == 1">订单资料审核中</text>
|
||||
<text v-if="isFinish == 2">修改订单资料</text>
|
||||
|
||||
<image class="cover" src="@/static/background/info_back.png" mode="widthFix"></image>
|
||||
</view>
|
||||
<view class="perfect-list">
|
||||
<view class="perfect-item" @click="onPerfect('WorkPerfectBasis', baseInfo.is_finish, baseInfo.business_order_user_id)">
|
||||
<view class="cover">
|
||||
<image class="cover-src" src="@/static/icons/tabs_show_01.png" mode="aspectFit"></image>
|
||||
</view>
|
||||
<view class="main">
|
||||
<view class="title nowrap">基础信息</view>
|
||||
<view class="submit nowrap">客户身份等基础信息</view>
|
||||
</view>
|
||||
<view class="state normal" v-if="baseInfo.is_finish == 0">待完善<u-icon class="arrow" color="#446EFE" name="arrow-right"></u-icon></view>
|
||||
<view class="state" v-else-if="baseInfo.is_finish == 2">待修改<u-icon class="arrow" color="#FFAB3F" name="arrow-right"></u-icon></view>
|
||||
<view class="state gray" v-else>已完善<u-icon class="arrow" color="gray" name="arrow-right"></u-icon></view>
|
||||
</view>
|
||||
<!-- 机构列表 -->
|
||||
<block v-for="(item, index) in businessArr" :key="index">
|
||||
<view class="perfect-item" @click="onPerfect('WorkPerfectInstitutions', item.is_finish, item.business_order_item_id)">
|
||||
<view class="cover">
|
||||
<image class="cover-src" :src="item.institution.cover" mode="aspectFit"></image>
|
||||
</view>
|
||||
<view class="main">
|
||||
<view class="title nowrap">{{item.institution.title || '-'}}</view>
|
||||
<view class="submit nowrap">{{item.business_type.title || '-'}}</view>
|
||||
</view>
|
||||
<view class="state normal" v-if="item.is_finish == 0">待完善<u-icon class="arrow" color="#446EFE" name="arrow-right"></u-icon></view>
|
||||
<view class="state" v-else-if="item.is_finish == 2">待修改<u-icon class="arrow" color="#FFAB3F" name="arrow-right"></u-icon></view>
|
||||
<view class="state gray" v-else>已完善<u-icon class="arrow" color="gray" name="arrow-right"></u-icon></view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { perfect } from '@/apis/interfaces/order.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
orderId : '',
|
||||
baseInfo : {
|
||||
name : '',
|
||||
is_finish: 0
|
||||
},
|
||||
isFinish : 0,
|
||||
businessArr : []
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.orderId = this.$Route.query.orderId
|
||||
},
|
||||
onShow(){
|
||||
this.getPerfect()
|
||||
},
|
||||
methods: {
|
||||
// 获取基础资料
|
||||
getPerfect(){
|
||||
uni.showLoading({
|
||||
title : '加载中...',
|
||||
mask : true
|
||||
})
|
||||
perfect(this.$Route.query.orderId).then(res => {
|
||||
let { base, items, is_finish } = res;
|
||||
this.isFinish = is_finish;
|
||||
this.baseInfo = base;
|
||||
this.businessArr = items;
|
||||
if(is_finish == 1 && this.$Route.query.type == 'perfect'){
|
||||
this.$store.commit('setOrderId', this.$Route.query.orderId)
|
||||
}
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 资料导航
|
||||
onPerfect(name, finish, id){
|
||||
if(finish == 1) return
|
||||
this.$Router.push({
|
||||
name,
|
||||
params: {
|
||||
orderId: id
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.perfect{
|
||||
background: #f8f8f8;
|
||||
min-height: 100vh;
|
||||
// header
|
||||
.perfect-header{
|
||||
background: linear-gradient(180deg, $main-color, #6588ff);
|
||||
padding: 30rpx 50rpx 130rpx;
|
||||
position: relative;
|
||||
font-weight: bold;
|
||||
color: white;
|
||||
font-size: 46rpx;
|
||||
.cover{
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
// 资料列表
|
||||
.perfect-list{
|
||||
position: relative;
|
||||
margin-top: -80rpx;
|
||||
padding: 0 50rpx;
|
||||
z-index: 1;
|
||||
.perfect-item{
|
||||
position: relative;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
background: white;
|
||||
border-radius: 20rpx;
|
||||
padding: 40rpx;
|
||||
box-shadow: 0 0 10rpx 10rpx rgba(0, 0, 0, .02);
|
||||
margin-bottom: 30rpx;
|
||||
overflow: hidden;
|
||||
.cover{
|
||||
width: 180rpx;
|
||||
height: 180rpx;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: -30rpx;
|
||||
opacity: .15;
|
||||
transform: rotate(-45deg);
|
||||
&-src{
|
||||
width: 180rpx;
|
||||
height: 180rpx;
|
||||
}
|
||||
&::after{
|
||||
content: " ";
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: linear-gradient(to top, #ffffff, rgba(255,255,255,0));
|
||||
}
|
||||
}
|
||||
.main{
|
||||
width: calc(100% - 200rpx);
|
||||
.title{
|
||||
font-weight: bold;
|
||||
font-size: 34rpx;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
.submit{
|
||||
font-size: 28rpx;
|
||||
color: gray;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
}
|
||||
.state{
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
width: 200rpx;
|
||||
text-align: right;
|
||||
font-size: 30rpx;
|
||||
color: $text-price;
|
||||
.arrow{
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-bottom: 5rpx;
|
||||
}
|
||||
&.normal{
|
||||
color: $main-color;
|
||||
}
|
||||
&.gray{
|
||||
color: gray;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
427
pages/work/perfectInstitutions.vue
Normal file
@@ -0,0 +1,427 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<!-- 银行基础信息 -->
|
||||
<view class="block header-flex">
|
||||
<image class="header-logo" :src="baseInfo.cover" mode="aspectFit"></image>
|
||||
<view class="header-text">
|
||||
<view class="title">{{baseInfo.title}}</view>
|
||||
<view class="type">{{baseInfo.type}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 表单 -->
|
||||
<view class="block form">
|
||||
<block
|
||||
v-for="(item, index) in params"
|
||||
:key="index"
|
||||
v-if="item.pre_key != null ? isShowBlock(params, item): true"
|
||||
>
|
||||
<view class="from-item" :class="item.flex == 50 ? 'from-item-50': 'from-item-100'">
|
||||
<block v-if="item.type == 'price' || item.type == 'number' || item.type == 'text' || item.type == 'region'">
|
||||
<label>
|
||||
<text v-if="item.is_required === 1">*</text>{{item.title}}
|
||||
<uni-icons v-if="item.reason.description" class="from-icon" type="info" size="18" color="red" @click="modifyToast(item.reason.description)"></uni-icons>
|
||||
</label>
|
||||
<input class="from-input" v-model="item.value" :type="item.type" :placeholder="item.placeholder || '请输入'">
|
||||
</block>
|
||||
<!-- mobile -->
|
||||
<block v-if="item.type == 'mobile'">
|
||||
<label>
|
||||
<text v-if="item.is_required === 1">*</text>{{item.title}}
|
||||
<uni-icons v-if="item.reason.description" class="from-icon" type="info" size="18" color="red" @click="modifyToast(item.reason.description)"></uni-icons>
|
||||
</label>
|
||||
<input class="from-input" v-model="item.value" type="number" :placeholder="item.placeholder || '请输入'">
|
||||
</block>
|
||||
<!-- password -->
|
||||
<block v-if="item.type == 'password'">
|
||||
<label>
|
||||
<text v-if="item.is_required === 1">*</text>{{item.title}}
|
||||
<uni-icons v-if="item.reason.description" class="from-icon" type="info" size="18" color="red" @click="modifyToast(item.reason.description)"></uni-icons>
|
||||
</label>
|
||||
<input class="from-input" v-model="item.value" type="safe-password" password :placeholder="item.placeholder || '请输入'">
|
||||
</block>
|
||||
<!-- date -->
|
||||
<block v-if="item.type == 'date'">
|
||||
<label>
|
||||
<text v-if="item.is_required === 1">*</text>{{item.title}}
|
||||
<uni-icons v-if="item.reason.description" class="from-icon" type="info" size="18" color="red" @click="modifyToast(item.reason.description)"></uni-icons>
|
||||
</label>
|
||||
<picker class="from-picker" mode="date" :value="item.value" @change="item.value = $event.detail.value">
|
||||
<view class="from-picker-text">
|
||||
<view class="text nowrap">{{item.value || '选择日期'}}</view>
|
||||
<u-icon class="icon" name="calendar" color="#999" size="20"></u-icon>
|
||||
</view>
|
||||
</picker>
|
||||
</block>
|
||||
<!-- radio -->
|
||||
<block v-if="item.type == 'radio'">
|
||||
<view class="from-radio">
|
||||
<label>
|
||||
<text v-if="item.is_required === 1">*</text>{{item.title}}
|
||||
<uni-icons v-if="item.reason.description" class="from-icon" type="info" size="18" color="red" @click="modifyToast(item.reason.description)"></uni-icons>
|
||||
</label>
|
||||
<radio-group @change="item.value = $event.detail.value">
|
||||
<label class="from-radio-labe" v-for="(radioItem, radioIndex) in item.options" :key="radioIndex">
|
||||
<radio :value="radioIndex" :checked="item.value === radioIndex" color="#446EFE" /><text>{{radioItem}}</text>
|
||||
</label>
|
||||
</radio-group>
|
||||
</view>
|
||||
</block>
|
||||
<!-- checkbox -->
|
||||
<block v-if="item.type == 'checkbox'">
|
||||
<label>
|
||||
<text v-if="item.is_required === 1">*</text>{{item.title}}
|
||||
<uni-icons v-if="item.reason.description" class="from-icon" type="info" size="18" color="red" @click="modifyToast(item.reason.description)"></uni-icons>
|
||||
</label>
|
||||
<checkbox-group @change="item.value = $event.detail.value">
|
||||
<label class="checkbox-item" v-for="(checkboxItem, checkboxIndex) in item.options">
|
||||
<checkbox class="checkbox-input" :checked="isChecked(checkboxIndex, item.value)" :value="checkboxIndex" color="#446EFE"></checkbox>{{checkboxItem}}
|
||||
</label>
|
||||
</checkbox-group>
|
||||
</block>
|
||||
<!-- select -->
|
||||
<block v-if="item.type == 'select'">
|
||||
<label>
|
||||
<text v-if="item.is_required === 1">*</text>{{item.title}}
|
||||
<uni-icons v-if="item.reason.description" class="from-icon" type="info" size="18" color="red" @click="modifyToast(item.reason.description)"></uni-icons>
|
||||
</label>
|
||||
<picker class="from-picker" :range="item.options" :value="item.value" @change="item.value = $event.detail.value">
|
||||
<view class="from-picker-text">
|
||||
<view class="nowrap">{{item.options[item.value]}}</view>
|
||||
<u-icon class="icon" name="arrow-down-fill" color="#999" size="10"></u-icon>
|
||||
</view>
|
||||
</picker>
|
||||
</block>
|
||||
<!-- textarea -->
|
||||
<block v-if="item.type == 'textarea'">
|
||||
<label>
|
||||
<text v-if="item.is_required === 1">*</text>{{item.title}}
|
||||
<uni-icons v-if="item.reason.description" class="from-icon" type="info" size="18" color="red" @click="modifyToast(item.reason.description)"></uni-icons>
|
||||
</label>
|
||||
<textarea class="from-textarea" v-model="item.value" :placeholder="item.placeholder"></textarea>
|
||||
</block>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<!-- 提交数据 -->
|
||||
<view class="form-btns">
|
||||
<button size="default" @click="onSubmit('local')">暂时保存</button>
|
||||
<button size="default" @click="onSubmit('serve')">提交审核</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { baseBase, updBaseBase } from '@/apis/interfaces/order.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
baseInfo: {
|
||||
cover: '',
|
||||
title: '',
|
||||
type : ''
|
||||
},
|
||||
params : []
|
||||
};
|
||||
},
|
||||
computed: {
|
||||
isChecked(){
|
||||
return (val, vals) => {
|
||||
let valsArr = vals || []
|
||||
return valsArr.findIndex(v => v == val) >= 0
|
||||
}
|
||||
},
|
||||
isShowBlock(){
|
||||
return (params, item) => {
|
||||
if(item.pre_key != null){
|
||||
let paramsValue = params.find(v => v.key == item.pre_key)
|
||||
return paramsValue.value == item.pre_value
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
||||
},
|
||||
created() {
|
||||
// 获取银行机构信息
|
||||
this.getBaseBase()
|
||||
},
|
||||
methods: {
|
||||
// 银行机构信息
|
||||
getBaseBase(){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
baseBase(this.$Route.query.orderId).then(res => {
|
||||
let { item, params } = res;
|
||||
uni.getStorage({
|
||||
key : 'institutions' + this.$Route.query.orderId,
|
||||
success : StorageRes => {
|
||||
let { data } = StorageRes
|
||||
let storageParams = []
|
||||
storageParams = params.map(val => {
|
||||
if(val.type == 'checkbox' && data[val.key].length > 0){
|
||||
val.value = data[val.key]
|
||||
return val
|
||||
}
|
||||
val.value = data[val.key]
|
||||
return val
|
||||
})
|
||||
this.params = storageParams
|
||||
},
|
||||
fail : StorageErr => {
|
||||
this.params = params
|
||||
},
|
||||
complete: () => {
|
||||
this.baseInfo = {
|
||||
cover: item.institution.cover,
|
||||
title: item.institution.title,
|
||||
type : item.business_type.title
|
||||
}
|
||||
uni.hideLoading()
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 提交银行资料
|
||||
onSubmit(type){
|
||||
uni.showLoading({
|
||||
title: '加载中...',
|
||||
mask : true
|
||||
})
|
||||
let subData = {};
|
||||
let dataArr = [];
|
||||
for(let val of this.params){
|
||||
if(val.type == 'checkbox'){
|
||||
subData[val.key] = val.value || []
|
||||
} else subData[val.key] = val.value
|
||||
}
|
||||
if(type === 'local'){
|
||||
uni.setStorage({
|
||||
key : 'institutions' + this.$Route.query.orderId,
|
||||
data : subData,
|
||||
success : res => {
|
||||
uni.showToast({
|
||||
title: '表单信息已存储',
|
||||
icon : 'none'
|
||||
})
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
// 组织提交数据
|
||||
for(let key in subData){
|
||||
dataArr.push({
|
||||
key,
|
||||
value: subData[key]
|
||||
})
|
||||
}
|
||||
updBaseBase(this.$Route.query.orderId, {
|
||||
data: dataArr
|
||||
}).then(res => {
|
||||
uni.showModal({
|
||||
title : '提示',
|
||||
content : '机构资料已保存',
|
||||
showCancel : false,
|
||||
success : ModalRes => {
|
||||
uni.removeStorageSync('institutions' + this.$Route.query.orderId)
|
||||
this.$Router.back()
|
||||
}
|
||||
})
|
||||
uni.hideLoading()
|
||||
}).catch(err => {
|
||||
console.log(err)
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 修改提示信息
|
||||
modifyToast(text){
|
||||
uni.showModal({
|
||||
title : '驳回原因',
|
||||
content : text || '-',
|
||||
showCancel : false,
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.content{
|
||||
padding-top: 1rpx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.block{
|
||||
background: white;
|
||||
margin: 30rpx 30rpx;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
// 表单按钮
|
||||
.form-btns{
|
||||
padding: 0 15rpx 50rpx;
|
||||
display: flex;
|
||||
button[size="default"]{
|
||||
width: calc(50% - 30rpx);
|
||||
margin: 0 15rpx;
|
||||
color: white;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
background-color: $main-color;
|
||||
padding: 0;
|
||||
border-radius: 20rpx;
|
||||
font-size: 34rpx;
|
||||
&:first-child{
|
||||
line-height: 98rpx;
|
||||
box-sizing: border-box;
|
||||
background-color: white;
|
||||
color: $main-color;
|
||||
border:solid 1rpx $main-color;
|
||||
}
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
// 表单
|
||||
.form{
|
||||
padding: 10rpx 15rpx 40rpx;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
flex-direction: flex-start;
|
||||
align-content: flex-start;
|
||||
.from-item{
|
||||
margin: 30rpx 15rpx 0;
|
||||
label{
|
||||
color: #111111;
|
||||
font-size: 30rpx;
|
||||
padding-bottom: 20rpx;
|
||||
display: block;
|
||||
& > text{
|
||||
color: #FF0101;
|
||||
margin-right: 5rpx;
|
||||
display: inline-block;
|
||||
}
|
||||
.from-icon{
|
||||
vertical-align: top;
|
||||
margin-left: 10rpx;
|
||||
}
|
||||
}
|
||||
&.from-item-50{
|
||||
width: calc(50% - 30rpx);
|
||||
}
|
||||
&.from-item-100{
|
||||
width: calc(100% - 30rpx);
|
||||
}
|
||||
// input
|
||||
.from-input{
|
||||
background: #F6F6F6;
|
||||
width: 100%;
|
||||
height: 90rpx;
|
||||
border-radius: 10rpx;
|
||||
padding: 0 30rpx;
|
||||
box-sizing: border-box;
|
||||
font-size: 30rpx;
|
||||
}
|
||||
// textarea
|
||||
.from-textarea{
|
||||
padding: 20rpx 30rpx;
|
||||
background: #F6F6F6;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
font-size: 30rpx;
|
||||
line-height: 50rpx;
|
||||
border-radius: 10rpx;
|
||||
}
|
||||
// radio
|
||||
.from-radio{
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
font-size: 30rpx;
|
||||
height: 60rpx;
|
||||
border-radius: 10rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: space-between;
|
||||
.from-radio-labe{
|
||||
display: inline-block;
|
||||
margin-left: 20rpx;
|
||||
radio{
|
||||
transform:scale(0.7)
|
||||
}
|
||||
text{
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
}
|
||||
// picker
|
||||
.from-picker{
|
||||
.from-picker-text{
|
||||
position: relative;
|
||||
background: #F6F6F6;
|
||||
width: 100%;
|
||||
height: 90rpx;
|
||||
line-height: 90rpx;
|
||||
border-radius: 10rpx;
|
||||
font-size: 30rpx;
|
||||
padding: 0 30rpx;
|
||||
box-sizing: border-box;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
& > .text{
|
||||
width: calc(100% - 80rpx);
|
||||
}
|
||||
}
|
||||
}
|
||||
// checkbox
|
||||
.checkbox-item{
|
||||
display: block;
|
||||
color: #999999;
|
||||
line-height: 70rpx;
|
||||
.checkbox-input{
|
||||
transform:scale(0.7);
|
||||
vertical-align: middle;
|
||||
margin-top: -5rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// header
|
||||
.header-flex{
|
||||
padding: 30rpx;
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.header-logo{
|
||||
width: 88rpx;
|
||||
height: 88rpx;
|
||||
}
|
||||
.header-text{
|
||||
width: calc(100% - 128rpx);
|
||||
.title{
|
||||
font-weight: bold;
|
||||
line-height: 40rpx;
|
||||
font-size: 32rpx;
|
||||
margin-bottom: 10rpx;
|
||||
}
|
||||
.type{
|
||||
font-size: 26rpx;
|
||||
height: 40rpx;
|
||||
line-height: 40rpx;
|
||||
color: $main-color;
|
||||
background: #ECF0FF;
|
||||
display: inline-block;
|
||||
padding: 0 15rpx;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
211
pages/work/poorOrder.vue
Normal file
@@ -0,0 +1,211 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<block v-if="orders.length > 0">
|
||||
<view v-for="(item, index) in orders" :key="index" class="order-block">
|
||||
<view class="order-header">
|
||||
<view class="order-header-no nowrap">{{item.order_no}}</view>
|
||||
<view class="order-header-price nowrap">¥{{item.total}}</view>
|
||||
</view>
|
||||
<view class="order-content">
|
||||
<view class="order-content-item">
|
||||
<label>客户姓名</label>
|
||||
<view class="order-content-val nowrap">{{ item.user.nickname }}</view>
|
||||
</view>
|
||||
<view class="order-content-item">
|
||||
<label>客户电话</label>
|
||||
<view class="order-content-val nowrap">{{ item.user.username }}</view>
|
||||
</view>
|
||||
<view class="order-content-item">
|
||||
<label>服务包数量</label>
|
||||
<view class="order-content-val nowrap">×{{ item.services.length }}</view>
|
||||
</view>
|
||||
<view class="order-content-item">
|
||||
<label>已缴纳费</label>
|
||||
<view class="order-content-val nowrap">¥{{ item.paid }}</view>
|
||||
</view>
|
||||
<view class="order-content-item">
|
||||
<label>需补缴费</label>
|
||||
<view class="order-content-val nowrap">¥{{ item.price }}</view>
|
||||
</view>
|
||||
<view class="order-content-item">
|
||||
<label>创建时间</label>
|
||||
<view class="order-content-val nowrap">{{item.created_at}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="order-btns">
|
||||
<button class="order-left-btn" size="mini" @click="onCallPhone(item.user.username)">联系客户</button>
|
||||
<view class="order-right">
|
||||
<button size="mini" @click="$Router.push({name: 'Pay', params: {orderId: item.order_id, type: 'acting', paytype: 'diff'}})">补缴</button>
|
||||
<button size="mini" @click="$Router.push({name: 'OrderInfo', params: {orderId: item.order_id}})">查看</button>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="null">
|
||||
<u-empty
|
||||
mode="order"
|
||||
icon="http://cdn.uviewui.com/uview/empty/order.png"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { ordersDiffs } from '@/apis/interfaces/order.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
orders: [],
|
||||
page : ''
|
||||
}
|
||||
},
|
||||
created() {
|
||||
this.getList()
|
||||
},
|
||||
onShow() {
|
||||
// 是否处理当前列表状态
|
||||
let isOrderId = this.$store.getters.getOrderId
|
||||
if(isOrderId != null){
|
||||
this.removeListVal(isOrderId)
|
||||
}
|
||||
},
|
||||
methods:{
|
||||
// 联系客户
|
||||
onCallPhone(phone){
|
||||
uni.makePhoneCall({
|
||||
phoneNumber: phone
|
||||
})
|
||||
},
|
||||
// 获取订单列表
|
||||
getList(){
|
||||
ordersDiffs().then(res => {
|
||||
let { data, page } = res;
|
||||
this.orders = data
|
||||
this.page = page
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 变更当前列表状态
|
||||
removeListVal(id){
|
||||
let ListArr = this.orders
|
||||
let ListIndex = ListArr.findIndex(val => val.business_order_id == id)
|
||||
if(ListIndex >= 0){
|
||||
this.orders.splice(ListIndex, 1)
|
||||
}
|
||||
this.$store.commit('setOrderId', null)
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.content{
|
||||
padding: 1rpx 0;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.null{
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
height: 100vh;
|
||||
}
|
||||
// 订单模块
|
||||
.order-block{
|
||||
background-color: white;
|
||||
margin: 30rpx;
|
||||
border-radius: 20rpx;
|
||||
.order-header{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
border-bottom: solid 1rpx #f6f6f6;
|
||||
padding: 15rpx 30rpx;
|
||||
line-height: 80rpx;
|
||||
font-size: 30rpx;
|
||||
&-no{
|
||||
color: gray;
|
||||
width: calc(100% - 200rpx);
|
||||
}
|
||||
&-price{
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
width: 200rpx;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
.order-content{
|
||||
padding: 20rpx 30rpx;
|
||||
&-item{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 70rpx;
|
||||
font-size: 30rpx;
|
||||
label{
|
||||
width: 200rpx;
|
||||
color: gray;
|
||||
}
|
||||
.order-content-val{
|
||||
width: calc(100% - 200rpx);
|
||||
text-align: right;
|
||||
}
|
||||
.order-content-type{
|
||||
text{
|
||||
margin-right: 30rpx;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
&::after{
|
||||
position: absolute;
|
||||
content: "/";
|
||||
width: 30rpx;
|
||||
text-align: center;
|
||||
font-size: 30rpx;
|
||||
top: 0;
|
||||
right: -30rpx;
|
||||
}
|
||||
&:last-child{
|
||||
margin-right: 0;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.order-btns{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
border-top: solid 1rpx #f6f6f6;
|
||||
padding: 20rpx 30rpx;
|
||||
button[size="mini"]{
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
height: 70rpx;
|
||||
line-height: 68rpx;
|
||||
border-radius: 40rpx;
|
||||
padding: 0 30rpx;
|
||||
font-size: 30rpx;
|
||||
background: white;
|
||||
color: $main-color;
|
||||
border:solid 1rpx $main-color;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
.order-right{
|
||||
button[size="mini"]{
|
||||
margin-left: 30rpx;
|
||||
background: $main-color;
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
187
pages/work/refundOrder.vue
Normal file
@@ -0,0 +1,187 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<!-- 订单管理列表 -->
|
||||
<view class="orders" v-if="orders.length > 0">
|
||||
<view class="orders-item" v-for="(item, index) in orders" :key="index">
|
||||
<view class="orders-flex">
|
||||
<view class="no nowrap">
|
||||
<text class="orders-tag" v-if="!item.is_my">客户</text>
|
||||
<text class="orders-tag order-tag-my" v-else>个人</text>
|
||||
{{item.order_no}}
|
||||
</view>
|
||||
<view class="state">{{item.status.text}}</view>
|
||||
</view>
|
||||
<view class="orders-content">
|
||||
<view class="orders-content-item">
|
||||
<label>业务类型</label>
|
||||
<view class="nowrap orders-content-type">
|
||||
<text v-for="(itemType, indexType) in item.item_type" :key="indexType" v-if="itemType.number > 0">{{itemType.title}}x{{itemType.number}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="orders-content-block">
|
||||
<view class="item-flex" v-for="(citem, cindex) in item.items" :key="cindex">
|
||||
<view class="item-flex-title">{{citem.institution.title}}</view>
|
||||
<view class="item-flex-value">¥{{citem.price}}</view>
|
||||
</view>
|
||||
</view>
|
||||
<view class="orders-content-item" v-if="item.total > 0">
|
||||
<label>咨询服务费</label>
|
||||
<view class="nowrap">¥{{item.total}}</view>
|
||||
</view>
|
||||
<view class="orders-content-item">
|
||||
<label>下单时间</label>
|
||||
<view class="nowrap">{{item.created_at}}</view>
|
||||
</view>
|
||||
<view class="orders-content-item">
|
||||
<label>退款时间</label>
|
||||
<view class="nowrap">-</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 订单是空的 -->
|
||||
<view class="order-null" v-else>
|
||||
<u-empty
|
||||
mode="order"
|
||||
icon="http://cdn.uviewui.com/uview/empty/order.png"
|
||||
text="暂无已退款订单"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { lists } from '@/apis/interfaces/order.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
orders: []
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getList()
|
||||
},
|
||||
methods:{
|
||||
// 获取列表
|
||||
getList(){
|
||||
lists({
|
||||
status: 11
|
||||
}).then(res => {
|
||||
let { data } = res;
|
||||
this.orders = data
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// 订单为空
|
||||
.order-null{
|
||||
height: 80vh;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
// 订单列表
|
||||
.orders{
|
||||
padding: 30rpx 0 10rpx;
|
||||
.orders-item{
|
||||
margin: 0 30rpx 20rpx;
|
||||
background-color: white;
|
||||
border-radius: $radius;
|
||||
}
|
||||
.orders-content{
|
||||
padding: 20rpx 30rpx;
|
||||
&-item{
|
||||
line-height: 70rpx;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
font-size: 30rpx;
|
||||
color: #111111;
|
||||
label{
|
||||
color: #999999;
|
||||
}
|
||||
}
|
||||
&-type{
|
||||
text{
|
||||
margin-right: 30rpx;
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
&::after{
|
||||
position: absolute;
|
||||
content: "/";
|
||||
width: 30rpx;
|
||||
text-align: center;
|
||||
font-size: 30rpx;
|
||||
top: 0;
|
||||
right: -30rpx;
|
||||
}
|
||||
&:last-child{
|
||||
margin-right: 0;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
&-block{
|
||||
background: rgba(68, 110, 254, .03);
|
||||
padding: 20rpx;
|
||||
font-size: 28rpx;
|
||||
border-radius: 10rpx;
|
||||
margin: 10rpx 0;
|
||||
.item-flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 50rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
.orders-flex{
|
||||
border-bottom: solid 1rpx #F6F6F6;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding: 20rpx $padding;
|
||||
&:last-child{
|
||||
border-top: solid 1rpx #F6F6F6;
|
||||
border-bottom: none;
|
||||
}
|
||||
.orders-tag{
|
||||
display: inline-block;
|
||||
background: $main-color;
|
||||
font-size: 26rpx;
|
||||
color: white;
|
||||
border-radius: 10rpx;
|
||||
padding: 0 10rpx;
|
||||
height: 40rpx;
|
||||
line-height: 40rpx;
|
||||
margin-right: 10rpx;
|
||||
&.order-tag-my{
|
||||
background: $text-price;
|
||||
}
|
||||
}
|
||||
.no{
|
||||
font-size: 30rpx;
|
||||
color: #111;
|
||||
line-height: 60rpx;
|
||||
width: calc(100% - 150rpx);
|
||||
}
|
||||
.state{
|
||||
color: $main-color;
|
||||
font-weight: bold;
|
||||
font-size: 30rpx;
|
||||
line-height: 60rpx;
|
||||
width: 150rpx;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
206
pages/work/schemes.vue
Normal file
@@ -0,0 +1,206 @@
|
||||
<template>
|
||||
<view class="content" v-if="scheme != ''">
|
||||
<view class="schemes-header">
|
||||
<view class="schemes-user">您好!{{user.nickname}} {{user.sex == '男'? '先生': '女士'}}</view>
|
||||
<view class="schemes-text">以下是根据您的情况为您匹配的机构最佳方案。由于银行政策实时变动,该方案为预估方案,仅供参考,具体以协商为准,感谢您的支持!</view>
|
||||
</view>
|
||||
<!-- 卡片信息 -->
|
||||
<view class="schemes-block">
|
||||
<view class="schemes-info">
|
||||
<view class="schemes-flex schemes-flex-header">
|
||||
<view class="schemes-title">{{scheme.institution.title}}</view>
|
||||
<text class="schemes-type">{{scheme.business_type.title}}</text>
|
||||
</view>
|
||||
<view class="schemes-flex" v-for="(item, index) in scheme.base" :key="index">
|
||||
<view class="schemes-label">{{item.title}}</view>
|
||||
<text class="schemes-value">{{item.value || '-'}}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="schemes-info schemes-footer">
|
||||
<view class="schemes-info-title">
|
||||
预估方案
|
||||
<text>YGFA</text>
|
||||
</view>
|
||||
<block v-if="scheme.params.length > 0">
|
||||
<view class="schemes-flex" v-for="(item, index) in scheme.params" :key="index">
|
||||
<view class="schemes-label">{{item.title}}</view>
|
||||
<text class="schemes-value">{{item.value || '-'}}</text>
|
||||
</view>
|
||||
</block>
|
||||
<block v-else>
|
||||
<view class="params-null">
|
||||
<u-empty
|
||||
mode="coupon"
|
||||
icon="http://cdn.uviewui.com/uview/empty/coupon.png"
|
||||
text="暂无预估方案"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</block>
|
||||
<view class="schemes-tips">
|
||||
<view class="schemes-tips-title">须知:</view>
|
||||
<text>{{scheme.business_type.notic}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 温馨提示 -->
|
||||
<view class="notic">
|
||||
<text>{{scheme.business_type.sweet_notic}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { getSchemes } from '@/apis/interfaces/order.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
user : { name : '', sex: '' },
|
||||
scheme: '',
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.getSchemesInfo()
|
||||
},
|
||||
methods: {
|
||||
getSchemesInfo(){
|
||||
getSchemes(this.$Route.query.id).then(res => {
|
||||
let { scheme, user } = res;
|
||||
this.scheme = scheme
|
||||
this.user = user
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
.content{
|
||||
padding-bottom: 50rpx;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
// 温馨提示
|
||||
.notic{
|
||||
padding: 30rpx;
|
||||
color: #FBAF3B;
|
||||
font-size: 28rpx;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
// 方案
|
||||
.schemes-block{
|
||||
border-radius: 20rpx;
|
||||
background: white;
|
||||
margin: -80rpx 30rpx 0;
|
||||
position: relative;
|
||||
.schemes-info{
|
||||
padding: 30rpx;
|
||||
box-sizing: border-box;
|
||||
position: relative;
|
||||
border-bottom: dashed 1rpx #EEEEEE;
|
||||
&.schemes-footer{
|
||||
border-bottom: none;
|
||||
position: relative;
|
||||
&::after{
|
||||
position: absolute;
|
||||
top: -20rpx;
|
||||
left: -20rpx;
|
||||
content: " ";
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
background: #f8f8f8;
|
||||
border-radius: 50%;
|
||||
}
|
||||
&::before{
|
||||
position: absolute;
|
||||
top: -20rpx;
|
||||
right: -20rpx;
|
||||
content: " ";
|
||||
width: 40rpx;
|
||||
height: 40rpx;
|
||||
background: #f8f8f8;
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
.schemes-info-title{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
font-weight: bold;
|
||||
font-size: 40rpx;
|
||||
padding-bottom: 30rpx;
|
||||
color: $main-color;
|
||||
text{
|
||||
opacity: .3;
|
||||
}
|
||||
}
|
||||
.params-null{
|
||||
padding: 30rpx 0 50rpx;
|
||||
}
|
||||
.schemes-flex{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
.schemes-title{
|
||||
font-weight: bold;
|
||||
font-size: 40rpx;
|
||||
line-height: 70rpx;
|
||||
}
|
||||
.schemes-type{
|
||||
background: white;
|
||||
color: $main-color;
|
||||
border:solid 1rpx $main-color;
|
||||
font-size: 28rpx;
|
||||
padding: 0 20rpx;
|
||||
line-height: 40rpx;
|
||||
border-radius: 20rpx;
|
||||
}
|
||||
&.schemes-flex-header{
|
||||
padding-bottom: 20rpx;
|
||||
}
|
||||
.schemes-label{
|
||||
line-height: 70rpx;
|
||||
font-size: 30rpx;
|
||||
width: 200rpx;
|
||||
color: #999999;
|
||||
}
|
||||
.schemes-value{
|
||||
width: calc( 100% - 200rpx );
|
||||
font-size: 30rpx;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
// 提示信息
|
||||
.schemes-tips{
|
||||
background: #F6F6F6;
|
||||
border-radius: 20rpx;
|
||||
margin-top: 30rpx;
|
||||
padding: 30rpx;
|
||||
font-size: 28rpx;
|
||||
color: #666;
|
||||
.schemes-tips-title{
|
||||
font-weight: bold;
|
||||
color: #111;
|
||||
padding-bottom: 20rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// header
|
||||
.schemes-header{
|
||||
background: $main-color;
|
||||
padding: 30rpx 30rpx 150rpx;
|
||||
color: white;
|
||||
.schemes-user{
|
||||
font-size: 30rpx;
|
||||
padding-bottom: 20rpx;
|
||||
}
|
||||
.schemes-text{
|
||||
font-size: 30rpx;
|
||||
line-height: 45rpx;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
457
pages/work/service.vue
Normal file
@@ -0,0 +1,457 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<!-- 服务包列表 -->
|
||||
<view class="services">
|
||||
<view class="services-null" v-if="services.length <= 0">
|
||||
<u-empty
|
||||
mode="data"
|
||||
icon="http://cdn.uviewui.com/uview/empty/data.png"
|
||||
text="暂无添加服务包"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
<view class="services-list" v-else>
|
||||
<view class="services-item" v-for="(item, index) in services" :key="index">
|
||||
<view class="services-header">
|
||||
<view class="title">{{item.title}}<text>{{item.tag}}</text></view>
|
||||
<view class="remove" @click="onRemove(item, index)">移出</view>
|
||||
</view>
|
||||
<view class="services-content">
|
||||
<block v-for="(citem, cindex) in item.items" :key="cindex">
|
||||
<view class="services-content-item">
|
||||
<view class="services-flex">
|
||||
<label class="services-flex-label nowrap">服务类型</label>
|
||||
<view class="services-flex-val nowrap">{{citem.business}}({{citem.type}})</view>
|
||||
</view>
|
||||
<view class="services-flex">
|
||||
<label class="services-flex-title nowrap">{{citem.title}}</label>
|
||||
<view class="services-flex-price nowrap"><text>¥</text>{{citem.price}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
</view>
|
||||
<view class="services-price">服务包价格<text>¥{{item.price}}</text></view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<!-- 选择业务 -->
|
||||
<u-popup :show="institutionsShow" round="20rpx" closeable @close="institutionsShow = false, itemsVal = []">
|
||||
<view class="institutions">
|
||||
<view class="institutions-title">选择业务</view>
|
||||
<scroll-view scroll-y class="institutions-scroll">
|
||||
<view class="institutions-lists" v-if="institutions.length > 0">
|
||||
<view class="institutions-block" :class="{ 'active': item.isChoose }" v-for="(item, index) in institutions" :key="index" @click="onInstitution(item, index)">
|
||||
<view class="institutions-block-item">
|
||||
<label>业务类型</label>
|
||||
<view class="val nowrap">{{item.business}}({{item.type}})</view>
|
||||
</view>
|
||||
<view class="institutions-block-item">
|
||||
<label>业务机构</label>
|
||||
<view class="val nowrap">{{item.title}}</view>
|
||||
</view>
|
||||
<view class="institutions-block-item">
|
||||
<label>金额</label>
|
||||
<view class="val price nowrap">¥{{item.price}}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-else class="institutions-null">
|
||||
<u-empty
|
||||
mode="list"
|
||||
icon="http://cdn.uviewui.com/uview/empty/list.png"
|
||||
text="暂无可分配的业务"
|
||||
>
|
||||
</u-empty>
|
||||
</view>
|
||||
</scroll-view>
|
||||
<view class="institutions-footer">
|
||||
<button class="btn" @click="onAddService" :disabled="itemsVal.length <= 0">选好了({{itemsVal.length}})</button>
|
||||
</view>
|
||||
</view>
|
||||
</u-popup>
|
||||
<!-- footer -->
|
||||
<view class="footer">
|
||||
<view class="footer-total">共{{services.length}}个服务包,总价格<text>{{total}}</text>元</view>
|
||||
<button class="footer-btn" :disabled="services.length <= 0" @click="onServiceOver">保存配置服务包</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { service, serviceAdd, serviceRemove, serviceOver } from '@/apis/interfaces/order.js'
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
total : '0.00',
|
||||
orderId : '',
|
||||
institutions : [],
|
||||
services : [],
|
||||
itemsVal : [],
|
||||
institutionsShow: false
|
||||
};
|
||||
},
|
||||
created() {
|
||||
this.orderId = this.$Route.query.orderId
|
||||
// 开始配置服务包
|
||||
this.getService()
|
||||
},
|
||||
methods: {
|
||||
// 获取业务
|
||||
getService(){
|
||||
service(this.orderId).then(res => {
|
||||
let { institutions, services, total } = res;
|
||||
this.institutions = institutions.map(val => {
|
||||
val.isChoose = false
|
||||
return val;
|
||||
})
|
||||
this.total = total;
|
||||
this.services = services;
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 选择业务
|
||||
onInstitution(val, index){
|
||||
let idIndex = this.itemsVal.findIndex(e => e === val.item_id)
|
||||
if(idIndex >= 0){
|
||||
val.isChoose = !val.isChoose;
|
||||
this.itemsVal.splice(idIndex, 1)
|
||||
this.$set(this.institutions, index, val)
|
||||
return
|
||||
}
|
||||
if(idIndex < 0 && this.itemsVal.length <= 2){
|
||||
val.isChoose = !val.isChoose;
|
||||
this.itemsVal.push(val.item_id)
|
||||
this.$set(this.institutions, index, val)
|
||||
return
|
||||
}
|
||||
uni.showToast({
|
||||
title: '单一服务包业务数量不可以超过3项',
|
||||
icon : 'none'
|
||||
})
|
||||
},
|
||||
// 新增服务包
|
||||
onAddService(){
|
||||
serviceAdd(this.orderId, this.itemsVal).then(res => {
|
||||
let { institutions, services, total } = res;
|
||||
this.institutions = institutions.map(val => {
|
||||
val.isChoose = false
|
||||
return val;
|
||||
});
|
||||
this.total = total;
|
||||
this.services = services
|
||||
this.itemsVal = []
|
||||
this.institutionsShow = false
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 删除服务包
|
||||
onRemove(val, index){
|
||||
serviceRemove(this.orderId, {
|
||||
group_no: val.group_no
|
||||
} ).then(res => {
|
||||
let { institutions, services, total } = res;
|
||||
this.institutions = institutions.map(val => {
|
||||
val.isChoose = false
|
||||
return val;
|
||||
});
|
||||
this.total = total;
|
||||
this.services = services;
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
},
|
||||
// 保存配置服务包
|
||||
onServiceOver(){
|
||||
if(this.institutions.length > 0){
|
||||
uni.showModal({
|
||||
title : '提示',
|
||||
content : '当前还有' + this.institutions.length + '项业务未匹配服务包,是否放弃未匹配的业务继续保存服务包?',
|
||||
cancelText : '继续配置',
|
||||
cancelColor : '#FFAB3F',
|
||||
confirmText : '立即保存',
|
||||
confirmColor: '#446EFE',
|
||||
success : res => {
|
||||
if(res.confirm){
|
||||
this.onSubmitService()
|
||||
}
|
||||
}
|
||||
})
|
||||
return
|
||||
}
|
||||
this.onSubmitService()
|
||||
},
|
||||
// 提交保存服务
|
||||
onSubmitService(){
|
||||
wx.showLoading({
|
||||
title: '保存中...',
|
||||
mask : true
|
||||
})
|
||||
serviceOver(this.orderId).then(res => {
|
||||
uni.showModal({
|
||||
content : res.message,
|
||||
showCancel : false,
|
||||
confirmColor: '#446EFE',
|
||||
success : res => {
|
||||
if(res.confirm){
|
||||
this.$store.commit('setOrderId', this.orderId)
|
||||
uni.navigateBack()
|
||||
}
|
||||
}
|
||||
})
|
||||
}).catch(err => {
|
||||
uni.showToast({
|
||||
title: err.message,
|
||||
icon : 'none'
|
||||
})
|
||||
})
|
||||
}
|
||||
},
|
||||
onNavigationBarButtonTap() {
|
||||
this.institutionsShow = true
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss">
|
||||
// 服务包列表
|
||||
.services{
|
||||
padding-bottom: 250rpx;
|
||||
box-sizing: border-box;
|
||||
.services-null{
|
||||
height: 70vh;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
// 服务包列表
|
||||
.services-list{
|
||||
padding: 10rpx 30rpx;
|
||||
.services-item{
|
||||
background: white;
|
||||
border-radius: 20rpx;
|
||||
padding: 30rpx;
|
||||
margin: 30rpx 0;
|
||||
.services-header{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
padding-bottom: 20rpx;
|
||||
.title{
|
||||
font-size: 32rpx;
|
||||
font-weight: bold;
|
||||
color: #111;
|
||||
width: calc(100% - 150rpx);
|
||||
text{
|
||||
background: $main-color;
|
||||
color: white;
|
||||
font-weight: normal;
|
||||
font-size: 26rpx;
|
||||
border-radius: 10rpx;
|
||||
padding: 0 10rpx;
|
||||
margin-left: 10rpx;
|
||||
line-height: 40rpx;
|
||||
}
|
||||
}
|
||||
.remove{
|
||||
background: rgba(68, 110, 254, .1);
|
||||
color: #446EFE;
|
||||
height: 50rpx;
|
||||
line-height: 50rpx;
|
||||
width: 100rpx;
|
||||
border-radius: 25rpx;
|
||||
text-align: center;
|
||||
font-size: 28rpx;
|
||||
}
|
||||
}
|
||||
.services-content{
|
||||
background-color: rgba(68, 110, 254, .03);
|
||||
border-radius: 10rpx;
|
||||
margin: 15rpx 0;
|
||||
padding: 0 25rpx;
|
||||
.services-content-item{
|
||||
border-bottom: solid 1rpx #f6f6f6;
|
||||
padding: 20rpx 0;
|
||||
&:last-child{
|
||||
border: none;
|
||||
}
|
||||
}
|
||||
.services-flex{
|
||||
display: flex;
|
||||
font-size: 30rpx;
|
||||
line-height: 55rpx;
|
||||
.services-flex-label{
|
||||
width: 150rpx;
|
||||
color: #111111;
|
||||
}
|
||||
.services-flex-val{
|
||||
width: calc(100% - 150rpx);
|
||||
text-align: right;
|
||||
color: gray;
|
||||
}
|
||||
.services-flex-title{
|
||||
width: 50%;
|
||||
color: #111111;
|
||||
font-size: 30rpx;
|
||||
}
|
||||
.services-flex-price{
|
||||
font-size: 30rpx;
|
||||
width: 50%;
|
||||
text-align: right;
|
||||
font-weight: bold;
|
||||
color: #111111;
|
||||
}
|
||||
}
|
||||
}
|
||||
.services-price{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
font-size: 30rpx;
|
||||
color: gray;
|
||||
line-height: 60rpx;
|
||||
text{
|
||||
color: $text-price;
|
||||
font-weight: bold;
|
||||
font-size: 34rpx;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// 添加服务包
|
||||
.institutions{
|
||||
padding: 0 0 180rpx;
|
||||
position: relative;
|
||||
// 标题
|
||||
.institutions-title{
|
||||
padding: 30rpx;
|
||||
text-align: center;
|
||||
font-size: 36rpx;
|
||||
font-weight: bold;
|
||||
line-height: 60rpx;
|
||||
}
|
||||
// 列表
|
||||
.institutions-scroll{
|
||||
height: 65vh;
|
||||
.institutions-null{
|
||||
height: 50vh;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.institutions-lists{
|
||||
padding: 15rpx 0;
|
||||
.institutions-block{
|
||||
margin: 15rpx 30rpx;
|
||||
background: #f8f8f8;
|
||||
padding: 30rpx;
|
||||
border-radius: 20rpx;
|
||||
border:solid 1rpx #f8f8f8;
|
||||
box-sizing: border-box;
|
||||
.institutions-block-item{
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
line-height: 50rpx;
|
||||
font-size: 30rpx;
|
||||
label{
|
||||
color: gray;
|
||||
width: 200rpx;
|
||||
}
|
||||
.val{
|
||||
width: calc(100% - 200rpx);
|
||||
text-align: right;
|
||||
&.price{
|
||||
color: $text-price;
|
||||
font-weight: bold;
|
||||
}
|
||||
}
|
||||
}
|
||||
&.active{
|
||||
background-color: #E4E8F7;
|
||||
border-color: $main-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// footer
|
||||
.institutions-footer{
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
padding: 30rpx 30rpx 50rpx;
|
||||
.btn{
|
||||
background: $main-color;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
color: white;
|
||||
font-size: 32rpx;
|
||||
border-radius: $radius-lg;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
&[disabled]{
|
||||
background-color: $main-color;
|
||||
color: white;
|
||||
opacity: .7;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// footer
|
||||
.footer{
|
||||
padding: 30rpx 30rpx 50rpx;
|
||||
background: white;
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 9;
|
||||
box-shadow: 0 0 10rpx 10rpx rgba(0, 0, 0, .02);
|
||||
.footer-total{
|
||||
padding-bottom: 30rpx;
|
||||
text-align: center;
|
||||
font-size: 30rpx;
|
||||
color: gray;
|
||||
line-height: 40rpx;
|
||||
text{
|
||||
font-weight: bold;
|
||||
color: red;
|
||||
}
|
||||
}
|
||||
.footer-btn{
|
||||
background: $main-color;
|
||||
height: 100rpx;
|
||||
line-height: 100rpx;
|
||||
color: white;
|
||||
font-size: 32rpx;
|
||||
border-radius: $radius-lg;
|
||||
&::after{
|
||||
display: none;
|
||||
}
|
||||
.icon{
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin-right: 10rpx;
|
||||
margin-bottom: 5rpx;
|
||||
}
|
||||
&[disabled]{
|
||||
background-color: $main-color;
|
||||
color: white;
|
||||
opacity: .7;
|
||||
}
|
||||
}
|
||||
}
|
||||
</style>
|
||||
35
router/index.js
Normal file
@@ -0,0 +1,35 @@
|
||||
import {
|
||||
RouterMount,
|
||||
createRouter
|
||||
} from 'uni-simple-router';
|
||||
import store from '@/store/index'
|
||||
|
||||
const router = createRouter({
|
||||
platform: process.env.VUE_APP_PLATFORM,
|
||||
routes: [...ROUTES]
|
||||
});
|
||||
|
||||
//全局路由前置守卫
|
||||
router.beforeEach((to, from, next) => {
|
||||
let isToken = store.getters.getToken === '' || uni.getStorageSync('token') === ''
|
||||
if(to.auth != undefined){
|
||||
if(to.auth && isToken){
|
||||
next({
|
||||
name: 'Auth',
|
||||
NAVTYPE: 'push'
|
||||
})
|
||||
return
|
||||
}
|
||||
}
|
||||
next();
|
||||
});
|
||||
|
||||
// 全局路由后置守卫
|
||||
router.afterEach((to, from) => {
|
||||
|
||||
})
|
||||
|
||||
export {
|
||||
router,
|
||||
RouterMount
|
||||
}
|
||||
122
scss/globa.scss
Normal file
@@ -0,0 +1,122 @@
|
||||
|
||||
/**
|
||||
* Web唐明明
|
||||
* 匆匆数载恍如梦,岁月迢迢华发增。
|
||||
* 碌碌无为枉半生,一朝惊醒万事空。
|
||||
*/
|
||||
|
||||
// 文字颜色
|
||||
$text-color: #333;
|
||||
$text-gray: #666;
|
||||
$text-gray-m: #999;
|
||||
$text-price: #FFAB3F;
|
||||
$main-color: #446EFE;
|
||||
|
||||
// 边框颜色
|
||||
$border-color: #ddd;
|
||||
|
||||
// 全局窗口色
|
||||
$window-color: #F3F6FB;
|
||||
|
||||
// 文字尺寸
|
||||
$title-size: 32rpx;
|
||||
$title-size-lg: 30rpx;
|
||||
$title-size-m: 28rpx;
|
||||
$title-size-sm: 26rpx;
|
||||
|
||||
// 模块圆角
|
||||
$radius: 20rpx;
|
||||
$radius-lg: 12rpx;
|
||||
$radius-m: 10rpx;
|
||||
|
||||
// 模块边距
|
||||
$margin: 30rpx;
|
||||
$padding: 30rpx;
|
||||
|
||||
// 0.5像素边线
|
||||
.border-solid{
|
||||
position: relative;
|
||||
&::after {
|
||||
content: "";
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 1rpx;
|
||||
background-image: linear-gradient(0deg, $border-color 50%, transparent 50%);
|
||||
}
|
||||
}
|
||||
.border-solid-empty{
|
||||
@extend .border-solid;
|
||||
&::after{
|
||||
width: calc(100% - #{$margin * 2});
|
||||
left: $margin;
|
||||
}
|
||||
}
|
||||
|
||||
.border{
|
||||
position: relative;
|
||||
&::after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 200%;
|
||||
height: 200%;
|
||||
border: 1rpx solid $border-color;
|
||||
transform: scale(0.5);
|
||||
transform-origin: 0 0;
|
||||
pointer-events: none;
|
||||
}
|
||||
}
|
||||
|
||||
// 状态栏高度
|
||||
.status_bar {
|
||||
height: var(--status-bar-height);
|
||||
}
|
||||
|
||||
/* #ifndef APP-PLUS-NVUE */
|
||||
// ios安全距离
|
||||
.ios-bottom{
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
padding-bottom: constant(safe-area-inset-bottom);
|
||||
}
|
||||
|
||||
.ios-left{
|
||||
padding-left: env(safe-area-inset-left);
|
||||
padding-left: constant(safe-area-inset-left);
|
||||
}
|
||||
|
||||
.ios-right{
|
||||
padding-right: env(safe-area-inset-right);
|
||||
padding-right: constant(safe-area-inset-right);
|
||||
}
|
||||
|
||||
.ios-top{
|
||||
padding-top: var(--status-bar-height);
|
||||
}
|
||||
|
||||
// 公共样式
|
||||
.vertical {
|
||||
display: -webkit-box;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-box-pack: center;
|
||||
}
|
||||
|
||||
.nowrap {
|
||||
max-width: 100%;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.ellipsis{
|
||||
max-width: 100%;
|
||||
display: -webkit-box;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
-webkit-box-orient: vertical;
|
||||
-webkit-line-clamp: 2;
|
||||
}
|
||||
/* #endif */
|
||||
|
||||
BIN
static/CollegeResults/CollegeResults_back.png
Normal file
|
After Width: | Height: | Size: 131 KiB |
BIN
static/CollegeResults/CollegeResults_icon_00.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
static/CollegeResults/CollegeResults_icon_01.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
static/background/account_back.png
Normal file
|
After Width: | Height: | Size: 21 KiB |
BIN
static/background/info_back.png
Normal file
|
After Width: | Height: | Size: 54 KiB |
BIN
static/code/code_back.png
Normal file
|
After Width: | Height: | Size: 690 KiB |
BIN
static/code/code_btn.png
Normal file
|
After Width: | Height: | Size: 77 KiB |
BIN
static/code/code_footer.png
Normal file
|
After Width: | Height: | Size: 210 KiB |
BIN
static/code/code_header.png
Normal file
|
After Width: | Height: | Size: 701 KiB |
BIN
static/code/code_img_lay.png
Normal file
|
After Width: | Height: | Size: 47 KiB |
BIN
static/code/code_logo.png
Normal file
|
After Width: | Height: | Size: 225 KiB |
BIN
static/code/code_sign.png
Normal file
|
After Width: | Height: | Size: 437 KiB |
BIN
static/gliconfont.ttf
Normal file
51
static/iconfont.css
Normal file
@@ -0,0 +1,51 @@
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 2869797 */
|
||||
src: url('@/static/iconfont.ttf');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16rpx;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-jia:before {
|
||||
content: "\e60a";
|
||||
}
|
||||
|
||||
.icon-dui:before {
|
||||
content: "\e609";
|
||||
}
|
||||
|
||||
.icon-gengduo2:before {
|
||||
content: "\e608";
|
||||
}
|
||||
|
||||
.icon-gengduo:before {
|
||||
content: "\e607";
|
||||
}
|
||||
|
||||
.icon-saoma:before {
|
||||
content: "\e605";
|
||||
}
|
||||
|
||||
.icon-tuandui:before {
|
||||
content: "\e606";
|
||||
}
|
||||
|
||||
.icon-sousuo:before {
|
||||
content: "\e603";
|
||||
}
|
||||
|
||||
.icon-pinglun:before {
|
||||
content: "\e601";
|
||||
}
|
||||
|
||||
.icon-shezhi:before {
|
||||
content: "\e602";
|
||||
}
|
||||
|
||||
|
||||
|
||||
BIN
static/iconfont.ttf
Normal file
BIN
static/icons/Identity_icon.png
Normal file
|
After Width: | Height: | Size: 1.2 KiB |
BIN
static/icons/diamond_icon_00.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
static/icons/diamond_icon_01.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
static/icons/diamond_icon_02.png
Normal file
|
After Width: | Height: | Size: 4.5 KiB |
BIN
static/icons/diamond_icon_03.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
static/icons/diamond_icon_04.png
Normal file
|
After Width: | Height: | Size: 4.4 KiB |
BIN
static/icons/diamond_icon_05.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |
BIN
static/icons/diamond_icon_06.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
static/icons/diamond_icon_07.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
static/icons/diamond_icon_08.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
static/icons/diamond_icon_09.png
Normal file
|
After Width: | Height: | Size: 4.3 KiB |
BIN
static/icons/pay_alipay.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
static/icons/pay_code.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
BIN
static/icons/pay_wechat.png
Normal file
|
After Width: | Height: | Size: 5.8 KiB |
BIN
static/icons/qrcode.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
static/icons/quick_icon.png
Normal file
|
After Width: | Height: | Size: 822 B |
BIN
static/icons/search_icon.png
Normal file
|
After Width: | Height: | Size: 2.5 KiB |
BIN
static/icons/tabs_icon_00.png
Normal file
|
After Width: | Height: | Size: 4.6 KiB |