Compare commits

..

28 Commits

Author SHA1 Message Date
wx-jincw 5cfd9dbdd6 fix: 版本号更新
4 days ago
wx-jincw 2608bb1245 Merge branch 'main' into property-only-app
3 weeks ago
wx-jincw fb9b718ad2 fix: 发版配置
3 weeks ago
wx-jincw f53b2baeee Merge branch 'main' into property-only-app
1 month ago
wx-jincw be946ea0a1 Merge branch 'main' into property-only-app
2 months ago
wx-jincw 927fb661bf fix: 版本号修改
2 months ago
wx-jincw 1ec1bb7223 fix: 合并冲突
2 months ago
wx-jincw b6dce6a46b fix: 页面优化
2 months ago
wx-jincw 16ec2d5e1f fix: json问题修复
2 months ago
wx-jincw b3f13b0e37 Merge branch 'main' into property-only-app
2 months ago
wx-jincw 0798071f52 fix: 关于我的页面调整
2 months ago
wx-jincw 529a69c773 fix: 领用显示优化
2 months ago
wx-jincw 82f5c0185c fix: 还原祈愿菜单
2 months ago
wx-jincw bbeb958cf2 fix: 物资领用
2 months ago
wx-jincw d90ff20875 feat: 物资领用
2 months ago
wx-jincw 86b51c1d23 feat: 每日菜单点赞点踩;bigint转字符串
2 months ago
zxf d8ec421905 feat:
2 months ago
wx-jincw ea76eb90e0 Merge branch 'main' into property-only-app
2 months ago
wx-jincw 504128821f Merge branch 'main' into property-only-app
3 months ago
wx-jincw 6c6f019e5b Merge branch 'main' into property-only-app
3 months ago
wx-jincw 0c83121224 Merge branch 'main' into property-only-app
3 months ago
wx-jincw f52d131945 Merge branch 'main' into property-only-app
3 months ago
wx-jincw 28d9b65d27 feat: app通知附件显示加载
3 months ago
wx-jincw 0176a9d2c0 Merge branch 'main' into property-only-app
3 months ago
wx-jincw 5a735d6f7b Merge branch 'main' into property-only-app
3 months ago
wx-jincw da1bd8069e feat: 派单记录显示
3 months ago
wx-jincw e20f33ddb8 Merge branch 'main' into property-only-app
3 months ago
wx-jincw 06f3335f8c fix: 手机号脱敏;关于我们,退出登录
3 months ago

@ -1,13 +0,0 @@
import request from '@/utils/request'
/**
* 发送一次性订阅消息
* @param params
*/
export function sendSubscribeMessageApi(params) {
return request({
url: `admin/wechat/subscribe/message/send`,
method: 'POST',
params
})
}

@ -191,7 +191,6 @@
import * as api from '@/api/pmcomplaintsuggestion.js'
import * as ownerApi from '@/api/pmowner.js'
import * as houseApi from '@/api/pmhouse.js'
import * as wechatApi from '@/api/wechat.js'
import DictTag from '@/components/DictTag'
export default {
dicts: ['owner_type', 'cs_type', 'submit_channel', 'suggestion_status'],
@ -368,12 +367,12 @@
},
// /3
handleComplaint (id) {
this.$confirm('确定要将该投诉/建议标记为已处理吗', '提示', {
this.$confirm('确定要将该投诉/建议标记为已处理吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// API
// API
api.pmcomplaintsuggestionUpdateApi({
id: id,
status: '3'
@ -385,34 +384,6 @@
})
}).catch(() => {})
},
//
testWechatMessage () {
this.$confirm('确定要发送测试微信消息吗固定测试用户obahy2fytF_nhWznyc4ihUzQtPZ0', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
// API
const params = {
unionId: 'obahy2fytF_nhWznyc4ihUzQtPZ0',
templateId: 'TEMPLATE_ID', // ID
scene: '1000',
title: '测试通知',
content: '这是一条测试消息,请忽略。'
}
// 使 API
wechatApi.sendSubscribeMessageApi(params).then(res => {
if (res.code === 200) {
this.$message.success('发送成功,请查看微信!')
} else {
this.$message.error(res.message || '发送失败')
}
}).catch(err => {
this.$message.error('发送失败:' + (err.message || '未知错误'))
})
}).catch(() => {})
},
}
}
</script>

@ -8,8 +8,8 @@
// | Author: CRMEB Team <admin@crmeb.com>
// +----------------------------------------------------------------------
//移动端商城API
// let domain = 'https://fzbfwy.com/mobile-api'
let domain = 'http://crmebxcx.test.jiutianda.cn'
let domain = 'https://fzbfwy.com/mobile-api'
// let domain = 'http://crmebxcx.test.jiutianda.cn'
module.exports = {
// 请求域名 格式: https://您的域名
@ -18,8 +18,8 @@ module.exports = {
// #ifdef MP
HTTP_REQUEST_URL: domain,
// #endif
HTTP_ADMIN_URL:'https://crmeb.test.jiutianda.cn',
// HTTP_ADMIN_URL:'https://fzbfwy.com/prod-api', //PC后台的API请求地址上传图片用,影响h5上传头像
// HTTP_ADMIN_URL:'https://crmeb.test.jiutianda.cn',
HTTP_ADMIN_URL:'https://fzbfwy.com/prod-api', //PC后台的API请求地址上传图片用,影响h5上传头像
// #ifdef H5
//H5接口是浏览器地址
// HTTP_REQUEST_URL: window.location.protocol+"//"+window.location.host,

File diff suppressed because it is too large Load Diff

@ -0,0 +1,188 @@
<template>
<view class="about-container">
<!-- <view class="header">
<view class="back" @click="goBack">
<text class="iconfont icon-xiangzuo"></text>
</view>
<view class="title">关于我们</view>
<view class="empty"></view>
</view> -->
<view class="content">
<view class="logo-section">
<image class="logo" src="/static/images/logo.png" mode="aspectFit"></image>
<view class="app-name">八方物业</view>
<view class="version">版本 {{appVersion}}</view>
</view>
<view class="info-section">
<!-- <view class="info-item">
<view class="info-label">公司名称</view>
<view class="info-value">...</view>
</view> -->
<!-- <view class="info-item">
<view class="info-label">联系电话</view>
<view class="info-value"></view>
</view> -->
<!-- <view class="info-item">
<view class="info-label">公司地址</view>
<view class="info-value">...</view>
</view> -->
<!-- <view class="info-item">
<view class="info-label">电子邮箱</view>
<view class="info-value"></view>
</view> -->
</view>
<!-- <view class="desc-section">
<view class="desc-title">关于八方物业</view>
<view class="desc-content">
我们是
</view>
</view> -->
<view class="copyright">
© 2026 八方物业. 保留所有权利
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
appVersion: uni.getAppBaseInfo().appVersion,
}
},
methods: {
goBack() {
uni.navigateBack();
}
}
}
</script>
<style lang="scss" scoped>
.about-container {
width: 100%;
min-height: 100vh;
background-color: #f5f5f5;
.header {
display: flex;
align-items: center;
justify-content: space-between;
height: 90rpx;
background-color: #409EFF;
padding: 0 30rpx;
.back {
width: 50rpx;
height: 50rpx;
display: flex;
align-items: center;
justify-content: center;
.iconfont {
font-size: 36rpx;
color: #fff;
}
}
.title {
font-size: 32rpx;
font-weight: 600;
color: #fff;
}
.empty {
width: 50rpx;
}
}
.content {
padding: 40rpx 30rpx;
.logo-section {
display: flex;
flex-direction: column;
align-items: center;
margin-bottom: 50rpx;
.logo {
width: 160rpx;
height: 160rpx;
margin-bottom: 20rpx;
}
.app-name {
font-size: 36rpx;
font-weight: 600;
color: #333;
margin-bottom: 10rpx;
}
.version {
font-size: 24rpx;
color: #999;
}
}
.info-section {
background-color: #fff;
border-radius: 14rpx;
padding: 30rpx;
margin-bottom: 30rpx;
.info-item {
display: flex;
justify-content: space-between;
align-items: center;
padding: 20rpx 0;
border-bottom: 1rpx solid #f2f2f2;
&:last-child {
border-bottom: none;
}
.info-label {
font-size: 28rpx;
color: #666;
}
.info-value {
font-size: 28rpx;
color: #333;
text-align: right;
flex: 1;
margin-left: 30rpx;
}
}
}
.desc-section {
background-color: #fff;
border-radius: 14rpx;
padding: 30rpx;
margin-bottom: 40rpx;
.desc-title {
font-size: 30rpx;
font-weight: 600;
color: #333;
margin-bottom: 20rpx;
}
.desc-content {
font-size: 26rpx;
color: #666;
line-height: 40rpx;
}
}
.copyright {
font-size: 24rpx;
color: #999;
text-align: center;
margin-top: 20rpx;
}
}
}
</style>

@ -132,6 +132,7 @@
<view class="menu-txt">通知公告</view>
</view>
</view>
<template v-if="false">
<!-- menu -->
<view class='nav acea-row' v-if="menus.length">
<block v-for="(item,index) in menus" :key="index">
@ -229,6 +230,7 @@
<text>我是有底线的</text>
</view>
</view>
</template>
</view>
</view>
</view>

@ -182,6 +182,7 @@ export default {
this.rankingDateRange.startDate = this.selectedDate;
this.rankingDateRange.endDate = this.selectedDate;
this.loadCanteens();
this.loadMealTypes();
this.loadPageData();
},
mounted() {
@ -270,10 +271,6 @@ export default {
groupMeals(list) {
//
const mealTypeDict = this.dict.get('meal_type') || [];
const mealTypeMap = {};
mealTypeDict.forEach(item => {
mealTypeMap[item.dictValue] = item.dictLabel;
});
//
const grouped = {};

@ -436,6 +436,16 @@ export default {
};
});
// yyyy-MM-dd HH:mm:ss
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
const hours = String(now.getHours()).padStart(2, '0');
const minutes = String(now.getMinutes()).padStart(2, '0');
const seconds = String(now.getSeconds()).padStart(2, '0');
const reportTime = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
const payload = {
// phone: this.form.phone.trim(),
faultDesc: this.form.faultDesc.trim(),
@ -443,7 +453,8 @@ export default {
houseId: this.selectedHouseId,
houseName: this.selectedHouseName,
files: imagefiles,
faultType: this.form.faultType
faultType: this.form.faultType,
reportTime: reportTime
};
try {

@ -13,8 +13,8 @@
请点击登录
</view>
<view class="name" v-if="uid">
{{userInfo.nickname}}
<view class="vip" v-if="userInfo.vip">
{{userInfo.nickname || '未设置用户名'}}
<view class="vip" v-if="showShop && userInfo.vip">
<image :src="userInfo.vipIcon" alt="">
<view style="margin-left: 10rpx;" class="vip-txt">{{userInfo.vipName || ''}}
</view>
@ -29,7 +29,7 @@
<view class="phone" v-if="!userInfo.phone && isLogin" @tap="bindPhone"></view>
</view>
</view>
<view class="num-wrapper">
<view class="num-wrapper" v-if="showShop">
<view class="num-item" @click="goMenuPage('/pages/users/user_money/index')">
<text class="num">{{userInfo.nowMoney && uid ?Number(userInfo.nowMoney).toFixed(2):0}}</text>
<view class="txt">余额</view>
@ -49,7 +49,7 @@
</view>
<!-- <view class="sign" @click="goSignIn"></view> -->
</view>
<view class="order-wrapper">
<view class="order-wrapper" v-if="showShop">
<view class="order-hd flex">
<view class="left">订单中心</view>
<navigator class="right flex" hover-class="none" url="/pages/users/order_list/index" open-type="navigate">
@ -70,7 +70,7 @@
</view>
</view>
</view>
<view class="contenBox">
<view class="contenBox" v-if="showShop">
<!-- 轮播 -->
<view class="slider-wrapper" v-if="imgUrls.length>0">
<swiper indicator-dots="true" :autoplay="autoplay" :circular="circular" :interval="interval"
@ -109,9 +109,13 @@
</view>
</view>
<!-- <image src="/static/images/support.png" alt="" class='support'> -->
<view class="uni-p-b-98"></view>
</view>
<!-- 关于我们 -->
<view class="aboutUs acea-row row-center-wrapper" @click="goAboutUs" style="margin-top: 30rpx; padding: 0 30rpx;">关于我们</view>
<!-- 退出登录 -->
<view v-if="uid" class="logOut acea-row row-center-wrapper" @click="outLogin" style="margin-top: 20rpx; padding: 0 30rpx;">退</view>
</scroll-view>
</view>
<!-- #ifdef MP -->
@ -135,17 +139,20 @@
toLogin
} from '@/libs/login.js';
import {
getCity
} from '@/api/api.js';
import {
mapGetters
} from "vuex";
// #ifdef H5
import Auth from '@/libs/wechat';
// #endif
// #ifdef MP
import authorize from '@/components/Authorize';
// #endif
getCity
} from '@/api/api.js';
import {
getLogout
} from '@/api/user.js';
import {
mapGetters
} from "vuex";
// #ifdef H5
import Auth from '@/libs/wechat';
// #endif
// #ifdef MP
import authorize from '@/components/Authorize';
// #endif
const app = getApp();
export default {
components: {
@ -156,6 +163,7 @@
computed: mapGetters(['isLogin', 'chatUrl', 'userInfo', 'uid']),
data() {
return {
showShop: false,
orderMenu: [{
img: '/static/images/order1.png',
title: '待付款',
@ -370,6 +378,36 @@
}); //
})
},
// 退
outLogin: function() {
let that = this;
uni.showModal({
title: '提示',
content: '确认退出登录?',
success: function(res) {
if (res.confirm) {
getLogout()
.then(res => {
that.$store.commit("LOGOUT");
uni.reLaunch({
url: '/pages/index/index'
});
})
.catch(err => {
console.log(err);
});
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
},
//
goAboutUs() {
uni.navigateTo({
url: '/pages/about/index'
});
},
maskPhone(phone) {
if (!phone) return '';
const phoneStr = String(phone);
@ -388,6 +426,7 @@
.bg {
position: absolute;
z-index: 0;
left: 0;
top: 0;
width: 100%;
@ -678,5 +717,26 @@
padding: 0 8rpx;
border: 1px solid #ee5a52;
}
.aboutUs,
.logOut {
position: relative;
font-size: 32rpx;
text-align: center;
width: 690rpx;
height: 90rpx;
border-radius: 45rpx;
margin: 30rpx auto 0 auto;
z-index: 1;
background: #f6f8fb;
color: #333;
border: 2rpx solid #dfe5ee !important;
}
.logOut {
color: #e34d59;
border-color: #f3c9cd !important;
background: #fff5f6;
}
}
</style>

@ -23,7 +23,7 @@
</navigator>
<navigator url="/pages/users/user_phone/index" hover-class="none" class="input" v-else>
<view class='input acea-row row-between-wrapper'>
<input type='text' disabled='true' name='phone' :value='userInfo.phone'
<input type='text' disabled='true' name='phone' :value='phoneDesensitization(userInfo.phone)'
class='id'></input>
<text class='iconfont icon-xiangyou'></text>
</view>
@ -112,6 +112,11 @@
}
},
methods: {
//
phoneDesensitization(phone) {
if (!phone) return '';
return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
},
//
authColse: function(e) {
this.isShowAuth = e

@ -1,20 +1,10 @@
/*
* @Author: zxf 1532322479@qq.com
* @Date: 2025-06-21 12:18:44
* @LastEditors: zxf 1532322479@qq.com
* @LastEditTime: 2026-05-20 14:48:26
* @FilePath: \crmebTwo\crmeb\crmeb-admin\src\main\java\com\zbkj\admin\controller\WeChatAdminController.java
* @Description: ,`customMade`, koroFileHeader : https://github.com/OBKoro1/koro1FileHeader/wiki/%E9%85%8D%E7%BD%AE
*/
package com.zbkj.admin.controller;
import com.zbkj.common.response.CommonResult;
import com.zbkj.common.response.WeChatJsSdkConfigResponse;
import com.zbkj.service.service.WechatFansService;
import com.zbkj.service.service.WechatNewService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@ -24,8 +14,6 @@ import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.security.PermitAll;
/**
* -- admin
* +----------------------------------------------------------------------
@ -47,9 +35,6 @@ public class WeChatAdminController {
@Autowired
private WechatNewService wechatNewService;
@Autowired
private WechatFansService wechatFansService;
/**
* js
*/
@ -60,40 +45,4 @@ public class WeChatAdminController {
public CommonResult<WeChatJsSdkConfigResponse> configJs(@RequestParam(value = "url") String url) {
return CommonResult.success(wechatNewService.getJsSdkConfig(url));
}
/**
*
* unionIdopenId
*/
@ApiOperation(value = "发送一次性订阅消息")
@RequestMapping(value = "/subscribe/message/send", method = RequestMethod.POST)
@PermitAll
@ApiImplicitParams({
@ApiImplicitParam(name = "unionId", value = "用户unionId", dataType = "String", required = true),
@ApiImplicitParam(name = "templateId", value = "订阅消息模板ID", dataType = "String", required = true),
@ApiImplicitParam(name = "scene", value = "订阅场景值", dataType = "String", required = true),
@ApiImplicitParam(name = "title", value = "消息标题(15字以内)", dataType = "String", required = true),
@ApiImplicitParam(name = "content", value = "消息内容(200字以内)", dataType = "String", required = true),
@ApiImplicitParam(name = "url", value = "跳转链接(需ICP备案)", dataType = "String")
})
public CommonResult<Boolean> sendSubscribeMessage(@RequestParam(value = "unionId") String unionId,
@RequestParam(value = "templateId") String templateId,
@RequestParam(value = "scene") String scene,
@RequestParam(value = "title") String title,
@RequestParam(value = "content") String content,
@RequestParam(value = "url", required = false) String url){
// 通过unionId获取公众号openId
String openId = wechatFansService.getOpenIdByUnionId(unionId);
if (openId == null) {
return CommonResult.failed("未找到该用户的公众号openId");
}
// 发送订阅消息
boolean success = wechatFansService.sendSubscribeMessage(openId, templateId, scene, title, content, url);
if (success) {
return CommonResult.success(true, "发送成功");
} else {
return CommonResult.failed("发送失败");
}
}
}

@ -229,7 +229,7 @@ public class PmDailyMenuDtlLikeController {
return CommonResult.failed("菜单明细不存在");
}
// 通过PmDailyMenu 获取菜单日期和餐别
// 通过PmDailyMenu 获取菜单日期
PmDailyMenu menu = pmDailyMenuService.getById(menuDtl.getMenuId());
if (menu == null) {
return CommonResult.failed("菜单不存在");
@ -240,11 +240,6 @@ public class PmDailyMenuDtlLikeController {
return CommonResult.failed("菜单日期不存在");
}
String mealType = menu.getMealType();
if (StrUtil.isBlank(mealType)) {
return CommonResult.failed("餐别不存在");
}
// 检查是否已经对该菜单明细进行过评价
LambdaQueryWrapper<PmDailyMenuDtlLike> existQueryWrapper = new LambdaQueryWrapper<>();
existQueryWrapper.eq(PmDailyMenuDtlLike::getUserId, userId);
@ -257,17 +252,16 @@ public class PmDailyMenuDtlLikeController {
return CommonResult.failed("已经对该菜品进行过" + ("1".equals(likeType) ? "点赞" : "点踩"));
}
// 检查用户在该日期、该餐别的评价次数
// 检查用户在该日期的评价次数
LambdaQueryWrapper<PmDailyMenuDtlLike> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(PmDailyMenuDtlLike::getUserId, userId);
queryWrapper.eq(PmDailyMenuDtlLike::getMenuDate, menuDate);
queryWrapper.eq(PmDailyMenuDtlLike::getMealType, mealType);
queryWrapper.eq(PmDailyMenuDtlLike::getLikeType, likeType);
queryWrapper.eq(PmDailyMenuDtlLike::getDelFlag, "0");
int count = pmDailyMenuDtlLikeService.count(queryWrapper);
if (count >= 3) {
return CommonResult.failed("同一日期同一餐别内" + ("1".equals(likeType) ? "点赞" : "点踩") + "次数已达上限3次");
return CommonResult.failed("同一日期内" + ("1".equals(likeType) ? "点赞" : "点踩") + "次数已达上限3次");
}
// 保存点赞/点踩记录
@ -275,7 +269,6 @@ public class PmDailyMenuDtlLikeController {
like.setMenuDtlId(menuDtlId);
like.setUserId(userId);
like.setMenuDate(menuDate);
like.setMealType(mealType);
like.setLikeType(likeType);
like.setRemark(remark);
like.setDelFlag("0");
@ -461,32 +454,33 @@ public class PmDailyMenuDtlLikeController {
});
}
// 分页处理
// 计算总记录数
int total = rankingList.size();
int fromIndex = (page - 1) * limit;
int toIndex = Math.min(fromIndex + limit, total);
if (fromIndex >= total) {
// 如果起始索引超出范围,返回空列表
CommonPage<PmDailyMenuDtlLike> emptyPage = new CommonPage<>();
emptyPage.setList(new ArrayList<>());
emptyPage.setTotal((long) total);
emptyPage.setPage(page);
emptyPage.setLimit(limit);
return CommonResult.success(emptyPage);
// 实现真正的分页
int startIndex = (page - 1) * limit;
int endIndex = Math.min(startIndex + limit, total);
List<PmDailyMenuDtlLike> pageList;
if (startIndex >= total) {
pageList = new ArrayList<>();
} else {
pageList = rankingList.subList(startIndex, endIndex);
}
List<PmDailyMenuDtlLike> pageList = rankingList.subList(fromIndex, toIndex);
CommonPage<PmDailyMenuDtlLike> resultPage = new CommonPage<>();
resultPage.setList(pageList);
resultPage.setTotal((long) total);
resultPage.setPage(page);
resultPage.setLimit(limit);
// 构建分页对象
CommonPage<PmDailyMenuDtlLike> pageResult = new CommonPage<>();
pageResult.setList(pageList);
pageResult.setTotal((long) total);
pageResult.setPage(page);
pageResult.setLimit(limit);
return CommonResult.success(resultPage);
return CommonResult.success(pageResult);
} catch (Exception e) {
e.printStackTrace();
return CommonResult.failed("查询失败:" + e.getMessage());
}
}
}

@ -120,16 +120,11 @@ public class PmDailyMenuDtlLike implements Serializable {
@ApiModelProperty(value = "备注")
private String remark;
/**
* 便
*/
@ApiModelProperty(value = "餐别")
private String mealType;
/**
*
*/
@ApiModelProperty(value = "用户名称")
@TableField(exist = false)
private String userName;
}

@ -16,13 +16,11 @@ import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.security.PermitAll;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -150,7 +148,6 @@ public class WeChatController {
*/
@ApiOperation(value = "发送一次性订阅消息")
@RequestMapping(value = "/subscribe/message/send", method = RequestMethod.POST)
@PermitAll
@ApiImplicitParams({
@ApiImplicitParam(name = "unionId", value = "用户unionId", dataType = "String", required = true),
@ApiImplicitParam(name = "templateId", value = "订阅消息模板ID", dataType = "String", required = true),

Loading…
Cancel
Save