diff --git a/code/base-project/base-uniapp-main/env/.env b/code/base-project/base-uniapp-main/env/.env
new file mode 100644
index 00000000..06135be5
--- /dev/null
+++ b/code/base-project/base-uniapp-main/env/.env
@@ -0,0 +1,4 @@
+VITE_APP_PORT = 8080
+
+VITE_ALIYUN_BUCKET = 'g3xc'
+
diff --git a/code/base-project/base-uniapp-main/src/App.vue b/code/base-project/base-uniapp-main/src/App.vue
index 38bcbfea..6ebe5683 100644
--- a/code/base-project/base-uniapp-main/src/App.vue
+++ b/code/base-project/base-uniapp-main/src/App.vue
@@ -8,7 +8,7 @@ onLaunch(() => {
console.log('App Launch')
})
onShow(() => {
- // userStore.requireLogin()
+ userStore.requireLogin()
console.log('App Show')
})
diff --git a/code/base-project/base-uniapp-main/src/env.d.ts b/code/base-project/base-uniapp-main/src/env.d.ts
index d4d74539..8ce9911c 100644
--- a/code/base-project/base-uniapp-main/src/env.d.ts
+++ b/code/base-project/base-uniapp-main/src/env.d.ts
@@ -13,6 +13,8 @@ interface ImportMetaEnv {
readonly VITE_SERVER_PORT: string
/** 是否清除console */
readonly VITE_DELETE_CONSOLE: string
+
+ readonly VITE_ALIYUN_BUCKET: string
}
interface ImportMeta {
diff --git a/code/base-project/base-uniapp-main/src/interceptor/router.ts b/code/base-project/base-uniapp-main/src/interceptor/router.ts
index 66f76a30..3f8cdcf0 100644
--- a/code/base-project/base-uniapp-main/src/interceptor/router.ts
+++ b/code/base-project/base-uniapp-main/src/interceptor/router.ts
@@ -1,8 +1,7 @@
import { useUserStore } from '@/store'
const whiteList = [
- '/pages-sub/login/index',
- '/pages/account/index',
+ '/pages-sub/login/index'
]
export const navigateToInterceptor = {
@@ -34,9 +33,9 @@ export const navigateToInterceptor = {
export const routeInterceptor = {
install() {
- // uni.addInterceptor('navigateTo', navigateToInterceptor)
- // uni.addInterceptor('reLaunch', navigateToInterceptor)
- // uni.addInterceptor('redirectTo', navigateToInterceptor)
- // uni.addInterceptor('switchTab', navigateToInterceptor)
+ uni.addInterceptor('navigateTo', navigateToInterceptor)
+ uni.addInterceptor('reLaunch', navigateToInterceptor)
+ uni.addInterceptor('redirectTo', navigateToInterceptor)
+ uni.addInterceptor('switchTab', navigateToInterceptor)
},
}
diff --git a/code/base-project/base-uniapp-main/src/pages-sub/file/index.vue b/code/base-project/base-uniapp-main/src/pages-sub/file/index.vue
new file mode 100644
index 00000000..c4e44c1a
--- /dev/null
+++ b/code/base-project/base-uniapp-main/src/pages-sub/file/index.vue
@@ -0,0 +1,147 @@
+
+
+
+
+
+
+
+
+
diff --git a/code/base-project/base-uniapp-main/src/pages-sub/login/index.vue b/code/base-project/base-uniapp-main/src/pages-sub/login/index.vue
index a61c77e3..aa3afe64 100644
--- a/code/base-project/base-uniapp-main/src/pages-sub/login/index.vue
+++ b/code/base-project/base-uniapp-main/src/pages-sub/login/index.vue
@@ -34,47 +34,35 @@ function onSubmit() {
formRef.value
?.validate()
.then(() => {
- userStore.userInfo.orgid = formModel.orgid
- userStore.userInfo.userid = formModel.userid
- userStore.userInfo.token = '123'
+ _loading.value = true
+ loginOrgApi({
+ orgid: formModel.orgid,
+ userid: formModel.userid,
+ password: formModel.password,
+ }).then((res) => {
+ if (res.data) {
+ userStore.userInfo.orgid = formModel.orgid
+ userStore.userInfo.userid = formModel.userid
+ userStore.userInfo.token = res.data
- uni.showToast({
- title: '登录成功',
- icon: 'success',
+ uni.showToast({
+ title: '登录成功',
+ icon: 'success',
+ })
+
+ uni.switchTab({
+ url: '/pages/home/index',
+ })
+ }
+ else {
+ uni.showToast({
+ title: '登录失败,请稍后再试',
+ icon: 'error',
+ })
+ }
+ }).finally(() => {
+ _loading.value = false
})
-
- uni.switchTab({
- url: '/pages/home/index',
- })
- // _loading.value = true
- // loginOrgApi({
- // orgid: formModel.orgid,
- // userid: formModel.userid,
- // password: formModel.password,
- // }).then((res) => {
- // if (res.data) {
- // userStore.userInfo.orgid = formModel.orgid
- // userStore.userInfo.userid = formModel.userid
- // userStore.userInfo.token = res.data
-
- // uni.showToast({
- // title: '登录成功',
- // icon: 'success',
- // })
-
- // uni.switchTab({
- // url: '/pages/home/index',
- // })
- // }
- // else {
- // uni.showToast({
- // title: '登录失败,请稍后再试',
- // icon: 'error',
- // })
- // }
- // }).finally(() => {
- // _loading.value = false
- // })
})
.catch((error: FieldValidateError[]) => {
toast.fail(error[0].message)
diff --git a/code/base-project/base-uniapp-main/src/pages-sub/update-password/index.vue b/code/base-project/base-uniapp-main/src/pages-sub/update-password/index.vue
new file mode 100644
index 00000000..c12c26e7
--- /dev/null
+++ b/code/base-project/base-uniapp-main/src/pages-sub/update-password/index.vue
@@ -0,0 +1,243 @@
+
+
+
+
+
+
+
+ 密码修改
+
+
+ 确保账户安全,请谨慎操作
+
+
+
+
+
+
+
+ 旧密码
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 新密码
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 确认密码
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/base-project/base-uniapp-main/src/pages-sub/xcjin/index.vue b/code/base-project/base-uniapp-main/src/pages-sub/xcjin/index.vue
new file mode 100644
index 00000000..c336b0b7
--- /dev/null
+++ b/code/base-project/base-uniapp-main/src/pages-sub/xcjin/index.vue
@@ -0,0 +1,310 @@
+
+
+
+
+
+
+
+
+
+
+
+ {{ tab.name }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 进场单号:
+
+
+ {{ item.b_id }}
+
+
+
+
+
+
+ 进场指令号:
+
+
+ {{ item.b_blno }}
+
+
+
+
+
+
+ 箱型:
+
+
+ {{ item.b_contype }}
+
+
+
+
+
+
+ 空重:
+
+
+ {{ item.b_conkz }}
+
+
+
+
+
+
+ 箱态:
+
+
+ {{ item.b_constate }}
+
+
+
+
+
+
+ 箱况:
+
+
+ {{ item.b_conxk }}
+
+
+
+
+
+
+ 箱位:
+
+
+ {{ item.b_xwt }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/code/base-project/base-uniapp-main/src/pages.json b/code/base-project/base-uniapp-main/src/pages.json
index 7f586b81..63a2dc42 100644
--- a/code/base-project/base-uniapp-main/src/pages.json
+++ b/code/base-project/base-uniapp-main/src/pages.json
@@ -52,7 +52,7 @@
"layout": "default",
"style": {
"navigationBarTitleText": "个人中心",
- "navigationStyle": "custom"
+ "navigationStyle": "default"
}
}
],
@@ -66,6 +66,27 @@
"navigationBarTitleText": "登录",
"navigationStyle": "default"
}
+ },
+ {
+ "path": "file/index",
+ "style": {
+ "navigationBarTitleText": "附件管理",
+ "navigationStyle": "default"
+ }
+ },
+ {
+ "path": "update-password/index",
+ "style": {
+ "navigationBarTitleText": "修改密码",
+ "navigationStyle": "default"
+ }
+ },
+ {
+ "path": "xcjin/index",
+ "style": {
+ "navigationBarTitleText": "进场堆高机",
+ "navigationStyle": "default"
+ }
}
]
}
diff --git a/code/base-project/base-uniapp-main/src/pages/account/index.vue b/code/base-project/base-uniapp-main/src/pages/account/index.vue
index 8d03efb6..0e46a030 100644
--- a/code/base-project/base-uniapp-main/src/pages/account/index.vue
+++ b/code/base-project/base-uniapp-main/src/pages/account/index.vue
@@ -9,7 +9,6 @@ function handleLoginOut() {
title: '提示',
message: '确定退出登录?',
onConfirm() {
- toast.success('退出成功')
userStore.reset()
uni.navigateTo({
@@ -18,27 +17,75 @@ function handleLoginOut() {
},
})
}
+
+function handleToLogin() {
+ if (userStore.isLogined) {
+ return
+ }
+ uni.navigateTo({
+ url: '/pages-sub/login/index',
+ })
+}
+
+function handleToUpdatePassword() {
+ handleToLogin()
+
+ uni.navigateTo({
+ url: '/pages-sub/update-password/index',
+ })
+}
+
+const avatarText = computed(() => {
+ if (!userStore.isLogined) {
+ return '登'
+ }
+
+ const id = userStore.userInfo?.userid
+ if (!id || id.length === 0)
+ return 'A'
+
+ return id.charAt(0).toUpperCase()
+})
-
-
@@ -47,34 +94,30 @@ function handleLoginOut() {
.account-header {
display: flex;
align-items: center;
- padding: 40rpx 32rpx;
- background-color: #2c3e50; /* 工业风深色 */
- border-radius: 2rpx; /* 轻微卡片感 */
- box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.15);
+ padding: 36rpx 28rpx;
+ background-color: #fff;
.user-info {
display: flex;
flex-direction: column;
justify-content: center;
margin-left: 32rpx;
- color: #fff;
-
- .user-account {
- font-size: 34rpx;
+ justify-content: space-between;
+ .user-userid {
+ font-size: 36rpx;
font-weight: 600;
- line-height: 42rpx;
+ line-height: 36rpx;
}
.user-orgid {
font-size: 28rpx;
- margin-top: 6rpx;
+ margin-top: 12rpx;
color: #6b788e;
- line-height: 34rpx;
}
}
}
-.actions{
+.actions {
margin-top: 32rpx;
}
diff --git a/code/base-project/base-uniapp-main/src/pages/home/index.vue b/code/base-project/base-uniapp-main/src/pages/home/index.vue
index 48e4705e..5b787d9e 100644
--- a/code/base-project/base-uniapp-main/src/pages/home/index.vue
+++ b/code/base-project/base-uniapp-main/src/pages/home/index.vue
@@ -7,6 +7,15 @@ const swiperList = [
{},
{},
]
+
+function toLinkUrl(url) {
+ if (!url) {
+ return
+ }
+ uni.navigateTo({
+ url,
+ })
+}
@@ -70,6 +79,12 @@ const swiperList = [
内容
+
+
+
+ 进场堆高机
+
+
@@ -85,6 +100,9 @@ const swiperList = [
}
.grid-container {
margin-top: 32rpx;
+ :deep(.sar-grid__content) {
+ background-color: var(--sar-primary);
+ }
.grid-item {
display: flex;
flex-direction: column;
@@ -98,6 +116,7 @@ const swiperList = [
text {
margin-top: 16rpx;
font-weight: bold;
+ color: #fff;
}
}
}
diff --git a/code/base-project/base-uniapp-main/src/request/api.ts b/code/base-project/base-uniapp-main/src/request/api.ts
index 651c1df4..12058b84 100644
--- a/code/base-project/base-uniapp-main/src/request/api.ts
+++ b/code/base-project/base-uniapp-main/src/request/api.ts
@@ -38,3 +38,67 @@ interface GetAutocompleteDataExParams {
export function getAutocompleteDataExApi(params: GetAutocompleteDataExParams) {
return request.postForm('/getAutocompleteDataEx.jsp', params)
}
+
+interface SaveobjtParams {
+ tables: string
+ insertValues: string
+ delValues: string
+ updateValues: string
+ keys: string
+}
+
+export function saveobjtApi(params: SaveobjtParams) {
+ return request.postForm('/saveobjt.jsp', params)
+}
+
+interface SearchdataParams {
+ viewname: string
+ searchcondition: string
+ orderfield: string
+}
+export function searchdataApi(params: SearchdataParams) {
+ return request.postForm('/searchdata.jsp', params)
+}
+
+interface SearchdatapageindexParams {
+ viewname: string
+ searchcondition: string
+ userid: string
+ orderfield: string
+ page: number
+ rows: number
+}
+
+export function searchdatapageindexApi(params: SearchdatapageindexParams) {
+ return request.postForm(`/searchdatapageindex.jsp`, params)
+}
+interface DelSubRecordParams {
+ id: string
+ module: string
+ bucketName: string
+}
+export function delSubRecordApi(params: DelSubRecordParams) {
+ return request.postForm('/DelSubRecord.jsp', params)
+}
+
+interface getaliyunkeyParams {
+ orgid: string
+ bucket: string
+}
+
+export function getaliyunkeyApi(params: getaliyunkeyParams) {
+ return request.postForm(`/getaliyunkey.jsp`, params)
+}
+
+interface aliyunpluploadParams {
+ despathfile: string
+ myfilename: string
+ size: string
+ tablename: string
+ sid: string
+ mx_moduleid: string
+ mx_cate_id: string
+}
+export function aliyunpluploadApi(params: aliyunpluploadParams) {
+ return request.postForm(`/aliyunplupload.jsp`, params)
+}
diff --git a/code/base-project/base-uniapp-main/src/request/index.ts b/code/base-project/base-uniapp-main/src/request/index.ts
index 59db00e4..f8c496a0 100644
--- a/code/base-project/base-uniapp-main/src/request/index.ts
+++ b/code/base-project/base-uniapp-main/src/request/index.ts
@@ -109,7 +109,7 @@ function request(option: UniApp.RequestOptions): Promise> &
}
catch {
// 如果解析失败,保持原始字符串即可
- console.warn('data.data 不是合法 JSON 字符串', data.data)
+ // console.warn('data.data 不是合法 JSON 字符串', data.data)
}
}
}
diff --git a/code/base-project/base-uniapp-main/src/style/iconfont.css b/code/base-project/base-uniapp-main/src/style/iconfont.css
index 9a641f95..cc37cceb 100644
--- a/code/base-project/base-uniapp-main/src/style/iconfont.css
+++ b/code/base-project/base-uniapp-main/src/style/iconfont.css
@@ -1,17 +1,25 @@
@font-face {
font-family: 'iconfont'; /* Project id 5031675 */
- src: url('data:font/ttf;charset=utf-8;base64,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')
+ src: url('data:font/ttf;charset=utf-8;base64,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')
format('truetype');
}
.iconfont {
font-family: 'iconfont' !important;
- font-size: 32rpx;
+ font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
+.iconfont-updatePassword:before {
+ content: '\e628';
+}
+
+.iconfont-exitLogin:before {
+ content: '\e600';
+}
+
.iconfont-chaiquan:before {
content: '\e647';
}
diff --git a/code/base-project/base-uniapp-main/src/utils/file.ts b/code/base-project/base-uniapp-main/src/utils/file.ts
new file mode 100644
index 00000000..c37686ee
--- /dev/null
+++ b/code/base-project/base-uniapp-main/src/utils/file.ts
@@ -0,0 +1,224 @@
+import { getaliyunkeyApi } from '@/request/api'
+import { useUserStore } from '@/store'
+import { isH5 } from './platform'
+
+const aliyunBucket = import.meta.env.VITE_ALIYUN_BUCKET
+
+/**
+ * 压缩图片(多端通用)
+ * @param url 图片路径
+ * @param name 图片名称
+ * @returns Promise<{ path: string, size: number }>
+ */
+export async function imageCompress(url: string): Promise<{ path: string, size: number }> {
+ // #ifndef H5
+ return new Promise((resolve, reject) => {
+ uni.compressImage({
+ src: url,
+ quality: 80,
+ success: async (res) => {
+ try {
+ // 获取文件信息
+ const fileInfo = await uni.getFileInfo({ filePath: res.tempFilePath })
+ resolve({
+ path: res.tempFilePath,
+ size: fileInfo.size,
+ })
+ }
+ catch (e) {
+ reject(e)
+ }
+ },
+ fail: reject,
+ })
+ })
+ // #endif
+
+ // #ifdef H5
+ return new Promise((resolve, reject) => {
+ const img = new Image()
+ img.crossOrigin = 'Anonymous'
+ img.src = url
+
+ img.onload = () => {
+ try {
+ const canvas = document.createElement('canvas')
+ const ctx = canvas.getContext('2d')!
+ const maxSize = 600
+ let { width, height } = img
+
+ // 按比例压缩
+ if (width > height && width > maxSize) {
+ height = (maxSize * height) / width
+ width = maxSize
+ }
+ else if (height > width && height > maxSize) {
+ width = (maxSize * width) / height
+ height = maxSize
+ }
+
+ canvas.width = width
+ canvas.height = height
+ ctx.clearRect(0, 0, width, height)
+ ctx.drawImage(img, 0, 0, width, height)
+
+ const base64 = canvas.toDataURL('image/jpeg', 0.8)
+
+ // 计算 Base64 大小
+ const sizeInBytes = Math.round((base64.length - (base64.indexOf(',') + 1)) * 0.75)
+
+ resolve({
+ path: base64,
+ size: sizeInBytes,
+ })
+ }
+ catch (e) {
+ reject(e)
+ }
+ }
+
+ img.onerror = reject
+ })
+ // #endif
+}
+
+/**
+ * 判断文件名是否为图片类型
+ * @param fileName 文件名(如 "photo.png"、"avatar.JPG")
+ */
+export function isImage(fileName: string): boolean {
+ if (!fileName || typeof fileName !== 'string')
+ return false
+
+ // 常见图片扩展名(全小写)
+ const imageExtensions = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'svg', 'heic']
+
+ // 取文件名的后缀
+ const ext = fileName.split('.').pop()?.toLowerCase()
+
+ // 检查是否在图片后缀列表中
+ return !!ext && imageExtensions.includes(ext)
+}
+
+// 文件大小格式化
+export function formatFileSize(size: number): string {
+ if (size < 1024)
+ return `${size} B`
+ else if (size < 1024 * 1024)
+ return `${(size / 1024).toFixed(2)} KB`
+ else if (size < 1024 * 1024 * 1024)
+ return `${(size / (1024 * 1024)).toFixed(2)} MB`
+ else return `${(size / (1024 * 1024 * 1024)).toFixed(2)} GB`
+}
+
+export interface AliyunUploadResult {
+ url: string // 上传后的完整 URL
+}
+
+/**
+ * 上传文件到阿里云 OSS
+ * @param filePath 本地文件路径
+ * @param fileName 文件名
+ * @param fileType 文件类型,可选:image/video/file
+ * @returns Promise
+ */
+export async function uploadFileToAliyun(
+ filePath: string,
+ fileName: string,
+ fileType: any,
+): Promise {
+ const userStore = useUserStore()
+
+ // 获取 OSS 临时上传凭证
+ const keyRes = await getaliyunkeyApi({
+ orgid: userStore.userInfo.orgid,
+ bucket: aliyunBucket,
+ })
+ const { accessid, callback, dir, host, policy, signature } = keyRes.data
+
+ // 构建文件在 OSS 的存储路径
+ const fileExtension = fileName.split('.').pop()?.toLowerCase() || 'tmp'
+ const timestamp = Date.now()
+ const random = Math.floor(Math.random() * 1000)
+ const key = `${dir}/${timestamp + random}.${fileExtension}`
+
+ const formData: Record = {
+ key,
+ OSSAccessKeyId: accessid,
+ policy,
+ signature,
+ success_action_status: '200',
+ name: fileName,
+ }
+ if (callback)
+ formData.callback = callback
+
+ // 使用 Promise 包裹 uni.uploadFile
+ return new Promise((resolve, reject) => {
+ uni.uploadFile({
+ url: host,
+ filePath,
+ name: 'file',
+ fileName,
+ fileType,
+ formData,
+ success: (res) => {
+ if (res.statusCode === 200) {
+ resolve({
+ url: `${host}/${key}`,
+ })
+ }
+ else {
+ reject(new Error(`上传失败,状态码: ${res.statusCode}`))
+ }
+ },
+ fail: (err) => {
+ reject(err)
+ },
+ })
+ })
+}
+
+export function downloadFile(fileUrl: string, fileName?: string) {
+ if (isH5) {
+ // H5 平台下载逻辑
+ const name = fileName || fileUrl.split('/').pop() || 'file'
+ const a = document.createElement('a')
+ a.href = fileUrl
+ a.download = name
+ a.target = '_blank'
+ document.body.appendChild(a)
+ a.click()
+ document.body.removeChild(a)
+ console.log('H5 文件下载已触发:', name)
+ }
+ else {
+ // APP / 小程序下载逻辑
+ uni.downloadFile({
+ url: fileUrl,
+ success: (response) => {
+ if (response.statusCode === 200 && response.tempFilePath) {
+ uni.saveFile({
+ tempFilePath: response.tempFilePath,
+ success: (resData) => {
+ console.log('保存路径', resData.savedFilePath)
+ uni.showToast({ title: '下载成功' })
+ },
+ fail: (error) => {
+ console.error('保存失败', error)
+ },
+ })
+ }
+ else {
+ console.error('下载失败或 tempFilePath 不存在', response)
+ }
+ },
+ fail: (err) => {
+ console.error('downloadFile 失败', err)
+ },
+ progress: (res) => {
+ console.log(`下载进度: ${res.progress}%`)
+ },
+ })
+ }
+}
diff --git a/code/base-project/base-uniapp-main/src/utils/time.ts b/code/base-project/base-uniapp-main/src/utils/time.ts
new file mode 100644
index 00000000..7c3fd512
--- /dev/null
+++ b/code/base-project/base-uniapp-main/src/utils/time.ts
@@ -0,0 +1,74 @@
+import dayjs from 'dayjs'
+
+// 定义单位的类型
+type Unit = 'day' | 'week' | 'month' | 'year'
+
+/**
+ * 获取指定日期之前的日期
+ * @param value 数字,表示要减去的时间量
+ * @param unit 时间单位,可以是 'day'、'week'、'month' 或 'year'
+ * @returns 返回计算后的日期
+ */
+export function getDateBefore(value: number, unit: Unit): string {
+ return dayjs().subtract(value, unit).format('YYYY-MM-DD')
+}
+export function getTimeDifference(dateStr1: string, dateStr2: string) {
+ const date1 = new Date(dateStr1)
+
+ if (!dateStr2) {
+ return Number.NaN
+ }
+
+ const date2 = new Date(dateStr2)
+ const differenceInMilliseconds = date2.getTime() - date1.getTime()
+
+ return differenceInMilliseconds
+}
+// 获取当前年份
+
+export function getYear(): string {
+ return dayjs().year().toString()
+}
+export function getMonth(): string {
+ // 获取当前月份并加1,确保是1-12范围
+ const month = (dayjs().month() + 1).toString()
+ return month.padStart(2, '0') // 如果是单数月,前面加0
+}
+
+export function getDay(): string {
+ // 获取当前日期并转换为字符串
+ const day = dayjs().date().toString()
+ return day.padStart(2, '0') // 如果是单数天,前面加0
+}
+
+export function getCurrentDate() {
+ return dayjs().format('YYYY-MM-DD')
+}
+export function getCurrentDateTimeWithSeconds() {
+ return dayjs().format('YYYY-MM-DD HH:mm:ss')
+}
+export function stringToTimestamp(timeString: string, format: string): number {
+ const parsedDate = dayjs(timeString, format)
+ if (!parsedDate.isValid()) {
+ throw new Error('Invalid date string or format')
+ }
+ return parsedDate.valueOf() // 返回时间戳(以毫秒为单位)
+}
+export function timestampToString(timestamp: number, format: string): string {
+ const parsedDate = dayjs(timestamp)
+ return parsedDate.format(format)
+}
+/**
+ * 判断传入日期是否在今天的60天以内(含60天)
+ * @param dateStr - 日期字符串(如 '2025-02-01')
+ * @returns boolean - true 表示在60天内(包括第60天),false 表示超过60天
+ */
+export function isWithin60Days(dateStr: string): boolean {
+ if (!dateStr.trim()) {
+ return true
+ }
+ const inputDate = dayjs(dateStr)
+ const today = dayjs()
+ const diffDays = today.diff(inputDate, 'day')
+ return diffDays >= 0 && diffDays <= 60
+}
diff --git a/code/base-project/base-uniapp-main/test.html b/code/base-project/base-uniapp-main/test.html
index 01f29181..d052eb2d 100644
--- a/code/base-project/base-uniapp-main/test.html
+++ b/code/base-project/base-uniapp-main/test.html
@@ -1,138 +1,119 @@
-
+
-
-
- 个人中心
-
+
+
+附件管理
+
-
-