23 Commits

Author SHA1 Message Date
xuli3099
1f8245ab2c 增加消息详情页 2025-09-12 09:41:59 +08:00
xuli3099
afdb3cb724 修改 appid 为 718的 2025-09-11 13:44:56 +08:00
xuli3099
612de69d7b 首页 常用功能图标太大,改为一行4个
编辑完常用功能,提交后直接返回业务中心,
并设定首页需要刷新
2025-09-10 16:20:53 +08:00
xuli3099
d244f20aac 登录增加推送cid 2025-09-09 10:01:18 +08:00
xuli3099
c205422420 增加 unipush2.0 2025-09-05 13:08:49 +08:00
xuli3099
426ac9171d 修改地址及推送内容 2025-09-04 14:34:00 +08:00
xuli3099
45b0117f5f 增加unipush2.0 云服务器,暂时无用之后集成到java中,只是配置需要 2025-09-04 14:03:38 +08:00
xuli3099
95a1187b8a 修改 离线插件 2025-09-04 14:02:33 +08:00
wangzhuo
a6a98eb2b6 fix: 客户人员-编辑-多选组件失去焦点关闭 2025-09-01 13:56:20 +08:00
wangzhuo
d37b721c28 fix: 主归属人-变更审核 2025-09-01 13:50:12 +08:00
wangzhuo
ca7572c542 fix: 客户人员-多选表单、日期表单问题修复 2025-09-01 13:46:13 +08:00
wangzhuo
c10a0be121 fix: 计划查看-头部空白高度修复 2025-09-01 13:29:47 +08:00
PC-202311141343\Administrator
036f2a61bf 补充提交 2025-09-01 10:16:33 +08:00
wangyang
487a367c5a Merge remote-tracking branch 'origin/develop' into develop 2025-09-01 09:38:41 +08:00
wangyang
1f4fc0b0cc CRM-走访审核,注释getUserInfo方法 2025-09-01 09:38:24 +08:00
PC-202311141343\Administrator
ed26947cce 颜色控制,更新高度 2025-09-01 09:07:49 +08:00
xuli3099
8e049c4a0c 修改没有记录时 显示图片路径 2025-08-29 18:42:15 +08:00
xuli3099
e94ce94c42 修改路由跳转 将 /pages/business/CRM/chooseCus 修改为 /pages/business/CRM/marketActivity/chooseCus 2025-08-29 18:23:57 +08:00
xuli3099
2bda2bb389 修改没记录时图片显示 2025-08-29 18:13:15 +08:00
PC-202311141343\Administrator
20dc7d5f75 客户选择样式问题提交 2025-08-29 17:31:05 +08:00
PC-202311141343\Administrator
850ed466cf 补充提交 2025-08-29 16:30:42 +08:00
PC-202311141343\Administrator
6cb3944a86 处理冲突 2025-08-29 14:51:05 +08:00
PC-202311141343\Administrator
8739cb4a34 整体提交 2025-08-29 14:43:12 +08:00
68 changed files with 1160 additions and 747 deletions

View File

@@ -1,6 +1,12 @@
#调用后台地址 #调用后台地址
# VITE_APP_BASE_URL = 'http://118.186.13.120:31302' # 公司
VITE_APP_BASE_URL = 'https://app-test.718yousheng.com' VITE_APP_BASE_URL = 'http://118.186.13.120:31302'
# VITE_APP_BASE_URL = "http://192.168.236.71:31302" # VITE_APP_BASE_URL = "http://192.168.236.71:31302"
# VITE_APP_BASE_URL = "http://123.57.20.168:3000" # VITE_APP_BASE_URL = "http://123.57.20.168:3000"
# 友晟外网
# VITE_APP_BASE_URL = 'https://app-test.718yousheng.com/app'
# 友晟内网
# VITE_APP_BASE_URL = 'https://appi-test.718yousheng.com/app'

View File

@@ -1,6 +1,11 @@
#调用后台地址 #调用后台地址
VITE_APP_BASE_URL = 'https://app-test.718yousheng.com' # 公司
# VITE_APP_BASE_URL = 'http://118.186.13.120:31302' # VITE_APP_BASE_URL = 'http://118.186.13.120:31302'
# VITE_APP_BASE_URL = "http://192.168.236.71:31302" # VITE_APP_BASE_URL = "http://192.168.236.71:31302"
# VITE_APP_BASE_URL = "http://123.57.20.168:3000" # VITE_APP_BASE_URL = "http://123.57.20.168:3000"
# 友晟外网
VITE_APP_BASE_URL = 'https://app-test.718yousheng.com/app'
# 友晟内网
# VITE_APP_BASE_URL = 'https://appi-test.718yousheng.com/app'

1
.gitignore vendored
View File

@@ -8,6 +8,7 @@ pnpm-debug.log*
lerna-debug.log* lerna-debug.log*
node_modules node_modules
.hbuilderx
.DS_Store .DS_Store
dist dist
*.local *.local

View File

@@ -4,6 +4,16 @@
{ {
"playground" : "custom", "playground" : "custom",
"type" : "uni-app:app-android" "type" : "uni-app:app-android"
},
{
"app" : {
"launchtype" : "remote"
},
"default" : {
"launchtype" : "local"
},
"provider" : "aliyun",
"type" : "uniCloud"
} }
] ]
} }

View File

@@ -4,16 +4,39 @@
<script setup> <script setup>
// import { onLaunch } from '@dcloudio/uni-app'; import {showAlert} from '@/utils/message.js'
// onLaunch((opt) => { import { onLaunch } from '@dcloudio/uni-app';
// console.log("onLaunch") onLaunch((opt) => {
// uni.preloadPage({ url: "/pages/login/login" });
// uni.preloadPage({ url: "/pages/home/home" });
// uni.preloadPage({ url: "/pages/business/business" });
// uni.preloadPage({ url: "/pages/notice/notice" });
// uni.preloadPage({ url: "/pages/userinfo/userinfo" });
console.log("APP onLaunch")
// #ifdef APP-PLUS
// uni.getPushClientId({
// success: (res) => {
// let push_clientid = res.cid
// showAlert(push_clientid)
// console.log('客户端推送标识:', push_clientid);
// },
// fail(err) {
// console.log(err)
// }
// })
uni.onPushMessage(res => {
console.log("收到推送消息:", res) //监听推送消息
// uni.createPushMessage({
// title: res.data.title,
// content: res.data.content,
// payload: res.data.payload
// })
})
// #endif
})
// uni.preloadPage({ url: "/pages/login/login" });
// uni.preloadPage({ url: "/pages/home/home" });
// uni.preloadPage({ url: "/pages/business/business" });
// uni.preloadPage({ url: "/pages/notice/notice" });
// uni.preloadPage({ url: "/pages/userinfo/userinfo" });
// })
</script> </script>

View File

@@ -93,7 +93,7 @@ export function viewingMarketInfgetDetail(data) {
//市场信审核列表接口 //市场信审核列表接口
export function approvalMarketInfget(data) { export function approvalMarketInfget(data) {
return request.get({ return request.get({
url: 'app/informationMarketInformation/Approval', url: '/crm/app/informationMarketInformation/Approval',
data data
},{ },{
isTransformResponse:false isTransformResponse:false

View File

@@ -25,7 +25,7 @@ export function saveappCrmCusUserNew(params){
// 查询业务员名下所有的客户 // 查询业务员名下所有的客户
export function SearchForAllCustomersSalesperson(params){ export function SearchForAllCustomersSalesperson(params){
return request.get({ return request.get({
url: 'app/appCrmCusUserNewController/SearchForAllCustomersSalesperson', url: '/crm/app/appCrmCusUserNewController/SearchForAllCustomersSalesperson',
data: params data: params
},{isTransformResponse: false}) },{isTransformResponse: false})
} }

View File

@@ -1,12 +1,5 @@
import request from "@/utils/request" import request from "@/utils/request"
// 获取用户信息
export function getPersonalPlanList(params) {
return request.post({
url: '/getPersonalPlanList',
params
})
}
export function getUserInfo(data) { export function getUserInfo(data) {
return request.get({ return request.get({
url: '/crm/app/user/getUserInfo', url: '/crm/app/user/getUserInfo',

View File

@@ -43,7 +43,7 @@
</template> </template>
<script setup> <script setup>
import { onMounted, reactive, ref } from "vue"; import { onMounted, reactive, ref, defineExpose} from "vue";
const props = defineProps({ const props = defineProps({
// 是否显示全部清空按钮 // 是否显示全部清空按钮
@@ -175,6 +175,17 @@ const handleChange = (index, item) => {
// 触发回调函数 // 触发回调函数
emit("change", changevalue, realValue); emit("change", changevalue, realValue);
}; };
// 失去焦点时关闭选项列表
const handleBlur = () => {
active.value = false;
};
// 定义组件实例暴露的方法
defineExpose({
handleBlur
});
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>

View File

@@ -21,7 +21,9 @@
"delay" : 0 "delay" : 0
}, },
/* */ /* */
"modules" : {}, "modules" : {
"Push" : {}
},
/* */ /* */
"distribute" : { "distribute" : {
/* android */ /* android */
@@ -41,17 +43,31 @@
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>", "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>", "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
"<uses-feature android:name=\"android.hardware.camera\"/>", "<uses-feature android:name=\"android.hardware.camera\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>" "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>",
"<uses-permission android:name=\"android.permission.INTERNET\" />",
"<uses-permission android:name=\"android.permission.RECEIVE_BOOT_COMPLETED\" />",
"<uses-permission android:name=\"android.permission.WRITE_EXTERNAL_STORAGE\" />",
"<uses-permission android:name=\"android.permission.GET_TASKS\" />",
"<uses-permission android:name=\"android.permission.BLUETOOTH\" />",
"<uses-permission android:name=\"android.permission.BLUETOOTH_ADMIN\" />",
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\" />",
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\" />",
"<uses-permission android:name=\"android.permission.BROADCAST_PACKAGE_ADDED\" />",
"<uses-permission android:name=\"android.permission.BROADCAST_PACKAGE_CHANGED\" />",
"<uses-permission android:name=\"android.permission.BROADCAST_PACKAGE_INSTALL\" />",
"<uses-permission android:name=\"android.permission.BROADCAST_PACKAGE_REPLACED\" />",
"<uses-permission android:name=\"android.permission.RESTART_PACKAGES\" />",
"<uses-permission android:name=\"android.permission.REQUEST_INSTALL_PACKAGES\" />"
], ],
"abiFilters" : [ "armeabi-v7a", "arm64-v8a" ], "abiFilters" : [ "armeabi-v7a", "arm64-v8a" ],
"minSdkVersion" : 26, "minSdkVersion" : 26,
"targetSdkVersion" : 35, "targetSdkVersion" : 35,
"icons" : { "icons" : {
"android" : { "android" : {
"hdpi" : "static/icons/72x72.png", "hdpi" : "/static/images/icon.png",
"xhdpi" : "static/icons/96x96.png", "xhdpi" : "/static/images/icon.png",
"xxhdpi" : "static/icons/144x144.png", "xxhdpi" : "/static/images/icon.png",
"xxxhdpi" : "static/icons/192x192.png" "xxxhdpi" : "/static/images/icon.png"
} }
} }
}, },
@@ -60,7 +76,23 @@
"dSYMs" : false "dSYMs" : false
}, },
/* SDK */ /* SDK */
"sdkConfigs" : {} "sdkConfigs" : {
"push" : {
"unipush" : {
"version" : "2",
"offline" : true,
"icons" : {
"small" : {
"ldpi" : "/static/images/icon.png",
"mdpi" : "/static/images/icon.png",
"hdpi" : "/static/images/icon.png",
"xhdpi" : "/static/images/icon.png",
"xxhdpi" : "/static/images/icon.png"
}
}
}
}
}
}, },
"nativePlugins" : { "nativePlugins" : {
"Tm-TmSafeSaveFileModule" : { "Tm-TmSafeSaveFileModule" : {

View File

@@ -54,6 +54,12 @@
"navigationBarTitleText": "" "navigationBarTitleText": ""
} }
}, },
{
"path": "pages/notice/noticeDetail",
"style": {
"navigationBarTitleText": ""
}
},
{ {
"path": "pages/notice/waitApprove", "path": "pages/notice/waitApprove",
"style": { "style": {
@@ -217,13 +223,6 @@
"navigationBarTitleText": "通用信息更新" "navigationBarTitleText": "通用信息更新"
} }
}, },
//选择客户(已更新)
{
"path": "pages/business/CRM/chooseCus",
"style": {
"navigationBarTitleText": "客户选择"
}
},
//选择客户人员(已更新) //选择客户人员(已更新)
{ {
"path": "pages/business/CRM/customerUserList", "path": "pages/business/CRM/customerUserList",

View File

@@ -1,170 +0,0 @@
<template>
<view class="con-body">
<view >
<!-- 头部 -->
<customHeader ref="customHeaderRef" :title="'选择客户单位'" :leftFlag="true" :rightFlag="false">
</customHeader>
<!-- 高度来避免头部遮挡 -->
<view class="top-height"></view>
<uni-easyinput prefixIcon="search" v-model="searchContent" placeholder="请输入客户单位名称" clearable
@iconClick="iconClick">
</uni-easyinput>
<view class="inner-box">
<view class="list-cont">
<radio-group class="block" @change="radioChange">
<view class="item" v-for="(item, index) in dataList">
<radio class='radio' :value="index" ></radio>
<view class="name">{{item.cusName+""+item.shortName+""}}</view>
</view>
</radio-group>
</view>
</view>
</view>
</view>
</template>
<script setup>
import customHeader from '@/components/customHeader.vue'
import { getYsCustomerList } from '../../../api/crm/api_ys.js'
import { onMounted, reactive, ref, watch } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import { useMessage } from '../../../utils/message.js'
const message = useMessage();
//点击查询客户人员
const queryParams = ref({
cusName: '',
nickName:'',
pageNum: 1,
pageSize: 10
})
onMounted(() => {
})
onLoad(options => {
queryParams.value.cusName = options.cusName
})
const dataList = ref([])
//查询某一客户人员
let searchContent = ref('')
function iconClick() {
message.toast('点击了查询,当前内容:' + searchContent.value)
}
//监视查询的内容的变化
let queryCusForm = reactive({})
watch(searchContent,(newValue,oldValue)=>{
console.log("输入内容:",searchContent.value)
queryCusForm.cusName = searchContent.value
getYsCustomerList(queryCusForm).then(res=>{
dataList.value = res.rows
})
})
function radioChange(event) {
const selectedIndex = event.detail.value
let test = dataList.value[selectedIndex]
// 发送全局事件
uni.$emit('onCustomerSelected', test)
let cusName = test.cusName;//客户名称
let cusId = test.cusId;//客户ID
uni.navigateBack()//返回上一页
}
</script>
<style scoped lang="scss">
.con-body{
background: white;
}
/* Container for the checkbox group */
.checkbox-group.block {
width: 100%;
}
/* Each item row */
.itemClass {
display: flex;
align-items: center;
padding: 10rpx 0;
margin-left: 15rpx;
border-bottom: 1px solid #eee;
/* optional divider */
}
/* Checkbox styling */
.checkBoxClass {
margin-right: 12rpx;
}
/* Content container */
.clientClass {
flex: 1;
display: flex;
align-items: center;
flex-wrap: wrap;
font-size: 36rpx;
color: #333;
/* default text color */
}
/* Blue username text */
.blue-text {
/* or any blue you prefer */
margin-right: 5rpx;
}
.inner-box {
width: 100%;
padding: 10px;
box-sizing: border-box;
}
.list-cont {
width: 100%;
}
.block {
width: 100%;
}
.item {
display: flex;
align-items: center;
padding: 12px 0;
border-bottom: 1px solid #eee;
}
.radio {
margin-right: 12px;
transform: scale(0.9);
}
.name {
flex: 1;
font-size: 16px;
color: #333;
}
.checked {
color: #007AFF; /* 选中状态的颜色 */
}
</style>

View File

@@ -128,7 +128,7 @@ const upOption = ref({
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {
tip: '~ 空空如也 ~', tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png" icon: "../../../../static/images/mescroll-empty.png"
}, },
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'

View File

@@ -168,8 +168,8 @@
<uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top"> <uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top">
<!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange--> <!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange-->
<uni-easyinput v-model="formData.hobby" placeholder="请输入爱好" :disabled="!editable"/> <uni-easyinput v-model="formData.hobby" placeholder="请输入爱好" :disabled="!editable"/>
<multipleSelect :multiple="true" :value="hobbyIndex" downInner :options="hobbyList" <multipleSelect ref="hobbySelectRef" :multiple="true" downInner :value="hobbyIds" :options="hobbyList"
@change="handleHobbyChange" :slabel="'name'" @change="handleHobbyChange" :slabel="'name'"
></multipleSelect><!--placeholder="请选择爱好标签"--> ></multipleSelect><!--placeholder="请选择爱好标签"-->
</uni-forms-item> </uni-forms-item>
@@ -467,20 +467,29 @@ let handleThinkLevelChange = (e) => {
// 系统推荐等级 // 系统推荐等级
let recommendLevel = ref(""); let recommendLevel = ref("");
let getRecommendLevel = async () => { let getRecommendLevel = async () => {
if (formData.value.cusEstate && formData.value.functionalRequirements) { if (formData.value.cusEstate) {
let {cusEstate, functionalRequirements} = formData.value; let {cusEstate, functionalRequirements} = formData.value;
let param = {cusEstate, functionalRequirements}; let param = {cusEstate, functionalRequirements};
if (formData.value.salesmanThinkLevel) { if (formData.value.salesmanThinkLevel) {
param.personnelLevel = formData.value.salesmanThinkLevel; param.personnelLevel = formData.value.salesmanThinkLevel;
} }
let res = await getCustomerLevel(param).catch(err => { let res = await getCustomerLevel(param)
/*.catch(err => {
console.error(err, "客户的系统推荐等级获取失败") console.error(err, "客户的系统推荐等级获取失败")
}) })*/
if (!res.systemRecommendationLevel) { try{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐" if(res.data.systemRecommendationLevel){
console.log(formData.value.systemThinkLevel + "???") formData.value.systemThinkLevel = res.data.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐";
}
}catch(e){
if (res.systemRecommendationLevel) {
formData.value.systemThinkLevel = res.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
}
} }
formData.value.systemThinkLevel = res.systemRecommendationLevel;
} else { } else {
recommendLevel.value = "无公司等级信息,无法推荐等级"; recommendLevel.value = "无公司等级信息,无法推荐等级";
} }
@@ -509,8 +518,7 @@ let handleUserTypeChange = (e) => {
// 选择日期 // 选择日期
function handleTenureTimeChange(e) { function handleTenureTimeChange(e) {
let {value} = e.detail; formData.value.tenureTime = e;
formData.value.tenureTime = value;
} }
// 需求层次索引 // 需求层次索引
@@ -533,16 +541,16 @@ let handleDevelopChange = e => {
// 选择生日 // 选择生日
function handleBirthdayChange(e) { function handleBirthdayChange(e) {
let{value} = e.detail formData.value.birthday = e;
formData.value.birthday = value;
} }
// 爱好标签索引 // 爱好标签索引
let hobbyIndex = reactive([]); let hobbyIds = ref([]);
let hobbies = ref([]);
// 选择爱好标签 // 选择爱好标签
const handleHobbyChange = (item, value) => { const handleHobbyChange = (items, ids) => {
// console.log("爱好", item, value); hobbyIds.value = [];
hobbyIndex = value; hobbies.value = items;
}; };
// 选择 // 选择
const handleNativeChange = (e) => { const handleNativeChange = (e) => {

View File

@@ -1,3 +1,8 @@
<!--
* @author wangzhuo
* @date 2025年9月1日
* @description 编辑客户人员信息
-->
<template> <template>
<view class="con-body"> <view class="con-body">
<view class="con-bg"> <view class="con-bg">
@@ -17,7 +22,7 @@
<!-- 正文内容 --> <!-- 正文内容 -->
<view class="white-bg"> <view class="white-bg">
<view class="form-con"> <view class="form-con" @click="handleBlur">
<uni-forms ref="formRef" :model="formData" :rules="rules" label-width="40%"> <uni-forms ref="formRef" :model="formData" :rules="rules" label-width="40%">
<!-- 选择客户 --> <!-- 选择客户 -->
<uni-forms-item label="客户名称" name="cusName" required class="f-c-right"> <uni-forms-item label="客户名称" name="cusName" required class="f-c-right">
@@ -168,8 +173,8 @@
<uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top"> <uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top">
<!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange--> <!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange-->
<uni-easyinput v-model="formData.hobby" placeholder="请输入爱好"/> <uni-easyinput v-model="formData.hobby" placeholder="请输入爱好"/>
<multipleSelect :multiple="true" :value="hobbyIndex" downInner :options="hobbyList" <multipleSelect ref="hobbySelectRef" :multiple="true" downInner :value="hobbyIds" :options="hobbyList"
@change="handleHobbyChange" :slabel="'name'" @change="handleHobbyChange" :slabel="'name'"
></multipleSelect><!--placeholder="请选择爱好标签"--> ></multipleSelect><!--placeholder="请选择爱好标签"-->
</uni-forms-item> </uni-forms-item>
@@ -468,20 +473,29 @@ let handleThinkLevelChange = (e) => {
// 系统推荐等级 // 系统推荐等级
let recommendLevel = ref(""); let recommendLevel = ref("");
let getRecommendLevel = async () => { let getRecommendLevel = async () => {
if (formData.value.cusEstate && formData.value.functionalRequirements) { if (formData.value.cusEstate) {
let {cusEstate, functionalRequirements} = formData.value; let {cusEstate, functionalRequirements} = formData.value;
let param = {cusEstate, functionalRequirements}; let param = {cusEstate, functionalRequirements};
if (formData.value.salesmanThinkLevel) { if (formData.value.salesmanThinkLevel) {
param.personnelLevel = formData.value.salesmanThinkLevel; param.personnelLevel = formData.value.salesmanThinkLevel;
} }
let res = await getCustomerLevel(param).catch(err => { let res = await getCustomerLevel(param)
/*.catch(err => {
console.error(err, "客户的系统推荐等级获取失败") console.error(err, "客户的系统推荐等级获取失败")
}) })*/
if (!res.systemRecommendationLevel) { try{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐" if(res.data.systemRecommendationLevel){
console.log(formData.value.systemThinkLevel + "???") formData.value.systemThinkLevel = res.data.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐";
}
}catch(e){
if (res.systemRecommendationLevel) {
formData.value.systemThinkLevel = res.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
}
} }
formData.value.systemThinkLevel = res.systemRecommendationLevel;
} else { } else {
recommendLevel.value = "无公司等级信息,无法推荐等级"; recommendLevel.value = "无公司等级信息,无法推荐等级";
} }
@@ -510,8 +524,7 @@ let handleUserTypeChange = (e) => {
// 选择日期 // 选择日期
function handleTenureTimeChange(e) { function handleTenureTimeChange(e) {
let {value} = e.detail; formData.value.tenureTime = e;
formData.value.tenureTime = value;
} }
// 需求层次索引 // 需求层次索引
@@ -534,17 +547,19 @@ let handleDevelopChange = e => {
// 选择生日 // 选择生日
function handleBirthdayChange(e) { function handleBirthdayChange(e) {
let{value} = e.detail formData.value.birthday = e;
formData.value.birthday = value;
} }
// 爱好标签索引 // 爱好标签索引
let hobbyIndex = reactive([]); let hobbyIds = ref([]);
let hobbies = ref([]);
// 选择爱好标签 // 选择爱好标签
const handleHobbyChange = (item, value) => { const handleHobbyChange = (items, ids) => {
// console.log("爱好", item, value); console.log('选择爱好', items, ids);
hobbyIndex = value; hobbyIds.value = [];
hobbies.value = items;
}; };
// 选择 // 选择
const handleNativeChange = (e) => { const handleNativeChange = (e) => {
formData.value.nativec = (e.detail.value.map(item => { formData.value.nativec = (e.detail.value.map(item => {
@@ -567,17 +582,22 @@ let handleWorkingStatusChange = e => {
formData.value.workingStatus = workingStatusList[value].name; formData.value.workingStatus = workingStatusList[value].name;
} }
const hobbySelectRef = ref(null);
// 多选组件失去焦点关闭
let handleBlur = () => {
if (hobbySelectRef.value) hobbySelectRef.value.handleBlur();
}
let submitForm = async () => { let submitForm = async () => {
let hobbyTags = hobbyIndex.map(it => { let hobbyTags = hobbies.value.map(it => {
let {name} = hobbyList[it]; let {name} = it;
return name; return name;
}) })
formData.value.iphone = formData.value.mobilePhone; // 特殊处理
const hobbyTagString = hobbyTags.join(''); const hobbyTagString = hobbyTags.join('');
console.log(hobbyTagString); console.log(hobbyTagString);
if (hobbyTagString || formData.value.hobby) { if (hobbyTagString || formData.value.hobby) {
formData.value.hobby = formData.value.hobby ? formData.value.hobby + '' + hobbyTagString : hobbyTagString; formData.value.hobby = hobbyTagString ? (formData.value.hobby ? formData.value.hobby + '' : '') + hobbyTagString : formData.value.hobby;
} }
formData.value.iphone = formData.value.mobilePhone; // 特殊处理
// console.log(formData.value, "校验表单数据") // console.log(formData.value, "校验表单数据")
// console.log(recommendLevel); // console.log(recommendLevel);
formData.value.cusName = customerUser.value.cusName; formData.value.cusName = customerUser.value.cusName;

View File

@@ -21,7 +21,7 @@
<!-- 正文内容 --> <!-- 正文内容 -->
<view class="white-bg"> <view class="white-bg">
<view class="form-con"> <view class="form-con" @click="handleBlur">
<uni-forms ref="formRef" :model="formData" :rules="rules" label-width="40%"> <uni-forms ref="formRef" :model="formData" :rules="rules" label-width="40%">
<!-- 选择客户 --> <!-- 选择客户 -->
<uni-forms-item label="客户名称" name="cusName" required class="f-c-right"> <uni-forms-item label="客户名称" name="cusName" required class="f-c-right">
@@ -178,7 +178,7 @@
<uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top"> <uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top">
<!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange--> <!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange-->
<uni-easyinput v-model="formData.hobby" placeholder="请输入爱好"/> <uni-easyinput v-model="formData.hobby" placeholder="请输入爱好"/>
<multipleSelect :multiple="true" :value="hobbyIndex" downInner :options="hobbyList" <multipleSelect ref="hobbySelectRef" :multiple="true" downInner :value="hobbyIds" :options="hobbyList"
@change="handleHobbyChange" :slabel="'name'" @change="handleHobbyChange" :slabel="'name'"
></multipleSelect><!--placeholder="请选择爱好标签"--> ></multipleSelect><!--placeholder="请选择爱好标签"-->
@@ -271,7 +271,7 @@
</template> </template>
<script setup> <script setup>
import {ref, onMounted, computed, reactive} from 'vue' import {ref, reactive} from 'vue'
import customHeader from '@/components/customHeader.vue' import customHeader from '@/components/customHeader.vue'
import multipleSelect from '@/components/multipleSelect.vue' import multipleSelect from '@/components/multipleSelect.vue'
import { import {
@@ -284,7 +284,8 @@ import {
} from "./dataMap"; } from "./dataMap";
import city from "@/utils/area"; import city from "@/utils/area";
import {getCustomerLevel, saveappCrmCusUserNew} from "@/api/crm/customer/getCustomer"; import {getCustomerLevel, saveappCrmCusUserNew} from "@/api/crm/customer/getCustomer";
// 对 multipleSelect 组件的引用
const hobbySelectRef = ref(null);
// 表单引用 // 表单引用
const formRef = ref({}); const formRef = ref({});
// 表单数据 // 表单数据
@@ -412,7 +413,7 @@ let handleCustomerClick = () => {
let { let {
cusName, // 公司名称 cusName, // 公司名称
cusEstate, // 等级 cusEstate, // 等级
cusId, cusId,
} = data; } = data;
customerUser.value.cusName = cusName; customerUser.value.cusName = cusName;
if (!cusEstate) customerUser.value.sysThinkLevel = "该客户暂无等级信息,无法进行系统推荐" if (!cusEstate) customerUser.value.sysThinkLevel = "该客户暂无等级信息,无法进行系统推荐"
@@ -448,20 +449,29 @@ let handleThinkLevelChange = (e) => {
// 系统推荐等级 // 系统推荐等级
let recommendLevel = ref(""); let recommendLevel = ref("");
let getRecommendLevel = async () => { let getRecommendLevel = async () => {
if (formData.value.cusEstate && formData.value.functionalRequirements) { if (formData.value.cusEstate) {
let {cusEstate, functionalRequirements} = formData.value; let {cusEstate, functionalRequirements} = formData.value;
let param = {cusEstate, functionalRequirements}; let param = {cusEstate, functionalRequirements};
if (formData.value.salesmanThinkLevel) { if (formData.value.salesmanThinkLevel) {
param.personnelLevel = formData.value.salesmanThinkLevel; param.personnelLevel = formData.value.salesmanThinkLevel;
} }
let res = await getCustomerLevel(param).catch(err => { let res = await getCustomerLevel(param)
/*.catch(err => {
console.error(err, "客户的系统推荐等级获取失败") console.error(err, "客户的系统推荐等级获取失败")
}) })*/
if (!res.systemRecommendationLevel) { try{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐" if(res.data.systemRecommendationLevel){
console.log(formData.value.systemThinkLevel + "???") formData.value.systemThinkLevel = res.data.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐";
}
}catch(e){
if (res.systemRecommendationLevel) {
formData.value.systemThinkLevel = res.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
}
} }
formData.value.systemThinkLevel = res.systemRecommendationLevel;
} else { } else {
recommendLevel.value = "无公司等级信息,无法推荐等级"; recommendLevel.value = "无公司等级信息,无法推荐等级";
} }
@@ -489,9 +499,9 @@ let handleUserTypeChange = (e) => {
} }
// 选择日期 // 选择日期
function handleTenureTimeChange(e) { function handleTenureTimeChange(val) {
let {value} = e.detail; console.log(val)
formData.value.tenureTime = value; formData.value.tenureTime = val;
} }
// 需求层次索引 // 需求层次索引
@@ -513,18 +523,20 @@ let handleDevelopChange = e => {
} }
// 选择生日 // 选择生日
function handleBirthdayChange(e) { function handleBirthdayChange(val) {
let{value} = e.detail formData.value.birthday = val;
formData.value.birthday = value;
} }
// 爱好标签索引 // 爱好标签索引
let hobbyIndex = reactive([]); let hobbyIds = ref([]);
let hobbies = ref([]);
// 选择爱好标签 // 选择爱好标签
const handleHobbyChange = (item, value) => { const handleHobbyChange = (items, ids) => {
// console.log("爱好", item, value); console.log('选择爱好', items, ids);
hobbyIndex = value; hobbyIds.value = [];
hobbies.value = items;
}; };
// 选择 // 选择
const handleNativeChange = (e) => { const handleNativeChange = (e) => {
formData.value.nativec = (e.detail.value.map(item => { formData.value.nativec = (e.detail.value.map(item => {
@@ -546,16 +558,93 @@ let handleWorkingStatusChange = e => {
workingStatusIndex.value = 0; workingStatusIndex.value = 0;
formData.value.workingStatus = workingStatusList[value].name; formData.value.workingStatus = workingStatusList[value].name;
} }
// 多选组件失去焦点关闭
let submitForm = async () => { let handleBlur = () => {
let hobbyTags = hobbyIndex.map(it => { if (hobbySelectRef.value) hobbySelectRef.value.handleBlur();
let {name} = hobbyList[it]; }
// 提取爱好标签处理逻辑
const processHobbyTags = () => {
let hobbyTags = hobbies.value.map(it => {
let {name} = it;
return name; return name;
}) })
const hobbyTagString = hobbyTags.join(''); const hobbyTagString = hobbyTags.join('');
console.log(hobbyTagString); console.log(hobbyTagString);
if (hobbyTagString || formData.value.hobby) { if (hobbyTagString || formData.value.hobby) {
formData.value.hobby = formData.value.hobby ? formData.value.hobby + '' + hobbyTagString : hobbyTagString; formData.value.hobby = hobbyTagString ? (formData.value.hobby ? formData.value.hobby + '' : '') + hobbyTagString : formData.value.hobby;
}
};
// 提取表单验证逻辑
const validateForm = async () => {
formData.value.cusName = customerUser.value.cusName;
await formRef.value.validate();
console.log(formData.value, "提交表单数据");
};
// 提取API调用逻辑
const saveCustomerUser = async () => {
uni.showLoading();
try {
const res = await saveappCrmCusUserNew(formData.value);
if(res.code === 200){
uni.showToast({
title: "保存成功"
});
} else {
uni.showToast({
title: "操作失败",
icon: "error"
});
}
setTimeout(() => uni.navigateBack(), 1500);
} catch(err) {
uni.showToast({
icon: 'none',
title: "保存失败"
});
}
finally{
uni.hideLoading()
}
};
// 简化后的 submitForm 方法
let submitForm = async () => {
console.log(formData.value);
try {
if(formData.value.iphone){
formData.value.mobilePhone = formData.value.iphone;
}
// 处理爱好标签
processHobbyTags();
// 表单验证
await validateForm();
// 保存客户人员信息
await saveCustomerUser();
} catch (err) {
uni.showToast({
icon: 'none',
title: '请检查并完善信息'
});
console.warn(err);
}
};
/*let submitForm = async () => {
let hobbyTags = hobbies.value.map(it => {
let {name} = it;
return name;
})
const hobbyTagString = hobbyTags.join('');
console.log(hobbyTagString);
if (hobbyTagString || formData.value.hobby) {
formData.value.hobby = hobbyTagString ? (formData.value.hobby ? formData.value.hobby + '' : '') + hobbyTagString : formData.value.hobby;
}
if(formData.value.iphone){
formData.value.mobilePhone = formData.value.iphone;
} }
// console.log(formData.value, "校验表单数据") // console.log(formData.value, "校验表单数据")
// console.log(recommendLevel); // console.log(recommendLevel);
@@ -565,19 +654,19 @@ let submitForm = async () => {
console.log(formData.value, "提交表单数据") console.log(formData.value, "提交表单数据")
// 请求保存 // 请求保存
uni.showLoading() uni.showLoading()
saveappCrmCusUserNew(formData.value).then(res=>{ saveappCrmCusUserNew(formData.value).then(res => {
uni.hideLoading(); uni.hideLoading();
if(res.code === 200){ if (res.code === 200) {
uni.showToast({ uni.showToast({
title: "保存成功" title: "保存成功"
}) })
}else{ } else {
uni.showToast({ uni.showToast({
title: "操作失败" title: "操作失败"
}) })
} }
setTimeout(()=>uni.navigateBack(), 1500); setTimeout(() => uni.navigateBack(), 1500);
}).catch(err=>{ }).catch(() => {
uni.showToast({ uni.showToast({
icon: 'none', icon: 'none',
title: "保存失败" title: "保存失败"
@@ -593,7 +682,7 @@ let submitForm = async () => {
}) })
console.warn(err); console.warn(err);
} }
} }*/
</script> </script>

View File

@@ -17,7 +17,7 @@
<view class="all-body"> <view class="all-body">
<!-- 搜索 @blur="blur" @focus="focus" @input="input" @cancel="cancel" @clear="clear"--> <!-- 搜索 @blur="blur" @focus="focus" @input="input" @cancel="cancel" @clear="clear"-->
<view class="search"> <view class="search">
<uni-search-bar class="custom-search" radius="28" placeholder="请输入客户名称" clearButton="auto" <uni-search-bar class="custom-search" radius="28" placeholder="请输入客户人员名称" clearButton="auto"
cancelButton="none" bgColor="#6FA2F8" textColor="#ffffff" cancelButton="none" bgColor="#6FA2F8" textColor="#ffffff"
@clear="clearSearchValue" @clear="clearSearchValue"
v-model="searchValue" v-model="searchValue"
@@ -133,8 +133,8 @@ const upOption = ref({
page: {num: 0, size: 10}, page: {num: 0, size: 10},
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {
tip: '~ 空空如也 ~', tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png" icon: "../../static/images/mescroll-empty.png"
}, },
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'

View File

@@ -168,8 +168,8 @@
<uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top"> <uni-forms-item label="爱好" name="hobby" class="uni-forms-item is-direction-top is-top">
<!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange--> <!-- 索引hobbyIndex 范围hobbyList 响应handleHobbyChange-->
<uni-easyinput v-model="formData.hobby" placeholder="请输入爱好" :disabled="!editable"/> <uni-easyinput v-model="formData.hobby" placeholder="请输入爱好" :disabled="!editable"/>
<multipleSelect :multiple="true" :value="hobbyIndex" downInner :options="hobbyList" <multipleSelect ref="hobbySelectRef" :multiple="true" downInner :value="hobbyIds" :options="hobbyList"
@change="handleHobbyChange" :slabel="'name'" @change="handleHobbyChange" :slabel="'name'"
></multipleSelect><!--placeholder="请选择爱好标签"--> ></multipleSelect><!--placeholder="请选择爱好标签"-->
</uni-forms-item> </uni-forms-item>
@@ -439,20 +439,29 @@ let handleThinkLevelChange = (e) => {
// 系统推荐等级 // 系统推荐等级
let recommendLevel = ref(""); let recommendLevel = ref("");
let getRecommendLevel = async () => { let getRecommendLevel = async () => {
if (formData.value.cusEstate && formData.value.functionalRequirements) { if (formData.value.cusEstate) {
let {cusEstate, functionalRequirements} = formData.value; let {cusEstate, functionalRequirements} = formData.value;
let param = {cusEstate, functionalRequirements}; let param = {cusEstate, functionalRequirements};
if (formData.value.salesmanThinkLevel) { if (formData.value.salesmanThinkLevel) {
param.personnelLevel = formData.value.salesmanThinkLevel; param.personnelLevel = formData.value.salesmanThinkLevel;
} }
let res = await getCustomerLevel(param).catch(err => { let res = await getCustomerLevel(param)
/*.catch(err => {
console.error(err, "客户的系统推荐等级获取失败") console.error(err, "客户的系统推荐等级获取失败")
}) })*/
if (!res.systemRecommendationLevel) { try{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐" if(res.data.systemRecommendationLevel){
console.log(formData.value.systemThinkLevel + "???") formData.value.systemThinkLevel = res.data.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐";
}
}catch(e){
if (res.systemRecommendationLevel) {
formData.value.systemThinkLevel = res.systemRecommendationLevel;
}else{
recommendLevel.value = "客户无等级信息,暂无法进行等级推荐"
}
} }
formData.value.systemThinkLevel = res.systemRecommendationLevel;
} else { } else {
recommendLevel.value = "无公司等级信息,无法推荐等级"; recommendLevel.value = "无公司等级信息,无法推荐等级";
} }
@@ -481,8 +490,7 @@ let handleUserTypeChange = (e) => {
// 选择日期 // 选择日期
function handleTenureTimeChange(e) { function handleTenureTimeChange(e) {
let {value} = e.detail; formData.value.tenureTime = e;
formData.value.tenureTime = value;
} }
// 需求层次索引 // 需求层次索引
@@ -505,17 +513,19 @@ let handleDevelopChange = e => {
// 选择生日 // 选择生日
function handleBirthdayChange(e) { function handleBirthdayChange(e) {
let{value} = e.detail formData.value.birthday = e;
formData.value.birthday = value;
} }
// 爱好标签索引 // 爱好标签索引
let hobbyIndex = reactive([]); let hobbyIds = ref([]);
let hobbies = ref([]);
// 选择爱好标签 // 选择爱好标签
const handleHobbyChange = (item, value) => { const handleHobbyChange = (items, ids) => {
// console.log("爱好", item, value); console.log('选择爱好', items, ids);
hobbyIndex = value; hobbyIds.value = [];
hobbies.value = items;
}; };
// 选择 // 选择
const handleNativeChange = (e) => { const handleNativeChange = (e) => {
formData.value.nativec = (e.detail.value.map(item => { formData.value.nativec = (e.detail.value.map(item => {
@@ -539,16 +549,18 @@ let handleWorkingStatusChange = e => {
} }
let submitForm = async () => { let submitForm = async () => {
let hobbyTags = hobbyIndex.map(it => { let hobbyTags = hobbies.value.map(it => {
let {name} = hobbyList[it]; let {name} = it;
return name; return name;
}) })
formData.value.iphone = formData.value.mobilePhone; // 特殊处理
const hobbyTagString = hobbyTags.join(''); const hobbyTagString = hobbyTags.join('');
console.log(hobbyTagString); console.log(hobbyTagString);
if (hobbyTagString || formData.value.hobby) { if (hobbyTagString || formData.value.hobby) {
formData.value.hobby = formData.value.hobby ? formData.value.hobby + '' + hobbyTagString : hobbyTagString; formData.value.hobby = hobbyTagString ? (formData.value.hobby ? formData.value.hobby + '' : '') + hobbyTagString : formData.value.hobby;
} }
formData.value.iphone = formData.value.mobilePhone; // 特殊处理
// console.log(formData.value, "校验表单数据") // console.log(formData.value, "校验表单数据")
// console.log(recommendLevel); // console.log(recommendLevel);
formData.value.cusName = customerUser.value.cusName; formData.value.cusName = customerUser.value.cusName;

View File

@@ -11,18 +11,18 @@
</customHeader> </customHeader>
<!-- 高度来避免头部遮挡 --> <!-- 高度来避免头部遮挡 -->
<view class="top-height" :style="{ paddingTop: navBarPaddingTop + 'px' }"></view> <view class="top-height"></view>
<!-- 正文内容 --> <!-- 正文内容 -->
<view class="all-body"> <view class="all-body">
<!-- 搜索--> <!-- 搜索-->
<!-- <view class="search">--> <!-- <view class="search">-->
<!-- <uni-search-bar class="custom-search" radius="28" placeholder="请输入客户人员名称" clearButton="auto"--> <!-- <uni-search-bar class="custom-search" radius="28" placeholder="请输入客户人员名称" clearButton="auto"-->
<!-- cancelButton="none" bgColor="#6FA2F8" textColor="#ffffff"--> <!-- cancelButton="none" bgColor="#6FA2F8" textColor="#ffffff"-->
<!-- v-model="searchValue"--> <!-- v-model="searchValue"-->
<!-- />--> <!-- />-->
<!-- <button type="default" @click="clearSearchValue" size="mini" class="btn-search">清空</button>--> <!-- <button type="default" @click="clearSearchValue" size="mini" class="btn-search">清空</button>-->
<!-- </view>--> <!-- </view>-->
<!-- 分页部分 --> <!-- 分页部分 -->
<mescroll-uni ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback" <mescroll-uni ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"
@@ -122,10 +122,7 @@ let list = ref([]);
const upOption = ref({ const upOption = ref({
page: {num: 0, size: 10}, page: {num: 0, size: 10},
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {tip: '~ 空空如也 ~'},
tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png"
},
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'
}); });

View File

@@ -135,7 +135,7 @@ function getCrmCusUserNewChangeOwnerList() {
<style scoped> <style scoped>
.con-bg{ .con-bg{
background: white; background: white;
min-height: 100vh; /* min-height: 100vh; */
} }
.white-bg { .white-bg {

View File

@@ -65,7 +65,7 @@ import { ref, reactive, onMounted } from 'vue'
import MescrollUni from 'mescroll-uni/mescroll-uni.vue'; import MescrollUni from 'mescroll-uni/mescroll-uni.vue';
import { getNavBarPaddingTop } from '@/utils/system.js' import { getNavBarPaddingTop } from '@/utils/system.js'
import { onShow } from '@dcloudio/uni-app'; import { onShow } from '@dcloudio/uni-app';
import { getApprovalList, getUserInfo } from '../../../../api/crm/activity/activity'; import { getApprovalList } from '../../../../api/crm/activity/activity';
let list = ref([]) let list = ref([])
@@ -82,7 +82,7 @@ const upOption = ref({
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {
tip: '~ 空空如也 ~', tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png" icon: "../../../../static/images/mescroll-empty.png"
}, },
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'
@@ -110,24 +110,24 @@ function upCallback(page) {
getVisistList(page); getVisistList(page);
} }
onShow(() => { // onShow(() => {
getUserInfoMethod(); // getUserInfoMethod();
}) // })
let nickName = ref(); let nickName = ref();
let deptName = ref(); let deptName = ref();
let userId = ref(); let userId = ref();
let posts = ref(); let posts = ref();
//获取用户信息 // //获取用户信息
function getUserInfoMethod() { // function getUserInfoMethod() {
getUserInfo().then(res => { // getUserInfo().then(res => {
nickName.value = res.user.nickName; // nickName.value = res.user.nickName;
deptName.value = res.user.dept.deptName; // deptName.value = res.user.dept.deptName;
userId.value = res.user.userId; // userId.value = res.user.userId;
posts.value = res.post; // posts.value = res.post;
}) // })
} // }
//查询待审批的列表信息 //查询待审批的列表信息
let dataList = ref([]) let dataList = ref([])

View File

@@ -82,7 +82,7 @@ const upOption = ref({
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {
tip: '~ 空空如也 ~', tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png" icon: "../../../../static/images/mescroll-empty.png"
}, },
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'

View File

@@ -79,7 +79,6 @@ import customHeader from '@/components/customHeader.vue'
import MescrollUni from 'mescroll-uni/mescroll-uni.vue'; import MescrollUni from 'mescroll-uni/mescroll-uni.vue';
import { getNavBarPaddingTop } from '@/utils/system.js' import { getNavBarPaddingTop } from '@/utils/system.js'
import { getYsVisistList, removeVisist, updateStatus } from '../../../../api/crm/activity/activity'; import { getYsVisistList, removeVisist, updateStatus } from '../../../../api/crm/activity/activity';
import {onHide, onShow} from "@dcloudio/uni-app";
// 获取导航栏高度用于内容区域padding // 获取导航栏高度用于内容区域padding
const navBarPaddingTop = ref(0); const navBarPaddingTop = ref(0);
@@ -87,10 +86,6 @@ onMounted(() => {
navBarPaddingTop.value = getNavBarPaddingTop() * 2; navBarPaddingTop.value = getNavBarPaddingTop() * 2;
}) })
onShow(()=>{
getList()
})
// 查询列表 // 查询列表
let list = ref([]); let list = ref([]);
@@ -147,7 +142,7 @@ const upOption = ref({
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {
tip: '~ 空空如也 ~', tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png" icon: "../../../../static/images/mescroll-empty.png"
}, },
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'
@@ -215,13 +210,6 @@ const getVisitorReportList = (pageNum, pageSize) => {
}); });
} }
//页面数据方法
function getList(){
getYsVisistList({pageNum: 1, pageSize: 10}).then(res=>{
list.value=res.rows;
})
}
let Loop = ref(0) let Loop = ref(0)
let now let now
@@ -264,7 +252,7 @@ function touchstart(item) {
}); });
} }
// 刷新内容 // 刷新内容
downCallback(mescrollRef.value.mescroll); upCallback()
}); });
} }
} }
@@ -273,10 +261,6 @@ function touchstart(item) {
} }
onHide(()=>{
clearInterval(Loop.value); //再次清空定时器,防止重复注册定时器
})
function touchend() { function touchend() {
let endDate = new Date(); let endDate = new Date();
console.log('结束时间', endDate) console.log('结束时间', endDate)

View File

@@ -1,348 +1,226 @@
<template> <template>
<view class="con-body"> <view class="con-body">
<view class="con-bg"> <view class="con-bg">
<!-- 头部 --> <!-- 头部 -->
<customHeader <customHeader ref="customHeaderRef" :title="'走访查看'" :leftFlag="true" :rightFlag="false"></customHeader>
ref="customHeaderRef" <!-- 高度来避免头部遮挡 -->
:title="!searchShow?'走访查看':'走访搜索'" <view class="top-height" :style="{ paddingTop: navBarPaddingTop + 'px' }"></view>
:leftFlag="true"
:rightFlag="false"
@back="handleBack" :searchType="searchShow?1:undefined"
></customHeader>
<!-- 高度来避免头部遮挡 -->
<view class="top-height" :style="{ paddingTop: navBarPaddingTop + 'px' }"></view>
<!-- 正文内容 --> <!-- 正文内容 -->
<view class="all-body"> <view class="all-body">
<!-- 搜索处理 --> <!-- 搜索 @blur="blur" @focus="focus" @input="input" @cancel="cancel" @clear="clear"-->
<customSearch v-if="searchShow" :searchKeywords="searchText" :searchType="searchTypeObj" <view class="search">
:checkTypeObj="notictTypeCheck" :searchTypeList="noticeTypeList" @confirm="handleSearchConfirm"> <uni-search-bar class="custom-search" radius="28" placeholder="请输入客户名称" clearButton="auto"
</customSearch> cancelButton="none" bgColor="#6FA2F8" textColor="#ffffff" v-model="searchValue" />
<view class="search" v-else @click="handleSearchFocus"> <button type="default" @click="handleSearch" size="mini" class="btn-search">查询</button>
<view class="search-bg"> </view>
<view class="search-left">{{ notictTypeCheck.name ? notictTypeCheck.name : '全部' }}</view>
<view class="search-right">
<input class="uni-input" v-model="inputval" placeholder="请输入您想查询的内容"
placeholder-class="search-color"/>
</view>
</view>
</view>
<!-- 分页部分 --> <!-- 分页部分 -->
<mescroll-uni ref="mescrollRef" v-if="!searchShow" @init="mescrollInit" @down="downCallback" @up="upCallback" <mescroll-uni ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"
:up="upOption" :down="downOption" :fixed="false" textColor="#ffffff" bgColor="#ffffff" :up="upOption" :down="downOption" :fixed="false" textColor="#ffffff" bgColor="#ffffff"
class="scroll-h" :class="{ 'loading-scroll': cssFlag }"> class="scroll-h" :class="{ 'loading-scroll': cssFlag }">
<view class="white-bg margin-bottom20" v-for="(item, index) in list" :key="index" <view class="white-bg margin-bottom20" v-for="(item, index) in list" :key="index"
@click="showDetail(item)"> @click="showDetail(item)">
<view> <view>
<view class="report-list"> <view class="report-list">
<view class="title">客户{{ item.cusName }}</view> <view class="title">客户{{ item.cusName }}</view>
<view class="r-list"> <view class="r-list">
<view class="r-name">{{ item.visistCode }}</view> <view class="r-name">{{ item.visistCode }}</view>
<view> <view>
<view <view
:class="item.myselfBrowsing == 0 ? 'r-right btn-orange' : 'r-right btn-blue'" :class="item.myselfBrowsing == 0 ? 'r-right btn-orange' : 'r-right btn-blue'"
size="mini"> size="mini">
{{ item.myselfBrowsing == 0 ? '未读' : '已读' }} {{ item.myselfBrowsing == 0 ? '未读' : '已读' }}
</view>
</view>
</view>
<view class="border-bottom"></view>
<view class="r-list">
<view class="r-left">报告类型</view>
<view class="r-right">{{ item.visistType === "业务招待" ? "Ⅱ类活动" : "走访报告" }}</view>
</view>
<view class="r-list" v-if="item.joinUser != null">
<view class="r-left">我方领导</view>
<view class="r-right">{{ item.joinUser }}</view>
</view>
<view class="border-bottom"></view>
<view class="r-list">
<view class="r-left">报告人</view>
<view class="r-right">{{ item.staffName }}</view>
</view>
<view class="border-bottom"></view>
<view class="r-list">
<view class="r-left">报告日期</view>
<view class="r-right">{{ item.visistDate }}</view>
</view>
</view>
</view>
</view> </view>
</view> </mescroll-uni>
</view>
<view class="border-bottom"></view>
<view class="r-list">
<view class="r-left">报告类型</view>
<view class="r-right">{{ item.visistType === "业务招待" ? "Ⅱ类活动" : "走访报告" }}</view>
</view>
<view class="r-list" v-if="item.joinUser != null">
<view class="r-left">我方领导</view>
<view class="r-right">{{ item.joinUser }}</view>
</view>
<view class="border-bottom"></view>
<view class="r-list">
<view class="r-left">报告人</view>
<view class="r-right">{{ item.staffName }}</view>
</view>
<view class="border-bottom"></view>
<view class="r-list">
<view class="r-left">报告日期</view>
<view class="r-right">{{ item.visistDate }}</view>
</view>
</view>
</view> </view>
</view> </view>
</mescroll-uni>
</view>
</view> </view>
</view>
</template> </template>
<script setup> <script setup>
import {ref, reactive, onMounted, watch} from 'vue'
import MescrollUni from 'mescroll-uni/mescroll-uni.vue';
import {getNavBarPaddingTop} from '@/utils/system.js'
import {getQueryVisistList} from '../../../../api/crm/activity/activity';
import {onHide, onShow} from "@dcloudio/uni-app";
import customHeader from '@/components/customHeader.vue' import customHeader from '@/components/customHeader.vue'
import customSearch from '@/components/customSearch.vue' import { ref, reactive, onMounted } from 'vue'
// 搜索处理 import MescrollUni from 'mescroll-uni/mescroll-uni.vue';
let searchShow = ref(false); import { getNavBarPaddingTop } from '@/utils/system.js'
let searchText = ref(undefined); import { getQueryVisistList } from '../../../../api/crm/activity/activity';
let notictTypeCheck = ref({}); //选中类型 import {onShow} from "@dcloudio/uni-app";
// 新增状态变量存储搜索条件
const selValue = ref(''); // 搜索类型名称
const inputval = ref(''); // 搜索内容
//点击查询方法,搜索当前报告信息
let searchValue = ref(null)
let noticeTypeList = ref([{
id: 1,
name: '客户全称'
},
{
id: 2,
name: '客户简称'
},
{
id: 3,
name: '业务员名称'
},
{
id: 4,
name: '活动单号'
},
{
id: 5,
name: '活动内容'
},
{
id: 6,
name: '模糊搜索'
},
{
id: 7,
name: '未读内容'
}
]);
// 搜索返回操作
const handleBack=()=>{
searchShow.value=false;
}
// 获取input 焦点跳转
const handleSearchFocus = () => {
searchShow.value = true;
}
let searchTypeObj = ref({
typeId: 3,
typeName: '消息类型'
});
// 搜索完返回处理
const handleSearchConfirm = (param1, param2) => {
notictTypeCheck.value = param1.value;
inputval.value = param2.value || '';
selValue.value = param1.value.name || '';
searchValue.value = param2.value;
console.log("selValue" + selValue.value)
console.log("inputval" + inputval.value)
// 重置mescroll触发刷新
if (mescrollRef.value) {
mescrollRef.value.resetUpScroll();
}
searchShow.value = false;
}
//监视查询的内容的变化 onShow(()=>{
// watch(searchValue, (newValue, oldValue) => { downCallback(mescrollRef.value.mescroll)
// //变化了之后,重新查询内容
// var data = {
// pageNum: 1,
// pageSize: 10,
// };
// getQueryVisistList(data).then(res => {
// if (res.code == 200) {
// //设置列表数据
// list.value = res.rows;
// }
// })
// })
onHide(()=>{
searchShow.value=false;
}) })
//====================
// onShow(() => {
// getList();
// })
let list = ref([]) let list = ref([])
let queryParams = reactive({ let queryParams = reactive({
selValue: '' selValue: ''
}) })
// 获取导航栏高度用于内容区域padding // 获取导航栏高度用于内容区域padding
const navBarPaddingTop = ref(0); const navBarPaddingTop = ref(0);
onMounted(() => { onMounted(() => {
navBarPaddingTop.value = getNavBarPaddingTop() * 2; navBarPaddingTop.value = getNavBarPaddingTop() * 2;
}) })
let cssFlag = ref(false);//控制样式 let cssFlag = ref(false);//控制样式
let mescrollRef = ref(null); let mescrollRef = ref(null);
const mescrollInit = (mescroll) => { const mescrollInit = (mescroll) => {
cssFlag.value = true; cssFlag.value = true;
mescrollRef.value = mescroll; mescrollRef.value = mescroll;
}; };
// 下拉刷新 // 下拉刷新
const downCallback = async (mescroll) => { const downCallback = async (mescroll) => {
try { try {
setTimeout(async () => { setTimeout(async () => {
queryParams.pageNum = 1; queryParams.pageNum = 1;
queryParams.pageSize = upOption.value.page.size; queryParams.pageSize = upOption.value.page.size;
//获取当前页的信息 //获取当前页的信息
const res = await getViewReportList(1, upOption.value.page.size) const res = await getQueryVisistList(queryParams)
cssFlag.value = false; cssFlag.value = false;
list.value = res.rows; list.value = res.rows;
}, 500); mescroll.resetUpScroll();
} catch (error) { }, 500);
mescroll.endErr(); } catch (error) {
} finally { mescroll.endErr();
setTimeout(async () => { } finally {
mescroll.endSuccess(); setTimeout(async () => {
}, 500); mescroll.endSuccess();
} }, 500);
}
} }
// 上拉加载更多 // 上拉加载更多
const upCallback = async (mescroll) => { const upCallback = async (mescroll) => {
try { try {
setTimeout(async () => { setTimeout(async () => {
const res = await getViewReportList(mescroll.num, mescroll.size, selValue.value, queryParams.pageNum = 1;
inputval.value); queryParams.pageSize = upOption.value.page.size;
if (mescroll.num === 1) { const res = await getQueryVisistList(queryParams);
list.value = res.list; if (mescroll.num === 1) {
} else { list.value = res.rows;
list.value.push(...res.list); } else {
} list.value.push(...res.rows);
mescroll.endBySize(list.value.length, res.total); }
}, 500); mescroll.endBySize(res.rows.length, res.total);
} catch (error) { }, 500);
mescroll.endErr(); } catch (error) {
} mescroll.endErr();
}
function getList() {
queryParams.pageNum = 1;
queryParams.pageSize = upOption.value.page.size;
getQueryVisistList(queryParams).then(res => {
list.value = res.rows;
})
}
// 获取数据列表
const getViewReportList = (pageNum, pageSize) => {
return new Promise(async (resolve) => {
let param = {
pageNum,
pageSize,
// 添加搜索条件参数
selValue: selValue.value,
inputval: inputval.value
} }
let res = await getQueryVisistList(param);
resolve({
list: res.rows,
total: res.total
});
});
} }
const upOption = ref({ const upOption = ref({
page: {num: 0, size: 10}, page: { num: 0, size: 10 },
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {
tip: '~ 空空如也 ~', tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png" icon: "../../../../static/images/mescroll-empty.png"
}, },
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'
}); });
const downOption = ref({ const downOption = ref({
auto: true, auto: true,
textInOffset: '下拉刷新', textInOffset: '下拉刷新',
textOutOffset: '释放更新', textOutOffset: '释放更新',
textLoading: '刷新中...' textLoading: '刷新中...'
}); });
//点击某一个进入查看明细信息 //点击某一个进入查看明细信息
function showDetail(item) { function showDetail(item) {
uni.navigateTo({ uni.navigateTo({
url: './visitReportDetail?visistId=' + item.visistId url: './visitReportDetail?visistId=' + item.visistId
}) })
} }
//点击查询方法,搜索当前报告信息
let searchValue = ref()
// function handleSearch() { function handleSearch() {
// queryParams.inputval = searchValue.value queryParams.inputval = searchValue.value
// downCallback(mescrollRef.value.mescroll); downCallback(mescrollRef.value.mescroll);
// } }
</script> </script>
<style scoped> <style scoped>
.all-body { .all-body {
/* #ifdef APP-PLUS */ /* #ifdef APP-PLUS */
top: 150rpx; top: 150rpx;
height: calc(100vh - 75px); height: calc(100vh - 75px);
/* #endif */ /* #endif */
/* #ifndef APP-PLUS */ /* #ifndef APP-PLUS */
top: 120rpx; top: 120rpx;
height: calc(100vh); height: calc(100vh);
/* #endif */ /* #endif */
} }
.search { .search {
display: flex; display: flex;
} }
.search .btn-search { .search .btn-search {
border: none; border: none;
background: none; background: none;
line-height: normal; line-height: normal;
color: #fff; color: #fff;
line-height: 56rpx !important; line-height: 56rpx !important;
padding: 10rpx 0 0; padding: 10rpx 0 0;
text-align: left; text-align: left;
cursor: pointer; cursor: pointer;
} }
.search .btn-search::after { .search .btn-search::after {
display: none; display: none;
} }
.search .custom-search { .search .custom-search {
width: 80%; width: 80%;
} }
.search .custom-search.uni-searchbar { .search .custom-search.uni-searchbar {
padding-right: 0 !important; padding-right: 0 !important;
} }
.scroll-h { .scroll-h {
/* #ifdef APP-PLUS */ /* #ifdef APP-PLUS */
height: calc(100vh - 120px); height: calc(100vh - 120px);
/* #endif */ /* #endif */
/* #ifndef APP-PLUS */ /* #ifndef APP-PLUS */
height: calc(100vh - 110px); height: calc(100vh - 110px);
/* #endif */ /* #endif */
} }
.white-bg { .white-bg {
padding-bottom: 10rpx; padding-bottom: 10rpx;
} }
</style> </style>

View File

@@ -143,7 +143,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -148,7 +148,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -340,7 +340,7 @@ const dynamicPlaceholder = computed(() => {
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -348,7 +348,7 @@ const dynamicPlaceholder = computed(() => {
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -244,7 +244,7 @@ const inputval = ref(''); // 搜索内容
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {
tip: '~ 空空如也 ~', tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png" icon: "../../../../static/images/mescroll-empty.png"
}, },
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'

View File

@@ -147,7 +147,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值
@@ -203,7 +203,7 @@
height: calc(120vh - 100px) height: calc(120vh - 100px)
/* #endif */ /* #endif */
/* #ifndef APP-PLUS */ /* #ifndef APP-PLUS */
height:calc(120vh - 80px) height:calc(140vh - 80px)
/* #endif */ /* #endif */
} }

View File

@@ -152,7 +152,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -172,7 +172,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -179,7 +179,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -31,7 +31,7 @@
<view class="report-list"> <view class="report-list">
<view class="title r-list"> <view class="title r-list">
<view class="r-left" style="font-size:38rpx;">{{ item.cusName }}</view> <view class="r-left" style="font-size:38rpx;">{{ item.cusName }}</view>
<view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.status==2}" <view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.state==='完成'}"
size="mini" @click.stop="itemView(item)">{{ item.state }}</view> size="mini" @click.stop="itemView(item)">{{ item.state }}</view>
</view> </view>
<view style="padding:0rpx 0 10rpx"> <view style="padding:0rpx 0 10rpx">
@@ -50,7 +50,7 @@
<view class="report-list"> <view class="report-list">
<view class="title r-list"> <view class="title r-list">
<view class="r-left" style="font-size:38rpx;">{{ item.cusName }}</view> <view class="r-left" style="font-size:38rpx;">{{ item.cusName }}</view>
<view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.status==2}" <view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.state==='完成'}"
size="mini" @click.stop="itemView(item)">{{ item.state }}</view> size="mini" @click.stop="itemView(item)">{{ item.state }}</view>
</view> </view>
<view style="padding:0rpx 0 10rpx"> <view style="padding:0rpx 0 10rpx">
@@ -69,7 +69,7 @@
<view class="report-list"> <view class="report-list">
<view class="title r-list"> <view class="title r-list">
<view class="r-left" style="font-size:38rpx;">{{ item.competitiveUnits }}</view> <view class="r-left" style="font-size:38rpx;">{{ item.competitiveUnits }}</view>
<view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.status==2}" <view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.state==='完成'}"
size="mini" @click.stop="itemView(item)">{{ item.state }}</view> size="mini" @click.stop="itemView(item)">{{ item.state }}</view>
</view> </view>
<view style="padding:0rpx 0 10rpx"> <view style="padding:0rpx 0 10rpx">
@@ -88,7 +88,7 @@
<view class="report-list"> <view class="report-list">
<view class="title r-list"> <view class="title r-list">
<view class="r-left" style="font-size:38rpx;">{{ item.cusName }}</view> <view class="r-left" style="font-size:38rpx;">{{ item.cusName }}</view>
<view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.status==2}" <view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.state==='完成'}"
size="mini" @click.stop="itemView(item)">{{ item.state }}</view> size="mini" @click.stop="itemView(item)">{{ item.state }}</view>
</view> </view>
<view style="padding:0rpx 0 10rpx"> <view style="padding:0rpx 0 10rpx">
@@ -109,7 +109,7 @@
<view class="report-list"> <view class="report-list">
<view class="title r-list"> <view class="title r-list">
<view class="r-left" style="font-size:38rpx;">{{ item.cusName }}</view> <view class="r-left" style="font-size:38rpx;">{{ item.cusName }}</view>
<view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.status==2}" <view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.state==='完成'}"
size="mini" @click.stop="itemView(item)">{{ item.state }}</view> size="mini" @click.stop="itemView(item)">{{ item.state }}</view>
</view> </view>
<view style="padding:0rpx 0 10rpx"> <view style="padding:0rpx 0 10rpx">
@@ -127,7 +127,7 @@
<view class="report-list"> <view class="report-list">
<view class="title r-list"> <view class="title r-list">
<view class="r-left" style="font-size:38rpx;">{{ item.cusName }}</view> <view class="r-left" style="font-size:38rpx;">{{ item.cusName }}</view>
<view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.status==2}" <view class="r-right btn-gray flex-auto" :class="{'btn-blue':item.state==='完成'}"
size="mini" @click.stop="itemView(item)">{{ item.state }}</view> size="mini" @click.stop="itemView(item)">{{ item.state }}</view>
</view> </view>
<view style="padding:0rpx 0 10rpx"> <view style="padding:0rpx 0 10rpx">
@@ -237,7 +237,7 @@
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {
tip: '~ 空空如也 ~', tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png" icon: "../../../../static/images/mescroll-empty.png"
}, },
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'
@@ -493,4 +493,8 @@
.report-list .title { .report-list .title {
display: flex; display: flex;
} }
.btn-blue {
background-color: #3384DF; /* 蓝色背景 */
color: #ffffff;
}
</style> </style>

View File

@@ -105,7 +105,7 @@ const upOption = ref({
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {
tip: '~ 空空如也 ~', tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png" icon: "../../../../static/images/mescroll-empty.png"
}, },
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'

View File

@@ -232,7 +232,8 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer(){ function chooseCustomer(){
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值
@@ -311,7 +312,7 @@
height: calc(120vh - 100px) height: calc(120vh - 100px)
/* #endif */ /* #endif */
/* #ifndef APP-PLUS */ /* #ifndef APP-PLUS */
height:calc(120vh - 80px) height:calc(140vh - 80px)
/* #endif */ /* #endif */
} }

View File

@@ -244,7 +244,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer(){ function chooseCustomer(){
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url:'/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -201,7 +201,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -202,7 +202,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -101,7 +101,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -110,7 +110,7 @@ const upOption = ref({
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {
tip: '~ 空空如也 ~', tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png" icon: "../../../../static/images/mescroll-empty.png"
}, },
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'

View File

@@ -105,7 +105,7 @@
// 选择客户页面跳转 // 选择客户页面跳转
function chooseCustomer() { function chooseCustomer() {
uni.navigateTo({ uni.navigateTo({
url: '/pages/business/CRM/chooseCus' url: '/pages/business/CRM/marketActivity/chooseCus'
}) })
} }
//定义数据接收的值 //定义数据接收的值

View File

@@ -8,7 +8,7 @@
<!-- #endif --> <!-- #endif -->
<!-- 高度来避免头部遮挡 --> <!-- 高度来避免头部遮挡 -->
<view class="top-height" :style="{ paddingTop: navBarPaddingTop + 'px' }"></view> <view class="top-height"></view>
<view class="white-bg"> <view class="white-bg">
<navigator url="/pages/business/CRM/plan/myPlan"> <navigator url="/pages/business/CRM/plan/myPlan">

View File

@@ -17,7 +17,7 @@
<view class="top-height"></view> <view class="top-height"></view>
<view class="week-plan-title"> <view class="week-plan-title">
<view>姓名<strong>{{ userInfo.nickName || userInfo.userName }}</strong></view> <view v-if="userInfo.nickName">姓名<strong>{{ userInfo.nickName || userInfo.userName }}</strong></view>
<view v-if="weekNum"> <view v-if="weekNum">
{{ yearMonth }} {{ yearMonth }}
<view v-if="isThisWeek" style=" display: inline-block;"> <view v-if="isThisWeek" style=" display: inline-block;">
@@ -28,9 +28,9 @@
</view> </view>
<view class="nav-list"> <view class="nav-list">
<view class="nav-item" :class="{active:index==activeTab}" <view class="nav-item" :class="{active:index==activeTab}"
v-for="(item,index) in allPlans" :key="index" v-for="(item,index) in allPlans" :key="index"
@click="handleNav(index)" @click="handleNav(index)"
>{{ getTapLabel(item) }} >{{ getTapLabel(item) }}
</view> </view>
</view> </view>
@@ -54,10 +54,11 @@
</view> </view>
</view> </view>
</view> </view>
<view class='bottom-spliter bg-gray'></view>
</block> </block>
<!-- 底部加高度来避免tabbar遮挡 --> <!-- 底部加高度来避免tabbar遮挡 -->
<view class="bottom-height"></view> <!-- <view class="bottom-height bg-gray"></view> -->
</view> </view>
@@ -106,12 +107,12 @@ let getWorkEvent = (index) => {
const refreshPlanList = () => { const refreshPlanList = () => {
message.showLoading(); message.showLoading();
// 获取用户信息 // 获取用户信息
getUserInfo().then(res => { // getUserInfo().then(res => {
userInfo.value = res.user; // userInfo.value = res.user;
console.log(route.path, ":用户信息获取成功"); // console.log(route.path, ":用户信息获取成功");
}).catch(err => { // }).catch(err => {
console.warn(err, "用户信息获取失败") // console.warn(err, "用户信息获取失败")
}); // });
// 获取周计划列表 // 获取周计划列表
getWeeklyPlanList(queryParams.value).then(res => { getWeeklyPlanList(queryParams.value).then(res => {
const {rows} = res; const {rows} = res;
@@ -180,11 +181,11 @@ function handleCreate() {
handlePlanEdit({itemList, selectIndex: result.tapIndex}, true); handlePlanEdit({itemList, selectIndex: result.tapIndex}, true);
}).catch((err) => { }).catch((err) => {
console.warn(err, "已存在周计划") console.warn(err, "已存在周计划")
uni.showToast({ // uni.showToast({
icon: 'error', // icon: 'error',
title: '已有本周或下周计划', // title: '已有本周或下周计划',
duration: 2000 // duration: 2000
}) // })
}) })
// }else{ // 创建下周计划 // }else{ // 创建下周计划
// } // }
@@ -234,7 +235,7 @@ function handleEdit(index) {
// console.log(JSON.stringify(formData)) // console.log(JSON.stringify(formData))
console.log(route.path, formData, "前往修改页面"); console.log(route.path, formData, "前往修改页面");
const editFields = [OrdinalDate[index], WorkType[index], WorkEvent[index]]; const editFields = [OrdinalDate[index], WorkType[index], WorkEvent[index]];
let userName = userInfo.value.nickName || userInfo.value.userName; let userName = null; // userInfo.value.userName || userInfo.value.nickName;
handlePlanEdit({userName, formData, editFields}, false); handlePlanEdit({userName, formData, editFields}, false);
} }
@@ -268,9 +269,14 @@ function handleEdit(index) {
} }
.white-bg.white-bg-2 { .white-bg.white-bg-2 {
margin-bottom: 20rpx; /* margin-bottom: 20rpx; */
}
.bottom-spliter{
height: 20rpx;
}
.bg-gray{
background-color: #f0f0f0;
} }
.report-list .w-b-title .btn-edit { .report-list .w-b-title .btn-edit {
background-color: #5C96F7; background-color: #5C96F7;
} }
@@ -280,14 +286,14 @@ function handleEdit(index) {
} }
.nav-list { .nav-list {
/* display: flex;*/ /* display: flex;*/
/* width: 690rpx;*/ /* width: 690rpx;*/
overflow-x: auto; /* 允许横向滚动 */ overflow-x: auto; /* 允许横向滚动 */
/*overflow-y: hidden; 隐藏垂直滚动 */ /*overflow-y: hidden; 隐藏垂直滚动 */
/*-ms-overflow-style: none; IE 隐藏滚动条 */ /*-ms-overflow-style: none; IE 隐藏滚动条 */
/* scrollbar-width: none; */ /*Firefox 隐藏滚动条 */ /* scrollbar-width: none; */ /*Firefox 隐藏滚动条 */
/* 添加高度以确保有足够的空间 */ /* 添加高度以确保有足够的空间 */
/* height: 80rpx;*/ /* height: 80rpx;*/
white-space: nowrap; /* 保持子元素在同一行显示 */ white-space: nowrap; /* 保持子元素在同一行显示 */
/* 添加这些属性确保滚动正常工作 */ /* 添加这些属性确保滚动正常工作 */
scroll-behavior: smooth; scroll-behavior: smooth;
@@ -304,7 +310,7 @@ function handleEdit(index) {
} }
.nav-list .nav-item { .nav-list .nav-item {
/* flex: 0 0 auto; 关键:不放大、不缩小、自动宽度 */ /* flex: 0 0 auto; 关键:不放大、不缩小、自动宽度 */
/* width: 200rpx;*/ /* width: 200rpx;*/
display: inline-block; display: inline-block;
background-color: #05A3F4; background-color: #05A3F4;
border-radius: 10rpx; border-radius: 10rpx;

View File

@@ -4,7 +4,7 @@
<!-- 头部 --> <!-- 头部 -->
<customHeader ref="customHeaderRef" :title="title" :leftFlag="true" :rightFlag="true"> <customHeader ref="customHeaderRef" :title="title" :leftFlag="true" :rightFlag="true">
<template #right> <template #right>
<view class="head-right" @click="submitForm" v-if="userInfo.nickName || userInfo.userName"> <view class="head-right" @click="submitForm">
<uni-icons custom-prefix="iconfont" type="icon-phonebaocun" size="22" <uni-icons custom-prefix="iconfont" type="icon-phonebaocun" size="22"
color="#B7D2FF"></uni-icons> color="#B7D2FF"></uni-icons>
保存 保存
@@ -16,7 +16,7 @@
<!-- 正文内容 --> <!-- 正文内容 -->
<view class="week-plan-title"> <view class="week-plan-title">
<view>姓名<strong>{{ userInfo.nickName || userInfo.userName }}</strong></view> <view v-if="userInfo.nickName">姓名<strong>{{ userInfo.nickName || userInfo.userName }}</strong></view>
<view>{{ currentEditDate.yearMonth }} <strong>{{ currentEditDate.weekNum }}</strong> </view> <view>{{ currentEditDate.yearMonth }} <strong>{{ currentEditDate.weekNum }}</strong> </view>
</view> </view>
<uni-forms ref="formRef" :model="weekPlanFormData" :rules="rules" label-width="100px" label-position="top"> <uni-forms ref="formRef" :model="weekPlanFormData" :rules="rules" label-width="100px" label-position="top">

View File

@@ -11,8 +11,7 @@
</customHeader> </customHeader>
<!-- 高度来避免头部遮挡 --> <!-- 高度来避免头部遮挡 -->
<view class="top-height" :style="{ paddingTop: navBarPaddingTop + 'px' }"></view> <view class="top-height"></view>
<!-- 正文内容 --> <!-- 正文内容 -->
<view> <view>
@@ -37,61 +36,61 @@
</view> </view>
<!-- 分页部分 --> <!-- 分页部分 -->
<!-- <mescroll-uni ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"--> <!-- <mescroll-uni ref="mescrollRef" @init="mescrollInit" @down="downCallback" @up="upCallback"-->
<!-- :up="upOption" :down="downOption" :fixed="false" textColor="#ffffff" bgColor="#ffffff"--> <!-- :up="upOption" :down="downOption" :fixed="false" textColor="#ffffff" bgColor="#ffffff"-->
<!-- class="scroll-h" :class="{'loading-scroll':cssFlag}">--> <!-- class="scroll-h" :class="{'loading-scroll':cssFlag}">-->
<view class="white-bg" v-if="list.length"> <view class="white-bg" v-if="list.length">
<!--v-for="(item, index) in list" :key="index" @click="handleDetail(item)"--> <!--v-for="(item, index) in list" :key="index" @click="handleDetail(item)"-->
<view style="text-align: center; margin-bottom: 30rpx; font-size: 30rpx;"> <view style="text-align: center; margin-bottom: 30rpx; font-size: 30rpx;">
{{ parseInt(searchValue.selectDate.substring(5, 7)) }} {{ parseInt(searchValue.selectDate.substring(5, 7)) }}
<span class="line"></span> <span class="line"></span>
{{searchValue.selectDate.substring(0, 4) }} {{searchValue.selectDate.substring(0, 4) }}
</view> </view>
<uni-row class="demo-uni-row">
<uni-col :span="1">
<view class="demo-uni-col right-radius">序号</view>
</uni-col>
<uni-col :span="2">
<view class="demo-uni-col left-radius">姓名</view>
</uni-col>
<block v-for="(field, i) in OrdinalDate">
<uni-col :span="3">
<view class="demo-uni-col mar-left">
<text>{{ WeekShortCN[i] }}</text>
<text v-if="list[0][field]">{{ list[0][field].substring(8) }}</text>
</view>
</uni-col>
</block>
</uni-row>
<block v-for="(item, index) in list" :key="index">
<uni-row class="demo-uni-row"> <uni-row class="demo-uni-row">
<uni-col :span="1"> <uni-col :span="1">
<view class="demo-uni-col right-radius">序号</view> <view class="demo-uni-col right-radius">
<text>{{ index + 1 }}</text>
</view>
</uni-col> </uni-col>
<uni-col :span="2"> <uni-col :span="2">
<view class="demo-uni-col left-radius">姓名</view> <view class="demo-uni-col left-radius">
<text>{{ item.nickName || item.userName }}</text>
</view>
</uni-col> </uni-col>
<block v-for="(field, i) in OrdinalDate"> <block v-for="(field, i) in WorkType">
<uni-col :span="3"> <uni-col :span="3">
<view class="demo-uni-col mar-left"> <view class="demo-uni-col mar-left color-white" @click="handleDetail(index, i)"
<text>{{ WeekShortCN[i] }}</text> :style="{ backgroundColor: COLOR_MAP[item[field]] }"
<text v-if="list[0][field]">{{ list[0][field].substring(8) }}</text> ><!--@click="handleView(index, i)"-->
<text v-if="item[field]">{{ item[field] }}</text>
<text v-else style="color: gray">暂无</text>
</view> </view>
</uni-col> </uni-col>
</block> </block>
</uni-row> </uni-row>
<block v-for="(item, index) in list" :key="index"> </block>
<uni-row class="demo-uni-row"> </view>
<uni-col :span="1"> <view v-else style="text-align: center; margin-top: 50%; color: white">
<view class="demo-uni-col right-radius"> 暂无数据
<text>{{ index + 1 }}</text> </view>
</view> <!-- </mescroll-uni>-->
</uni-col>
<uni-col :span="2">
<view class="demo-uni-col left-radius">
<text>{{ item.nickName || item.userName }}</text>
</view>
</uni-col>
<block v-for="(field, i) in WorkType">
<uni-col :span="3">
<view class="demo-uni-col mar-left color-white" @click="handleDetail(index, i)"
:style="{ backgroundColor: COLOR_MAP[item[field]] }"
><!--@click="handleView(index, i)"-->
<text v-if="item[field]">{{ item[field] }}</text>
<text v-else style="color: gray">暂无</text>
</view>
</uni-col>
</block>
</uni-row>
</block>
</view>
<view v-else style="text-align: center; margin-top: 50%; color: white">
暂无数据
</view>
<!-- </mescroll-uni>-->
</view> </view>
</view> </view>
</view> </view>
@@ -144,10 +143,7 @@ const mescrollRef = ref(null);
const upOption = ref({ const upOption = ref({
page: {num: 0, size: 10}, page: {num: 0, size: 10},
noMoreSize: 5, noMoreSize: 5,
empty: { empty: {tip: '~ 空空如也 ~'},
tip: '~ 空空如也 ~',
icon: "../../static/images/mescroll-empty.png"
},
textLoading: '加载中...', textLoading: '加载中...',
textNoMore: '已经到底了' textNoMore: '已经到底了'
}); });

View File

@@ -157,6 +157,7 @@ const handleSubmit= async()=>{
await bizFavoriteSetting({bizIds:bizIds.value.join(",")}); await bizFavoriteSetting({bizIds:bizIds.value.join(",")});
showAlert("操作成功") showAlert("操作成功")
hideLoading(); hideLoading();
uni.navigateBack();
} catch (error) { } catch (error) {
hideLoading(); hideLoading();
} }

View File

@@ -142,7 +142,7 @@
<script setup> <script setup>
import { ref,onMounted } from 'vue'; import { ref,onMounted } from 'vue';
import { onLoad } from '@dcloudio/uni-app'; import { onLoad,onShow } from '@dcloudio/uni-app';
import customHeader from '@/components/customHeader.vue' import customHeader from '@/components/customHeader.vue'
import MescrollUni from 'mescroll-uni/mescroll-uni.vue'; import MescrollUni from 'mescroll-uni/mescroll-uni.vue';
import customSteps from '@/components/customSteps.vue' import customSteps from '@/components/customSteps.vue'
@@ -185,6 +185,9 @@ onLoad(async(opt) => {
uni.setStorageSync('page_cache',true); uni.setStorageSync('page_cache',true);
// initLoad(); // initLoad();
}) })
onShow(()=>{
initLoad();
})
// 初始化调用方法 // 初始化调用方法
const initLoad =()=>{ const initLoad =()=>{
@@ -517,7 +520,7 @@ const formatDateStr =(times)=>{
margin-top:10rpx; margin-top:10rpx;
} }
.white-bg .logo-list{ /* .white-bg .logo-list{
margin-left:-25rpx; margin-left:-25rpx;
margin-right:-25rpx; margin-right:-25rpx;
padding:0 20rpx; padding:0 20rpx;
@@ -535,5 +538,5 @@ const formatDateStr =(times)=>{
.white-bg .logo-list .l-l-item img{ .white-bg .logo-list .l-l-item img{
width:110rpx; width:110rpx;
height:110rpx; height:110rpx;
} } */
</style> </style>

View File

@@ -134,6 +134,7 @@ const selectDeviceId = async()=>{
// 查询本地缓存的设备状态是否绑定过 // 查询本地缓存的设备状态是否绑定过
// let deviceId = uni.getStorageSync('app_device_id');// 本地设备ID // let deviceId = uni.getStorageSync('app_device_id');// 本地设备ID
try { try {
// showAlert("safeSave=>"+safeSave)
safeSave.getSafeFile({ "key": "app_device_id" }, res2 => { safeSave.getSafeFile({ "key": "app_device_id" }, res2 => {
// showAlert(JSON.stringify(res2)); // showAlert(JSON.stringify(res2));
if (res2.code == 1) { if (res2.code == 1) {
@@ -177,7 +178,7 @@ const selectDeviceId = async()=>{
}) })
} catch (error) { } catch (error) {
console.log("getSafeFile=>",error) console.log("getSafeFile=>",error)
showAlert(error) // showAlert("getSafeFile=>"+error)
} }
} }
// 下载最新版本 // 下载最新版本

View File

@@ -264,10 +264,9 @@ const submitForm = () => {
// #ifdef H5 // #ifdef H5
//h5测试用 内网-sn123456 //h5测试用 内网-sn123456
//公司外网 '9516053c-b441-465b-9781-06e7b8031811' //公司外网 'f3fca83f-bf56-47f4-a98b-a602ed8bddee'
//友晟外网 'b97527c8-2ad4-493c-a01c-5f9d0aabaff2' //友晟外网 'b97527c8-2ad4-493c-a01c-5f9d0aabaff2'
//8f9bbe3b-7f1d-4e7f-9734-6faa6b86350f param.uniqCode = 'f3fca83f-bf56-47f4-a98b-a602ed8bddee';
param.uniqCode = 'b97527c8-2ad4-493c-a01c-5f9d0aabaff2';
let res = await login(param); let res = await login(param);
userStore.login(res); userStore.login(res);
uni.switchTab({ url: '/pages/home/home' }) uni.switchTab({ url: '/pages/home/home' })
@@ -279,16 +278,27 @@ const submitForm = () => {
// 读取设备ID // 读取设备ID
safeSave.getSafeFile({ "key": "app_device_id" }, res3 => { safeSave.getSafeFile({ "key": "app_device_id" }, res3 => {
if (res3.code == 1) { if (res3.code == 1) {
let deviceId = res3.data; let deviceId = res3.data;
// showAlert("读取成功=>"+deviceId); // showAlert("读取成功=>"+deviceId);
param.uniqCode = deviceId; param.uniqCode = deviceId;
console.log("param=>",param) uni.getPushClientId({
login(param).then(res=>{ success: (res) => {
userStore.login(res); let push_clientid = res.cid
uni.switchTab({ url: '/pages/home/home' }) console.log('客户端推送标识:', push_clientid);
btnLoading.value = false; console.log("param=>",param)
}).finally(()=>{ param.cid = push_clientid
btnLoading.value = false; // showAlert("客户端推送标识=>"+push_clientid);
login(param).then(res=>{
userStore.login(res);
uni.switchTab({ url: '/pages/home/home' })
btnLoading.value = false;
}).finally(()=>{
btnLoading.value = false;
})
},
fail(err) {
console.log(err)
}
}) })
} else { } else {

View File

@@ -214,7 +214,8 @@ const getNoticeList = (pageIndex, pageSize) => {
// 跳转webview // 跳转webview
const handleJump = (item)=>{ const handleJump = (item)=>{
uni.navigateTo({ uni.navigateTo({
url: '/pages/h5-webview/h5-webview?url=' + item.mobileLink+"&title="+item.subject // url: '/pages/h5-webview/h5-webview?url=' + item.mobileLink+"&title="+item.subject
url:'/pages/notice/noticeDetail?title='+item.subject+'&time='+item.createTime+'&appName='+item.appName
}); });
} }
</script> </script>

View File

@@ -0,0 +1,84 @@
<template>
<view class="con-body">
<view class="con-bg">
<!-- 头部 -->
<customHeader ref="customHeaderRef" :title="'消息通知'" :leftFlag="true" :rightFlag="false"></customHeader>
<!-- 高度来避免头部遮挡 -->
<view class="top-height"></view>
<!-- 正文内容 -->
<view class="white-bg">
<view class="n-title">{{ title }}</view>
<view class="n-time">
<text>来自{{appName}}</text> {{ time }}
</view>
<view class="btn-blue" @click="handleJump">跳转详情页</view>
</view>
<!-- 底部加高度来避免tabbar遮挡 -->
<view class="bottom-height"></view>
</view>
</view>
</template>
<script setup>
import { ref, onMounted } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import customHeader from '@/components/customHeader.vue'
import {showToast} from '@/utils/message.js'
// 加载后调用
let title = ref(null);
let time = ref(null);
let appName = ref(null);
onLoad((options) => {
console.log(options)
title.value = options.title;
time.value = options.time;
appName.value = options.appName
})
// 跳转webview
const handleJump = ()=>{
showToast('暂不支持跳转');
}
</script>
<style scoped>
.white-bg {
width: 650rpx;
padding:30rpx 50rpx;
height:100vh;
margin: 0;
border-radius: 8px 8px 0 0;
}
.white-bg .n-title{
font-size:40rpx;
font-weight: bold;
padding:20rpx 0 25rpx;
text-align: center;
border-bottom: 1px solid #BFBFBF;
}
.white-bg .n-time{
text-align: center;
color:#919191;
font-size:26rpx;
padding:20rpx;
}
.white-bg .n-time text{
margin-right:50rpx;
}
.btn-blue {
background-color: #05A3F4;
color: #fff;
width:380rpx;
height:80rpx;
line-height: 80rpx;
margin:300rpx auto 0;
text-align: center;
border-radius: 40rpx;
}
</style>

View File

@@ -59,6 +59,7 @@ import customHeader from '@/components/customHeader.vue'
import { getNavBarPaddingTop } from '@/utils/system.js' import { getNavBarPaddingTop } from '@/utils/system.js'
import {formatLevel} from '@/utils/status.js' import {formatLevel} from '@/utils/status.js'
import { parseTime } from '@/utils/datetime.js' import { parseTime } from '@/utils/datetime.js'
import {showToast} from '@/utils/message.js'
let detail = ref({}) let detail = ref({})
@@ -80,10 +81,11 @@ onMounted(() => {
// 跳转webview // 跳转webview
const handleJump = ()=>{ const handleJump = ()=>{
let item = detail.value; showToast('暂不支持跳转');
uni.navigateTo({ // let item = detail.value;
url: `/pages/h5-webview/h5-webview?url=${item.mobileLink}&title=${item.subject}` // uni.navigateTo({
}); // url: `/pages/h5-webview/h5-webview?url=${item.mobileLink}&title=${item.subject}`
// });
} }
</script> </script>

View File

@@ -0,0 +1,6 @@
## 0.0.32022-11-11
- 修复 config 方法获取根节点为数组格式配置时错误的转化为了对象的Bug
## 0.0.22021-04-16
- 修改插件package信息
## 0.0.12021-03-15
- 初始化项目

View File

@@ -0,0 +1,81 @@
{
"id": "uni-config-center",
"displayName": "uni-config-center",
"version": "0.0.3",
"description": "uniCloud 配置中心",
"keywords": [
"配置",
"配置中心"
],
"repository": "",
"engines": {
"HBuilderX": "^3.1.0"
},
"dcloudext": {
"sale": {
"regular": {
"price": "0.00"
},
"sourcecode": {
"price": "0.00"
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "",
"type": "unicloud-template-function"
},
"directories": {
"example": "../../../scripts/dist"
},
"uni_modules": {
"dependencies": [],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y"
},
"client": {
"App": {
"app-vue": "u",
"app-nvue": "u"
},
"H5-mobile": {
"Safari": "u",
"Android Browser": "u",
"微信浏览器(Android)": "u",
"QQ浏览器(Android)": "u"
},
"H5-pc": {
"Chrome": "u",
"IE": "u",
"Edge": "u",
"Firefox": "u",
"Safari": "u"
},
"小程序": {
"微信": "u",
"阿里": "u",
"百度": "u",
"字节跳动": "u",
"QQ": "u"
},
"快应用": {
"华为": "u",
"联盟": "u"
},
"Vue": {
"vue2": "y",
"vue3": "u"
}
}
}
}
}

View File

@@ -0,0 +1,93 @@
# 为什么使用uni-config-center
实际开发中很多插件需要配置文件才可以正常运行,如果每个插件都单独进行配置的话就会产生下面这样的目录结构
```bash
cloudfunctions
└─────common 公共模块
├─plugin-a // 插件A对应的目录
│ ├─index.js
│ ├─config.json // plugin-a对应的配置文件
│ └─other-file.cert // plugin-a依赖的其他文件
└─plugin-b // plugin-b对应的目录
├─index.js
└─config.json // plugin-b对应的配置文件
```
假设插件作者要发布一个项目模板,里面使用了很多需要配置的插件,无论是作者发布还是用户使用都是一个大麻烦。
uni-config-center就是用了统一管理这些配置文件的使用uni-config-center后的目录结构如下
```bash
cloudfunctions
└─────common 公共模块
├─plugin-a // 插件A对应的目录
│ └─index.js
├─plugin-b // plugin-b对应的目录
│ └─index.js
└─uni-config-center
├─index.js // config-center入口文件
├─plugin-a
│ ├─config.json // plugin-a对应的配置文件
│ └─other-file.cert // plugin-a依赖的其他文件
└─plugin-b
└─config.json // plugin-b对应的配置文件
```
使用uni-config-center后的优势
- 配置文件统一管理,分离插件主体和配置信息,更新插件更方便
- 支持对config.json设置schema插件使用者在HBuilderX内编写config.json文件时会有更好的提示后续HBuilderX会提供支持
# 用法
在要使用uni-config-center的公共模块或云函数内引入uni-config-center依赖请参考[使用公共模块](https://uniapp.dcloud.net.cn/uniCloud/cf-common)
```js
const createConfig = require('uni-config-center')
const uniIdConfig = createConfig({
pluginId: 'uni-id', // 插件id
defaultConfig: { // 默认配置
tokenExpiresIn: 7200,
tokenExpiresThreshold: 600,
},
customMerge: function(defaultConfig, userConfig) { // 自定义默认配置和用户配置的合并规则,不设置的情况侠会对默认配置和用户配置进行深度合并
// defaudltConfig 默认配置
// userConfig 用户配置
return Object.assign(defaultConfig, userConfig)
}
})
// 以如下配置为例
// {
// "tokenExpiresIn": 7200,
// "passwordErrorLimit": 6,
// "bindTokenToDevice": false,
// "passwordErrorRetryTime": 3600,
// "app-plus": {
// "tokenExpiresIn": 2592000
// },
// "service": {
// "sms": {
// "codeExpiresIn": 300
// }
// }
// }
// 获取配置
uniIdConfig.config() // 获取全部配置注意uni-config-center内不存在对应插件目录时会返回空对象
uniIdConfig.config('tokenExpiresIn') // 指定键值获取配置返回7200
uniIdConfig.config('service.sms.codeExpiresIn') // 指定键值获取配置返回300
uniIdConfig.config('tokenExpiresThreshold', 600) // 指定键值获取配置如果不存在则取传入的默认值返回600
// 获取文件绝对路径
uniIdConfig.resolve('custom-token.js') // 获取uni-config-center/uni-id/custom-token.js文件的路径
// 引用文件require
uniIDConfig.requireFile('custom-token.js') // 使用require方式引用uni-config-center/uni-id/custom-token.js文件。文件不存在时返回undefined文件内有其他错误导致require失败时会抛出错误。
// 判断是否包含某文件
uniIDConfig.hasFile('custom-token.js') // 配置目录是否包含某文件true: 文件存在false: 文件不存在
```

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,13 @@
{
"name": "uni-config-center",
"version": "0.0.3",
"description": "配置中心",
"main": "index.js",
"keywords": [],
"author": "DCloud",
"license": "Apache-2.0",
"origin-plugin-dev-name": "uni-config-center",
"origin-plugin-version": "0.0.3",
"plugin-dev-name": "uni-config-center",
"plugin-version": "0.0.3"
}

View File

@@ -0,0 +1,36 @@
## 1.0.182024-07-08
- checkToken时如果传入的token为空则返回uni-id-check-token-failed错误码以便uniIdRouter能正常跳转
## 1.0.172024-04-26
- 兼容uni-app-x对客户端uniPlatform的调整uni-app-x内uniPlatform区分app-android、app-ios
## 1.0.162023-04-25
- 新增maxTokenLength配置用于限制数据库用户记录token数组的最大长度
## 1.0.152023-04-06
- 修复部分语言国际化出错的Bug
## 1.0.142023-03-07
- 修复 admin用户包含其他角色时未包含在token的Bug
## 1.0.132022-07-21
- 修复 创建token时未传角色权限信息生成的token不正确的bug
## 1.0.122022-07-15
- 提升与旧版本uni-id的兼容性补充读取配置文件时回退平台app-plus、h5但是仍推荐使用新平台名进行配置app、web
## 1.0.112022-07-14
- 修复 部分情况下报`read property 'reduce' of undefined`的错误
## 1.0.102022-07-11
- 将token存储在用户表的token字段内与旧版本uni-id保持一致
## 1.0.92022-07-01
- checkToken兼容token内未缓存角色权限的情况此时将查库获取角色权限
## 1.0.82022-07-01
- 修复clientDB默认依赖时部分情况下获取不到uni-id配置的Bug
## 1.0.72022-06-30
- 修复config文件不合法时未抛出具体错误的Bug
## 1.0.62022-06-28
- 移除插件内的数据表schema
## 1.0.52022-06-27
- 修复使用多应用配置时报`Cannot read property 'appId' of undefined`的Bug
## 1.0.42022-06-27
- 修复使用自定义token内容功能报错的Bug [详情](https://ask.dcloud.net.cn/question/147945)
## 1.0.22022-06-23
- 对齐旧版本uni-id默认配置
## 1.0.12022-06-22
- 补充对uni-config-center的依赖
## 1.0.02022-06-21
- 提供uni-id token创建、校验、刷新接口简化旧版uni-id公共模块

View File

@@ -0,0 +1,84 @@
{
"id": "uni-id-common",
"displayName": "uni-id-common",
"version": "1.0.18",
"description": "包含uni-id token生成、校验、刷新功能的云函数公共模块",
"keywords": [
"uni-id-common",
"uniCloud",
"token",
"权限"
],
"repository": "https://gitcode.net/dcloud/uni-id-common",
"engines": {
},
"dcloudext": {
"sale": {
"regular": {
"price": 0
},
"sourcecode": {
"price": 0
}
},
"contact": {
"qq": ""
},
"declaration": {
"ads": "无",
"data": "无",
"permissions": "无"
},
"npmurl": "",
"type": "unicloud-template-function"
},
"uni_modules": {
"dependencies": ["uni-config-center"],
"encrypt": [],
"platforms": {
"cloud": {
"tcb": "y",
"aliyun": "y",
"alipay": "n"
},
"client": {
"Vue": {
"vue2": "u",
"vue3": "u"
},
"App": {
"app-vue": "u",
"app-nvue": "u"
},
"H5-mobile": {
"Safari": "u",
"Android Browser": "u",
"微信浏览器(Android)": "u",
"QQ浏览器(Android)": "u"
},
"H5-pc": {
"Chrome": "u",
"IE": "u",
"Edge": "u",
"Firefox": "u",
"Safari": "u"
},
"小程序": {
"微信": "u",
"阿里": "u",
"百度": "u",
"字节跳动": "u",
"QQ": "u",
"钉钉": "u",
"快手": "u",
"飞书": "u",
"京东": "u"
},
"快应用": {
"华为": "u",
"联盟": "u"
}
}
}
}
}

View File

@@ -0,0 +1,3 @@
# uni-id-common
文档请参考:[uni-id-common](https://uniapp.dcloud.net.cn/uniCloud/uni-id-common.html)

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,20 @@
{
"name": "uni-id-common",
"version": "1.0.18",
"description": "uni-id token生成、校验、刷新",
"main": "index.js",
"homepage": "https:\/\/uniapp.dcloud.io\/uniCloud\/uni-id-common.html",
"repository": {
"type": "git",
"url": "git+https:\/\/gitee.com\/dcloud\/uni-id-common.git"
},
"author": "DCloud",
"license": "Apache-2.0",
"dependencies": {
"uni-config-center": "file:..\/..\/..\/..\/..\/uni-config-center\/uniCloud\/cloudfunctions\/common\/uni-config-center"
},
"origin-plugin-dev-name": "uni-id-common",
"origin-plugin-version": "1.0.18",
"plugin-dev-name": "uni-id-common",
"plugin-version": "1.0.18"
}

View File

@@ -60,7 +60,10 @@ const requestHooks = {
return Promise.reject(); return Promise.reject();
default: default:
message.alert(msg) if(msg)
message.alert(msg)
else
message.alert("网络连接失败,请稍后再试!")
// return data; // return data;
return Promise.reject(msg); return Promise.reject(msg);
} }

View File

@@ -0,0 +1,46 @@
// 'use strict';
// const uniPush = uniCloud.getPushManager({appId:"__UNI__4C459F4"}) //注意这里需要传入你的应用appId
// exports.main = async (event) => {
// console.log(event)
// if(event.cid){
// let obj = JSON.parse(event.body);
// console.log(obj)
// const res = await uniPush.sendMessage({
// "push_clientid": obj.cids, // 设备id支持多个以数组的形式指定多个设备如["cid-1","cid-2"]数组长度不大于1000
// "title": obj.title, // 标题
// "content": obj.content, // 内容
// "settings": obj.settings, // 消息有效期
// "payload": obj.payload, // 数据
// "category": obj.category, // HarmonyOS NEXT系统纯血鸿蒙、非安卓鸿蒙的消息分类要给鸿蒙设备推送时才必传
// "force_notification": true, //填写true客户端就会对在线消息自动创建“通知栏消息”不填写则需要客户端自己处理。
// "request_id": obj.request_id ,//请求唯一标识号10-32位之间如果request_id重复会导致消息丢失
// "options":obj.options //消息分类,没申请可以不传这个参数
// })
// return res;
// }
// return {}
// };
// 简单的使用示例 appId: "__UNI__4C459F4"
'use strict';
const uniPush = uniCloud.getPushManager({
appId: "__UNI__0B682E1"
})
exports.main = async (event) => {
console.log(event)
let obj = JSON.parse(event.body)
const res = await uniPush.sendMessage({
"push_clientid": obj.cids, // 设备id支持多个以数组的形式指定多个设备如["cid-1","cid-2"]数组长度不大于1000
"title": obj.title, // 标题
"content": obj.content, // 内容
"settings": obj.settings, // 消息有效期
"payload": obj.payload, // 数据
"category": obj.category, // HarmonyOS NEXT系统纯血鸿蒙、非安卓鸿蒙的消息分类要给鸿蒙设备推送时才必传
"force_notification": true, //填写true客户端就会对在线消息自动创建“通知栏消息”不填写则需要客户端自己处理。
"request_id": obj.request_id ,//请求唯一标识号10-32位之间如果request_id重复会导致消息丢失
"options":obj.options //消息分类,没申请可以不传这个参数
})
return res;
};

View File

@@ -0,0 +1,7 @@
{
"name": "testUnipush2",
"dependencies": {},
"extensions": {
"uni-cloud-push": {}
}
}

View File

@@ -0,0 +1,12 @@
// 本文件用于使用JQL语法操作项目关联的uniCloud空间的数据库方便开发调试和远程数据库管理
// 编写clientDB的js API也支持常规js语法比如var可以对云数据库进行增删改查操作。不支持uniCloud-db组件写法
// 可以全部运行也可以选中部分代码运行。点击工具栏上的运行按钮或者按下【F5】键运行代码
// 如果文档中存在多条JQL语句只有最后一条语句生效
// 如果混写了普通js最后一条语句需是数据库操作语句
// 此处代码运行不受DB Schema的权限控制移植代码到实际业务中注意在schema中配好permission
// 不支持clientDB的action
// 数据库查询有最大返回条数限制详见https://uniapp.dcloud.net.cn/uniCloud/cf-database.html#limit
// 详细JQL语法请参考https://uniapp.dcloud.net.cn/uniCloud/jql.html
// 下面示例查询uni-id-users表的所有数据
db.collection('uni-id-users').get();