Commit 11cea6e5 by yuzhenWang

Merge branch 'dev' into 'master'

Dev

See merge request !85
parents 348b1c97 b062d5db
......@@ -460,4 +460,7 @@ export default {
getCardStats(data) {
return request(`${apiURL}/business-card/stats/${data.cardId}?userId=${data.userId}`, 'GET')
},
dealerCouponCardList(params) {
return request(`${sfpUrl}/dealerCoupon/inventory/list/page`, 'POST', params)
},
}
......@@ -42,7 +42,7 @@
</div>
<script type="module" src="/main.js"></script>
<!-- uni 的 SDK,必须引用。 -->
<script type="text/javascript" src="/static/uni.webview.1.5.4.js"></script>
<!-- <script type="text/javascript" src="/static/uni.webview.1.5.4.js"></script>
<script type="text/javascript">
// 验证脚本是否加载成功(调试关键:控制台打印 webViewJs 确认)
const webViewJs = window.uni?.webView;
......@@ -53,6 +53,6 @@
// 将 webViewJs 挂载到 window 全局,供 Vue 组件访问
window.webViewJs = webViewJs;
}
</script>
</script> -->
</body>
</html>
\ No newline at end of file
......@@ -83,6 +83,27 @@
<uni-icons type="file-pdf" size="18" color="#cc66ff"></uni-icons>
<text class="file-name">{{ file.fileName }}</text>
</view>
<!-- 使用pdfjs打开 -->
<view class="popup" v-if="pdfShow">
<view class="popup-header">
<text>PDF预览</text>
<text class="close" @click="pdfShow = false">关闭</text>
</view>
<view class="popup-content">
<PdfViewer
:pdfInfo="{
title: null,
url: viewFileUrl,
landscapeFlag:false
}"
:autoLoad="true"
:lazyLoad="true"
:maxRetryCount="2"
/>
</view>
</view>
</view>
</view>
</view>
......@@ -103,6 +124,8 @@ import { ref, computed, onMounted } from 'vue';
import { useRouter, useRoute } from 'vue-router';
import common from '@/common/common';
import api from '@/api/api';
// 导入PDF查看器组件
import PdfViewer from '@/components/pdf-viewer/pdf-viewer.vue';
// 路由实例
const router = useRouter();
const route = useRoute();
......@@ -117,6 +140,7 @@ const productPKInfoList = ref([]);
const showOnlyDiff = ref(false);
// 查看文件的URL
const viewFileUrl = ref()
const pdfShow = ref(false)
// 根据分组编码获取对应的图标
const getGroupIcon = (groupCode) => {
......@@ -181,7 +205,9 @@ const getUrl = (fileUrl) => {
// 区分环境:H5 端直接打开 URL,其他端用原下载逻辑
if (uni.getSystemInfoSync().uniPlatform === 'web') {
// H5 方案:用浏览器新窗口打开 PDF(依赖浏览器原生支持)
const opened = window.open(fileUrl, '_blank');
pdfShow.value = true
viewFileUrl.value = fileUrl
// const opened = window.open(fileUrl, '_blank');
} else {
// 非 H5 端(小程序/APP):保留原下载+打开逻辑
uni.downloadFile({
......@@ -255,7 +281,6 @@ const shouldHide = (groupCode, factorType) => {
// 前往PK选择页
const navigateToPKPage = () => {
uni.navigateBack()
};
// 初始化数据
......@@ -488,4 +513,15 @@ onMounted(() => {
align-items: center;
justify-content: center;
}
.popup {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: #fff;
z-index: 999;
display: flex;
flex-direction: column;
}
</style>
<template>
<view class="container" :style="{paddingTop:paddingTop}">
<!-- #ifndef H5 -->
<CustomNavbar title="卡券使用记录" />
<!-- #endif -->
<view class="moduleBox" style="margin-top: 20rpx;">
<view class="module-content">
<view class="moudleHeader">
<view class="headerLeft">
<text class="bigTxt">已用卡券</text>
<text class="smallTxt">共有{{totalElements}}</text>
</view>
<!-- <view class="headerRight">
<text class="useTxt">使用记录 <text class="iconfont icon-youjiantou "></text> </text>
</view> -->
</view>
<view class="moudleItem" v-for="(item,index) in alreadyList" :key="index">
<view class="itemTop">
<view class="itemL">
<view class="productName">
{{item.cardName}}
</view>
<view class="timeTxt">
激活时间:{{item.activeTime}}
</view>
</view>
<view class="itemR">
{{item.price || '--'}}
</view>
</view>
<view class="itemBottom">
激活手机号:{{item.recipientMobile?item.recipientMobile :'--'}}
</view>
</view>
<view class="moreTxt">
<!-- 点击更多的时候要请求接口拿取分页数据 -->
<text class="useTxt" @click="getMore" v-if="alreadyList.length < totalElements">更多 <text class="iconfont icon-xiala "></text> </text>
<text class="useTxt" v-if="alreadyList.length == totalElements">数据已加载完 </text>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { onLoad, onShow } from '@dcloudio/uni-app'
import { ref, onMounted, nextTick } from 'vue'
import api from '@/util/api'
import commonHeader from '@/components/commonHeader/commonHeader.vue'
import dataHandling from '@/util/dataHandling'
import * as environment from '@/environments/environment'
import CustomNavbar from '@/components/CustomNavbar/CustomNavbar.vue'
import { useSafeArea } from '@/mixins/safeAreaMixin'
const { paddingTop } = useSafeArea()
const paginationInfo = ref({
"number": 1,
"size": 10,
})
const totalElements = ref()//总条数
let alreadyList = ref([])
let dealerInfo = ref({})
onMounted(() => {
})
onLoad(() => {
// getList(paginationInfo.value)
// initShare()
dataHandling.pocessTracking(null, '点击', '进入我的卡券', '进入我的卡券', '2', '0');
})
const initShare = () => {
let name = uni.getStorageSync('hoservice_name')
let shareData = {
title: '邀请您体验金融工具',
desc: `${name}邀请您免费使用金融工具`,
imgUrl: `${environment.baseURL}/ydMall/static/img/share.png`,
// path: '/myPackageA/rights/rightsActive',
link: `${environment.baseURL}/ydMall/#/myPackageA/financial/toolsList?orderFlag=3`
}
dataHandling.wxJsSdkConfig(shareData, '金融工具')
}
// 分页获取卡券数据
const getList = (paginationInfo) => {
uni.showLoading({
title: '加载中...'
})
let obj = {
"paginationInfo" : paginationInfo,
"dealerId": dealerInfo.value.id,
// "dealerId": JSON.parse(JSON.stringify(uni.getStorageSync('hoservice_userId'))), //经销商ID(必填)
"status": 3 //卡券状态: 0-未使用 1-已赠送 2-已领取 3-已激活 4-已过期/失活
}
api.dealerCouponCardList(obj).then(res => {
uni.hideLoading()
if (res.success) {
alreadyList.value = alreadyList.value.concat(res.data.list)
totalElements.value = res.data.paginationInfo.totalElements
} else {
dataHandling.showToast(res['message'])
}
})
}
const getMore = ()=>{
if(alreadyList.value.length < totalElements.value){
paginationInfo.value.number += 1
paginationInfo.value.size = 10
getList(paginationInfo.value)
}
}
onShow(()=>{
alreadyList.value = []
paginationInfo.value = {
"number": 1,
"size": 10,
}
dealerInfo.value = JSON.parse(JSON.stringify(uni.getStorageSync('dealerInfo')))
getList(paginationInfo.value)
})
</script>
<style lang="scss" scoped>
@import '../../static/css/variable.scss';
.container {
box-sizing: border-box;
background-color: rgba(235, 239, 247, 1);
.moduleBox {
box-sizing: border-box;
/* #ifdef H5 */
margin-top: 30rpx;
/* #endif */
/* #ifdef MP-WEIXIN */
// margin-top: 135rpx;
/* #endif */
padding: 0 20rpx;
.module-content {
background-color: #fff;
margin-bottom: 20rpx;
padding: 20rpx 15rpx;
border-radius: 10rpx;
}
.moudleHeader {
@include flex(center, space-between);
margin-bottom: 20rpx;
.headerLeft {
.bigTxt {
font-size: 32rpx;
}
.smallTxt {
margin-left: 5rpx;
font-size: 26rpx;
color: $system-auxiliary-deepgray;
}
}
.headerRight {
.useTxt {
font-size: 26rpx;
color: $system-auxiliary-deepgray;
}
.icon-youjiantou {
font-size: 28rpx;
color: $system-auxiliary-deepgray;
}
}
}
.moudleItem {
background-color: rgba(206, 14, 45,.05);
padding: 30rpx 20rpx;
border-radius: 10rpx;
margin-bottom: 20rpx;
.itemTop {
@include flex(center, space-between);
margin-bottom: 10rpx;
.productName {
margin-bottom: 10rpx;
font-size: 32rpx;
max-width: 400rpx;
/* 关键:单行省略号 */
white-space: nowrap;
/* 不换行 */
overflow: hidden;
/* 隐藏溢出内容 */
text-overflow: ellipsis;
/* 溢出部分用省略号表示 */
}
.timeTxt {
font-size: 26rpx;
color: $system-auxiliary-deepgray;
}
.itemR {
font-size: 28rpx;
}
}
.itemBottom {
border-top: 1px solid $system-main-color4;
font-size: 30rpx;
color: $system-main-color;
padding-top: 10rpx;
margin-top: 15rpx;
position: relative;
&::before {
content: '';
width: 22rpx;
height: 22rpx;
border-radius: 50%;
position: absolute;
left: -5%;
top: -14%;
background-color: #fff;
}
&::after {
content: '';
width: 22rpx;
height: 22rpx;
border-radius: 50%;
position: absolute;
right: -5%;
top: -14%;
background-color: #fff;
}
}
}
.moreTxt{
@include flex(center, center);
color: $system-auxiliary-deepgray;
.useTxt{
font-size: 28rpx;
}
.icon-xiala{
font-size: 26rpx;
margin-left: 5rpx;
}
}
}
}
</style>
\ No newline at end of file
<template>
<view class="container">
<!-- #ifndef H5 -->
<CustomNavbar title="我的卡券" />
<!-- #endif -->
<view class="moduleBox" style="margin-top: 20rpx;">
<view class="module-content">
<view class="moudleHeader">
<view class="headerLeft">
<text class="bigTxt">我的卡券</text>
<text class="smallTxt">共有{{totalElements}}</text>
</view>
<view class="headerRight" @click="viewUseRecord">
<text class="useTxt">使用记录 <text class="iconfont icon-youjiantou "></text> </text>
</view>
</view>
<view class="moudleItem" v-for="(item,index) in moduleList" :key="index">
<view class="itemTop">
<view class="itemL">
<view class="productName">
{{item.cardName}}
</view>
<view class="timeTxt">
有效期:{{item.validEndTime}}
</view>
</view>
<view class="itemR">
{{item.price || '--'}}
</view>
</view>
<view class="itemBottom">
权益码:{{item.redeemCode}}
</view>
</view>
<view class="moreTxt">
<!-- 点击更多的时候要请求接口拿取分页数据 -->
<text class="useTxt" @click="getMore" v-if="moduleList.length < totalElements">更多 <text class="iconfont icon-xiala "></text> </text>
<text class="useTxt" v-if="moduleList.length == totalElements">数据已加载完 </text>
</view>
</view>
</view>
</view>
</template>
<script setup>
import { onLoad, onShow } from '@dcloudio/uni-app'
import { ref, onMounted, nextTick } from 'vue'
import api from "@/api/api";
import dataHandling from '@/util/dataHandling'
import * as environment from '@/environments/environment'
const paginationInfo = ref({
"number": 1,
"size": 10,
})
const totalElements = ref()//总条数
let moduleList = ref([])
let dealerId = ref()
const viewUseRecord = ()=>{
uni.navigateTo({
url:'/myPackageA/ticket/alreadyUsed'
})
}
onMounted(() => {
})
onLoad(() => {
// dataHandling.pocessTracking(null, '点击', '进入我的卡券', '进入我的卡券', '2', '0');
})
// 分页获取卡券数据
const getList = (paginationInfo) => {
uni.showLoading({
title: '加载中...'
})
let obj = {
"paginationInfo" : paginationInfo,
"dealerId": dealerId.value,
// "dealerId": JSON.parse(JSON.stringify(uni.getStorageSync('hoservice_userId'))), //经销商ID(必填)
"status": 0 //卡券状态: 0-未使用 1-已赠送 2-已领取 3-已激活 4-已过期/失活
}
api.dealerCouponCardList(obj).then(res => {
uni.hideLoading()
if (res.success) {
moduleList.value = moduleList.value.concat(res.data.list)
totalElements.value = res.data.paginationInfo.totalElements
} else {
// uni.showToast({
// title:res['message']
// })
}
})
}
const getMore = ()=>{
if(moduleList.value.length < totalElements.value){
paginationInfo.value.number += 1
paginationInfo.value.size = 10
getList(paginationInfo.value)
}
}
onShow(()=>{
moduleList.value = []
paginationInfo.value = {
"number": 1,
"size": 10,
}
dealerId.value = JSON.parse(JSON.stringify(uni.getStorageSync('cffp_userInfo'))) ? JSON.parse(JSON.stringify(uni.getStorageSync('cffp_userInfo'))).dealerId :''
console.log('dealerId.value',dealerId.value);
getList(paginationInfo.value)
})
</script>
<style lang="scss" scoped>
@import '@/uni.scss';
.container {
box-sizing: border-box;
background-color: rgba(235, 239, 247, 1);
padding-top:30rpx;
.moduleBox {
box-sizing: border-box;
/* #ifdef H5 */
margin-top: 30rpx;
/* #endif */
/* #ifdef MP-WEIXIN */
// margin-top: 135rpx;
/* #endif */
padding: 0 20rpx;
.module-content {
background-color: #fff;
margin-bottom: 20rpx;
padding: 20rpx 15rpx;
border-radius: 10rpx;
}
.moudleHeader {
@include flex(center, space-between);
margin-bottom: 20rpx;
.headerLeft {
.bigTxt {
font-size: 32rpx;
}
.smallTxt {
margin-left: 5rpx;
font-size: 26rpx;
color: $system-auxiliary-deepgray;
}
}
.headerRight {
.useTxt {
font-size: 26rpx;
color: $system-auxiliary-deepgray;
}
.icon-youjiantou {
font-size: 28rpx;
color: $system-auxiliary-deepgray;
}
}
}
.moudleItem {
background-color: rgba(206, 14, 45,.05);
padding: 30rpx 20rpx;
border-radius: 10rpx;
margin-bottom: 20rpx;
.itemTop {
@include flex(center, space-between);
margin-bottom: 10rpx;
.productName {
margin-bottom: 10rpx;
font-size: 32rpx;
max-width: 400rpx;
/* 关键:单行省略号 */
white-space: nowrap;
/* 不换行 */
overflow: hidden;
/* 隐藏溢出内容 */
text-overflow: ellipsis;
/* 溢出部分用省略号表示 */
}
.timeTxt {
font-size: 26rpx;
color: $system-auxiliary-deepgray;
}
.itemR {
font-size: 28rpx;
}
}
.itemBottom {
border-top: 1px solid $system-main-color4;
font-size: 34rpx;
color: $system-main-color;
padding-top: 10rpx;
margin-top: 15rpx;
position: relative;
&::before {
content: '';
width: 22rpx;
height: 22rpx;
border-radius: 50%;
position: absolute;
left: -5%;
top: -14%;
background-color: #fff;
}
&::after {
content: '';
width: 22rpx;
height: 22rpx;
border-radius: 50%;
position: absolute;
right: -5%;
top: -14%;
background-color: #fff;
}
}
}
.moreTxt{
@include flex(center, center);
color: $system-auxiliary-deepgray;
.useTxt{
font-size: 28rpx;
}
.icon-xiala{
font-size: 26rpx;
margin-left: 5rpx;
}
}
}
}
</style>
\ No newline at end of file
......@@ -621,6 +621,20 @@
"navigationBarTitleText" : "我的名片"
}
}
// {
// "path" : "ticket/unUsed",
// "style" :
// {
// "navigationBarTitleText" : "我的卡券"
// }
// },
// {
// "path" : "ticket/alreadyUsed",
// "style" :
// {
// "navigationBarTitleText" : "使用记录"
// }
// }
]
},{
......
......@@ -79,9 +79,8 @@
<view class="productBox">
<view class="productList" :style="{marginTop}">
<view class="tabBox">
<view :class="{'actived': courseClassify==4}" @click="transform('consult')"><text>咨询产品</text></view>
<view :class="{'actived': courseClassify==3}" @click="transform('plan')"><text>规划产品</text></view>
<view :class="{'actived': courseClassify==4}" @click="transform('consult')"><text>咨询产品</text></view>
</view>
<view class="productItem" v-for="item in localCourseInfos" :key="item.fileId" >
<view class="top" @click="goDetail(item)">
......@@ -235,7 +234,7 @@
env:dataHandling.getRuntimeEnv2(),
shareItem:{},//分享的产品
sharelogin: false,
courseClassify:4,
courseClassify:3,
posterImg:'https://yindun-images.oss-cn-shanghai-finance-1-pub.aliyuncs.com/ydMall/product/serviceContent-zx_jqsw1-1.png',
qrCodeUrl: 'https://example.com',//二维码的链接地址
......
......@@ -190,7 +190,7 @@
inviteEqrode: '',
currentPage: 'personalCenter',
customerBasicInfo: {},
loginornot: true,
loginornot: true,//登录状态
tabBarPadding: 100,
settingItem: {
title: '系统设置',
......@@ -218,6 +218,14 @@
isShow: true,
identity: true
},
// {
// title: '我的卡券',
// icon: 'icon-yifukuan',
// link: '/myPackageA/ticket/unUsed',
// isOpen: true,
// isShow: true,
// key:'ticket',
// },
{
title: '我的售后',
icon: 'icon-shouhoufuwu',
......@@ -567,6 +575,7 @@
this.bootpage = false
},
isLogin() {
console.log('11111');
uni.navigateTo({
url: '/myPackageA/login/login?from=personalCenter'
})
......@@ -579,6 +588,7 @@
},
// 菜单跳转页面
goDetail(item) {
if (uni.getStorageSync('cffp_userInfo')) {
this.userInfo = JSON.parse(uni.getStorageSync('cffp_userInfo'))
}
......@@ -683,10 +693,21 @@
});
return
}
if (!this.loginornot && !item.islogin) {
console.log('判断',(!uni.getStorageSync('loginType') || uni.getStorageSync('loginType') == 'visitor') && !item.islogin);
if ((!uni.getStorageSync('loginType') || uni.getStorageSync('loginType') == 'visitor') && !item.islogin) {
this.isLogin()
return
}
// 登录状态下直接去我的卡券
if(item.key=='ticket'){
uni.navigateTo({
url: `${item.link}`
});
return
}
if (item.isShow && item.isOpen) {
if (item.title === '我的邀请码') {
this.$refs.popup1.open('bottom');
......@@ -714,7 +735,9 @@
url: `${item.link}?levelCode=` + this.customerBasicInfo.levelCode
});
} else {
const urlObj = JSON.parse(JSON.stringify(item))
console.log('222222222',urlObj.link);
if (urlObj.type) {
urlObj.link =
`${urlObj.link}?type=${urlObj.type}&from=personalCenter&partnerType=${this.customerBasicInfo.partnerType}`
......
......@@ -75,3 +75,32 @@ $uni-color-subtitle: #555555; // 二级标题颜色
$uni-font-size-subtitle:26px;
$uni-color-paragraph: #3F536E; // 文章段落颜色
$uni-font-size-paragraph:15px;
// $system-auxiliary-deepgray:#2A36AD;
//系统主题色
$system-main-color:#CE0E2D;
$system-main-color1:rgba(206, 14, 45,.1);
$system-main-color2:rgba(206, 14, 45,.2);
$system-main-color3:rgba(206, 14, 45,.3);
$system-main-color4:rgba(206, 14, 45,.4);
$system-main-color5:rgba(206, 14, 45,.5);
$system-main-color6:rgba(206, 14, 45,.6);
$system-main-color7:rgba(206, 14, 45,.7);
$system-main-color8:rgba(206, 14, 45,.8);
$system-main-color9:rgba(206, 14, 45,.9);
// 系统辅助色
$system-auxiliary-gray:#E6E6E6;
// 系统辅助色
$system-auxiliary-deepgray:#898989;
// 绝对居中
@mixin flex($alignItems, $justifyContent) {
display: flex;
align-items: $alignItems;
justify-content: $justifyContent;
}
@mixin background-cover($bg-image,$bg-size) {
background-image: url($bg-image);
background-size: $bg-size;
background-position: center;
background-repeat: no-repeat;
}
\ No newline at end of file
......@@ -155,7 +155,8 @@ export const interceptor = () => {
success(args) {
if(args && args.data && args.data.errorCode && "T001"==args.data.errorCode){
uni.removeStorageSync('isLogin');
uni.removeStorageSync('uni-token');
uni.removeStorageSync('uni-token');
uni.setStorageSync('loginType','visitor')
uni.switchTab({
url:'/pages/index/index'
})
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment