feat: 完整重构小程序匹配功能 + 修复UI对齐 + 文章数据API
主要更新: 1. 按H5网页端完全重构匹配功能(match页面) - 4种匹配类型: 创业合伙/资源对接/导师顾问/团队招募 - 资源对接等类型弹出手机号/微信号输入框 - 去掉重新匹配按钮,改为返回按钮 2. 修复所有卡片对齐和宽度问题 - 目录页附录卡片居中 - 首页阅读进度卡片满宽度 - 我的页面菜单卡片对齐 - 推广中心分享卡片统一宽度 3. 修复目录页图标和文字对齐 - section-icon固定40rpx宽高 - section-title与图标垂直居中 4. 更新真实完整文章标题(62篇) - 从book目录读取真实markdown文件名 - 替换之前的简化标题 5. 新增文章数据API - /api/db/chapters - 获取完整书籍结构 - 支持按ID获取单篇文章内容
This commit is contained in:
182
miniprogram/utils/util.js
Normal file
182
miniprogram/utils/util.js
Normal file
@@ -0,0 +1,182 @@
|
||||
/**
|
||||
* Soul创业实验 - 工具函数
|
||||
*/
|
||||
|
||||
// 格式化时间
|
||||
const formatTime = date => {
|
||||
const year = date.getFullYear()
|
||||
const month = date.getMonth() + 1
|
||||
const day = date.getDate()
|
||||
const hour = date.getHours()
|
||||
const minute = date.getMinutes()
|
||||
const second = date.getSeconds()
|
||||
|
||||
return `${[year, month, day].map(formatNumber).join('/')} ${[hour, minute, second].map(formatNumber).join(':')}`
|
||||
}
|
||||
|
||||
const formatNumber = n => {
|
||||
n = n.toString()
|
||||
return n[1] ? n : `0${n}`
|
||||
}
|
||||
|
||||
// 格式化日期
|
||||
const formatDate = date => {
|
||||
const year = date.getFullYear()
|
||||
const month = date.getMonth() + 1
|
||||
const day = date.getDate()
|
||||
return `${year}-${formatNumber(month)}-${formatNumber(day)}`
|
||||
}
|
||||
|
||||
// 格式化金额
|
||||
const formatMoney = (amount, decimals = 2) => {
|
||||
return Number(amount).toFixed(decimals)
|
||||
}
|
||||
|
||||
// 防抖函数
|
||||
const debounce = (fn, delay = 300) => {
|
||||
let timer = null
|
||||
return function (...args) {
|
||||
if (timer) clearTimeout(timer)
|
||||
timer = setTimeout(() => {
|
||||
fn.apply(this, args)
|
||||
}, delay)
|
||||
}
|
||||
}
|
||||
|
||||
// 节流函数
|
||||
const throttle = (fn, delay = 300) => {
|
||||
let last = 0
|
||||
return function (...args) {
|
||||
const now = Date.now()
|
||||
if (now - last >= delay) {
|
||||
fn.apply(this, args)
|
||||
last = now
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 生成唯一ID
|
||||
const generateId = () => {
|
||||
return 'id_' + Date.now().toString(36) + Math.random().toString(36).substr(2)
|
||||
}
|
||||
|
||||
// 检查手机号格式
|
||||
const isValidPhone = phone => {
|
||||
return /^1[3-9]\d{9}$/.test(phone)
|
||||
}
|
||||
|
||||
// 检查微信号格式
|
||||
const isValidWechat = wechat => {
|
||||
return wechat && wechat.length >= 6 && wechat.length <= 20
|
||||
}
|
||||
|
||||
// 深拷贝
|
||||
const deepClone = obj => {
|
||||
if (obj === null || typeof obj !== 'object') return obj
|
||||
if (obj instanceof Date) return new Date(obj)
|
||||
if (obj instanceof Array) return obj.map(item => deepClone(item))
|
||||
if (obj instanceof Object) {
|
||||
const copy = {}
|
||||
Object.keys(obj).forEach(key => {
|
||||
copy[key] = deepClone(obj[key])
|
||||
})
|
||||
return copy
|
||||
}
|
||||
}
|
||||
|
||||
// 获取URL参数
|
||||
const getQueryParams = url => {
|
||||
const params = {}
|
||||
const queryString = url.split('?')[1]
|
||||
if (queryString) {
|
||||
queryString.split('&').forEach(pair => {
|
||||
const [key, value] = pair.split('=')
|
||||
params[decodeURIComponent(key)] = decodeURIComponent(value || '')
|
||||
})
|
||||
}
|
||||
return params
|
||||
}
|
||||
|
||||
// 存储操作
|
||||
const storage = {
|
||||
get(key) {
|
||||
try {
|
||||
return wx.getStorageSync(key)
|
||||
} catch (e) {
|
||||
console.error('获取存储失败:', e)
|
||||
return null
|
||||
}
|
||||
},
|
||||
set(key, value) {
|
||||
try {
|
||||
wx.setStorageSync(key, value)
|
||||
return true
|
||||
} catch (e) {
|
||||
console.error('设置存储失败:', e)
|
||||
return false
|
||||
}
|
||||
},
|
||||
remove(key) {
|
||||
try {
|
||||
wx.removeStorageSync(key)
|
||||
return true
|
||||
} catch (e) {
|
||||
console.error('删除存储失败:', e)
|
||||
return false
|
||||
}
|
||||
},
|
||||
clear() {
|
||||
try {
|
||||
wx.clearStorageSync()
|
||||
return true
|
||||
} catch (e) {
|
||||
console.error('清除存储失败:', e)
|
||||
return false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 显示Toast
|
||||
const showToast = (title, icon = 'none', duration = 2000) => {
|
||||
wx.showToast({ title, icon, duration })
|
||||
}
|
||||
|
||||
// 显示Loading
|
||||
const showLoading = (title = '加载中...') => {
|
||||
wx.showLoading({ title, mask: true })
|
||||
}
|
||||
|
||||
// 隐藏Loading
|
||||
const hideLoading = () => {
|
||||
wx.hideLoading()
|
||||
}
|
||||
|
||||
// 显示确认框
|
||||
const showConfirm = (title, content) => {
|
||||
return new Promise((resolve) => {
|
||||
wx.showModal({
|
||||
title,
|
||||
content,
|
||||
success: res => resolve(res.confirm)
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
module.exports = {
|
||||
formatTime,
|
||||
formatDate,
|
||||
formatMoney,
|
||||
formatNumber,
|
||||
debounce,
|
||||
throttle,
|
||||
generateId,
|
||||
isValidPhone,
|
||||
isValidWechat,
|
||||
deepClone,
|
||||
getQueryParams,
|
||||
storage,
|
||||
showToast,
|
||||
showLoading,
|
||||
hideLoading,
|
||||
showConfirm
|
||||
}
|
||||
Reference in New Issue
Block a user