学习:uniapp全栈微信小程序vue3后台-额外/精彩报错篇

1.分类列表分页

uni-pagination | uni-app官网

Pagination Props

属性名 类型 默认值 说明
prevText String 上一页 左侧按钮文字
nextText String 下一页 右侧按钮文字
value/v-model Number 1 当前页
current Number 1 当前页, 优先级高于 value
total Number 0 数据总量
pageSize Number 10 每页数据量
showIcon Boolean false 是否以 icon 形式展示按钮

/uniCloud-alipay/cloudfunctions/admin-wallpaper-classify/index.obj.js

复制代码
	/**
	 * 获取分类列表
	 */
	async list({ current = 1, size = 10 } = {}) {
		try {
			// 从第skip条数据开始
			let skip = (current - 1) * size;
			// 初始化数据库JQL实例
			const dbJQL = uniCloud.databaseForJQL({
				clientInfo: this.getClientInfo()
			});
			const res = await dbJQL.collection("wallpaper-classify")
				.skip(skip)
				.limit(size)
				.field(`name,picurl,enable,select,sort,user_id,createTime`)
				.orderBy("sort asc")
				.get({ getCount: true }); // 返回数据和总数
			return res;
		} catch (err) {
			return {
				errCode: 500,
				errMsg: "数据库查询失败",
				data: [],
				count: 0
			};
		}
	},

/pages/wallpaper/classify

复制代码
<script setup>

	// 分页参数
	const params = ref({
		currentPage: 1, // 当前页码
		pageSize: 10, // 每页条数
		total: 0 // 总条数
	});

	// 获取分类列表
	const getClassify = async () => {
		try {
			// 解构 后端需要 current ,size
			let { errCode, errMsg, data, count } = await classifyCloudObj.list({
				current: params.value.currentPage,
				size: params.value.pageSize
			});
			if (errCode !== 0) return showToast({ title: errMsg });
			// 赋值
			classData.value = data
			// 总计,更新总条数
			params.value.total = count;
			console.log(data);
		} catch (err) {
			console.error("加载分类失败:", err);
			showToast({ title: "加载数据失败,请重试" });
		}
	}
	// 分页切换事件
	const handlePageChange = (e) => {
		console.log("打印当前页码:", e.current); // 打印当前页码
		params.value.currentPage = e.current; // 更新当前页码
		getClassify(); // 重新加载数据
	};


</script>

	<!-- 分页 -->
		<view class="paging">
			<uni-pagination :title="`共 ${params.total} 条`" :show-icon="true" :total="params.total"
				:current="params.currentPage" :page-size="params.pageSize" @change="handlePageChange"></uni-pagination>
		</view>

2.管理员显示注册时间

1.创建超级管理员出现的问题

ai分析:

连接本地云函数

连接云端云函数

跟着第一节课步骤走,还是会出现,看来不是我的问题

好像还是我的问题,明天老师远程。

远程控制更改了我系统的时间,就好了,不到20分钟,

AI分析的

1. 可能的原因

(1) Token 或 Session 过期

  • 现象uni-iduni-captcha 返回 500 错误,可能与登录状态的校验有关。
  • 原因
    • 系统时间不正确时,生成的 Token 或 Session 的时间戳可能被服务器判定为无效(例如,时间偏差过大)。
    • 例如:
      • 如果系统时间比实际时间快,Token 可能被判定为"未来生成"而失效。
      • 如果系统时间比实际时间慢,Token 可能被判定为"已过期"。

(2) 证书或 HTTPS 校验失败

  • 现象 :本地开发服务(如 http://127.0.0.1:7001 )可能启用了 HTTPS 或证书校验。
  • 原因
    • 证书的有效期依赖于系统时间。如果系统时间不在证书的有效期内,请求会被拒绝。

(3) 数据库或缓存时间同步问题

  • 现象:云函数依赖的数据库(如 MongoDB)或缓存(如 Redis)可能对操作时间有严格校验。
  • 原因
    • 数据库可能拒绝时间不一致的请求(例如,写入数据的 createdAt 字段时间与实际时间偏差过大)。

(4) 定时任务或 Cron 作业

  • 现象:云函数中可能有定时任务逻辑,依赖系统时间触发。
  • 原因
    • 如果系统时间错误,定时任务可能无法按预期执行。

2. 解决方案

(1) 同步系统时间

  • 确保系统时间与网络时间同步:
    • Windows
      1. 右键任务栏的时间 > "调整日期和时间"。
      2. 开启"自动设置时间"和"自动设置时区"。

2.后台下载记录报错

删掉测试图片后

未正确传入 type 参数,导致触发了这段错误

  • 如果关联查询的结果为空(如 classnamenicknamepicurlnull 或空数组),直接访问 [0] 会抛出 Cannot read properties of null 错误。

解决方案

  • 增加空值判断

    // 增加空值判断的处理关联字段数组
    let data = res.data.map(item => ({
    ...item,
    classname: item.classname && item.classname.length > 0 ? item.classname[0] : '',
    nickname: item.nickname && item.nickname.length > 0 ? item.nickname[0] : '',
    picurl: item.picurl && item.picurl.length > 0 ? item.picurl[0] : ''
    }))

同样的问题出现在客户端,

增加空值判断的处理关联字段数组

复制代码
	// 增加空值判断的处理关联字段数组
		let data = res.data.map(item => ({
			...item,
			classname: item.classname?.[0] || '',
			classid: item.classid?.[0] || '',
			_id: item._id?.[0] || '',
			description: item.description?.[0] || '',
			picurl: item.picurl?.[0] || '',
			score: item.score?.[0] || 0,
			tabs: item.tabs?.[0] || [],
			user_id: item.user_id?.[0] || '',
			view_count: item.view_count?.[0] || 0
		}));

通过增加对 nickname 字段的空值判断

复制代码
	// 合并用户昵称(增加空值判断)
		data = data.map(item => ({
			...item,
			nickname: authData.find(find => find._id == item.user_id)?.nickname || '匿名用户'
		}));

不影响结果的小问题,没有提示,把单词打错了

/pages/data/download-record

如果 collection 写错(指向不存在的集合或无权限的集合),uni-data-select 会无法拉取数据,常见表现为:

  • 下拉选项为空或显示"加载失败"
  • 控制台报错类似"collection not found/集合不存在"或"Permission denied/权限不足"
  • 可能出现请求 500 的错误码并附带 JQL 查询失败信息
  • v-model 不会赋值,classifyChange 不触发或接收到 undefined/空值

点第二页报错了,还有分类会报错

3.排行榜错误

countTotal一直为1

/uniCloud-alipay/cloudfunctions/admin-data-overview/index.obj.js

rankOrder

复制代码
async rankOrder({ type = null, dataRange = [], number = 9 } = {}) {
		// 确保number不超过15
		number = Math.min(number, 15);
		// 根据type确定要查询的数据表
		// 如果type是'download',则查询'wallpaper-download'表
		// 如果type是'score',则查询'wallpaper-score'表
		// 否则,table为空字符串
		let table = type == 'download' ? 'wallpaper-download' : type == 'score' ? 'wallpaper-score' : '';
		// 如果table为空,则输出错误信息并返回空数组
		if (!table) {
			console.error('无效的类型参数:', type);
			return [];
		}
		// 构建时间范围查询条件
		let wre = dataRange.length ?
			`createTime >= ${dayjs(dataRange[0]).startOf("day").valueOf()} && 
			createTime<=${dayjs(dataRange[1]).endOf("day").valueOf()}` : {};

		const dbJQL = uniCloud.databaseForJQL({
			clientInfo: this.getClientInfo()
		});

		try {
			// 优先使用分组统计
			let { data: groupData = [] } = await dbJQL.collection(table)
				.where(wre)
				.groupBy("picid")
				.groupField("count(*) as countTotal")
				.orderBy("countTotal desc")
				.limit(number)
				.get();

			if (groupData.length === 0) {
				// 如果分组统计无结果,使用手动统计
				let { data: allRecords = [] } = await dbJQL.collection(table)
					.where(wre)
					.field("picid")
					.get();

				// 手动统计每个picid的出现次数
				let countMap = {};
				allRecords.forEach(record => {
					if (record.picid) {
						countMap[record.picid] = (countMap[record.picid] || 0) + 1;
					}
				});

				// 转换为数组并排序
				groupData = Object.keys(countMap).map(picid => ({
					picid,
					countTotal: countMap[picid]
				})).sort((a, b) => b.countTotal - a.countTotal).slice(0, number);
			}

			if (groupData.length === 0) return [];

			// 获取壁纸详情
			// 使用groupData数组生成picid数组,并过滤掉空值
			let picidArr = groupData.map(item => item.picid) // 使用map方法提取每个元素的picid属性
				.filter(Boolean); // 使用filter方法过滤掉所有假值(null、undefined、0、false、NaN、空字符串)
			let { data: piclist = [] } = await dbJQL.collection("wallpaper-piclist")
				.where(`_id in ${JSON.stringify(picidArr)}`)
				.field("_id,picurl")
				.get();

			// 合并数据
			return groupData.map(item => {
				let pic = piclist.find(p => p._id === item.picid);
				return {
					picid: item.picid,
					countTotal: Number(item.countTotal) || 0,
					picurl: pic?.picurl || ''
				};
			});
		} catch (error) {
			console.error('Failed to get rank data:', error);
			return [];
		}
	},

没修好,除了第一张图countTotal显示其他,

4.排序错误

评分取整

复制代码
	<!-- 评分 -->
					<uni-td class="score">
						<uni-rate class="uni-rate" :disabled="true" disabledColor="#F7E7CE" size="16"
							:value="item.score" />
						<text class="text">{{Number(item.score).toFixed(1)}}</text>
					</uni-td>

5.noticeEdit在提交时未包含 user_id

wallpaper-notice-list.schema.jsonuser_id 字段的 defaultValue 设置为 {\"$env\": \"uid\"} ,但初始化数据时未提供 uid 环境变量,导致 user_idnull 。解决方案是在初始化数据时显式设置 user_id 或确保 uid 环境变量存在。

相关推荐
zhangxuyu11183 小时前
Vue2 学习记录
学习
charlie1145141913 小时前
精读C++20设计模式——行为型设计模式:迭代器模式
c++·学习·设计模式·迭代器模式·c++20
excel3 小时前
Vue3 中的双向链表依赖管理详解与示例
前端
尘似鹤3 小时前
微信小程序学习(三)补充
学习·微信小程序
Le1Yu4 小时前
2025-9-28学习笔记
java·笔记·学习
老华带你飞4 小时前
机电公司管理小程序|基于微信小程序的机电公司管理小程序设计与实现(源码+数据库+文档)
java·数据库·vue.js·spring boot·微信小程序·小程序·机电公司管理小程序
yuxb734 小时前
Ceph 分布式存储学习笔记(三):块存储和对象存储管理
笔记·ceph·学习
yuxb734 小时前
Ceph 分布式存储学习笔记(一):介绍、部署与集群配置(上)
笔记·ceph·学习
前端小白从0开始4 小时前
Chrome DevTools高级用法:性能面板内存泄漏排查
前端·chrome·chrome devtools