This commit is contained in:
唐明明
2024-01-03 11:10:25 +08:00
15 changed files with 734 additions and 40 deletions

View File

@@ -1,3 +1,3 @@
# dou-Fire
抖火App
抖火App ( 现在线上版本 2023-12-15)

View File

@@ -10,8 +10,8 @@ import router from '../router'
// 基础配置
const config = {
// apiUrl : 'https://douhuo.douhuofalv.com/api/',
apiUrl : 'https://douhuo.demos.uzchain.tech/api/', //测试环境
apiUrl : 'https://douhuo.douhuofalv.com/api/',
// apiUrl : 'https://douhuo.demos.uzchain.tech/api/', //测试环境
timeout : 60000
}

48
apis/interfaces/custom.js Normal file
View File

@@ -0,0 +1,48 @@
/**
* Web -zdx
* moduleName: 线下业务订单类型
*/
import { request } from '../index'
// 获取业务类型
const customTypes = () =>{
return request({
url: "custom_type/index",
})
}
// 提交办理线下订单
const customTypeStore = (customType,data) => {
return request({
url : `custom_type/${customType}/store`,
method : "POST",
data
})
}
// 取消线下订单
const customTypeCancel = (orderId, data) => {
return request({
url : `custom_type/order/${orderId}/cancel`,
method : 'DELETE',
data
})
}
// 线下订单列表
const customTypelists = data => {
return request({
url : 'custom_type/order/lists',
data
})
}
export {
customTypes,
customTypeStore,
customTypeCancel,
customTypelists
}

View File

@@ -216,6 +216,16 @@ const orderLog = (id, page) => {
})
}
// 通用订单详情
const unifyInfo = data => {
return request({
url : 'unify/order/info',
method : 'POST',
data
})
}
// 支付订单
export {
lists,
@@ -243,5 +253,6 @@ export {
getConfirmSchemeInfo,
sbuConfirmScheme,
orderCancel,
orderLog
orderLog,
unifyInfo
}

28
main.js
View File

@@ -1,26 +1,10 @@
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.config.productionTip = false
import { INIT } from './im/INIT'
// (async () => {
Vue.component('my-link', Mylink)
Vue.use(uView)
Vue.use(router)
// await INIT();
Vue.config.productionTip = false
App.mpType = 'app'
const app = new Vue({
store,
...App
})
app.$mount()
// })()
App.mpType = 'app'
const app = new Vue({
...App
})
app.$mount()

View File

@@ -2,8 +2,8 @@
"name" : "抖火法律",
"appid" : "__UNI__C305C03",
"description" : "纵有疾风起,人生不言弃",
"versionName" : "1.6.4",
"versionCode" : 1064,
"versionName" : "1.6.5",
"versionCode" : 1065,
"transformPx" : false,
/* 5+App */
"app-plus" : {

View File

@@ -889,6 +889,13 @@
"navigationBarTitleText" : "账户咨询办理",
"enablePullDownRefresh" : false
}
},{
"path" : "pages/management/account2",
"name" : "MagAccount2",
"style" : {
"navigationBarTitleText" : "线下账户咨询办理",
"enablePullDownRefresh" : false
}
},
{
"path" : "pages/management/delegation",
@@ -906,6 +913,14 @@
"enablePullDownRefresh" : false,
"navigationBarBackgroundColor": "#FFFFFF"
}
},{
"path" : "pages/work/account2",
"name" : "AccountWork2",
"style" : {
"navigationBarTitleText" : " 线下订单",
"enablePullDownRefresh" : false,
"navigationBarBackgroundColor": "#FFFFFF"
}
},{
"path" : "pages/work/delegation",
"name" : "DelegationWork",
@@ -914,6 +929,16 @@
"enablePullDownRefresh" : false,
"navigationBarBackgroundColor": "#FFFFFF"
}
},
{
"path" : "pages/orderInfo/orderInfo",
"name" : "OrderInfo",
"style" : {
"navigationBarTitleText" : "",
"enablePullDownRefresh" : false,
"navigationBarTextStyle": "white",
"navigationBarBackgroundColor": "#353ef4"
}
}],
"globalStyle": {
"navigationBarTextStyle": "black",

View File

@@ -0,0 +1,151 @@
<template>
<view class="from-content">
<view class="from-block" v-if="pickerArr.length > 0" >
<view class="from-block-item">
<label>办理业务</label>
<picker class="from-block-val" :range="pickerArr" :value="pickerIndex" range-key="title" @change="pickerIndex = $event.detail.value">
<view class="from-block-picker nowrap">{{pickerArr[pickerIndex].title}}
<u-icon class="from-block-picker-icon" name="arrow-down" color="#555" size="15"></u-icon>
</view>
</picker>
</view>
<view class="from-block-item">
<label>业务描述</label>
<view class="from-block-val">{{pickerArr[pickerIndex].subtitle}}</view>
</view>
<view class="from-block-item">
<label>服务费</label>
<input class="from-block-val from-block-input" type="number" placeholder="请输入客户服务费(元)" v-model="price" />
</view>
</view>
<view class="from-block">
<view class="from-block-item">
<label>客户姓名</label>
<input class="from-block-val from-block-input" placeholder="请输入客户姓名" v-model="name" />
</view>
<view class="from-block-item">
<label>手机号码</label>
<input class="from-block-val from-block-input" type="number" placeholder="请输入客户手机号码" v-model="phone" />
</view>
</view>
<button class="from-btn" @click="onSubmit">提交办理</button>
</view>
</template>
<script>
import { customTypes,customTypeStore } from '@/apis/interfaces/custom.js'
export default {
data() {
return {
pickerArr : [],
pickerIndex : 0,
name : '',
phone : '',
price : ''
};
},
onLoad() {
uni.showLoading({
title: '加载中...',
mask : true
})
customTypes().then(res => {
console.log(res)
uni.hideLoading()
this.pickerArr = res;
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
methods: {
// 提交表单
onSubmit(){
let { name, phone, pickerArr, pickerIndex,price} = this
if(price === ''){
uni.showToast({
title: '请输入服务费金额',
icon : 'none'
})
return
}
if(name === ''){
uni.showToast({
title: '请输入客户姓名',
icon : 'none'
})
return
}
if(phone === ''){
uni.showToast({
title: '请输入客户手机号码',
icon : 'none'
})
return
}
uni.showLoading({
title: "提交中...",
mask : true
})
let params = {
name : name,
mobile : phone,
price : price
}
customTypeStore(pickerArr[pickerIndex].id,params).then(res => {
let { order_type, order_id, order_no } = res;
this.$Router.replace({
name : 'Pay',
params : {
paytype : 'synthesize',
orderId : order_id,
orderType : order_type.replace(/\\/g, '-')
},
})
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none',
mask:true,
duration:3000
})
})
}
}
}
</script>
<style lang="scss">
.from-content{
min-height: 100vh;
padding: 30rpx;
background: #f7f8f9;
}
.from-block{
background: white;
border-radius: 20rpx;
margin-bottom: 30rpx;
padding: 0 30rpx;
}
.from-block-item{
min-height: 70rpx;
display: flex;
font-size: 32rpx;
border-bottom: solid 1rpx #f3f3f3;
padding: 15rpx 0;
&:last-child{ border: none; }
label{ width: 200rpx; line-height: 70rpx; }
.from-block-val{ width: calc(100% - 200rpx); text-align: right; line-height: 70rpx;
&.price{ color: $main-color; font-weight: bold; }
}
.from-block-input{ height: 70rpx; font-size: 32rpx; }
.from-block-picker{ padding-right: 50rpx; position: relative; }
.from-block-picker-icon{ position: absolute; right: 0; top: 50%; margin-top: -15rpx; }
}
.from-btn{ width: 100%; background-color: $main-color; color: white; line-height: 95rpx; height: 95rpx; border-radius: 45rpx; font-size: 32rpx; font-weight: bold;
&::after{ display: none; }
}
</style>

View File

@@ -0,0 +1,122 @@
<template>
<view class="info-content">
<view class="block">
<view class="block-item">
<view class="block-item-flex" v-for="(item, index) in objArr" :key="index">
<label>{{item.name}}</label>
<view class="val">{{item.value}}</view>
</view>
</view>
</view>
</view>
</template>
<script>
import { unifyInfo } from '@/apis/interfaces/order.js'
export default {
data() {
return {
objArr: []
};
},
created() {
uni.showLoading({
title: '加载中...',
mask : true
})
unifyInfo({
order_type : this.$Route.query.orderType.replace(/\-/g, '\\'),
order_id : this.$Route.query.id
}).then(res => {
uni.hideLoading()
this.objArr = res;
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
}
}
</script>
<style lang="scss" scoped>
.info-content{
position: relative;
background: #eeefff;
min-height: 100vh;
box-sizing: border-box;
padding-bottom: 10rpx;
padding-top: 30rpx;
&::before{
background-image: linear-gradient(180deg, #353ef4 10%, #eeefff);
height: 50vh;
content: " ";
width: 100vw;
position: absolute;
top: 0;
left: 0;
}
// 模块
.block{
background: white;
position: relative;
z-index: 1;
margin: 0 40rpx 30rpx;
border-radius: 20rpx;
.block-header{
padding: 32rpx;
display: flex;
justify-content: space-between;
align-items: center;
.title{
width: calc(100% - 200rpx);
text{
font-size: 30rpx;
line-height: 30rpx;
color: gray;
}
view{
font-weight: bold;
font-size: 40rpx;
line-height: 50rpx;
@extend .nowrap;
}
}
.price{
text-align: right;
width: 200rpx;
padding-left: 20rpx;
text{
font-size: 30rpx;
line-height: 30rpx;
color: gray;
}
view{
font-weight: bold;
font-size: 40rpx;
color: #353ef4;
line-height: 50rpx;
@extend .nowrap;
}
}
}
.block-item{
padding: 32rpx;
.block-item-flex{
padding: 20rpx 0;
font-size: 30rpx;
display: flex;
color: #555;
justify-content: space-between;
label{ width: 240rpx; }
.val{
text-align: right;
width: calc(100% - 240rpx);
}
}
}
}
}
</style>

View File

@@ -43,12 +43,6 @@
</block>
</view>
<view class="border-solid-empty"></view>
<view class="nav-flex" @click="onPhone">
<view class="nav-icon">
<image class="nav-icon-src" src="@/static/icons/user_nav_00.png"></image>识别demo
</view>
<u-icon name="arrow-right" color="#cacaca" size="34rpx" bold></u-icon>
</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 File

@@ -56,6 +56,7 @@
<view class="btns">
<view class="btns-item border" v-if="item.can.cancel" @click="onCancel(item)">取消订单</view>
<view class="btns-item" v-if="item.can.pay" @click="onPay(item)">立即支付</view>
<view class="btns-item" v-if="item.can.look" @click="onInfo(item)">查看详情</view>
</view>
</view>
</view>
@@ -155,6 +156,16 @@
}
})
},
// 订单详情
onInfo(obj){
this.$Router.push({
name : 'OrderInfo',
params : {
id : obj.order_id,
orderType : obj.order_type.replace(/\\/g, '-')
}
})
},
// 复制订单号码
copyNo(no){
uni.setClipboardData({

331
pages/work/account2.vue Normal file
View File

@@ -0,0 +1,331 @@
<template>
<view class="content">
<!-- tabs -->
<u-sticky bgColor="#FFF" zIndex="9" >
<u-tabs
:current="tabsCurrent"
:list="tabs"
keyName="value"
lineColor="#446EFE"
:scrollable="tabs.length > 5"
: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" @click="copyNo(item.order_no)">
{{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">{{item.item.title}}</view>
</view>
<view class="orders-content-item">
<label>客户姓名</label>
<view class="nowrap">{{item.name}}</view>
</view>
<view class="orders-content-item">
<label>手机号码</label>
<view class="nowrap">{{item.mobile}}</view>
</view>
<view class="orders-content-item">
<label>创建时间</label>
<view class="nowrap">{{item.created_at}}</view>
</view>
<view class="orders-content-item" v-if="item.paid_at != ''">
<label>支付时间</label>
<view class="nowrap">{{item.paid_at}}</view>
</view>
</view>
<view class="orders-flex">
<view class="price">{{item.price}}</view>
<view class="btns">
<view class="btns-item border" v-if="item.can.cancel" @click="onCancel(item)">取消订单</view>
<view class="btns-item" v-if="item.can.pay" @click="onPay(item)">立即支付</view>
<view class="btns-item" v-if="item.can.look" @click="onInfo(item)">查看详情</view>
</view>
</view>
</view>
<!-- 分页 -->
<u-loadmore v-if="pagesShow" :status="status" />
</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 { customTypelists, customTypeCancel } from '@/apis/interfaces/custom.js'
export default {
data() {
return {
tabs : [{ id: '', value: '全部' }],
tabsCurrent : 0,
tabsId : '',
orders : [],
pagesShow : false,
page : {
current : 1,
has_more: false,
},
status : ''
};
},
onShow() {
this.getOrder()
},
methods: {
// 筛选分类
onTabs(e){
let { id, index } = e;
this.tabsCurrent = index
this.tabsId = id
this.page = { current: 1, has_more: false }
this.getOrder()
},
// 获取订单列表
getOrder(){
let { tabsId, tabs, orders, page } = this
customTypelists({
manager: 1,
status : tabsId,
page : page.current
}).then(res => {
console.log(res)
let { status, lists } = res;
this.tabs = [{ id: '', value: '全部' }].concat(status)
this.orders = lists.page.current == 1 ? lists.data : this.orders.concat(lists.data)
this.page = lists.page
this.pagesShow = false
}).catch(err => {
uni.showToast({
title: err.message,
icon : 'none'
})
})
},
// 取消订单
onCancel(e){
let { order_id } = e;
uni.showModal({
title : "提示",
content : "确认取消当前订单嘛?",
cancelText : "取消",
confirmColor: "#446EFE",
success : modalRes => {
if(modalRes.confirm){
uni.showLoading({
title: "加载中...",
mask : true
})
customTypeCancel(order_id).then(res => {
uni.showToast({
title: '订单已取消',
icon : 'none'
})
this.page = { current: 1, has_more: false }
this.getOrder()
}).catch(err => {
console.log(err)
uni.showToast({
title: err.message,
icon : 'none'
})
})
}
}
})
},
// 订单详情
onInfo(obj){
this.$Router.push({
name : 'OrderInfo',
params : {
id : obj.order_id,
orderType : obj.order_type.replace(/\\/g, '-')
}
})
},
// 复制订单号码
copyNo(no){
uni.setClipboardData({
data : no,
success : res => {
uni.showToast({
title: '订单号已复制',
icon : 'none'
})
}
})
},
// 去支付
onPay(obj){
let { order_id, order_type, paid_at } = obj
if(paid_at == ''){
this.$Router.push({
name : 'Pay',
params : {
paytype : 'synthesize',
orderId : order_id,
orderType : order_type.replace(/\\/g, '-')
},
})
}
}
},
onReachBottom() {
this.pagesShow = true;
if(this.page.has_more){
this.status = 'loading';
this.page.current++
this.getOrder()
return
}
this.status = 'nomore';
}
}
</script>
<style lang="scss">
// 订单列表
.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;
}
.orders-content-btn{
color: $main-color;
}
&.orders-content-bottom{
padding-right: 40rpx;
position: relative;
.orders-content-icon{
position: absolute;
right: 0;
top: 0;
}
}
}
&-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% - 150rpx);
}
.state{
color: $main-color;
font-weight: bold;
font-size: 30rpx;
line-height: 60rpx;
width: 150rpx;
text-align: right;
}
.price{
font-weight: bold;
color: $main-color;
}
.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;
&.border{
border: solid 1rpx $main-color;
color: $main-color;
background: white;
height: 68rpx;
line-height: 68rpx;
&::after{ display: none;}
}
&:last-child{ margin-left: 30rpx; }
}
}
}
}
</style>

View File

@@ -56,6 +56,7 @@
<view class="btns">
<view class="btns-item border" v-if="item.can.cancel" @click="onCancel(item)">取消订单</view>
<view class="btns-item" v-if="item.can.pay" @click="onPay(item)">立即支付</view>
<view class="btns-item" v-if="item.can.look" @click="onInfo(item)">查看详情</view>
</view>
</view>
</view>
@@ -155,6 +156,16 @@
}
})
},
// 订单详情
onInfo(obj){
this.$Router.push({
name : 'OrderInfo',
params : {
id : obj.order_id,
orderType : obj.order_type.replace(/\\/g, '-')
}
})
},
// 复制订单号码
copyNo(no){
uni.setClipboardData({

View File

@@ -64,7 +64,6 @@
</u-popup>
</block>
<!-- 管理中台 -->
<!-- <block v-else> -->
<view class="flex">
<view class="flex-item" @click="onNav('ConsultWork')">
<image class="flex-icon" src="/static/icons/icon_00.png" mode="aspectFill"></image>
@@ -115,15 +114,22 @@
</view>
<view class="flex-btn">去查看</view>
</view>
<view class="flex-item" @click="onNav('AccountWork2')">
<image class="flex-icon" src="/static/icons/icon_04.png" mode="aspectFill"></image>
<view class="flex-title">
<view class="flex-name">线下订单</view>
<view class="flex-tips">线下咨询类订单</view>
</view>
<view class="flex-btn">去查看</view>
</view>
</view>
<!-- </block> -->
</view>
<!-- 未登录 -->
<view v-else class="auth-null">
<u-empty
mode="permission"
icon="https://douhuo-storage.oss-cn-beijing.aliyuncs.com/images/2023/06/06/c95ebcf8641fcbd413f990d661f638cb.gif"
text="暂未登录"
mode="permission"
icon="https://douhuo-storage.oss-cn-beijing.aliyuncs.com/images/2023/06/06/c95ebcf8641fcbd413f990d661f638cb.gif"
text="暂未登录"
/>
<button class="auth-null-btn" size="mini" @click="onNav('Auth')">登录</button>
</view>
@@ -254,7 +260,7 @@
success : res => {
switch (res.tapIndex){
case 0:
this.onNav('OfflineCreate')
this.onNav('MagAccount2')
break;
case 1:
this.onNav('OrderCreate', { type: 'self' })

BIN
static/icons/icon_04.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB