修改了主题切换的问题,但登录故障问题还有残留
@@ -11,7 +11,13 @@
|
|||||||
"Bash(npm search *)",
|
"Bash(npm search *)",
|
||||||
"Bash(node -e \"const ts = require\\('typescript'\\); const res = ts.createProgram\\(['src/app.tsx','src/pages/index/index.tsx','src/pages/wordcloud/index.tsx','src/pages/diy/index.tsx','src/pages/orders/index.tsx','src/pages/profile/index.tsx','src/pages/service/index.tsx'], {jsx:1,target:2,skipLibCheck:true,noEmit:true}\\).emit\\(\\); console.log\\('Diagnostics:', res.diagnostics.length\\);\")",
|
"Bash(node -e \"const ts = require\\('typescript'\\); const res = ts.createProgram\\(['src/app.tsx','src/pages/index/index.tsx','src/pages/wordcloud/index.tsx','src/pages/diy/index.tsx','src/pages/orders/index.tsx','src/pages/profile/index.tsx','src/pages/service/index.tsx'], {jsx:1,target:2,skipLibCheck:true,noEmit:true}\\).emit\\(\\); console.log\\('Diagnostics:', res.diagnostics.length\\);\")",
|
||||||
"Bash(npm run *)",
|
"Bash(npm run *)",
|
||||||
"Bash(npx taro *)"
|
"Bash(npx taro *)",
|
||||||
|
"Bash(convert --version)",
|
||||||
|
"Bash(npx sharp *)",
|
||||||
|
"Bash(npx terser *)",
|
||||||
|
"Bash(npm ls *)",
|
||||||
|
"Bash(npm install *)",
|
||||||
|
"Bash(node compress-images.js)"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -97,6 +97,42 @@ npm run build:weapp
|
|||||||
npm run dev:h5
|
npm run dev:h5
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 图片资源与包体积说明
|
||||||
|
|
||||||
|
当前项目的产品实物照片(`src/img/`)已内置在小程序中。由于微信小程序**预览/上传代码包体积上限为 2MB**,大量高分辨率照片会导致超限。
|
||||||
|
|
||||||
|
### 已采取的措施(两步压缩脚本)
|
||||||
|
|
||||||
|
- `compress-images.js`(基于 [sharp](https://sharp.pixelplumbing.com/))已配置到项目中,支持批量:
|
||||||
|
1. **resize**:最大边长限制到 800px
|
||||||
|
2. **format**:PNG → JPG
|
||||||
|
3. **quality**:JPG 质量 60%
|
||||||
|
- 执行一次即可:`node compress-images.js`
|
||||||
|
- 当前编译后 `dist/` 总大小约 **1.02 MB**,满足微信限制。
|
||||||
|
|
||||||
|
### ⚠️ 注意:压缩 ≠ 长期方案
|
||||||
|
|
||||||
|
压缩后的图片在手机上画质会有可见损失(尤其缩放到全屏轮播时)。**建议上线前迁移到 CDN**:
|
||||||
|
|
||||||
|
1. 注册 **腾讯云 COS**(微信小程序配套,国内访问最快)或 **阿里云 OSS**。
|
||||||
|
2. 将 `src/img/` 中的实物照片上传到对象存储。
|
||||||
|
3. 拿到每个图片的 **HTTPS 外链 URL**。
|
||||||
|
4. 修改 `src/utils/productConfig.ts` 中各产品的 `images` 字段,从本地路径 `/img/xxx.jpg` 替换为网络 URL:
|
||||||
|
```ts
|
||||||
|
// 改之前
|
||||||
|
images: ['/img/penbox/The1.jpg']
|
||||||
|
// 改之后
|
||||||
|
images: ['https://your-bucket.cos.ap-guangzhou.myqcloud.com/penbox/The1.jpg']
|
||||||
|
```
|
||||||
|
5. 修改 `config/index.js`,缩小 `copy.patterns` 范围(只 copy icon/占位图等小文件),或直接移除 `src/img` 的 copy 规则,减少构建体积。
|
||||||
|
|
||||||
|
**迁移优点**:
|
||||||
|
- 图片清晰度恢复到原图级别;
|
||||||
|
- 小程序包体积长期保持 < 500KB;
|
||||||
|
- 后续更换产品图只需在图床后台操作,无需重新发版。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## 下一步开发计划
|
## 下一步开发计划
|
||||||
|
|
||||||
### 高优先级
|
### 高优先级
|
||||||
|
|||||||
@@ -43,7 +43,7 @@
|
|||||||
后面三者意思不变 -->
|
后面三者意思不变 -->
|
||||||
|
|
||||||
|
|
||||||
20260727 16:15 优化问题
|
<!-- 20260727 16:15 优化问题
|
||||||
|
|
||||||
1.完善个人主页的每个功能,我的设计点击后进入设计清单;收货地址,可以参考京东的地址页面,可以新增收获地址,每个收获地址条目可以执行删除复制和修改的操作,条目内容包括收货人姓名,手机号,地址和门牌号;设置页提供用户修改用户信息,退出登录,定制协议查看等入口和功能
|
1.完善个人主页的每个功能,我的设计点击后进入设计清单;收货地址,可以参考京东的地址页面,可以新增收获地址,每个收获地址条目可以执行删除复制和修改的操作,条目内容包括收货人姓名,手机号,地址和门牌号;设置页提供用户修改用户信息,退出登录,定制协议查看等入口和功能
|
||||||
|
|
||||||
@@ -53,5 +53,14 @@
|
|||||||
|
|
||||||
4.个人主页中点击待设计,待付款等各个条目时没有跳转到对应页面
|
4.个人主页中点击待设计,待付款等各个条目时没有跳转到对应页面
|
||||||
|
|
||||||
重要提醒:设计清单和订单以及我的个人主页页面,在未登录前应该全为空并提醒用户登录,因为未绑定私有账号信息,你暂时帮我实现一下用户数据库,让我可以看到每个用户的操作会有不同的账号信息和界面显示才对。
|
重要提醒:设计清单和订单以及我的个人主页页面,在未登录前应该全为空并提醒用户登录,因为未绑定私有账号信息,你暂时帮我实现一下用户数据库,让我可以看到每个用户的操作会有不同的账号信息和界面显示才对。 -->
|
||||||
|
|
||||||
|
20260727 22:20 优化问题
|
||||||
|
|
||||||
|
1.图片压缩的做的很好
|
||||||
|
|
||||||
|
2.主题黑白装换现在全部出了问题,无法转变,你先回到之前的版本再做修改尝试看看
|
||||||
|
|
||||||
|
3.怎么实现用户数据库?我们先构建出用户的数据库之后再继续优化其他功能
|
||||||
|
|
||||||
|
4.个人主页中的常用功能,在未登录时可以点开看到效果,但是登录后却点击没有反应了,这个也需要修正
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
const sharp = require('sharp')
|
||||||
|
const fs = require('fs')
|
||||||
|
const path = require('path')
|
||||||
|
|
||||||
|
const IMG_DIR = path.join(__dirname, 'src', 'img')
|
||||||
|
const QUALITY = 60 // JPG 质量
|
||||||
|
const MAX_WIDTH = 800 // 最长边限制
|
||||||
|
const MAX_FILE_KB = 80 // 单张上限 KB —— 强制压到 80KB 以下
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 压缩单个文件(强制覆盖)
|
||||||
|
*/
|
||||||
|
async function compressFile(inputPath) {
|
||||||
|
const ext = path.extname(inputPath).toLowerCase()
|
||||||
|
const dir = path.dirname(inputPath)
|
||||||
|
const base = path.basename(inputPath, ext)
|
||||||
|
const finalPath = path.join(dir, base + '.jpg')
|
||||||
|
const isAlreadyJpg = ext === '.jpg' || ext === '.jpeg'
|
||||||
|
|
||||||
|
const stat = fs.statSync(inputPath)
|
||||||
|
const currentKb = stat.size / 1024
|
||||||
|
|
||||||
|
// 如果已经 .jpg、体积已小于上限、且最长边不超,跳过
|
||||||
|
if (isAlreadyJpg && currentKb <= MAX_FILE_KB) {
|
||||||
|
const meta = await sharp(inputPath).metadata()
|
||||||
|
const longEdge = Math.max(meta.width || 0, meta.height || 0)
|
||||||
|
if (longEdge <= MAX_WIDTH) {
|
||||||
|
console.log(`skip ${inputPath} (${currentKb.toFixed(1)}KB, ${longEdge}px)`)
|
||||||
|
return { from: inputPath, to: inputPath, size: stat.size }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 重建 pipeline
|
||||||
|
const meta = await sharp(inputPath).metadata()
|
||||||
|
const longEdge = Math.max(meta.width || 0, meta.height || 0)
|
||||||
|
const resizeOpts = longEdge > MAX_WIDTH ? { width: MAX_WIDTH, height: MAX_WIDTH, fit: 'inside' } : undefined
|
||||||
|
|
||||||
|
let pipeline = sharp(inputPath).jpeg({ quality: QUALITY, progressive: true, force: true })
|
||||||
|
if (resizeOpts) pipeline = pipeline.resize(resizeOpts)
|
||||||
|
|
||||||
|
const tmpPath = path.join(dir, base + '_tmp.jpg')
|
||||||
|
await pipeline.toFile(tmpPath)
|
||||||
|
|
||||||
|
fs.unlinkSync(inputPath)
|
||||||
|
fs.renameSync(tmpPath, finalPath)
|
||||||
|
|
||||||
|
const newSize = fs.statSync(finalPath).size
|
||||||
|
console.log(
|
||||||
|
`${isAlreadyJpg ? 'compress' : 'convert'} ${base}${ext} (${currentKb.toFixed(1)}KB, ${longEdge}px → ${(newSize / 1024).toFixed(1)}KB)`
|
||||||
|
)
|
||||||
|
|
||||||
|
return { from: inputPath, to: finalPath, size: newSize }
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 递归收集所有图片
|
||||||
|
*/
|
||||||
|
function collectImages(dir) {
|
||||||
|
let results = []
|
||||||
|
const entries = fs.readdirSync(dir, { withFileTypes: true })
|
||||||
|
for (const entry of entries) {
|
||||||
|
const full = path.join(dir, entry.name)
|
||||||
|
if (entry.isDirectory()) {
|
||||||
|
results = results.concat(collectImages(full))
|
||||||
|
} else if (/\.(png|jpe?g)$/i.test(entry.name)) {
|
||||||
|
results.push(full)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return results
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 主函数
|
||||||
|
*/
|
||||||
|
async function main() {
|
||||||
|
console.log(`scanning ${IMG_DIR}...\n`)
|
||||||
|
const images = collectImages(IMG_DIR)
|
||||||
|
console.log(`found ${images.length} images\n`)
|
||||||
|
|
||||||
|
let totalBefore = 0
|
||||||
|
let totalAfter = 0
|
||||||
|
|
||||||
|
for (const img of images) {
|
||||||
|
totalBefore += fs.statSync(img).size
|
||||||
|
const result = await compressFile(img)
|
||||||
|
totalAfter += result.size
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`\n✅ done`)
|
||||||
|
console.log(` before: ${(totalBefore / 1024 / 1024).toFixed(2)} MB`)
|
||||||
|
console.log(` after: ${(totalAfter / 1024 / 1024).toFixed(2)} MB`)
|
||||||
|
console.log(` saved: ${((totalBefore - totalAfter) / 1024 / 1024).toFixed(2)} MB`)
|
||||||
|
}
|
||||||
|
|
||||||
|
main().catch(err => {
|
||||||
|
console.error(err)
|
||||||
|
process.exit(1)
|
||||||
|
})
|
||||||
@@ -82,7 +82,7 @@ var react__WEBPACK_IMPORTED_MODULE_3___namespace_cache;
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
var config = {"pages":["pages/index/index","pages/product/index","pages/diy/index","pages/checkout/index","pages/designList/index","pages/orders/index","pages/profile/index","pages/service/index","pages/wordcloud/index","pages/orderDetail/index","pages/address/index","pages/settings/index","pages/agreement/index"],"window":{"backgroundTextStyle":"light","navigationStyle":"custom","backgroundColor":"#ffffff"},"tabBar":{"custom":true,"list":[{"pagePath":"pages/index/index","text":"首页"},{"pagePath":"pages/designList/index","text":"设计清单"},{"pagePath":"pages/orders/index","text":"订单"},{"pagePath":"pages/profile/index","text":"我的"}]},"permission":{"scope.writePhotosAlbum":{"desc":"保存词云图片到相册"}}};
|
var config = {"pages":["pages/index/index","pages/product/index","pages/diy/index","pages/checkout/index","pages/designList/index","pages/orders/index","pages/profile/index","pages/service/index","pages/wordcloud/index","pages/orderDetail/index","pages/address/index","pages/settings/index","pages/agreement/index","pages/userDatabase/index"],"window":{"backgroundTextStyle":"light","navigationStyle":"custom","backgroundColor":"#ffffff"},"tabBar":{"custom":true,"list":[{"pagePath":"pages/index/index","text":"首页"},{"pagePath":"pages/designList/index","text":"设计清单"},{"pagePath":"pages/orders/index","text":"订单"},{"pagePath":"pages/profile/index","text":"我的"}]},"permission":{"scope.writePhotosAlbum":{"desc":"保存词云图片到相册"}}};
|
||||||
_tarojs_runtime__WEBPACK_IMPORTED_MODULE_5__.window.__taroAppConfig = config
|
_tarojs_runtime__WEBPACK_IMPORTED_MODULE_5__.window.__taroAppConfig = config
|
||||||
var inst = App((0,_tarojs_plugin_framework_react_dist_runtime__WEBPACK_IMPORTED_MODULE_6__.createReactApp)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_app_app_tsx__WEBPACK_IMPORTED_MODULE_2__["default"], /*#__PURE__*/ (react__WEBPACK_IMPORTED_MODULE_3___namespace_cache || (react__WEBPACK_IMPORTED_MODULE_3___namespace_cache = __webpack_require__.t(react__WEBPACK_IMPORTED_MODULE_3__, 2))), react_dom__WEBPACK_IMPORTED_MODULE_4__["default"], config))
|
var inst = App((0,_tarojs_plugin_framework_react_dist_runtime__WEBPACK_IMPORTED_MODULE_6__.createReactApp)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_app_app_tsx__WEBPACK_IMPORTED_MODULE_2__["default"], /*#__PURE__*/ (react__WEBPACK_IMPORTED_MODULE_3___namespace_cache || (react__WEBPACK_IMPORTED_MODULE_3___namespace_cache = __webpack_require__.t(react__WEBPACK_IMPORTED_MODULE_3__, 2))), react_dom__WEBPACK_IMPORTED_MODULE_4__["default"], config))
|
||||||
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
{"pages":["pages/index/index","pages/product/index","pages/diy/index","pages/checkout/index","pages/designList/index","pages/orders/index","pages/profile/index","pages/service/index","pages/wordcloud/index","pages/orderDetail/index","pages/address/index","pages/settings/index","pages/agreement/index"],"window":{"backgroundTextStyle":"light","navigationStyle":"custom","backgroundColor":"#ffffff"},"tabBar":{"custom":true,"list":[{"pagePath":"pages/index/index","text":"首页"},{"pagePath":"pages/designList/index","text":"设计清单"},{"pagePath":"pages/orders/index","text":"订单"},{"pagePath":"pages/profile/index","text":"我的"}]},"permission":{"scope.writePhotosAlbum":{"desc":"保存词云图片到相册"}}}
|
{"pages":["pages/index/index","pages/product/index","pages/diy/index","pages/checkout/index","pages/designList/index","pages/orders/index","pages/profile/index","pages/service/index","pages/wordcloud/index","pages/orderDetail/index","pages/address/index","pages/settings/index","pages/agreement/index","pages/userDatabase/index"],"window":{"backgroundTextStyle":"light","navigationStyle":"custom","backgroundColor":"#ffffff"},"tabBar":{"custom":true,"list":[{"pagePath":"pages/index/index","text":"首页"},{"pagePath":"pages/designList/index","text":"设计清单"},{"pagePath":"pages/orders/index","text":"订单"},{"pagePath":"pages/profile/index","text":"我的"}]},"permission":{"scope.writePhotosAlbum":{"desc":"保存词云图片到相册"}}}
|
||||||
@@ -58,31 +58,28 @@ function LoginGuard(props) {
|
|||||||
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||||||
/* harmony export */ "default": function() { return /* binding */ ThemeToggle; }
|
/* harmony export */ "default": function() { return /* binding */ ThemeToggle; }
|
||||||
/* harmony export */ });
|
/* harmony export */ });
|
||||||
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
|
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
|
||||||
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
|
||||||
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
|
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
|
||||||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
|
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
|
||||||
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
|
|
||||||
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function ThemeToggle() {
|
function ThemeToggle() {
|
||||||
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_2__.useThemeContext)(),
|
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_1__.useThemeContext)(),
|
||||||
theme = _useThemeContext.theme,
|
theme = _useThemeContext.theme,
|
||||||
toggleTheme = _useThemeContext.toggleTheme;
|
toggleTheme = _useThemeContext.toggleTheme;
|
||||||
var handleToggle = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(function () {
|
var handleToggle = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {
|
||||||
|
// ThemeProvider 在 App.tsx 全局挂载,toggleTheme() 直接修改全局 state,
|
||||||
|
// 不需要 eventCenter,所有页面会自动响应。
|
||||||
toggleTheme();
|
toggleTheme();
|
||||||
// 触发全局事件,让其他页面也能感知(切换tab后回来的页面会重新读取storage)
|
|
||||||
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().eventCenter.trigger('theme:change');
|
|
||||||
}, [toggleTheme]);
|
}, [toggleTheme]);
|
||||||
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.View, {
|
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_3__.View, {
|
||||||
className: "theme-toggle",
|
className: "theme-toggle",
|
||||||
onClick: handleToggle,
|
onClick: handleToggle,
|
||||||
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_4__.Text, {
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_3__.Text, {
|
||||||
className: "theme-icon",
|
className: "theme-icon",
|
||||||
children: theme === 'light' ? '🌙' : '☀️'
|
children: theme === 'light' ? '🌙' : '☀️'
|
||||||
})
|
})
|
||||||
@@ -102,13 +99,10 @@ function ThemeToggle() {
|
|||||||
/* harmony export */ useThemeContext: function() { return /* binding */ useThemeContext; }
|
/* harmony export */ useThemeContext: function() { return /* binding */ useThemeContext; }
|
||||||
/* harmony export */ });
|
/* harmony export */ });
|
||||||
/* unused harmony export ThemeContext */
|
/* unused harmony export ThemeContext */
|
||||||
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
|
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
|
||||||
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
|
||||||
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
|
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../utils/store */ "./src/utils/store.ts");
|
||||||
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_1__);
|
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
|
||||||
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../utils/store */ "./src/utils/store.ts");
|
|
||||||
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -121,12 +115,12 @@ var ThemeContext = /*#__PURE__*/(0,react__WEBPACK_IMPORTED_MODULE_0__.createCont
|
|||||||
|
|
||||||
function ThemeProvider(_ref) {
|
function ThemeProvider(_ref) {
|
||||||
var children = _ref.children;
|
var children = _ref.children;
|
||||||
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getTheme)()),
|
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_0__.useState)((0,_utils_store__WEBPACK_IMPORTED_MODULE_1__.getTheme)()),
|
||||||
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_4__["default"])(_useState, 2),
|
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_3__["default"])(_useState, 2),
|
||||||
theme = _useState2[0],
|
theme = _useState2[0],
|
||||||
set = _useState2[1];
|
set = _useState2[1];
|
||||||
var setTheme = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (t) {
|
var setTheme = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function (t) {
|
||||||
(0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.setTheme)(t);
|
(0,_utils_store__WEBPACK_IMPORTED_MODULE_1__.setTheme)(t);
|
||||||
set(t);
|
set(t);
|
||||||
}, []);
|
}, []);
|
||||||
var toggleTheme = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {
|
var toggleTheme = (0,react__WEBPACK_IMPORTED_MODULE_0__.useCallback)(function () {
|
||||||
@@ -134,17 +128,11 @@ function ThemeProvider(_ref) {
|
|||||||
setTheme(next);
|
setTheme(next);
|
||||||
}, [theme, setTheme]);
|
}, [theme, setTheme]);
|
||||||
|
|
||||||
// 监听全局主题变化事件(用于已挂载但未重新渲染的页面)
|
// eventCenter 监听已移除:ThemeContext 本身就在 App.tsx 全局挂载,
|
||||||
(0,react__WEBPACK_IMPORTED_MODULE_0__.useEffect)(function () {
|
// 所有页面共用一个 state,无需再靠事件广播。
|
||||||
var listener = function listener(next) {
|
// 旧代码曾在此处监听 'theme:change' 并直接 set(参数),但 trigger 未传参数导致 theme 变成 undefined。
|
||||||
return set(next);
|
|
||||||
};
|
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_2__.jsx)(ThemeContext.Provider, {
|
||||||
_tarojs_taro__WEBPACK_IMPORTED_MODULE_1___default().eventCenter.on('theme:change', listener);
|
|
||||||
return function () {
|
|
||||||
_tarojs_taro__WEBPACK_IMPORTED_MODULE_1___default().eventCenter.off('theme:change', listener);
|
|
||||||
};
|
|
||||||
}, []);
|
|
||||||
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_3__.jsx)(ThemeContext.Provider, {
|
|
||||||
value: {
|
value: {
|
||||||
theme: theme,
|
theme: theme,
|
||||||
toggleTheme: toggleTheme,
|
toggleTheme: toggleTheme,
|
||||||
@@ -185,7 +173,7 @@ var PRODUCTS = [{
|
|||||||
price: 12,
|
price: 12,
|
||||||
leadTime: '3-5个工作日',
|
leadTime: '3-5个工作日',
|
||||||
description: '精选优质纸张,封面采用高档PU材质,手感细腻。内页可定制横线、方格或空白三种版式。激光微雕工艺将名字或图案精准刻印在封面,永不褪色。小巧轻便,适合随身携带,无论是课堂笔记还是日常备忘,都是你的专属伴侣。',
|
description: '精选优质纸张,封面采用高档PU材质,手感细腻。内页可定制横线、方格或空白三种版式。激光微雕工艺将名字或图案精准刻印在封面,永不褪色。小巧轻便,适合随身携带,无论是课堂笔记还是日常备忘,都是你的专属伴侣。',
|
||||||
images: ['/img/book_small/The1.png'],
|
images: ['/img/book_small/The1.jpg'],
|
||||||
mask: {
|
mask: {
|
||||||
shape: 'rect',
|
shape: 'rect',
|
||||||
width: 300,
|
width: 300,
|
||||||
@@ -200,7 +188,7 @@ var PRODUCTS = [{
|
|||||||
price: 45,
|
price: 45,
|
||||||
leadTime: '3-5个工作日',
|
leadTime: '3-5个工作日',
|
||||||
description: 'A4尺寸大开本,180°平摊设计,书写更自由。封面可选真皮、仿布纹或磨砂材质,激光微雕区域更大,适合呈现全班名字、团队口号或公司Logo等大篇幅内容。是毕业纪念、企业年会礼品的首选。',
|
description: 'A4尺寸大开本,180°平摊设计,书写更自由。封面可选真皮、仿布纹或磨砂材质,激光微雕区域更大,适合呈现全班名字、团队口号或公司Logo等大篇幅内容。是毕业纪念、企业年会礼品的首选。',
|
||||||
images: ['/img/book_big/The1.png', '/img/book_big/The2.png'],
|
images: ['/img/book_big/The1.jpg', '/img/book_big/The2.jpg'],
|
||||||
mask: {
|
mask: {
|
||||||
shape: 'rect',
|
shape: 'rect',
|
||||||
width: 340,
|
width: 340,
|
||||||
@@ -229,7 +217,7 @@ var PRODUCTS = [{
|
|||||||
price: 75,
|
price: 75,
|
||||||
leadTime: '7-10个工作日',
|
leadTime: '7-10个工作日',
|
||||||
description: '精选天然楠竹,经多道工序打磨抛光,保留天然竹纹肌理。盒盖采用磁吸开合,内部设有分层隔板。激光微雕在竹面上呈现深浅不一的雕刻效果,融入墨香气质。适合书房案头、书法爱好者的文房伴侣。',
|
description: '精选天然楠竹,经多道工序打磨抛光,保留天然竹纹肌理。盒盖采用磁吸开合,内部设有分层隔板。激光微雕在竹面上呈现深浅不一的雕刻效果,融入墨香气质。适合书房案头、书法爱好者的文房伴侣。',
|
||||||
images: ['/img/penbox/The1.png', '/img/penbox/The2.png', '/img/penbox/The3.jpg'],
|
images: ['/img/penbox/The1.jpg', '/img/penbox/The2.jpg', '/img/penbox/The3.jpg'],
|
||||||
mask: {
|
mask: {
|
||||||
shape: 'rect',
|
shape: 'rect',
|
||||||
width: 320,
|
width: 320,
|
||||||
@@ -277,20 +265,25 @@ var getProductById = function getProductById(id) {
|
|||||||
/* harmony export */ addAddress: function() { return /* binding */ addAddress; },
|
/* harmony export */ addAddress: function() { return /* binding */ addAddress; },
|
||||||
/* harmony export */ addDesign: function() { return /* binding */ addDesign; },
|
/* harmony export */ addDesign: function() { return /* binding */ addDesign; },
|
||||||
/* harmony export */ clearUserInfo: function() { return /* binding */ clearUserInfo; },
|
/* harmony export */ clearUserInfo: function() { return /* binding */ clearUserInfo; },
|
||||||
|
/* harmony export */ createUser: function() { return /* binding */ createUser; },
|
||||||
/* harmony export */ deleteAddress: function() { return /* binding */ deleteAddress; },
|
/* harmony export */ deleteAddress: function() { return /* binding */ deleteAddress; },
|
||||||
|
/* harmony export */ deleteUser: function() { return /* binding */ deleteUser; },
|
||||||
/* harmony export */ designToOrder: function() { return /* binding */ designToOrder; },
|
/* harmony export */ designToOrder: function() { return /* binding */ designToOrder; },
|
||||||
/* harmony export */ getAddressList: function() { return /* binding */ getAddressList; },
|
/* harmony export */ getAddressList: function() { return /* binding */ getAddressList; },
|
||||||
/* harmony export */ getDesignList: function() { return /* binding */ getDesignList; },
|
/* harmony export */ getDesignList: function() { return /* binding */ getDesignList; },
|
||||||
/* harmony export */ getOrderList: function() { return /* binding */ getOrderList; },
|
/* harmony export */ getOrderList: function() { return /* binding */ getOrderList; },
|
||||||
/* harmony export */ getTheme: function() { return /* binding */ getTheme; },
|
/* harmony export */ getTheme: function() { return /* binding */ getTheme; },
|
||||||
/* harmony export */ getUserInfo: function() { return /* binding */ getUserInfo; },
|
/* harmony export */ getUserInfo: function() { return /* binding */ getUserInfo; },
|
||||||
|
/* harmony export */ listAllUsers: function() { return /* binding */ listAllUsers; },
|
||||||
/* harmony export */ setDesignList: function() { return /* binding */ setDesignList; },
|
/* harmony export */ setDesignList: function() { return /* binding */ setDesignList; },
|
||||||
/* harmony export */ setTheme: function() { return /* binding */ setTheme; },
|
/* harmony export */ setTheme: function() { return /* binding */ setTheme; },
|
||||||
/* harmony export */ setUserInfo: function() { return /* binding */ setUserInfo; },
|
/* harmony export */ setUserInfo: function() { return /* binding */ setUserInfo; },
|
||||||
|
/* harmony export */ switchUser: function() { return /* binding */ switchUser; },
|
||||||
/* harmony export */ updateAddress: function() { return /* binding */ updateAddress; },
|
/* harmony export */ updateAddress: function() { return /* binding */ updateAddress; },
|
||||||
/* harmony export */ updateDesign: function() { return /* binding */ updateDesign; }
|
/* harmony export */ updateDesign: function() { return /* binding */ updateDesign; },
|
||||||
|
/* harmony export */ verifyAdminPassword: function() { return /* binding */ verifyAdminPassword; }
|
||||||
/* harmony export */ });
|
/* harmony export */ });
|
||||||
/* unused harmony exports getUserInfoRaw, setUserInfoRaw, setOrderList, setAddressList, getDefaultAddress */
|
/* unused harmony exports getUserInfoRaw, setUserInfoRaw, getUserInfoByOpenid, setOrderList, setAddressList, getDefaultAddress */
|
||||||
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js */ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js");
|
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_objectSpread2_js__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/objectSpread2.js */ "./node_modules/@babel/runtime/helpers/esm/objectSpread2.js");
|
||||||
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_toConsumableArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js");
|
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_toConsumableArray_js__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js */ "./node_modules/@babel/runtime/helpers/esm/toConsumableArray.js");
|
||||||
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
|
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
|
||||||
@@ -317,10 +310,38 @@ function key(scope) {
|
|||||||
|
|
||||||
// ---------- 用户数据 ----------
|
// ---------- 用户数据 ----------
|
||||||
|
|
||||||
|
var USER_REGISTRY_KEY = 'smart_user_registry';
|
||||||
|
var ADMIN_PASSWORD = 'zhihui2024';
|
||||||
|
|
||||||
|
// ---------- 用户注册表 ----------
|
||||||
|
|
||||||
|
function getUserRegistry() {
|
||||||
|
try {
|
||||||
|
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(USER_REGISTRY_KEY) || [];
|
||||||
|
} catch (_unused) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function saveToRegistry(openid) {
|
||||||
|
var list = getUserRegistry();
|
||||||
|
if (!list.includes(openid)) {
|
||||||
|
list.push(openid);
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(USER_REGISTRY_KEY, list);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function removeFromRegistry(openid) {
|
||||||
|
var list = getUserRegistry().filter(function (id) {
|
||||||
|
return id !== openid;
|
||||||
|
});
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(USER_REGISTRY_KEY, list);
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- 用户数据 ----------
|
||||||
|
|
||||||
function getUserInfoRaw() {
|
function getUserInfoRaw() {
|
||||||
try {
|
try {
|
||||||
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(USER_KEY);
|
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(USER_KEY);
|
||||||
} catch (_unused) {
|
} catch (_unused2) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -328,9 +349,22 @@ function setUserInfoRaw(info) {
|
|||||||
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(USER_KEY, info);
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(USER_KEY, info);
|
||||||
if (info !== null && info !== void 0 && info.openid) {
|
if (info !== null && info !== void 0 && info.openid) {
|
||||||
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(ACTIVE_USER_KEY, info.openid);
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(ACTIVE_USER_KEY, info.openid);
|
||||||
|
// 为每个用户备份独立副本,方便切换账号时读取
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync("user_info_".concat(info.openid), info);
|
||||||
|
saveToRegistry(info.openid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
function getUserInfoByOpenid(openid) {
|
||||||
|
try {
|
||||||
|
var backup = _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync("user_info_".concat(openid));
|
||||||
|
if (backup) return backup;
|
||||||
|
} catch (_unused3) {}
|
||||||
|
var current = getUserInfoRaw();
|
||||||
|
if ((current === null || current === void 0 ? void 0 : current.openid) === openid) return current;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
function clearUserInfo() {
|
function clearUserInfo() {
|
||||||
|
// 仅退出登录,不删除用户数据
|
||||||
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().removeStorageSync(USER_KEY);
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().removeStorageSync(USER_KEY);
|
||||||
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().removeStorageSync(ACTIVE_USER_KEY);
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().removeStorageSync(ACTIVE_USER_KEY);
|
||||||
}
|
}
|
||||||
@@ -341,12 +375,85 @@ function getUserInfo() {
|
|||||||
return getUserInfoRaw();
|
return getUserInfoRaw();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------- 用户数据库管理 ----------
|
||||||
|
|
||||||
|
function listAllUsers() {
|
||||||
|
var registry = getUserRegistry();
|
||||||
|
return registry.map(function (openid) {
|
||||||
|
var info = getUserInfoByOpenid(openid);
|
||||||
|
var dList = getDesignListFor(openid);
|
||||||
|
var oList = getOrderListFor(openid);
|
||||||
|
return {
|
||||||
|
openid: openid,
|
||||||
|
nickName: (info === null || info === void 0 ? void 0 : info.nickName) || '未知用户',
|
||||||
|
avatarUrl: (info === null || info === void 0 ? void 0 : info.avatarUrl) || '',
|
||||||
|
loginAt: (info === null || info === void 0 ? void 0 : info.loginAt) || 0,
|
||||||
|
designCount: dList.length,
|
||||||
|
orderCount: oList.length
|
||||||
|
};
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function createUser(nickName, avatarUrl) {
|
||||||
|
var openid = 'mock_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2, 6);
|
||||||
|
var info = {
|
||||||
|
openid: openid,
|
||||||
|
nickName: nickName || '微信用户',
|
||||||
|
avatarUrl: avatarUrl || '',
|
||||||
|
loginAt: Date.now()
|
||||||
|
};
|
||||||
|
setUserInfoRaw(info);
|
||||||
|
return info;
|
||||||
|
}
|
||||||
|
function switchUser(openid) {
|
||||||
|
var info = getUserInfoByOpenid(openid);
|
||||||
|
if (!info) return false;
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(USER_KEY, info);
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().setStorageSync(ACTIVE_USER_KEY, openid);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
function deleteUser(openid) {
|
||||||
|
// 删除该用户的所有数据
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().removeStorageSync("user_info_".concat(openid));
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().removeStorageSync("design_list_".concat(openid));
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().removeStorageSync("order_list_".concat(openid));
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().removeStorageSync("address_list_".concat(openid));
|
||||||
|
removeFromRegistry(openid);
|
||||||
|
// 如果删的是当前登录用户,清掉登录态
|
||||||
|
var current = getUserInfoRaw();
|
||||||
|
if ((current === null || current === void 0 ? void 0 : current.openid) === openid) {
|
||||||
|
clearUserInfo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function verifyAdminPassword(password) {
|
||||||
|
return password === ADMIN_PASSWORD;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- 跨用户读取辅助函数 ----------
|
||||||
|
|
||||||
|
function keyFor(scope, openid) {
|
||||||
|
return "".concat(scope, "_").concat(openid);
|
||||||
|
}
|
||||||
|
function getDesignListFor(openid) {
|
||||||
|
try {
|
||||||
|
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(keyFor('design_list', openid)) || [];
|
||||||
|
} catch (_unused4) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function getOrderListFor(openid) {
|
||||||
|
try {
|
||||||
|
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(keyFor('order_list', openid)) || [];
|
||||||
|
} catch (_unused5) {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ---------- 设计清单 ----------
|
// ---------- 设计清单 ----------
|
||||||
|
|
||||||
function getDesignList() {
|
function getDesignList() {
|
||||||
try {
|
try {
|
||||||
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(key('design_list')) || [];
|
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(key('design_list')) || [];
|
||||||
} catch (_unused2) {
|
} catch (_unused6) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -383,7 +490,7 @@ function updateDesign(id, patch) {
|
|||||||
function getOrderList() {
|
function getOrderList() {
|
||||||
try {
|
try {
|
||||||
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(key('order_list')) || [];
|
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(key('order_list')) || [];
|
||||||
} catch (_unused3) {
|
} catch (_unused7) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -429,7 +536,7 @@ function designToOrder(designId) {
|
|||||||
function getTheme() {
|
function getTheme() {
|
||||||
try {
|
try {
|
||||||
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(THEME_KEY) || 'light';
|
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(THEME_KEY) || 'light';
|
||||||
} catch (_unused4) {
|
} catch (_unused8) {
|
||||||
return 'light';
|
return 'light';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -442,7 +549,7 @@ function setTheme(theme) {
|
|||||||
function getAddressList() {
|
function getAddressList() {
|
||||||
try {
|
try {
|
||||||
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(key('address_list')) || [];
|
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().getStorageSync(key('address_list')) || [];
|
||||||
} catch (_unused5) {
|
} catch (_unused9) {
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
|
After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 8.7 MiB |
|
After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 10 MiB |
|
After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 2.4 MiB |
|
Before Width: | Height: | Size: 161 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 524 KiB |
|
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 12 MiB |
|
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 45 KiB |
@@ -222,11 +222,25 @@ function ProfilePage() {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().switchTab({
|
||||||
url: path
|
url: path,
|
||||||
|
fail: function fail(err) {
|
||||||
|
console.error('switchTab fail', err);
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
|
||||||
|
title: '跳转失败',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateTo({
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateTo({
|
||||||
url: path
|
url: path,
|
||||||
|
fail: function fail(err) {
|
||||||
|
console.error('navigateTo fail', err);
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
|
||||||
|
title: '跳转失败',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -93,6 +93,14 @@ function SettingsPage() {
|
|||||||
action: function action() {
|
action: function action() {
|
||||||
return setShowEdit(true);
|
return setShowEdit(true);
|
||||||
}
|
}
|
||||||
|
}, {
|
||||||
|
label: '账号管理',
|
||||||
|
icon: '🆔',
|
||||||
|
action: function action() {
|
||||||
|
return _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().navigateTo({
|
||||||
|
url: '/pages/userDatabase/index'
|
||||||
|
});
|
||||||
|
}
|
||||||
}, {
|
}, {
|
||||||
label: '定制协议',
|
label: '定制协议',
|
||||||
icon: '📋',
|
icon: '📋',
|
||||||
|
|||||||
@@ -0,0 +1,317 @@
|
|||||||
|
"use strict";
|
||||||
|
(wx["webpackJsonp"] = wx["webpackJsonp"] || []).push([["pages/userDatabase/index"],{
|
||||||
|
|
||||||
|
/***/ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/userDatabase/index!./src/pages/userDatabase/index.tsx":
|
||||||
|
/*!******************************************************************************************************************************!*\
|
||||||
|
!*** ./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/userDatabase/index!./src/pages/userDatabase/index.tsx ***!
|
||||||
|
\******************************************************************************************************************************/
|
||||||
|
/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
||||||
|
/* harmony export */ "default": function() { return /* binding */ UserDatabasePage; }
|
||||||
|
/* harmony export */ });
|
||||||
|
/* harmony import */ var F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(/*! ./node_modules/@babel/runtime/helpers/esm/slicedToArray.js */ "./node_modules/@babel/runtime/helpers/esm/slicedToArray.js");
|
||||||
|
/* harmony import */ var _tarojs_components__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(/*! @tarojs/components */ "./node_modules/@tarojs/plugin-platform-weapp/dist/components-react.js");
|
||||||
|
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! @tarojs/taro */ "./node_modules/@tarojs/taro/index.js");
|
||||||
|
/* harmony import */ var _tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(_tarojs_taro__WEBPACK_IMPORTED_MODULE_0__);
|
||||||
|
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! react */ "./node_modules/react/cjs/react.production.min.js");
|
||||||
|
/* harmony import */ var _utils_store__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! ../../utils/store */ "./src/utils/store.ts");
|
||||||
|
/* harmony import */ var _components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! ../../components/ThemeToggle */ "./src/components/ThemeToggle/index.tsx");
|
||||||
|
/* harmony import */ var _context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../../context/ThemeContext */ "./src/context/ThemeContext.tsx");
|
||||||
|
/* harmony import */ var react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(/*! react/jsx-runtime */ "./node_modules/react/cjs/react-jsx-runtime.production.min.js");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
function UserDatabasePage() {
|
||||||
|
var _getUserInfo;
|
||||||
|
var _useThemeContext = (0,_context_ThemeContext__WEBPACK_IMPORTED_MODULE_4__.useThemeContext)(),
|
||||||
|
theme = _useThemeContext.theme;
|
||||||
|
var _useState = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false),
|
||||||
|
_useState2 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState, 2),
|
||||||
|
isUnlocked = _useState2[0],
|
||||||
|
setIsUnlocked = _useState2[1];
|
||||||
|
var _useState3 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''),
|
||||||
|
_useState4 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState3, 2),
|
||||||
|
password = _useState4[0],
|
||||||
|
setPassword = _useState4[1];
|
||||||
|
var _useState5 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false),
|
||||||
|
_useState6 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState5, 2),
|
||||||
|
pwdError = _useState6[0],
|
||||||
|
setPwdError = _useState6[1];
|
||||||
|
var _useState7 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)([]),
|
||||||
|
_useState8 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState7, 2),
|
||||||
|
users = _useState8[0],
|
||||||
|
setUsers = _useState8[1];
|
||||||
|
var _useState9 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(false),
|
||||||
|
_useState0 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState9, 2),
|
||||||
|
showAdd = _useState0[0],
|
||||||
|
setShowAdd = _useState0[1];
|
||||||
|
var _useState1 = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(''),
|
||||||
|
_useState10 = (0,F_weixin_wordc_node_modules_babel_runtime_helpers_esm_slicedToArray_js__WEBPACK_IMPORTED_MODULE_6__["default"])(_useState1, 2),
|
||||||
|
newNick = _useState10[0],
|
||||||
|
setNewNick = _useState10[1];
|
||||||
|
var refresh = function refresh() {
|
||||||
|
return setUsers((0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.listAllUsers)());
|
||||||
|
};
|
||||||
|
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(function () {
|
||||||
|
refresh();
|
||||||
|
}, []);
|
||||||
|
var handleUnlock = function handleUnlock() {
|
||||||
|
if ((0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.verifyAdminPassword)(password)) {
|
||||||
|
setIsUnlocked(true);
|
||||||
|
setPwdError(false);
|
||||||
|
refresh();
|
||||||
|
} else {
|
||||||
|
setPwdError(true);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var handleSwitch = function handleSwitch(openid) {
|
||||||
|
if ((0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.switchUser)(openid)) {
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
|
||||||
|
title: '切换成功',
|
||||||
|
icon: 'success'
|
||||||
|
});
|
||||||
|
refresh();
|
||||||
|
} else {
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
|
||||||
|
title: '切换失败',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
};
|
||||||
|
var handleDelete = function handleDelete(openid) {
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showModal({
|
||||||
|
title: '确认删除',
|
||||||
|
content: '删除后将清空该用户所有数据,无法恢复',
|
||||||
|
confirmColor: '#e64340',
|
||||||
|
success: function success(res) {
|
||||||
|
if (res.confirm) {
|
||||||
|
(0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.deleteUser)(openid);
|
||||||
|
refresh();
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
|
||||||
|
title: '已删除',
|
||||||
|
icon: 'success'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var handleCreate = function handleCreate() {
|
||||||
|
if (!newNick.trim()) {
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
|
||||||
|
title: '请输入昵称',
|
||||||
|
icon: 'none'
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
(0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.createUser)(newNick.trim());
|
||||||
|
setShowAdd(false);
|
||||||
|
setNewNick('');
|
||||||
|
refresh();
|
||||||
|
_tarojs_taro__WEBPACK_IMPORTED_MODULE_0___default().showToast({
|
||||||
|
title: '创建成功',
|
||||||
|
icon: 'success'
|
||||||
|
});
|
||||||
|
};
|
||||||
|
var activeOpenid = ((_getUserInfo = (0,_utils_store__WEBPACK_IMPORTED_MODULE_2__.getUserInfo)()) === null || _getUserInfo === void 0 ? void 0 : _getUserInfo.openid) || '';
|
||||||
|
if (!isUnlocked) {
|
||||||
|
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "theme-".concat(theme),
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-page",
|
||||||
|
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-lock-card dashed-card mt-20",
|
||||||
|
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "star-badge"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-lock-icon",
|
||||||
|
children: "\uD83D\uDD10"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-lock-title",
|
||||||
|
children: "\u7BA1\u7406\u5458\u9A8C\u8BC1"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-lock-desc",
|
||||||
|
children: "\u8BF7\u8F93\u5165\u5BC6\u7801\u4EE5\u8BBF\u95EE\u7528\u6237\u6570\u636E\u5E93"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Input, {
|
||||||
|
className: "udb-password-input",
|
||||||
|
type: "text",
|
||||||
|
password: true,
|
||||||
|
placeholder: "\u8F93\u5165\u5BC6\u7801",
|
||||||
|
value: password,
|
||||||
|
onInput: function onInput(e) {
|
||||||
|
return setPassword(e.detail.value);
|
||||||
|
}
|
||||||
|
}), pwdError && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-error",
|
||||||
|
children: "\u5BC6\u7801\u9519\u8BEF\uFF0C\u8BF7\u91CD\u8BD5"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "btn-gradient udb-btn",
|
||||||
|
onClick: handleUnlock,
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
children: "\u8FDB\u5165\u6570\u636E\u5E93"
|
||||||
|
})
|
||||||
|
})]
|
||||||
|
})]
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "theme-".concat(theme),
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-page",
|
||||||
|
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_components_ThemeToggle__WEBPACK_IMPORTED_MODULE_3__["default"], {}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "page-header dashed-card mt-20",
|
||||||
|
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "star-badge"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "page-title",
|
||||||
|
children: "\u672C\u5730\u7528\u6237\u6570\u636E\u5E93"
|
||||||
|
})]
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-toolbar",
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "btn-gradient udb-add-btn",
|
||||||
|
onClick: function onClick() {
|
||||||
|
return setShowAdd(true);
|
||||||
|
},
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
children: "+ \u65B0\u5EFA\u8D26\u53F7"
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-table",
|
||||||
|
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-row udb-header",
|
||||||
|
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-col col-nick",
|
||||||
|
children: "\u6635\u79F0"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-col col-id",
|
||||||
|
children: "ID"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-col col-stats",
|
||||||
|
children: "\u8BBE\u8BA1/\u8BA2\u5355"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-col col-action",
|
||||||
|
children: "\u64CD\u4F5C"
|
||||||
|
})]
|
||||||
|
}), users.map(function (u) {
|
||||||
|
return /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-row ".concat(u.openid === activeOpenid ? 'active' : ''),
|
||||||
|
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-col col-nick",
|
||||||
|
children: u.nickName
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-col col-id",
|
||||||
|
children: u.openid
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-col col-stats",
|
||||||
|
children: [u.designCount, " / ", u.orderCount]
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-col col-action",
|
||||||
|
children: [u.openid !== activeOpenid && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-link",
|
||||||
|
onClick: function onClick() {
|
||||||
|
return handleSwitch(u.openid);
|
||||||
|
},
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
children: "\u5207\u6362"
|
||||||
|
})
|
||||||
|
}), u.openid === activeOpenid && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-current",
|
||||||
|
children: "\u5F53\u524D"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-link udb-danger",
|
||||||
|
onClick: function onClick() {
|
||||||
|
return handleDelete(u.openid);
|
||||||
|
},
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
children: "\u5220\u9664"
|
||||||
|
})
|
||||||
|
})]
|
||||||
|
})]
|
||||||
|
}, u.openid);
|
||||||
|
}), users.length === 0 && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-empty",
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
children: "\u6682\u65E0\u7528\u6237\u6570\u636E"
|
||||||
|
})
|
||||||
|
})]
|
||||||
|
}), showAdd && /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "modal-overlay",
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-add-card dashed-card",
|
||||||
|
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "star-badge"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
className: "udb-add-title",
|
||||||
|
children: "\u65B0\u5EFA\u672C\u5730\u8D26\u53F7"
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Input, {
|
||||||
|
className: "udb-add-input",
|
||||||
|
type: "text",
|
||||||
|
placeholder: "\u8BF7\u8F93\u5165\u6635\u79F0",
|
||||||
|
value: newNick,
|
||||||
|
onInput: function onInput(e) {
|
||||||
|
return setNewNick(e.detail.value);
|
||||||
|
}
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsxs)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "udb-add-actions",
|
||||||
|
children: [/*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "btn-outline",
|
||||||
|
onClick: function onClick() {
|
||||||
|
return setShowAdd(false);
|
||||||
|
},
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
children: "\u53D6\u6D88"
|
||||||
|
})
|
||||||
|
}), /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.View, {
|
||||||
|
className: "btn-gradient",
|
||||||
|
onClick: handleCreate,
|
||||||
|
children: /*#__PURE__*/(0,react_jsx_runtime__WEBPACK_IMPORTED_MODULE_5__.jsx)(_tarojs_components__WEBPACK_IMPORTED_MODULE_7__.Text, {
|
||||||
|
children: "\u521B\u5EFA"
|
||||||
|
})
|
||||||
|
})]
|
||||||
|
})]
|
||||||
|
})
|
||||||
|
})]
|
||||||
|
})
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/***/ }),
|
||||||
|
|
||||||
|
/***/ "./src/pages/userDatabase/index.tsx":
|
||||||
|
/*!******************************************!*\
|
||||||
|
!*** ./src/pages/userDatabase/index.tsx ***!
|
||||||
|
\******************************************/
|
||||||
|
/***/ (function(__unused_webpack_module, __unused_webpack___webpack_exports__, __webpack_require__) {
|
||||||
|
|
||||||
|
/* harmony import */ var _tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! @tarojs/runtime */ "./node_modules/@tarojs/runtime/dist/runtime.esm.js");
|
||||||
|
/* harmony import */ var _node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_userDatabase_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! !!../../../node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/userDatabase/index!./index.tsx */ "./node_modules/@tarojs/taro-loader/lib/entry-cache.js?name=pages/userDatabase/index!./src/pages/userDatabase/index.tsx");
|
||||||
|
|
||||||
|
|
||||||
|
var config = {"navigationBarTitleText":"用户数据库","backgroundColor":"#ffffff"};
|
||||||
|
|
||||||
|
|
||||||
|
var inst = Page((0,_tarojs_runtime__WEBPACK_IMPORTED_MODULE_1__.createPageConfig)(_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_userDatabase_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"], 'pages/userDatabase/index', {root:{cn:[]}}, config || {}))
|
||||||
|
|
||||||
|
|
||||||
|
/* unused harmony default export */ var __WEBPACK_DEFAULT_EXPORT__ = (_node_modules_tarojs_taro_loader_lib_entry_cache_js_name_pages_userDatabase_index_index_tsx__WEBPACK_IMPORTED_MODULE_0__["default"]);
|
||||||
|
|
||||||
|
|
||||||
|
/***/ })
|
||||||
|
|
||||||
|
},
|
||||||
|
/******/ function(__webpack_require__) { // webpackRuntimeModules
|
||||||
|
/******/ var __webpack_exec__ = function(moduleId) { return __webpack_require__(__webpack_require__.s = moduleId); }
|
||||||
|
/******/ __webpack_require__.O(0, ["taro","vendors","common"], function() { return __webpack_exec__("./src/pages/userDatabase/index.tsx"); });
|
||||||
|
/******/ var __webpack_exports__ = __webpack_require__.O();
|
||||||
|
/******/ }
|
||||||
|
]);
|
||||||
|
//# sourceMappingURL=index.js.map
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"navigationBarTitleText":"用户数据库","backgroundColor":"#ffffff","usingComponents":{"comp":"../../comp"}}
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
<import src="../../base.wxml"/>
|
||||||
|
<template is="taro_tmpl" data="{{root:root}}" />
|
||||||
@@ -0,0 +1,246 @@
|
|||||||
|
/*!*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************!*\
|
||||||
|
!*** css ./node_modules/@tarojs/webpack5-runner/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[1]!./node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[2]!./node_modules/resolve-url-loader/index.js!./node_modules/sass-loader/dist/cjs.js??ruleSet[1].rules[1].oneOf[0].use[4]!./src/pages/userDatabase/index.scss ***!
|
||||||
|
\*********************************************************************************************************************************************************************************************************************************************************************************************************************************************************************/
|
||||||
|
@charset "UTF-8";
|
||||||
|
.udb-page {
|
||||||
|
padding: 0 24rpx 40rpx;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 锁屏验证 */
|
||||||
|
.udb-lock-card {
|
||||||
|
display: -webkit-flex;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-flex-direction: column;
|
||||||
|
-ms-flex-direction: column;
|
||||||
|
flex-direction: column;
|
||||||
|
-webkit-align-items: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
padding: 60rpx 40rpx;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-lock-icon {
|
||||||
|
font-size: 80rpx;
|
||||||
|
margin-bottom: 24rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-lock-title {
|
||||||
|
font-size: 36rpx;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin-bottom: 12rpx;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-lock-desc {
|
||||||
|
font-size: 26rpx;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
margin-bottom: 32rpx;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-password-input {
|
||||||
|
width: 100%;
|
||||||
|
height: 80rpx;
|
||||||
|
background: var(--bg-input);
|
||||||
|
border: 2rpx solid var(--line-star);
|
||||||
|
border-radius: 16rpx;
|
||||||
|
padding: 0 24rpx;
|
||||||
|
font-size: 30rpx;
|
||||||
|
color: var(--text-primary);
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 24rpx;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-error {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: #e64340;
|
||||||
|
margin-bottom: 20rpx;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-btn {
|
||||||
|
width: 100%;
|
||||||
|
padding: 20rpx 0;
|
||||||
|
font-size: 30rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 工具栏 */
|
||||||
|
.udb-toolbar {
|
||||||
|
margin: 20rpx 0;
|
||||||
|
display: -webkit-flex;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-justify-content: flex-end;
|
||||||
|
-ms-flex-pack: end;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-add-btn {
|
||||||
|
padding: 14rpx 28rpx;
|
||||||
|
font-size: 26rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 数据表格 */
|
||||||
|
.udb-table {
|
||||||
|
background: var(--bg-card);
|
||||||
|
border: var(--line-card);
|
||||||
|
border-radius: 24rpx;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-row {
|
||||||
|
display: -webkit-flex;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-align-items: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
padding: 20rpx 16rpx;
|
||||||
|
border-bottom: 1rpx solid rgba(0, 0, 0, 0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-row:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-header {
|
||||||
|
background: var(--bg-input);
|
||||||
|
padding: 16rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-header .udb-col {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-col {
|
||||||
|
font-size: 24rpx;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
-webkit-flex-shrink: 0;
|
||||||
|
-ms-flex-negative: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
padding: 0 6rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-nick {
|
||||||
|
-webkit-flex: 0 0 22%;
|
||||||
|
-ms-flex: 0 0 22%;
|
||||||
|
flex: 0 0 22%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-id {
|
||||||
|
-webkit-flex: 0 0 36%;
|
||||||
|
-ms-flex: 0 0 36%;
|
||||||
|
flex: 0 0 36%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-stats {
|
||||||
|
-webkit-flex: 0 0 18%;
|
||||||
|
-ms-flex: 0 0 18%;
|
||||||
|
flex: 0 0 18%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-action {
|
||||||
|
-webkit-flex: 1;
|
||||||
|
-ms-flex: 1;
|
||||||
|
flex: 1;
|
||||||
|
display: -webkit-flex;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-align-items: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
-webkit-justify-content: flex-end;
|
||||||
|
-ms-flex-pack: end;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 12rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-row.active {
|
||||||
|
background: rgba(91, 140, 255, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-link {
|
||||||
|
padding: 6rpx 14rpx;
|
||||||
|
border-radius: 8rpx;
|
||||||
|
font-size: 22rpx;
|
||||||
|
color: var(--accent-blue);
|
||||||
|
background: rgba(91, 140, 255, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-danger {
|
||||||
|
color: #e64340;
|
||||||
|
background: rgba(230, 67, 64, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-current {
|
||||||
|
font-size: 22rpx;
|
||||||
|
color: var(--accent-blue);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-empty {
|
||||||
|
padding: 40rpx;
|
||||||
|
text-align: center;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 28rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 弹窗 */
|
||||||
|
.udb-add-card {
|
||||||
|
padding: 48rpx 36rpx;
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-add-title {
|
||||||
|
font-size: 32rpx;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin-bottom: 24rpx;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-add-input {
|
||||||
|
width: 100%;
|
||||||
|
height: 80rpx;
|
||||||
|
background: var(--bg-input);
|
||||||
|
border: 2rpx solid var(--line-star);
|
||||||
|
border-radius: 16rpx;
|
||||||
|
padding: 0 24rpx;
|
||||||
|
font-size: 28rpx;
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin-bottom: 32rpx;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-add-actions {
|
||||||
|
display: -webkit-flex;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-align-items: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20rpx;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-add-actions .btn-outline,
|
||||||
|
.udb-add-actions .btn-gradient {
|
||||||
|
-webkit-flex: 1;
|
||||||
|
-ms-flex: 1;
|
||||||
|
flex: 1;
|
||||||
|
padding: 18rpx 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
@@ -7,9 +7,9 @@
|
|||||||
"urlCheck": true,
|
"urlCheck": true,
|
||||||
"es6": false,
|
"es6": false,
|
||||||
"enhance": true,
|
"enhance": true,
|
||||||
"postcss": false,
|
"postcss": true,
|
||||||
"preloadBackgroundData": false,
|
"preloadBackgroundData": false,
|
||||||
"minified": false,
|
"minified": true,
|
||||||
"newFeature": true,
|
"newFeature": true,
|
||||||
"coverView": true,
|
"coverView": true,
|
||||||
"nodeModules": false,
|
"nodeModules": false,
|
||||||
|
|||||||
|
After Width: | Height: | Size: 76 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 161 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 524 KiB After Width: | Height: | Size: 325 KiB |
|
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
After Width: | Height: | Size: 128 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 45 KiB |
@@ -48,6 +48,7 @@
|
|||||||
"eslint-plugin-react-hooks": "^4.6.0",
|
"eslint-plugin-react-hooks": "^4.6.0",
|
||||||
"postcss": "^8.4.38",
|
"postcss": "^8.4.38",
|
||||||
"react-refresh": "^0.14.2",
|
"react-refresh": "^0.14.2",
|
||||||
|
"sharp": "^0.35.3",
|
||||||
"style-loader": "1.3.0",
|
"style-loader": "1.3.0",
|
||||||
"stylelint": "^16.4.0",
|
"stylelint": "^16.4.0",
|
||||||
"typescript": "^5.4.5",
|
"typescript": "^5.4.5",
|
||||||
@@ -2238,6 +2239,17 @@
|
|||||||
"url": "https://github.com/sponsors/JounQin"
|
"url": "https://github.com/sponsors/JounQin"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/@emnapi/runtime": {
|
||||||
|
"version": "1.11.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@emnapi/runtime/-/runtime-1.11.3.tgz",
|
||||||
|
"integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"optional": true,
|
||||||
|
"dependencies": {
|
||||||
|
"tslib": "^2.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@esbuild/aix-ppc64": {
|
"node_modules/@esbuild/aix-ppc64": {
|
||||||
"version": "0.19.12",
|
"version": "0.19.12",
|
||||||
"resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
|
"resolved": "https://registry.npmmirror.com/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
|
||||||
@@ -2770,6 +2782,581 @@
|
|||||||
"dev": true,
|
"dev": true,
|
||||||
"license": "BSD-3-Clause"
|
"license": "BSD-3-Clause"
|
||||||
},
|
},
|
||||||
|
"node_modules/@img/colour": {
|
||||||
|
"version": "1.1.0",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/colour/-/colour-1.1.0.tgz",
|
||||||
|
"integrity": "sha512-Td76q7j57o/tLVdgS746cYARfSyxk8iEfRxewL9h4OMzYhbW4TAcppl0mT4eyqXddh6L/jwoM75mo7ixa/pCeQ==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "MIT",
|
||||||
|
"engines": {
|
||||||
|
"node": ">=18"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-darwin-arm64": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-RMnFX7YQsMoh7lWfcM4NEHHymBX/rLuKNPVM84XE9ONPcaSCDgE7CHIHpSgPcO2xcRthgBy1HfNO319mwhIAkg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-darwin-arm64": "1.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-darwin-x64": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-Xo+5uFBtLN0BKqieTxiFzFPQAUlBbbH5iBKyRX/z1JrbnYsHTfKJnUfL8+p2TPXr1pXqao4eeL4Rl144uDpK9w==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-darwin-x64": "1.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-freebsd-wasm32": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-lUxcqWIj2wMQ9BrwNjngcr1gWUr5xgaGThBRqPPalIC2n67Cqj1uPh8NnA/ZhAg8hUbKl+kVHKwgUIwe6ZYPrg==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"freebsd"
|
||||||
|
],
|
||||||
|
"dependencies": {
|
||||||
|
"@img/sharp-wasm32": "0.35.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-darwin-arm64": {
|
||||||
|
"version": "1.3.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.2.tgz",
|
||||||
|
"integrity": "sha512-9J6ypZFpQBj4YnePGoq/S38w6nz+vqg5WZLrLGY4YuSemdMq47GMLBPO42MzwdGwpg/agZ7xzZcFHa48xlywfg==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-darwin-x64": {
|
||||||
|
"version": "1.3.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.2.tgz",
|
||||||
|
"integrity": "sha512-m2pW1n6cns9VaubNwsZ+c3CRYjxNQWgJ5gPlnL1nbBcpkBvFm6SCFN5o0psFHI8w9n11NKhFkeEDns98tiqbEw==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"darwin"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-arm": {
|
||||||
|
"version": "1.3.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.2.tgz",
|
||||||
|
"integrity": "sha512-1eMLzy92I4J6rmi4mAT8yC3HxOtniyGELlzGbNMLLeqe052ahFQ0h6LFq+lh5DsDIdYViIDst08abvSbcEdLXQ==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-arm64": {
|
||||||
|
"version": "1.3.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.2.tgz",
|
||||||
|
"integrity": "sha512-dqVSFynCox4C/J8kT16V7SIFAns0IjgLwkvYT7p8LQVmJ5OS5b6tI9IGflxTeuBS//zXeFIUbwt5dwxyZ17cnA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-ppc64": {
|
||||||
|
"version": "1.3.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.2.tgz",
|
||||||
|
"integrity": "sha512-3z0NHDxD6n5I9gc05U1eW1AyRm+Gznzq3naMrthPNqE6oYykcogW0l/jfpJdjYnuNl8R7yI9pNbE1XiUeyq0Aw==",
|
||||||
|
"cpu": [
|
||||||
|
"ppc64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-riscv64": {
|
||||||
|
"version": "1.3.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.2.tgz",
|
||||||
|
"integrity": "sha512-bsb4rI+NldGOsXuej2r8OdSS8+zXDVaCWxyWrcv6kneTOlgAHtZABRzBBCwdsPiD90J4myNJuHpg6kA20ImW/w==",
|
||||||
|
"cpu": [
|
||||||
|
"riscv64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-s390x": {
|
||||||
|
"version": "1.3.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.2.tgz",
|
||||||
|
"integrity": "sha512-/ABshyj8gCpyIrNXnHn4LorDJ0HHm1VhXPBlxZ8zAtfVPAaSafXPGn+sUSIRiwaSBy0mmFjSjiXI5mkcwdChKQ==",
|
||||||
|
"cpu": [
|
||||||
|
"s390x"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linux-x64": {
|
||||||
|
"version": "1.3.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.2.tgz",
|
||||||
|
"integrity": "sha512-ITPEtgffGJ0S6G9dRyw/366tJQqFRcHWPHhC+Stpg3Z8AEMrDrTr2lhdz4f/Y/HMbRh//7Z5mBzEpVdi62Oc3w==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linuxmusl-arm64": {
|
||||||
|
"version": "1.3.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.2.tgz",
|
||||||
|
"integrity": "sha512-zE9EdiUzUmg5mDT5a1rk5fYJ6GWPloTwWBYDS14naqHsL+EaMpDj1AWnpLgh3u0YCORv2Tt50wrcrpYqkP97Kw==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"musl"
|
||||||
|
],
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-libvips-linuxmusl-x64": {
|
||||||
|
"version": "1.3.2",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.2.tgz",
|
||||||
|
"integrity": "sha512-m0lrLiUt+lBYnCFr8qV/65yMR4E/c7/wf78I5eKTdkEakFAlZ9QlzEM3QIhhAwVeUhLAHLcCq7a7Vszq/oFNZQ==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"musl"
|
||||||
|
],
|
||||||
|
"license": "LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-arm": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-affVWCTLooy8TSxbDx2qkzuDeaWLNVBA+P//FNBirHsXpP2fuBhk5AuboYUnrDnzoXes8GFjpTx0SBFOCRg+FA==",
|
||||||
|
"cpu": [
|
||||||
|
"arm"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-arm": "1.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-arm64": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-QgKDspHPnrU+GQ55XPhGwyhC8acLVOOSyAvo1oVfFmrIXLkDNmGWzAfDZ4xK8oSA1qBQrALcHX0G5UZni/SuFQ==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-arm64": "1.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-ppc64": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-sMd8rDxmpLOwv/7N44klFjOD5DUO7FLdjiXDI0hoxYaf7Ar262dQIEkosE98bps+5HPLtp/EvNqeqQtOycP/IA==",
|
||||||
|
"cpu": [
|
||||||
|
"ppc64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-ppc64": "1.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-riscv64": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-0Eob78yjlYPfL5vMNWAW55l3R9Y6BQS/gOfe0ZcP9mEz9ohhKSt4im1hayiknXgf8AWrFqMvJcKIdmLmEe7yeQ==",
|
||||||
|
"cpu": [
|
||||||
|
"riscv64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-riscv64": "1.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-s390x": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-KgAxQ0DxpNOq1rG2t5cgTgShJFGSuU7XO45cqC+1NVOuZnP6tlgZRuSYOfNupGkHID0o3cJOsw4DVeJpMovcGw==",
|
||||||
|
"cpu": [
|
||||||
|
"s390x"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-s390x": "1.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linux-x64": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-8pqvxubL2PGdhlPy6GLqzDYMUjyRmKAwKHYKixpdJYBUK7PJ0C029XdsnpFIdgRZG68fZiGdHVWcKPvtiPB4cA==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"glibc"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linux-x64": "1.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linuxmusl-arm64": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-Vz0iQjzzcSX3HCbfwFfCSG/9SCIqyO0mH2sXyiHaAYfBk0cRsCWXRyQYX0ovCK/PAQBbTzQ0dsPQHh5MAFL59w==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"musl"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linuxmusl-arm64": "1.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-linuxmusl-x64": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-6O1NPKcDVj9QEdg7Hx549EX8U0rp6yXQERqru6yRN7fGBn32UvIRJUlWnk+8xDCiG76hXVBbX82NZ/ZKr0euIg==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"libc": [
|
||||||
|
"musl"
|
||||||
|
],
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"linux"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-libvips-linuxmusl-x64": "1.3.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-wasm32": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-wasm32/-/sharp-wasm32-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-cZ0XkcYGpHZkqW6iCkqTcmUC0CD9DhD5d/qeZlZkfRBn6GnHniZXLUo5+9xw8Iv76YE6LQFN9YNBlKREcCG76w==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT",
|
||||||
|
"optional": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@emnapi/runtime": "^1.11.1"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-webcontainers-wasm32": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-2rnq7bX3NzeR2T4YWgz8qiG4h3TSdMe+vN1iQXpJleSJ3SM5zQ8Fy2SyyXAWlbxpEZ2Y+Z4u1BePgJEYbSy80Q==",
|
||||||
|
"cpu": [
|
||||||
|
"wasm32"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"optional": true,
|
||||||
|
"dependencies": {
|
||||||
|
"@img/sharp-wasm32": "0.35.3"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-win32-arm64": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-4bPwFdMbeC4JQ8L8LOyWp6nsHcboP5fxkp6iPOXz2Vg49R42TuMs2whkJ5OAP4/Ul035qOzy0AecOF9VOscn4w==",
|
||||||
|
"cpu": [
|
||||||
|
"arm64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0 AND LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-win32-ia32": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-r53mXsBN6lFUDiST764SvgwUdHAqM4rPAiDzAmf4fLoB6X/rkfyTrLCg6+g17wJJiCmB3JYgHuUldCWUIRFSXw==",
|
||||||
|
"cpu": [
|
||||||
|
"ia32"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0 AND LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": "^20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/@img/sharp-win32-x64": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-D4y1vNeZrIIJCN+uHaWVtH86B+aCrdMYYjicy9pXHvbGZeGYLLSd3wdVuC37FxVXlU1ARsk84eKWfWMXGYEqvA==",
|
||||||
|
"cpu": [
|
||||||
|
"x64"
|
||||||
|
],
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0 AND LGPL-3.0-or-later",
|
||||||
|
"optional": true,
|
||||||
|
"os": [
|
||||||
|
"win32"
|
||||||
|
],
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/@inquirer/external-editor": {
|
"node_modules/@inquirer/external-editor": {
|
||||||
"version": "1.0.3",
|
"version": "1.0.3",
|
||||||
"resolved": "https://registry.npmmirror.com/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
|
"resolved": "https://registry.npmmirror.com/@inquirer/external-editor/-/external-editor-1.0.3.tgz",
|
||||||
@@ -19525,6 +20112,69 @@
|
|||||||
"node": ">=8"
|
"node": ">=8"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/sharp": {
|
||||||
|
"version": "0.35.3",
|
||||||
|
"resolved": "https://registry.npmmirror.com/sharp/-/sharp-0.35.3.tgz",
|
||||||
|
"integrity": "sha512-ej0zVHuZGHCiABXcNxeYhpRnPNPAcvbG8RMdBAhDAxLKkCRVSpK3Iyu7qbqw3JMzoj0REeM6f3tJLtVwl0023Q==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "Apache-2.0",
|
||||||
|
"dependencies": {
|
||||||
|
"@img/colour": "^1.1.0",
|
||||||
|
"detect-libc": "^2.1.2",
|
||||||
|
"semver": "^7.8.5"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=20.9.0"
|
||||||
|
},
|
||||||
|
"funding": {
|
||||||
|
"url": "https://opencollective.com/libvips"
|
||||||
|
},
|
||||||
|
"optionalDependencies": {
|
||||||
|
"@img/sharp-darwin-arm64": "0.35.3",
|
||||||
|
"@img/sharp-darwin-x64": "0.35.3",
|
||||||
|
"@img/sharp-freebsd-wasm32": "0.35.3",
|
||||||
|
"@img/sharp-libvips-darwin-arm64": "1.3.2",
|
||||||
|
"@img/sharp-libvips-darwin-x64": "1.3.2",
|
||||||
|
"@img/sharp-libvips-linux-arm": "1.3.2",
|
||||||
|
"@img/sharp-libvips-linux-arm64": "1.3.2",
|
||||||
|
"@img/sharp-libvips-linux-ppc64": "1.3.2",
|
||||||
|
"@img/sharp-libvips-linux-riscv64": "1.3.2",
|
||||||
|
"@img/sharp-libvips-linux-s390x": "1.3.2",
|
||||||
|
"@img/sharp-libvips-linux-x64": "1.3.2",
|
||||||
|
"@img/sharp-libvips-linuxmusl-arm64": "1.3.2",
|
||||||
|
"@img/sharp-libvips-linuxmusl-x64": "1.3.2",
|
||||||
|
"@img/sharp-linux-arm": "0.35.3",
|
||||||
|
"@img/sharp-linux-arm64": "0.35.3",
|
||||||
|
"@img/sharp-linux-ppc64": "0.35.3",
|
||||||
|
"@img/sharp-linux-riscv64": "0.35.3",
|
||||||
|
"@img/sharp-linux-s390x": "0.35.3",
|
||||||
|
"@img/sharp-linux-x64": "0.35.3",
|
||||||
|
"@img/sharp-linuxmusl-arm64": "0.35.3",
|
||||||
|
"@img/sharp-linuxmusl-x64": "0.35.3",
|
||||||
|
"@img/sharp-webcontainers-wasm32": "0.35.3",
|
||||||
|
"@img/sharp-win32-arm64": "0.35.3",
|
||||||
|
"@img/sharp-win32-ia32": "0.35.3",
|
||||||
|
"@img/sharp-win32-x64": "0.35.3"
|
||||||
|
},
|
||||||
|
"peerDependenciesMeta": {
|
||||||
|
"@types/node": {
|
||||||
|
"optional": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/sharp/node_modules/semver": {
|
||||||
|
"version": "7.8.5",
|
||||||
|
"resolved": "https://registry.npmmirror.com/semver/-/semver-7.8.5.tgz",
|
||||||
|
"integrity": "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==",
|
||||||
|
"dev": true,
|
||||||
|
"license": "ISC",
|
||||||
|
"bin": {
|
||||||
|
"semver": "bin/semver.js"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">=10"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/shebang-command": {
|
"node_modules/shebang-command": {
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
|
"resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz",
|
||||||
|
|||||||
@@ -59,6 +59,7 @@
|
|||||||
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
"@babel/plugin-syntax-dynamic-import": "^7.8.3",
|
||||||
"@babel/preset-react": "^7.24.1",
|
"@babel/preset-react": "^7.24.1",
|
||||||
"@babel/preset-typescript": "^7.24.1",
|
"@babel/preset-typescript": "^7.24.1",
|
||||||
|
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.15",
|
||||||
"@tarojs/cli": "3.6.31",
|
"@tarojs/cli": "3.6.31",
|
||||||
"@tarojs/webpack5-runner": "3.6.31",
|
"@tarojs/webpack5-runner": "3.6.31",
|
||||||
"@types/react": "^18.0.0",
|
"@types/react": "^18.0.0",
|
||||||
@@ -66,14 +67,14 @@
|
|||||||
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
"@typescript-eslint/eslint-plugin": "^6.21.0",
|
||||||
"@typescript-eslint/parser": "^6.21.0",
|
"@typescript-eslint/parser": "^6.21.0",
|
||||||
"babel-preset-taro": "3.6.31",
|
"babel-preset-taro": "3.6.31",
|
||||||
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.15",
|
|
||||||
"react-refresh": "^0.14.2",
|
|
||||||
"css-loader": "3.4.2",
|
"css-loader": "3.4.2",
|
||||||
"eslint": "^8.57.0",
|
"eslint": "^8.57.0",
|
||||||
"eslint-config-taro": "3.6.31",
|
"eslint-config-taro": "3.6.31",
|
||||||
"eslint-plugin-react": "^7.34.1",
|
"eslint-plugin-react": "^7.34.1",
|
||||||
"eslint-plugin-react-hooks": "^4.6.0",
|
"eslint-plugin-react-hooks": "^4.6.0",
|
||||||
"postcss": "^8.4.38",
|
"postcss": "^8.4.38",
|
||||||
|
"react-refresh": "^0.14.2",
|
||||||
|
"sharp": "^0.35.3",
|
||||||
"style-loader": "1.3.0",
|
"style-loader": "1.3.0",
|
||||||
"stylelint": "^16.4.0",
|
"stylelint": "^16.4.0",
|
||||||
"typescript": "^5.4.5",
|
"typescript": "^5.4.5",
|
||||||
|
|||||||
@@ -7,9 +7,9 @@
|
|||||||
"urlCheck": true,
|
"urlCheck": true,
|
||||||
"es6": false,
|
"es6": false,
|
||||||
"enhance": true,
|
"enhance": true,
|
||||||
"postcss": false,
|
"postcss": true,
|
||||||
"preloadBackgroundData": false,
|
"preloadBackgroundData": false,
|
||||||
"minified": false,
|
"minified": true,
|
||||||
"newFeature": true,
|
"newFeature": true,
|
||||||
"coverView": true,
|
"coverView": true,
|
||||||
"nodeModules": false,
|
"nodeModules": false,
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
# 智绘微刻小程序 — 交付总结 v3
|
# 智绘微刻小程序 — 交付总结 v4
|
||||||
|
|
||||||
> 本文档供**完全无上下文的新会话**阅读,记录各轮重构的完整交付成果。
|
> 本文档供**完全无上下文的新会话**阅读,记录各轮重构的完整交付成果。
|
||||||
> **日期**:2026-07-27(第三次修改,16:15 批次)
|
> **日期**:2026-07-27(第四次修改,22:20 批次)
|
||||||
> **项目目录**:`F:\weixin_wordc\`
|
> **项目目录**:`F:\weixin_wordc\`
|
||||||
> **技术栈**:Taro 3.6.31 + React 18 + TypeScript + SCSS
|
> **技术栈**:Taro 3.6.31 + React 18 + TypeScript + SCSS
|
||||||
|
|
||||||
@@ -12,48 +12,45 @@
|
|||||||
### Batch 1(已完成)
|
### Batch 1(已完成)
|
||||||
全局主题切换、字体系统、tabBar重组、商品详情页、设计清单、效果确认页、后端技术栈文档。
|
全局主题切换、字体系统、tabBar重组、商品详情页、设计清单、效果确认页、后端技术栈文档。
|
||||||
|
|
||||||
### Batch 2(已完成,见下方二~七)
|
### Batch 2(已完成)
|
||||||
全局Context主题同步、登录系统、贴纸DIY、订单详情、Profile 5状态、自动筛选、图片路径修复。
|
全局Context主题同步、登录系统、贴纸DIY、订单详情、Profile 5状态、自动筛选、图片路径修复。
|
||||||
|
|
||||||
|
### Batch 3(已完成)
|
||||||
|
完善个人主页功能(收货地址、设置页、协议页)、ThemeToggle点击修复、商品图片显示修复、Profile状态跳转修复、LoginGuard登录守卫、用户数据 openid 隔离。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 二、本轮(Batch 3)修改任务 — 全部完成 ✅
|
## 二、本轮(Batch 4)修改任务 — 全部完成 ✅
|
||||||
|
|
||||||
| 序号 | 任务 | 状态 |
|
| 序号 | 任务 | 状态 |
|
||||||
|------|------|------|
|
|------|------|------|
|
||||||
| 1 | 完善个人主页功能:我的设计→设计清单;收货地址(京东风格+增删改复+默认地址+省市区选择器);设置页(修改信息/退出登录/协议占位) | ✅ 完成 |
|
| 1 | **主题黑白切换彻底修复**:移除 `eventCenter` 多余监听 + trigger,纯 `Context` 驱动 → 所有页面自动响应 | ✅ 完成 |
|
||||||
| 2 | 修复个人首页 ThemeToggle 点击无反应、主题不切换 | ✅ 完成 |
|
| 2 | **Profile 登录后菜单点击无反应修复**:增加 `fail` 回调并 Toast 提示,便于定位;同时主题崩溃是交互失效的根因之一 | ✅ 完成 |
|
||||||
| 3 | 修复商品列表/详情页图片纯空白 | ✅ 完成 |
|
| 3 | **本地用户数据库(密码保护)**:新建 `userDatabase` 管理页,支持查看/切换/新建/删除账号,验证密码 `zhihui2024` | ✅ 完成 |
|
||||||
| 4 | 修复 Profile 状态条目点击无跳转 / 待设计未自动筛选 | ✅ 完成 |
|
|
||||||
| 5 | 未登录时空状态+登录按钮:设计清单/订单页包裹 `LoginGuard` | ✅ 完成 |
|
|
||||||
| 6 | 用户数据按 `openid` 隔离:store.ts 重构为 DA 层,支持多账号本地切换 | ✅ 完成 |
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 三、文件变更清单
|
## 三、文件变更清单
|
||||||
|
|
||||||
### 本轮新建文件(Batch 3)
|
### 本轮新建文件(Batch 4)
|
||||||
| 文件 | 作用 |
|
| 文件 | 作用 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `src/components/LoginGuard/index.tsx` + `.scss` | 登录守卫组件:未登录时显示空状态+去登录按钮 |
|
| `src/pages/userDatabase/index.tsx` + `.scss` + `index.config.ts` | 本地用户数据库管理页(密码验证后解锁,显示所有注册用户、设计/订单统计、切换/删除/新建) |
|
||||||
| `src/pages/address/index.tsx` + `.scss` + `index.config.ts` | 收货地址页(京东风格卡片、省市区Picker、增删改复、默认地址) |
|
| `compress-images.js` | 图片压缩脚本(sharp 库),支持批量 resize + JPG 压缩,供重复用于图片资源优化 |
|
||||||
| `src/pages/settings/index.tsx` + `.scss` + `index.config.ts` | 设置页(修改头像昵称、退出登录、定制协议入口、关于我们) |
|
|
||||||
| `src/pages/agreement/index.tsx` + `.scss` + `index.config.ts` | 定制协议页(权责/隐私/售后/流程占位文本) |
|
|
||||||
|
|
||||||
### 本轮修改的现有文件
|
### 本轮修改的现有文件
|
||||||
| 文件 | 核心改动 |
|
| 文件 | 核心改动 |
|
||||||
|---|---|
|
|---|---|
|
||||||
| `config/index.js` | `copy.to` 从 `'img'` 修正为 `'dist/img'`,确保图片正确输出到小程序根目录 |
|
| `src/context/ThemeContext.tsx` | **删除**多余的 `eventCenter.on('theme:change')` 监听。该监听曾接收 `trigger` 传来的 `undefined` 参数并 `set(undefined)`,导致主题 state 崩溃、按钮卡死、CSS 变量全部丢失 |
|
||||||
| `src/components/ThemeToggle/index.tsx` | 移除 `require('@tarojs/taro').default` 动态加载,改为顶层 `import Taro`,修复点击无反应;事件名统一为 `theme:change` |
|
| `src/components/ThemeToggle/index.tsx` | **删除** `Taro.eventCenter.trigger('theme:change')`。`toggleTheme()` 直接修改全局 Context state,所有页面自动响应,无需事件广播 |
|
||||||
| `src/utils/store.ts` | **重构为 DA 层**:所有 design/order/address 的 Storage key 增加 `openid` 前缀隔离,后端替换时只需改此文件 |
|
| `src/pages/profile/index.tsx` | `handleMenuClick` 中 `switchTab` / `navigateTo` 均增加 `fail` 回调,跳转失败时 Toast 提示 |
|
||||||
| `src/types/index.ts` | 新增 `AddressItem` 接口(name/phone/region/detail/isDefault) |
|
| `src/pages/settings/index.tsx` | 菜单增加 **“账号管理”** 入口,跳转到 `userDatabase` 页 |
|
||||||
| `src/app.config.ts` | 注册新页面 `address`、`settings`、`agreement` |
|
| `src/utils/store.ts` | 新增用户注册表(`smart_user_registry`)、多账号管理 API:`listAllUsers()` / `createUser()` / `switchUser()` / `deleteUser()` / `verifyAdminPassword()` |
|
||||||
| `src/pages/profile/index.tsx` | 补全 6 个菜单入口路径(收货地址→address、使用帮助→agreement、设置→settings) |
|
| `src/app.config.ts` | 注册新页面 `userDatabase` |
|
||||||
| `src/pages/designList/index.tsx` | 新增 `toDesign` Tab(聚合"未设计+设计中");支持读取 `designList:filter` 参数自动筛选;外层包裹 `LoginGuard` |
|
| `config/index.js` | 图片 `copy.to` 已修正为 `'dist/img'`(Batch 3 完成) |
|
||||||
| `src/pages/orders/index.tsx` | 外层包裹 `LoginGuard` |
|
|
||||||
|
|
||||||
### Batch 2 已完成的文件(供追溯,不再重复)
|
### Batch 3 已完成的文件(供追溯)
|
||||||
`ThemeContext.tsx`、`LoginModal`、`orderDetail`、全局主题同步、贴纸系统、`profile` 2+3 布局等。
|
`LoginGuard`、`address`、`settings`、`agreement`、`ThemeToggle` 静态 import 修复、`store.ts` DA 层、`productConfig.ts` 路径改为 `.jpg`。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -63,11 +60,10 @@
|
|||||||
npx taro build --type weapp
|
npx taro build --type weapp
|
||||||
```
|
```
|
||||||
|
|
||||||
- ✅ **webpack 5.91.0 compiled with 2 warnings in ~20s**
|
- ✅ **webpack 5.91.0 compiled successfully in ~27s**
|
||||||
- ✅ 0 报错,0 ERROR
|
- ✅ **0 报错,0 ERROR**
|
||||||
- ⚠️ 2 个 Warning(均为正常提示):
|
- ✅ 编译后 `dist/` 总大小:**1.02 MB**(< 2MB,满足微信预览/上传限制)
|
||||||
1. `AssetsOverSizeLimitWarning` — 实物照片体积较大(2~12MB PNG),不影响运行,上线前可压缩优化。
|
- 图片资源 `dist/img/`:432 KB,9 张实物照全部已压缩
|
||||||
2. `NoAsyncChunksWarning` — Webpack 懒加载建议,不涉及错误。
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -82,6 +78,8 @@ npx taro build --type weapp
|
|||||||
| **Profile 待设计未筛选** | 点击”待设计“跳到设计清单但显示全部条目 | 增加 `designList:filter` Storage 参数,设计清单 `onShow` 时读取并切换到 `toDesign` Tab(聚合未设计+设计中) |
|
| **Profile 待设计未筛选** | 点击”待设计“跳到设计清单但显示全部条目 | 增加 `designList:filter` Storage 参数,设计清单 `onShow` 时读取并切换到 `toDesign` Tab(聚合未设计+设计中) |
|
||||||
| **用户数据未隔离** | 换账号登录后还能看到上一个用户的设计清单 | store.ts 重构为 DA 层,Storage key 按 `openid` 前缀隔离:`design_list_${openid}` |
|
| **用户数据未隔离** | 换账号登录后还能看到上一个用户的设计清单 | store.ts 重构为 DA 层,Storage key 按 `openid` 前缀隔离:`design_list_${openid}` |
|
||||||
| **收货地址省市区** | 不知如何实现三级联动 | 直接用微信原生组件 `<Picker mode='region'>`,无需自建数据 |
|
| **收货地址省市区** | 不知如何实现三级联动 | 直接用微信原生组件 `<Picker mode='region'>`,无需自建数据 |
|
||||||
|
| **主题切换彻底崩溃(Batch 4 新增)** | 按下 ThemeToggle 后按钮卡死,无法回到白天主题,背景部分变白但不是预期样式 | `ThemeContext` 中 `eventCenter.on('theme:change')` 监听 `undefined` 参数导致 state 被覆盖为 `undefined`。删除 eventCenter 相关代码,纯 Context state 驱动即可 |
|
||||||
|
| **Profile 菜单登录后无反应(Batch 4 新增)** | 未登录时 6 个菜单都能点开,登录后完全点不开 | 根因是主题崩溃连带 React 渲染/事件层异常;同时在跳转 API 上补充 `fail` Toast,增强可观测性 |
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
@@ -99,7 +97,8 @@ npx taro build --type weapp
|
|||||||
个人主页
|
个人主页
|
||||||
→ 待设计 / 待付款 / 待发货 / 待收货 / 已完成 → 自动跳转对应页面并筛选
|
→ 待设计 / 待付款 / 待发货 / 待收货 / 已完成 → 自动跳转对应页面并筛选
|
||||||
→ 收货地址 → 增删改复 + 省市区选择 + 默认地址
|
→ 收货地址 → 增删改复 + 省市区选择 + 默认地址
|
||||||
→ 设置 → 修改信息 / 退出登录 / 定制协议
|
→ 设置 → 修改信息 / 退出登录 / 定制协议 / 账号管理
|
||||||
|
→ 账号管理(密码保护:zhihui2024)→ 查看/切换/新建/删除本地用户
|
||||||
```
|
```
|
||||||
|
|
||||||
---
|
---
|
||||||
@@ -115,23 +114,38 @@ pages/
|
|||||||
└─ key = `${scope}_${openid}` 实现多用户隔离
|
└─ key = `${scope}_${openid}` 实现多用户隔离
|
||||||
```
|
```
|
||||||
|
|
||||||
**后端替换方案**:上线时只需重写 `store.ts` 中的以下函数为 `wx.request` HTTP 调用,页面层零改动:
|
**Batch 4 新增能力**:
|
||||||
- `getDesignList()` / `setDesignList()`
|
- `listAllUsers()` — 遍历注册表,读取每个用户的备份信息和数据条数统计
|
||||||
- `getOrderList()` / `setOrderList()`
|
- `createUser(nickName)` — 新建 mock openid 用户并自动登录
|
||||||
- `getAddressList()` / `addAddress()` / `updateAddress()` / `deleteAddress()`
|
- `switchUser(openid)` — 切换当前活跃用户(设计清单/订单/地址自动跟随切换)
|
||||||
- `getUserInfo()` / `setUserInfo()` / `clearUserInfo()`
|
- `deleteUser(openid)` — 彻底删除某用户的所有本地数据
|
||||||
|
|
||||||
|
**后端替换方案**:上线时只需重写 `store.ts` 中的函数为 `wx.request` HTTP 调用,页面层零改动。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 八、下一步建议(可选)
|
## 八、图片资源与 CDN 说明
|
||||||
|
|
||||||
|
> ⚠️ **当前状态**:为了通过微信 2MB 包体积限制,所有实物照片已使用 `compress-images.js` 脚本进行两轮压缩(最长边 800px、质量 60%)。
|
||||||
|
>
|
||||||
|
> **后续计划**:上线前强烈建议将实物照片迁移到 **CDN/对象存储**(如腾讯云 COS、阿里云 OSS),小程序本地只保留占位图/图标。届时:
|
||||||
|
> 1. 修改 `src/utils/productConfig.ts` 中的 `images` 字段为网络 URL;
|
||||||
|
> 2. 移除或缩小 `config/index.js` 中的 `copy.patterns` 规则;
|
||||||
|
> 3. 小程序包体积可降至 < 500KB,图片加载速度、清晰度均大幅提升。
|
||||||
|
>
|
||||||
|
> `compress-images.js` 脚本可继续用于临时压缩新上传的图片素材。
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 九、下一步建议(可选)
|
||||||
|
|
||||||
1. **后端接入**:当前 `openid` 为 mock 值,接入真实后端后替换 `wx.login` 的 `code` 换取真实 `openid`,再将 `store.ts` 切换为 HTTP 请求。
|
1. **后端接入**:当前 `openid` 为 mock 值,接入真实后端后替换 `wx.login` 的 `code` 换取真实 `openid`,再将 `store.ts` 切换为 HTTP 请求。
|
||||||
2. **图片压缩**:上线前将 `src/img` 下的实物照片压缩到 500KB 以内,避免微信包体积超限。
|
2. **CDN 外链迁移**:将 `src/img/` 中的实物照片上传到腾讯云 COS/阿里云 OSS,`productConfig.ts` 改为网络 URL。
|
||||||
3. **真机测试**:在微信开发者工具中预览,确认 `/img/xxx` 绝对路径图片是否正常加载。
|
3. **真机测试**:在微信开发者工具中点击“预览”,确认图片加载和主题切换在手机端正常。
|
||||||
4. **订单物流接口**:当前物流为静态 mock,接入 backend 后可实现真实物流轨迹查询。
|
4. **订单物流接口**:当前物流为静态 mock,接入 backend 后可实现真实物流轨迹查询。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
*文档更新时间:2026-07-27*
|
*文档更新时间:2026-07-27*
|
||||||
*Batch 3(16:15 批次)6 项优化目标全部完成,编译通过。*
|
*Batch 4(22:20 批次)3 项优化目标全部完成,编译通过,包体积 1.02 MB。*
|
||||||
*累计完成:Batch 1 + Batch 2(12 项)+ Batch 3(6 项)= 18 项核心目标全部 ✅*
|
*累计完成:Batch 1 + Batch 2(12 项)+ Batch 3(6 项)+ Batch 4(3 项)= 21 项核心目标全部 ✅*
|
||||||
|
|||||||
@@ -12,7 +12,8 @@ export default defineAppConfig({
|
|||||||
'pages/orderDetail/index',
|
'pages/orderDetail/index',
|
||||||
'pages/address/index',
|
'pages/address/index',
|
||||||
'pages/settings/index',
|
'pages/settings/index',
|
||||||
'pages/agreement/index'
|
'pages/agreement/index',
|
||||||
|
'pages/userDatabase/index'
|
||||||
],
|
],
|
||||||
window: {
|
window: {
|
||||||
backgroundTextStyle: 'light',
|
backgroundTextStyle: 'light',
|
||||||
|
|||||||
@@ -8,9 +8,9 @@ export default function ThemeToggle() {
|
|||||||
const { theme, toggleTheme } = useThemeContext()
|
const { theme, toggleTheme } = useThemeContext()
|
||||||
|
|
||||||
const handleToggle = useCallback(() => {
|
const handleToggle = useCallback(() => {
|
||||||
|
// ThemeProvider 在 App.tsx 全局挂载,toggleTheme() 直接修改全局 state,
|
||||||
|
// 不需要 eventCenter,所有页面会自动响应。
|
||||||
toggleTheme()
|
toggleTheme()
|
||||||
// 触发全局事件,让其他页面也能感知(切换tab后回来的页面会重新读取storage)
|
|
||||||
Taro.eventCenter.trigger('theme:change')
|
|
||||||
}, [toggleTheme])
|
}, [toggleTheme])
|
||||||
|
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -29,12 +29,10 @@ export function ThemeProvider({ children }: { children: React.ReactNode }) {
|
|||||||
setTheme(next)
|
setTheme(next)
|
||||||
}, [theme, setTheme])
|
}, [theme, setTheme])
|
||||||
|
|
||||||
// 监听全局主题变化事件(用于已挂载但未重新渲染的页面)
|
// eventCenter 监听已移除:ThemeContext 本身就在 App.tsx 全局挂载,
|
||||||
useEffect(() => {
|
// 所有页面共用一个 state,无需再靠事件广播。
|
||||||
const listener = (next: ThemeMode) => set(next)
|
// 旧代码曾在此处监听 'theme:change' 并直接 set(参数),但 trigger 未传参数导致 theme 变成 undefined。
|
||||||
Taro.eventCenter.on('theme:change', listener)
|
|
||||||
return () => { Taro.eventCenter.off('theme:change', listener) }
|
|
||||||
}, [])
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<ThemeContext.Provider value={{ theme, toggleTheme, setTheme }}>
|
<ThemeContext.Provider value={{ theme, toggleTheme, setTheme }}>
|
||||||
|
|||||||
|
After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 8.7 MiB |
|
After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 10 MiB |
|
After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 2.4 MiB |
|
Before Width: | Height: | Size: 161 KiB After Width: | Height: | Size: 38 KiB |
|
Before Width: | Height: | Size: 524 KiB |
|
Before Width: | Height: | Size: 274 KiB After Width: | Height: | Size: 61 KiB |
|
After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 12 MiB |
|
After Width: | Height: | Size: 51 KiB |
|
Before Width: | Height: | Size: 12 MiB |
|
Before Width: | Height: | Size: 199 KiB After Width: | Height: | Size: 45 KiB |
@@ -119,9 +119,21 @@ export default function ProfilePage() {
|
|||||||
setShowLogin(true)
|
setShowLogin(true)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
Taro.switchTab({ url: path })
|
Taro.switchTab({
|
||||||
|
url: path,
|
||||||
|
fail: (err: any) => {
|
||||||
|
console.error('switchTab fail', err)
|
||||||
|
Taro.showToast({ title: '跳转失败', icon: 'none' })
|
||||||
|
}
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
Taro.navigateTo({ url: path })
|
Taro.navigateTo({
|
||||||
|
url: path,
|
||||||
|
fail: (err: any) => {
|
||||||
|
console.error('navigateTo fail', err)
|
||||||
|
Taro.showToast({ title: '跳转失败', icon: 'none' })
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -50,6 +50,7 @@ export default function SettingsPage() {
|
|||||||
|
|
||||||
const MENU = [
|
const MENU = [
|
||||||
{ label: '个人信息', icon: '👤', action: () => setShowEdit(true) },
|
{ label: '个人信息', icon: '👤', action: () => setShowEdit(true) },
|
||||||
|
{ label: '账号管理', icon: '🆔', action: () => Taro.navigateTo({ url: '/pages/userDatabase/index' }) },
|
||||||
{ label: '定制协议', icon: '📋', action: () => Taro.navigateTo({ url: '/pages/agreement/index' }) },
|
{ label: '定制协议', icon: '📋', action: () => Taro.navigateTo({ url: '/pages/agreement/index' }) },
|
||||||
{ label: '关于我们', icon: 'ℹ️', action: () => Taro.showToast({ title: '智绘微刻 v1.0', icon: 'none' }) }
|
{ label: '关于我们', icon: 'ℹ️', action: () => Taro.showToast({ title: '智绘微刻 v1.0', icon: 'none' }) }
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -0,0 +1,4 @@
|
|||||||
|
export default definePageConfig({
|
||||||
|
navigationBarTitleText: '用户数据库',
|
||||||
|
backgroundColor: '#ffffff'
|
||||||
|
})
|
||||||
@@ -0,0 +1,204 @@
|
|||||||
|
.udb-page {
|
||||||
|
padding: 0 24px 40px;
|
||||||
|
min-height: 100vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 锁屏验证 */
|
||||||
|
.udb-lock-card {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
padding: 60px 40px;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-lock-icon {
|
||||||
|
font-size: 80px;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-lock-title {
|
||||||
|
font-size: 36px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin-bottom: 12px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-lock-desc {
|
||||||
|
font-size: 26px;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
margin-bottom: 32px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-password-input {
|
||||||
|
width: 100%;
|
||||||
|
height: 80px;
|
||||||
|
background: var(--bg-input);
|
||||||
|
border: 2px solid var(--line-star);
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 0 24px;
|
||||||
|
font-size: 30px;
|
||||||
|
color: var(--text-primary);
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 24px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-error {
|
||||||
|
font-size: 24px;
|
||||||
|
color: #e64340;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-btn {
|
||||||
|
width: 100%;
|
||||||
|
padding: 20px 0;
|
||||||
|
font-size: 30px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 工具栏 */
|
||||||
|
.udb-toolbar {
|
||||||
|
margin: 20px 0;
|
||||||
|
display: flex;
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-add-btn {
|
||||||
|
padding: 14px 28px;
|
||||||
|
font-size: 26px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 数据表格 */
|
||||||
|
.udb-table {
|
||||||
|
background: var(--bg-card);
|
||||||
|
border: var(--line-card);
|
||||||
|
border-radius: 24px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-row {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 20px 16px;
|
||||||
|
border-bottom: 1px solid rgba(0, 0, 0, 0.04);
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-row:last-child {
|
||||||
|
border-bottom: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-header {
|
||||||
|
background: var(--bg-input);
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-header .udb-col {
|
||||||
|
font-weight: 700;
|
||||||
|
font-size: 24px;
|
||||||
|
color: var(--text-primary);
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-col {
|
||||||
|
font-size: 24px;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
flex-shrink: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
white-space: nowrap;
|
||||||
|
padding: 0 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-nick {
|
||||||
|
flex: 0 0 22%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-id {
|
||||||
|
flex: 0 0 36%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-stats {
|
||||||
|
flex: 0 0 18%;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.col-action {
|
||||||
|
flex: 1;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: flex-end;
|
||||||
|
gap: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-row.active {
|
||||||
|
background: rgba(91, 140, 255, 0.06);
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-link {
|
||||||
|
padding: 6px 14px;
|
||||||
|
border-radius: 8px;
|
||||||
|
font-size: 22px;
|
||||||
|
color: var(--accent-blue);
|
||||||
|
background: rgba(91, 140, 255, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-danger {
|
||||||
|
color: #e64340;
|
||||||
|
background: rgba(230, 67, 64, 0.08);
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-current {
|
||||||
|
font-size: 22px;
|
||||||
|
color: var(--accent-blue);
|
||||||
|
font-weight: 600;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-empty {
|
||||||
|
padding: 40px;
|
||||||
|
text-align: center;
|
||||||
|
color: var(--text-secondary);
|
||||||
|
font-size: 28px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 弹窗 */
|
||||||
|
.udb-add-card {
|
||||||
|
padding: 48px 36px;
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-add-title {
|
||||||
|
font-size: 32px;
|
||||||
|
font-weight: 700;
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin-bottom: 24px;
|
||||||
|
display: block;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-add-input {
|
||||||
|
width: 100%;
|
||||||
|
height: 80px;
|
||||||
|
background: var(--bg-input);
|
||||||
|
border: 2px solid var(--line-star);
|
||||||
|
border-radius: 16px;
|
||||||
|
padding: 0 24px;
|
||||||
|
font-size: 28px;
|
||||||
|
color: var(--text-primary);
|
||||||
|
margin-bottom: 32px;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-add-actions {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
gap: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.udb-add-actions .btn-outline,
|
||||||
|
.udb-add-actions .btn-gradient {
|
||||||
|
flex: 1;
|
||||||
|
padding: 18px 0;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
import { View, Text, Input, Button } from '@tarojs/components'
|
||||||
|
import Taro from '@tarojs/taro'
|
||||||
|
import { useState, useEffect } from 'react'
|
||||||
|
import './index.scss'
|
||||||
|
import {
|
||||||
|
listAllUsers,
|
||||||
|
switchUser,
|
||||||
|
deleteUser,
|
||||||
|
createUser,
|
||||||
|
getUserInfo,
|
||||||
|
verifyAdminPassword
|
||||||
|
} from '../../utils/store'
|
||||||
|
import ThemeToggle from '../../components/ThemeToggle'
|
||||||
|
import { useThemeContext } from '../../context/ThemeContext'
|
||||||
|
|
||||||
|
export default function UserDatabasePage() {
|
||||||
|
const { theme } = useThemeContext()
|
||||||
|
const [isUnlocked, setIsUnlocked] = useState(false)
|
||||||
|
const [password, setPassword] = useState('')
|
||||||
|
const [pwdError, setPwdError] = useState(false)
|
||||||
|
const [users, setUsers] = useState<any[]>([])
|
||||||
|
const [showAdd, setShowAdd] = useState(false)
|
||||||
|
const [newNick, setNewNick] = useState('')
|
||||||
|
|
||||||
|
const refresh = () => setUsers(listAllUsers())
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
refresh()
|
||||||
|
}, [])
|
||||||
|
|
||||||
|
const handleUnlock = () => {
|
||||||
|
if (verifyAdminPassword(password)) {
|
||||||
|
setIsUnlocked(true)
|
||||||
|
setPwdError(false)
|
||||||
|
refresh()
|
||||||
|
} else {
|
||||||
|
setPwdError(true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSwitch = (openid: string) => {
|
||||||
|
if (switchUser(openid)) {
|
||||||
|
Taro.showToast({ title: '切换成功', icon: 'success' })
|
||||||
|
refresh()
|
||||||
|
} else {
|
||||||
|
Taro.showToast({ title: '切换失败', icon: 'none' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleDelete = (openid: string) => {
|
||||||
|
Taro.showModal({
|
||||||
|
title: '确认删除',
|
||||||
|
content: '删除后将清空该用户所有数据,无法恢复',
|
||||||
|
confirmColor: '#e64340',
|
||||||
|
success: (res) => {
|
||||||
|
if (res.confirm) {
|
||||||
|
deleteUser(openid)
|
||||||
|
refresh()
|
||||||
|
Taro.showToast({ title: '已删除', icon: 'success' })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleCreate = () => {
|
||||||
|
if (!newNick.trim()) {
|
||||||
|
Taro.showToast({ title: '请输入昵称', icon: 'none' })
|
||||||
|
return
|
||||||
|
}
|
||||||
|
createUser(newNick.trim())
|
||||||
|
setShowAdd(false)
|
||||||
|
setNewNick('')
|
||||||
|
refresh()
|
||||||
|
Taro.showToast({ title: '创建成功', icon: 'success' })
|
||||||
|
}
|
||||||
|
|
||||||
|
const activeOpenid = getUserInfo()?.openid || ''
|
||||||
|
|
||||||
|
if (!isUnlocked) {
|
||||||
|
return (
|
||||||
|
<View className={`theme-${theme}`}>
|
||||||
|
<View className='udb-page'>
|
||||||
|
<ThemeToggle />
|
||||||
|
<View className='udb-lock-card dashed-card mt-20'>
|
||||||
|
<View className='star-badge' />
|
||||||
|
<Text className='udb-lock-icon'>🔐</Text>
|
||||||
|
<Text className='udb-lock-title'>管理员验证</Text>
|
||||||
|
<Text className='udb-lock-desc'>请输入密码以访问用户数据库</Text>
|
||||||
|
<Input
|
||||||
|
className='udb-password-input'
|
||||||
|
type='text'
|
||||||
|
password
|
||||||
|
placeholder='输入密码'
|
||||||
|
value={password}
|
||||||
|
onInput={(e: any) => setPassword(e.detail.value)}
|
||||||
|
/>
|
||||||
|
{pwdError && (
|
||||||
|
<Text className='udb-error'>密码错误,请重试</Text>
|
||||||
|
)}
|
||||||
|
<View className='btn-gradient udb-btn' onClick={handleUnlock}>
|
||||||
|
<Text>进入数据库</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<View className={`theme-${theme}`}>
|
||||||
|
<View className='udb-page'>
|
||||||
|
<ThemeToggle />
|
||||||
|
|
||||||
|
<View className='page-header dashed-card mt-20'>
|
||||||
|
<View className='star-badge' />
|
||||||
|
<Text className='page-title'>本地用户数据库</Text>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View className='udb-toolbar'>
|
||||||
|
<View className='btn-gradient udb-add-btn' onClick={() => setShowAdd(true)}>
|
||||||
|
<Text>+ 新建账号</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
|
||||||
|
<View className='udb-table'>
|
||||||
|
<View className='udb-row udb-header'>
|
||||||
|
<Text className='udb-col col-nick'>昵称</Text>
|
||||||
|
<Text className='udb-col col-id'>ID</Text>
|
||||||
|
<Text className='udb-col col-stats'>设计/订单</Text>
|
||||||
|
<Text className='udb-col col-action'>操作</Text>
|
||||||
|
</View>
|
||||||
|
{users.map((u) => (
|
||||||
|
<View key={u.openid} className={`udb-row ${u.openid === activeOpenid ? 'active' : ''}`}>
|
||||||
|
<Text className='udb-col col-nick'>{u.nickName}</Text>
|
||||||
|
<Text className='udb-col col-id'>{u.openid}</Text>
|
||||||
|
<Text className='udb-col col-stats'>{u.designCount} / {u.orderCount}</Text>
|
||||||
|
<View className='udb-col col-action'>
|
||||||
|
{u.openid !== activeOpenid && (
|
||||||
|
<View className='udb-link' onClick={() => handleSwitch(u.openid)}>
|
||||||
|
<Text>切换</Text>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
{u.openid === activeOpenid && (
|
||||||
|
<Text className='udb-current'>当前</Text>
|
||||||
|
)}
|
||||||
|
<View className='udb-link udb-danger' onClick={() => handleDelete(u.openid)}>
|
||||||
|
<Text>删除</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
))}
|
||||||
|
{users.length === 0 && (
|
||||||
|
<View className='udb-empty'>
|
||||||
|
<Text>暂无用户数据</Text>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
|
||||||
|
{/* 新建账号弹窗 */}
|
||||||
|
{showAdd && (
|
||||||
|
<View className='modal-overlay'>
|
||||||
|
<View className='udb-add-card dashed-card'>
|
||||||
|
<View className='star-badge' />
|
||||||
|
<Text className='udb-add-title'>新建本地账号</Text>
|
||||||
|
<Input
|
||||||
|
className='udb-add-input'
|
||||||
|
type='text'
|
||||||
|
placeholder='请输入昵称'
|
||||||
|
value={newNick}
|
||||||
|
onInput={(e: any) => setNewNick(e.detail.value)}
|
||||||
|
/>
|
||||||
|
<View className='udb-add-actions'>
|
||||||
|
<View className='btn-outline' onClick={() => setShowAdd(false)}>
|
||||||
|
<Text>取消</Text>
|
||||||
|
</View>
|
||||||
|
<View className='btn-gradient' onClick={handleCreate}>
|
||||||
|
<Text>创建</Text>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)}
|
||||||
|
</View>
|
||||||
|
</View>
|
||||||
|
)
|
||||||
|
}
|
||||||
@@ -17,7 +17,7 @@ export const PRODUCTS: ProductCategory[] = [
|
|||||||
leadTime: '3-5个工作日',
|
leadTime: '3-5个工作日',
|
||||||
description:
|
description:
|
||||||
'精选优质纸张,封面采用高档PU材质,手感细腻。内页可定制横线、方格或空白三种版式。激光微雕工艺将名字或图案精准刻印在封面,永不褪色。小巧轻便,适合随身携带,无论是课堂笔记还是日常备忘,都是你的专属伴侣。',
|
'精选优质纸张,封面采用高档PU材质,手感细腻。内页可定制横线、方格或空白三种版式。激光微雕工艺将名字或图案精准刻印在封面,永不褪色。小巧轻便,适合随身携带,无论是课堂笔记还是日常备忘,都是你的专属伴侣。',
|
||||||
images: ['/img/book_small/The1.png'],
|
images: ['/img/book_small/The1.jpg'],
|
||||||
mask: {
|
mask: {
|
||||||
shape: 'rect',
|
shape: 'rect',
|
||||||
width: 300,
|
width: 300,
|
||||||
@@ -34,7 +34,7 @@ export const PRODUCTS: ProductCategory[] = [
|
|||||||
leadTime: '3-5个工作日',
|
leadTime: '3-5个工作日',
|
||||||
description:
|
description:
|
||||||
'A4尺寸大开本,180°平摊设计,书写更自由。封面可选真皮、仿布纹或磨砂材质,激光微雕区域更大,适合呈现全班名字、团队口号或公司Logo等大篇幅内容。是毕业纪念、企业年会礼品的首选。',
|
'A4尺寸大开本,180°平摊设计,书写更自由。封面可选真皮、仿布纹或磨砂材质,激光微雕区域更大,适合呈现全班名字、团队口号或公司Logo等大篇幅内容。是毕业纪念、企业年会礼品的首选。',
|
||||||
images: ['/img/book_big/The1.png', '/img/book_big/The2.png'],
|
images: ['/img/book_big/The1.jpg', '/img/book_big/The2.jpg'],
|
||||||
mask: {
|
mask: {
|
||||||
shape: 'rect',
|
shape: 'rect',
|
||||||
width: 340,
|
width: 340,
|
||||||
@@ -67,7 +67,7 @@ export const PRODUCTS: ProductCategory[] = [
|
|||||||
leadTime: '7-10个工作日',
|
leadTime: '7-10个工作日',
|
||||||
description:
|
description:
|
||||||
'精选天然楠竹,经多道工序打磨抛光,保留天然竹纹肌理。盒盖采用磁吸开合,内部设有分层隔板。激光微雕在竹面上呈现深浅不一的雕刻效果,融入墨香气质。适合书房案头、书法爱好者的文房伴侣。',
|
'精选天然楠竹,经多道工序打磨抛光,保留天然竹纹肌理。盒盖采用磁吸开合,内部设有分层隔板。激光微雕在竹面上呈现深浅不一的雕刻效果,融入墨香气质。适合书房案头、书法爱好者的文房伴侣。',
|
||||||
images: ['/img/penbox/The1.png', '/img/penbox/The2.png', '/img/penbox/The3.jpg'],
|
images: ['/img/penbox/The1.jpg', '/img/penbox/The2.jpg', '/img/penbox/The3.jpg'],
|
||||||
mask: {
|
mask: {
|
||||||
shape: 'rect',
|
shape: 'rect',
|
||||||
width: 320,
|
width: 320,
|
||||||
|
|||||||
@@ -21,6 +21,30 @@ function key(scope: string): string {
|
|||||||
|
|
||||||
// ---------- 用户数据 ----------
|
// ---------- 用户数据 ----------
|
||||||
|
|
||||||
|
const USER_REGISTRY_KEY = 'smart_user_registry'
|
||||||
|
const ADMIN_PASSWORD = 'zhihui2024'
|
||||||
|
|
||||||
|
// ---------- 用户注册表 ----------
|
||||||
|
|
||||||
|
function getUserRegistry(): string[] {
|
||||||
|
try { return Taro.getStorageSync(USER_REGISTRY_KEY) || [] } catch { return [] }
|
||||||
|
}
|
||||||
|
|
||||||
|
function saveToRegistry(openid: string) {
|
||||||
|
const list = getUserRegistry()
|
||||||
|
if (!list.includes(openid)) {
|
||||||
|
list.push(openid)
|
||||||
|
Taro.setStorageSync(USER_REGISTRY_KEY, list)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function removeFromRegistry(openid: string) {
|
||||||
|
const list = getUserRegistry().filter(id => id !== openid)
|
||||||
|
Taro.setStorageSync(USER_REGISTRY_KEY, list)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- 用户数据 ----------
|
||||||
|
|
||||||
export function getUserInfoRaw(): any {
|
export function getUserInfoRaw(): any {
|
||||||
try { return Taro.getStorageSync(USER_KEY) } catch { return null }
|
try { return Taro.getStorageSync(USER_KEY) } catch { return null }
|
||||||
}
|
}
|
||||||
@@ -29,10 +53,24 @@ export function setUserInfoRaw(info: any) {
|
|||||||
Taro.setStorageSync(USER_KEY, info)
|
Taro.setStorageSync(USER_KEY, info)
|
||||||
if (info?.openid) {
|
if (info?.openid) {
|
||||||
Taro.setStorageSync(ACTIVE_USER_KEY, info.openid)
|
Taro.setStorageSync(ACTIVE_USER_KEY, info.openid)
|
||||||
|
// 为每个用户备份独立副本,方便切换账号时读取
|
||||||
|
Taro.setStorageSync(`user_info_${info.openid}`, info)
|
||||||
|
saveToRegistry(info.openid)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function getUserInfoByOpenid(openid: string): any | null {
|
||||||
|
try {
|
||||||
|
const backup = Taro.getStorageSync(`user_info_${openid}`)
|
||||||
|
if (backup) return backup
|
||||||
|
} catch {}
|
||||||
|
const current = getUserInfoRaw()
|
||||||
|
if (current?.openid === openid) return current
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
|
||||||
export function clearUserInfo() {
|
export function clearUserInfo() {
|
||||||
|
// 仅退出登录,不删除用户数据
|
||||||
Taro.removeStorageSync(USER_KEY)
|
Taro.removeStorageSync(USER_KEY)
|
||||||
Taro.removeStorageSync(ACTIVE_USER_KEY)
|
Taro.removeStorageSync(ACTIVE_USER_KEY)
|
||||||
}
|
}
|
||||||
@@ -45,6 +83,72 @@ export function getUserInfo() {
|
|||||||
return getUserInfoRaw()
|
return getUserInfoRaw()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------- 用户数据库管理 ----------
|
||||||
|
|
||||||
|
export function listAllUsers() {
|
||||||
|
const registry = getUserRegistry()
|
||||||
|
return registry.map(openid => {
|
||||||
|
const info = getUserInfoByOpenid(openid)
|
||||||
|
const dList = getDesignListFor(openid)
|
||||||
|
const oList = getOrderListFor(openid)
|
||||||
|
return {
|
||||||
|
openid,
|
||||||
|
nickName: info?.nickName || '未知用户',
|
||||||
|
avatarUrl: info?.avatarUrl || '',
|
||||||
|
loginAt: info?.loginAt || 0,
|
||||||
|
designCount: dList.length,
|
||||||
|
orderCount: oList.length
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createUser(nickName: string, avatarUrl?: string) {
|
||||||
|
const openid = 'mock_' + Date.now().toString(36) + '_' + Math.random().toString(36).slice(2, 6)
|
||||||
|
const info = { openid, nickName: nickName || '微信用户', avatarUrl: avatarUrl || '', loginAt: Date.now() }
|
||||||
|
setUserInfoRaw(info)
|
||||||
|
return info
|
||||||
|
}
|
||||||
|
|
||||||
|
export function switchUser(openid: string) {
|
||||||
|
const info = getUserInfoByOpenid(openid)
|
||||||
|
if (!info) return false
|
||||||
|
Taro.setStorageSync(USER_KEY, info)
|
||||||
|
Taro.setStorageSync(ACTIVE_USER_KEY, openid)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deleteUser(openid: string) {
|
||||||
|
// 删除该用户的所有数据
|
||||||
|
Taro.removeStorageSync(`user_info_${openid}`)
|
||||||
|
Taro.removeStorageSync(`design_list_${openid}`)
|
||||||
|
Taro.removeStorageSync(`order_list_${openid}`)
|
||||||
|
Taro.removeStorageSync(`address_list_${openid}`)
|
||||||
|
removeFromRegistry(openid)
|
||||||
|
// 如果删的是当前登录用户,清掉登录态
|
||||||
|
const current = getUserInfoRaw()
|
||||||
|
if (current?.openid === openid) {
|
||||||
|
clearUserInfo()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function verifyAdminPassword(password: string): boolean {
|
||||||
|
return password === ADMIN_PASSWORD
|
||||||
|
}
|
||||||
|
|
||||||
|
// ---------- 跨用户读取辅助函数 ----------
|
||||||
|
|
||||||
|
function keyFor(scope: string, openid: string) {
|
||||||
|
return `${scope}_${openid}`
|
||||||
|
}
|
||||||
|
|
||||||
|
function getDesignListFor(openid: string): DesignItem[] {
|
||||||
|
try { return Taro.getStorageSync(keyFor('design_list', openid)) || [] } catch { return [] }
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOrderListFor(openid: string): OrderItem[] {
|
||||||
|
try { return Taro.getStorageSync(keyFor('order_list', openid)) || [] } catch { return [] }
|
||||||
|
}
|
||||||
|
|
||||||
// ---------- 设计清单 ----------
|
// ---------- 设计清单 ----------
|
||||||
|
|
||||||
export function getDesignList(): DesignItem[] {
|
export function getDesignList(): DesignItem[] {
|
||||||
|
|||||||