diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..39127f2
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+# 忽略提交文件
+/unpackage
+node_modules/
+.vscode/
+.hbuilderx/
\ No newline at end of file
diff --git a/App.vue b/App.vue
new file mode 100644
index 0000000..e04f1a0
--- /dev/null
+++ b/App.vue
@@ -0,0 +1,12 @@
+
+
+
\ No newline at end of file
diff --git a/README.md b/README.md
deleted file mode 100644
index b8ed363..0000000
--- a/README.md
+++ /dev/null
@@ -1 +0,0 @@
-#cashier_wx
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..c3ff205
--- /dev/null
+++ b/index.html
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/main.js b/main.js
new file mode 100644
index 0000000..5ea081f
--- /dev/null
+++ b/main.js
@@ -0,0 +1,48 @@
+import App from './App'
+import uviewPlus from '@/uni_modules/uview-plus'
+
+//写个方法,配置一下持久化插件
+const createPersistUni = () => {
+ return createPersistedState({
+ storage: {
+ getItem: uni.getStorageSync,
+ setItem: uni.setStorageSync
+ }
+ })
+}
+// #ifndef VUE3
+import Vue from 'vue'
+import './uni.promisify.adaptor'
+Vue.config.productionTip = false
+App.mpType = 'app'
+const app = new Vue({
+ ...App
+})
+app.$mount()
+// #endif
+
+// #ifdef VUE3
+import { createSSRApp } from "vue";
+import * as Pinia from "pinia";
+import { createUnistorage } from "pinia-plugin-unistorage";
+// 写个方法,配置一下持久化插件
+const createPersistUni = () => {
+ return createPersistedState({
+ storage: {
+ getItem: uni.getStorageSync,
+ setItem: uni.setStorageSync
+ }
+ })
+}
+export function createApp() {
+ const store = Pinia.createPinia()
+ // 使用持久化插件
+ store.use(createPersistUni());
+ const app = createSSRApp(App)
+ app.use(uviewPlus)
+ return {
+ app,
+ Pinia
+ }
+}
+// #endif
\ No newline at end of file
diff --git a/manifest.json b/manifest.json
new file mode 100644
index 0000000..3bcf7e5
--- /dev/null
+++ b/manifest.json
@@ -0,0 +1,72 @@
+{
+ "name" : "wepp",
+ "appid" : "__UNI__9EC799C",
+ "description" : "",
+ "versionName" : "1.0.0",
+ "versionCode" : "100",
+ "transformPx" : false,
+ /* 5+App特有相关 */
+ "app-plus" : {
+ "usingComponents" : true,
+ "nvueStyleCompiler" : "uni-app",
+ "compilerVersion" : 3,
+ "splashscreen" : {
+ "alwaysShowBeforeRender" : true,
+ "waiting" : true,
+ "autoclose" : true,
+ "delay" : 0
+ },
+ /* 模块配置 */
+ "modules" : {},
+ /* 应用发布信息 */
+ "distribute" : {
+ /* android打包配置 */
+ "android" : {
+ "permissions" : [
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ "",
+ ""
+ ]
+ },
+ /* ios打包配置 */
+ "ios" : {},
+ /* SDK配置 */
+ "sdkConfigs" : {}
+ }
+ },
+ /* 快应用特有相关 */
+ "quickapp" : {},
+ /* 小程序特有相关 */
+ "mp-weixin" : {
+ "appid" : "",
+ "setting" : {
+ "urlCheck" : false
+ },
+ "usingComponents" : true
+ },
+ "mp-alipay" : {
+ "usingComponents" : true
+ },
+ "mp-baidu" : {
+ "usingComponents" : true
+ },
+ "mp-toutiao" : {
+ "usingComponents" : true
+ },
+ "uniStatistics" : {
+ "enable" : false
+ },
+ "vueVersion" : "3"
+}
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..f8de150
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,18 @@
+{
+ "name": "wepp",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "dependencies": {
+ "dayjs": "^1.11.13"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.13",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz",
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+ "license": "MIT"
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..0b01ed4
--- /dev/null
+++ b/package.json
@@ -0,0 +1,6 @@
+{
+ "dependencies": {
+ "dayjs": "^1.11.13",
+ "pinia-plugin-persistedstate": "^4.2.0"
+ }
+}
diff --git a/pages.json b/pages.json
new file mode 100644
index 0000000..0163499
--- /dev/null
+++ b/pages.json
@@ -0,0 +1,25 @@
+{
+ "easycom": {
+ "autoscan": true,
+ "custom": {
+ "^u--(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue",
+ "^up-(.*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue",
+ "^u-([^-].*)": "@/uni_modules/uview-plus/components/u-$1/u-$1.vue"
+ }
+ },
+ "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages
+ {
+ "path": "pages/index/index",
+ "style": {
+ "navigationBarTitleText": "uni-app"
+ }
+ }
+ ],
+ "globalStyle": {
+ "navigationBarTextStyle": "black",
+ "navigationBarTitleText": "uni-app",
+ "navigationBarBackgroundColor": "#F8F8F8",
+ "backgroundColor": "#F8F8F8"
+ },
+ "uniIdRouter": {}
+}
\ No newline at end of file
diff --git a/pages/index/index.vue b/pages/index/index.vue
new file mode 100644
index 0000000..ec06a23
--- /dev/null
+++ b/pages/index/index.vue
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/logo.png b/static/logo.png
new file mode 100644
index 0000000..b5771e2
Binary files /dev/null and b/static/logo.png differ
diff --git a/store/index.js b/store/index.js
new file mode 100644
index 0000000..b920103
--- /dev/null
+++ b/store/index.js
@@ -0,0 +1,25 @@
+// user.js
+import { defineStore } from 'pinia';
+export const useAppStore = defineStore('user', {
+ state: () => {
+ return {
+ userInfo: {},
+ isLogin: false,
+ }
+ },
+ getters: {
+ app_userInfo: (state) => state.userInfo,
+ app_isLogin: (state) => state.isLogin
+ },
+
+ actions: {
+ // 设置数据
+ async setData(key,data){
+ this[key] = data
+ },
+ // 获取数据
+ getData(key){
+ return this[key]
+ },
+ }
+});
diff --git a/uni.promisify.adaptor.js b/uni.promisify.adaptor.js
new file mode 100644
index 0000000..5fec4f3
--- /dev/null
+++ b/uni.promisify.adaptor.js
@@ -0,0 +1,13 @@
+uni.addInterceptor({
+ returnValue (res) {
+ if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
+ return res;
+ }
+ return new Promise((resolve, reject) => {
+ res.then((res) => {
+ if (!res) return resolve(res)
+ return res[0] ? reject(res[0]) : resolve(res[1])
+ });
+ });
+ },
+});
\ No newline at end of file
diff --git a/uni.scss b/uni.scss
new file mode 100644
index 0000000..0735599
--- /dev/null
+++ b/uni.scss
@@ -0,0 +1,75 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+@import '@/uni_modules/uview-plus/theme.scss';
+/* 颜色变量 */
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:12px;
+$uni-font-size-base:14px;
+$uni-font-size-lg:16px;
+
+/* 图片尺寸 */
+$uni-img-size-sm:20px;
+$uni-img-size-base:26px;
+$uni-img-size-lg:40px;
+
+/* Border Radius */
+$uni-border-radius-sm: 2px;
+$uni-border-radius-base: 3px;
+$uni-border-radius-lg: 6px;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 5px;
+$uni-spacing-row-base: 10px;
+$uni-spacing-row-lg: 15px;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 4px;
+$uni-spacing-col-base: 8px;
+$uni-spacing-col-lg: 12px;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:20px;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:26px;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:15px;
diff --git a/uni_modules/pinia-plugin-unistorage/changelog.md b/uni_modules/pinia-plugin-unistorage/changelog.md
new file mode 100644
index 0000000..053621c
--- /dev/null
+++ b/uni_modules/pinia-plugin-unistorage/changelog.md
@@ -0,0 +1,31 @@
+## 0.1.2(2024-07-17)
+chore: 移除冗余的 typescript 依赖
+## 0.1.1(2024-07-17)
+fix: 修复 createUnistorage 导出
+## 0.1.0(2024-07-10)
+fix!: 更新 pinia 类型
+## 0.0.21(2024-07-10)
+chore!: 继承 pinia-plugin-persistedstate
+## 0.0.19(2024-01-18)
+
+fix: 重新构建,不需要默认参数
+
+## 0.0.16(2023-05-06)
+
+fix: 修复全局 key 移除
+
+## 0.0.14(2023-04-29)
+
+fix: 修复全局 global key 选项
+
+## 0.0.12(2023-04-07)
+
+- fix: 修复类型错误
+
+## 0.0.11(2023-03-22)
+
+- chore: ts 支持
+
+## 0.0.7(2022-04-29)
+
+- 更新 README
diff --git a/uni_modules/pinia-plugin-unistorage/index.d.ts b/uni_modules/pinia-plugin-unistorage/index.d.ts
new file mode 100644
index 0000000..b6d3c73
--- /dev/null
+++ b/uni_modules/pinia-plugin-unistorage/index.d.ts
@@ -0,0 +1,112 @@
+import * as pinia from 'pinia';
+import { StateTree, PiniaPluginContext, PiniaPlugin } from 'pinia';
+
+type Prettify = {
+ [K in keyof T]: T[K];
+};
+type StorageLike = Pick;
+interface Serializer {
+ /**
+ * Serializes state into string before storing
+ * @default JSON.stringify
+ */
+ serialize: (value: StateTree) => string;
+ /**
+ * Deserializes string into state before hydrating
+ * @default JSON.parse
+ */
+ deserialize: (value: string) => StateTree;
+}
+interface PersistedStateOptions {
+ /**
+ * Storage key to use.
+ * @default $store.id
+ */
+ key?: string | ((id: string) => string);
+ /**
+ * Where to store persisted state.
+ * @default localStorage
+ */
+ storage?: StorageLike;
+ /**
+ * Dot-notation paths to partially save state. Saves everything if undefined.
+ * @default undefined
+ */
+ paths?: Array;
+ /**
+ * Customer serializer to serialize/deserialize state.
+ */
+ serializer?: Serializer;
+ /**
+ * Hook called before state is hydrated from storage.
+ * @default null
+ */
+ beforeRestore?: (context: PiniaPluginContext) => void;
+ /**
+ * Hook called after state is hydrated from storage.
+ * @default undefined
+ */
+ afterRestore?: (context: PiniaPluginContext) => void;
+ /**
+ * Logs errors in console when enabled.
+ * @default false
+ */
+ debug?: boolean;
+}
+type PersistedStateFactoryOptions = Prettify & {
+ /**
+ * Global key generator, allows pre/postfixing store keys.
+ * @default storeKey => storeKey
+ */
+ key?: (storeKey: string) => string;
+ /**
+ * Automatically persists all stores, opt-out individually.
+ * @default false
+ */
+ auto?: boolean;
+}>;
+declare module 'pinia' {
+ interface DefineStoreOptionsBase {
+ /**
+ * Persists store in storage.
+ * @see https://prazdevs.github.io/pinia-plugin-persistedstate
+ */
+ persist?: boolean | PersistedStateOptions | PersistedStateOptions[];
+ unistorage?: boolean | PersistedStateOptions | PersistedStateOptions[];
+ }
+ interface PiniaCustomProperties {
+ /**
+ * Rehydrates store from persisted state
+ * Warning: this is for advances usecases, make sure you know what you're doing.
+ * @see https://prazdevs.github.io/pinia-plugin-persistedstate/guide/advanced.html#forcing-the-rehydration
+ */
+ $hydrate: (opts?: {
+ runHooks?: boolean;
+ }) => void;
+ /**
+ * Persists store into configured storage
+ * Warning: this is for advances usecases, make sure you know what you're doing.
+ * @see https://prazdevs.github.io/pinia-plugin-persistedstate/guide/advanced.html#forcing-the-persistence
+ */
+ $persist: () => void;
+ }
+}
+
+/**
+ * Creates a pinia persistence plugin
+ * @param factoryOptions global persistence options
+ * @returns pinia plugin
+ */
+declare function createPersistedState(factoryOptions?: PersistedStateFactoryOptions): PiniaPlugin;
+
+declare const _default: pinia.PiniaPlugin;
+
+export { PersistedStateFactoryOptions, PersistedStateOptions, Serializer, StorageLike, createPersistedState, _default as default, createUnistorage };
+
+/**
+ * Creates a pinia persistence plugin with uniapp
+ * @param factoryOptions global persistence options
+ * @returns pinia plugin
+ */
+declare function createUnistorage(factoryOptions?: PersistedStateFactoryOptions): PiniaPlugin;
+
\ No newline at end of file
diff --git a/uni_modules/pinia-plugin-unistorage/index.js b/uni_modules/pinia-plugin-unistorage/index.js
new file mode 100644
index 0000000..02c4e79
--- /dev/null
+++ b/uni_modules/pinia-plugin-unistorage/index.js
@@ -0,0 +1,162 @@
+// src/normalize.ts
+function isObject(v) {
+ return typeof v === "object" && v !== null;
+}
+function normalizeOptions(options, factoryOptions) {
+ options = isObject(options) ? options : /* @__PURE__ */ Object.create(null);
+ return new Proxy(options, {
+ get(target, key, receiver) {
+ if (key === "key")
+ return Reflect.get(target, key, receiver);
+ return Reflect.get(target, key, receiver) || Reflect.get(factoryOptions, key, receiver);
+ }
+ });
+}
+
+// src/pick.ts
+function get(state, path) {
+ return path.reduce((obj, p) => {
+ return obj == null ? void 0 : obj[p];
+ }, state);
+}
+function set(state, path, val) {
+ return path.slice(0, -1).reduce((obj, p) => {
+ if (/^(__proto__)$/.test(p))
+ return {};
+ else
+ return obj[p] = obj[p] || {};
+ }, state)[path[path.length - 1]] = val, state;
+}
+function pick(baseState, paths) {
+ return paths.reduce((substate, path) => {
+ const pathArray = path.split(".");
+ return set(substate, pathArray, get(baseState, pathArray));
+ }, {});
+}
+
+// src/plugin.ts
+function parsePersistence(factoryOptions, store) {
+ return (o) => {
+ var _a;
+ try {
+ const {
+ storage = localStorage,
+ beforeRestore = void 0,
+ afterRestore = void 0,
+ serializer = {
+ serialize: JSON.stringify,
+ deserialize: JSON.parse
+ },
+ key = store.$id,
+ paths = null,
+ debug = false
+ } = o;
+ return {
+ storage,
+ beforeRestore,
+ afterRestore,
+ serializer,
+ key: ((_a = factoryOptions.key) != null ? _a : (k) => k)(typeof key == "string" ? key : key(store.$id)),
+ paths,
+ debug
+ };
+ } catch (e) {
+ if (o.debug)
+ console.error("[pinia-plugin-persistedstate]", e);
+ return null;
+ }
+ };
+}
+function hydrateStore(store, { storage, serializer, key, debug }) {
+ try {
+ const fromStorage = storage == null ? void 0 : storage.getItem(key);
+ if (fromStorage)
+ store.$patch(serializer == null ? void 0 : serializer.deserialize(fromStorage));
+ } catch (e) {
+ if (debug)
+ console.error("[pinia-plugin-persistedstate]", e);
+ }
+}
+function persistState(state, { storage, serializer, key, paths, debug }) {
+ try {
+ const toStore = Array.isArray(paths) ? pick(state, paths) : state;
+ storage.setItem(key, serializer.serialize(toStore));
+ } catch (e) {
+ if (debug)
+ console.error("[pinia-plugin-persistedstate]", e);
+ }
+}
+function createPersistedState(factoryOptions = {}) {
+ return (context) => {
+ const { auto = false } = factoryOptions;
+ const {
+ options: { persist = auto },
+ store,
+ pinia
+ } = context;
+ if (!persist)
+ return;
+ if (!(store.$id in pinia.state.value)) {
+ const original_store = pinia._s.get(store.$id.replace("__hot:", ""));
+ if (original_store)
+ Promise.resolve().then(() => original_store.$persist());
+ return;
+ }
+ const persistences = (Array.isArray(persist) ? persist.map((p) => normalizeOptions(p, factoryOptions)) : [normalizeOptions(persist, factoryOptions)]).map(parsePersistence(factoryOptions, store)).filter(Boolean);
+ store.$persist = () => {
+ persistences.forEach((persistence) => {
+ persistState(store.$state, persistence);
+ });
+ };
+ store.$hydrate = ({ runHooks = true } = {}) => {
+ persistences.forEach((persistence) => {
+ const { beforeRestore, afterRestore } = persistence;
+ if (runHooks)
+ beforeRestore == null ? void 0 : beforeRestore(context);
+ hydrateStore(store, persistence);
+ if (runHooks)
+ afterRestore == null ? void 0 : afterRestore(context);
+ });
+ };
+ persistences.forEach((persistence) => {
+ const { beforeRestore, afterRestore } = persistence;
+ beforeRestore == null ? void 0 : beforeRestore(context);
+ hydrateStore(store, persistence);
+ afterRestore == null ? void 0 : afterRestore(context);
+ store.$subscribe(
+ (_mutation, state) => {
+ persistState(state, persistence);
+ },
+ {
+ detached: true
+ }
+ );
+ });
+ };
+}
+
+function createUnistorage(globalOptions = {}) {
+ const persistedState = createPersistedState({
+ storage: {
+ getItem(key) {
+ return uni.getStorageSync(key);
+ },
+ setItem(key, value) {
+ uni.setStorageSync(key, value);
+ }
+ },
+ serializer: {
+ deserialize: JSON.parse,
+ serialize: JSON.stringify
+ },
+ ...globalOptions
+ });
+ return (ctx) => {
+ if (ctx.options.unistorage) {
+ ctx.options.persist = ctx.options.unistorage;
+ }
+ return persistedState(ctx);
+ };
+}
+
+export { createPersistedState, createUnistorage };
diff --git a/uni_modules/pinia-plugin-unistorage/package.json b/uni_modules/pinia-plugin-unistorage/package.json
new file mode 100644
index 0000000..fd82db4
--- /dev/null
+++ b/uni_modules/pinia-plugin-unistorage/package.json
@@ -0,0 +1,94 @@
+{
+ "id": "pinia-plugin-unistorage",
+ "displayName": "pinia-plugin-unistorage",
+ "version": "0.1.2",
+ "description": "uniapp 下 pinia 的本地数据缓存插件",
+ "keywords": [
+ "pinia",
+ "uniapp",
+ "storage",
+ "pinia-plugin",
+ "persistence"
+],
+ "type": "module",
+ "main": "./index.js",
+ "types": "./index.d.ts",
+ "exports": {
+ ".": {
+ "import": "./index.js",
+ "types": "./index.d.ts"
+ }
+ },
+ "engines": {
+ "HBuilderX": "^3.4.7"
+ },
+ "dcloudext": {
+ "sale": {
+ "regular": {
+ "price": "0.00"
+ },
+ "sourcecode": {
+ "price": "0.00"
+ }
+ },
+ "contact": {
+ "qq": ""
+ },
+ "declaration": {
+ "ads": "无",
+ "data": "无",
+ "permissions": "无"
+ },
+ "npmurl": "https://www.npmjs.com/package/pinia-plugin-unistorage",
+ "type": "sdk-js"
+ },
+ "uni_modules": {
+ "dependencies": [],
+ "encrypt": [],
+ "platforms": {
+ "cloud": {
+ "tcb": "y",
+ "aliyun": "y",
+ "alipay": "n"
+ },
+ "client": {
+ "Vue": {
+ "vue2": "y",
+ "vue3": "y"
+ },
+ "App": {
+ "app-vue": "y",
+ "app-nvue": "y"
+ },
+ "H5-mobile": {
+ "Safari": "y",
+ "Android Browser": "y",
+ "微信浏览器(Android)": "y",
+ "QQ浏览器(Android)": "y"
+ },
+ "H5-pc": {
+ "Chrome": "y",
+ "IE": "y",
+ "Edge": "y",
+ "Firefox": "y",
+ "Safari": "y"
+ },
+ "小程序": {
+ "微信": "y",
+ "阿里": "y",
+ "百度": "y",
+ "字节跳动": "y",
+ "QQ": "y",
+ "钉钉": "y",
+ "快手": "y",
+ "飞书": "y",
+ "京东": "y"
+ },
+ "快应用": {
+ "华为": "y",
+ "联盟": "y"
+ }
+ }
+ }
+ }
+}
diff --git a/uni_modules/pinia-plugin-unistorage/readme.md b/uni_modules/pinia-plugin-unistorage/readme.md
new file mode 100644
index 0000000..7724e13
--- /dev/null
+++ b/uni_modules/pinia-plugin-unistorage/readme.md
@@ -0,0 +1,226 @@
+
+

+
pinia-plugin-unistorage
+
uniapp 下 pinia 的本地数据缓存插件
+
+
+
+
+
+
+

+
+
+
+
+
+## 引用
+
+该插件是
+[pinia-plugin-persistedstate](https://github.com/prazdevs/pinia-plugin-persistedstate)
+的 `uniapp` 版本,如果你需要在纯 `vue` 或者 `nuxt` 项目中使用 `pinia`
+的本地数据缓存,请使用
+[pinia-plugin-persistedstate](https://github.com/prazdevs/pinia-plugin-persistedstate)。
+
+
+
+
+## 动机
+
+为了实现多端的更简单的全局本地数据缓存
+
+
+
+
+## 组织 🦔
+
+欢迎关注 **帝莎编程**
+
+- [官网](http://dishaxy.dishait.cn/)
+- [Gitee](https://gitee.com/dishait)
+- [Github](https://github.com/dishait)
+- [网易云课堂](https://study.163.com/provider/480000001892585/index.htm?share=2&shareId=480000001892585)
+
+
+
+
+## 使用
+
+### 安装
+
+#### 1. `cli` 创建的 `uniapp` 项目
+
+```shell
+npm i pinia-plugin-unistorage -D
+```
+
+```js
+// main.js
+import { createSSRApp } from "vue";
+import * as Pinia from "pinia";
+import { createUnistorage } from "pinia-plugin-unistorage";
+
+export function createApp() {
+ const app = createSSRApp(App);
+
+ const store = Pinia.createPinia();
+
+ // 关键代码 👇
+ store.use(createUnistorage());
+
+ app.use(store);
+
+ return {
+ app,
+ Pinia, // 此处必须将 Pinia 返回
+ };
+}
+```
+
+
+
+#### 2. `hbuilderx` 创建的 `uniapp` 项目
+
+直接插件市场安装后引入注册
+
+```js
+// main.js
+import { createSSRApp } from "vue";
+import * as Pinia from "pinia";
+import { createUnistorage } from "./uni_modules/pinia-plugin-unistorage";
+
+export function createApp() {
+ const app = createSSRApp(App);
+
+ const store = Pinia.createPinia();
+
+ // 关键代码 👇
+ store.use(createUnistorage());
+
+ app.use(store);
+
+ return {
+ app,
+ Pinia, // 此处必须将 Pinia 返回
+ };
+}
+```
+
+### 基础
+
+```js
+import { defineStore } from "pinia";
+
+export const useStore = defineStore("main", {
+ state() {
+ return {
+ someState: "hello pinia",
+ };
+ },
+ unistorage: true, // 开启后对 state 的数据读写都将持久化
+});
+```
+
+或者 `setup` 语法也是支持的
+
+```js
+import { defineStore } from "pinia";
+
+export const useStore = defineStore(
+ "main",
+ () => {
+ const someState = ref("hello pinia");
+ return { someState };
+ },
+ {
+ unistorage: true, // 开启后对 state 的数据读写都将持久化
+ },
+);
+```
+
+
+
+### 选项
+
+#### 钩子
+
+```js
+import { defineStore } from "pinia";
+
+export const useStore = defineStore("main", {
+ state() {
+ return {
+ someState: "hello pinia",
+ };
+ },
+ unistorage: {
+ // 初始化恢复前触发
+ beforeRestore(ctx) {},
+ // 初始化恢复后触发
+ afterRestore(ctx) {},
+ },
+});
+```
+
+
+
+#### 序列化
+
+大多数情况下你并不需要了解该选项
+
+```js
+import { defineStore } from "pinia";
+
+export const useStore = defineStore("main", {
+ state() {
+ return {
+ someState: "hello pinia",
+ };
+ },
+ unistorage: {
+ serializer: {
+ // 序列化,默认为 JSON.stringify
+ serialize(v) {
+ return JSON.stringify(v);
+ },
+ // 反序列化,默认为 JSON.parse
+ deserialize(v) {
+ return JSON.parse(v);
+ },
+ },
+ },
+});
+```
+
+
+
+#### 其他
+
+```js
+import { defineStore } from "pinia";
+
+export const useStore = defineStore("main", {
+ state() {
+ return {
+ foo: "foo",
+ nested: {
+ data: "nested pinia",
+ },
+ someState: "hello pinia",
+ };
+ },
+ unistorage: {
+ key: "foo", // 缓存的键,默认为该 store 的 id,这里是 main,
+ paths: ["foo", "nested.data"], // 需要缓存的路径,这里设置 foo 和 nested 下的 data 会被缓存
+ },
+});
+```
+
+
+
+
+## License
+
+Made with [markthree](https://github.com/markthree)
+
+Published under [MIT License](./LICENSE).
diff --git a/uni_modules/pinia-plugin-unistorage/src/index.ts b/uni_modules/pinia-plugin-unistorage/src/index.ts
new file mode 100644
index 0000000..fee2467
--- /dev/null
+++ b/uni_modules/pinia-plugin-unistorage/src/index.ts
@@ -0,0 +1,35 @@
+import {
+ createPersistedState,
+ type PersistedStateFactoryOptions,
+} from "pinia-plugin-persistedstate";
+
+export * from "pinia-plugin-persistedstate";
+
+export function createUnistorage(
+ globalOptions: PersistedStateFactoryOptions = {},
+) {
+ const persistedState = createPersistedState({
+ storage: {
+ getItem(key) {
+ // @ts-ignore
+ return uni.getStorageSync(key);
+ },
+ setItem(key, value) {
+ // @ts-ignore
+ uni.setStorageSync(key, value);
+ },
+ },
+ serializer: {
+ deserialize: JSON.parse,
+ serialize: JSON.stringify,
+ },
+ ...globalOptions,
+ });
+ // @ts-ignore
+ return (ctx) => {
+ if (ctx.options.unistorage) {
+ ctx.options.persist = ctx.options.unistorage;
+ }
+ return persistedState(ctx);
+ };
+}
diff --git a/uni_modules/uview-plus/LICENSE b/uni_modules/uview-plus/LICENSE
new file mode 100644
index 0000000..c0ffd3e
--- /dev/null
+++ b/uni_modules/uview-plus/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2024 https://uiadmin.net/uview-plus
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/uni_modules/uview-plus/README.md b/uni_modules/uview-plus/README.md
new file mode 100644
index 0000000..930e9cc
--- /dev/null
+++ b/uni_modules/uview-plus/README.md
@@ -0,0 +1,74 @@
+
+
+
+uview-plus 3.0
+多平台快速开发的UI框架
+
+[](https://github.com/ijry/uview-plus)
+[](https://github.com/ijry/uview-plus)
+[](https://github.com/ijry/uview-plus/issues)
+[](https://gitee.com/jry/uview-plus/releases)
+[](https://en.wikipedia.org/wiki/MIT_License)
+
+## 说明
+
+uview-plus,是uni-app全面兼容vue3/nvue/鸿蒙/uni-app-x的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水。uview-plus是基于uView2.x移植的支持vue3的版本,感谢uView。
+
+## 可视化设计
+
+uview-plus现已推出免费可视化设计,可以方便的进行页面可视化设计,导出源码即可使用。极大提高前端页面开发效率;如产品经理设计师直接使用更可作为高保真高可用原型制作工具,让设计稿即代码,无需传统的设计稿开发还原步骤。
+
+
+
+
+
+## 文档
+[官方文档:https://uview-plus.jiangruyi.com](https://uview-plus.jiangruyi.com)
+[备用文档:https://uiadmin.net/uview-plus](https://uiadmin.net/uview-plus)
+
+
+## 预览
+
+您可以通过**微信**扫码,查看最佳的演示效果。
+
+
+
+
+## 链接
+
+- [官方文档](https://uview-plus.jiangruyi.com)
+- [更新日志](https://uview-plus.jiangruyi.com/components/changelog.html)
+- [升级指南](https://uview-plus.jiangruyi.com/components/changeGuide.html)
+- [关于我们](https://uview-plus.jiangruyi.com/cooperation/about.html)
+
+## 交流反馈
+
+欢迎加入我们的QQ群交流反馈:[点此跳转](https://uview-plus.jiangruyi.com/components/addQQGroup.html)
+
+## 关于PR
+
+> 我们非常乐意接受各位的优质PR,但在此之前我希望您了解uview-plus是一个需要兼容多个平台的(小程序、h5、ios app、android app)包括nvue页面、vue页面。
+> 所以希望在您修复bug并提交之前尽可能的去这些平台测试一下兼容性。最好能携带测试截图以方便审核。非常感谢!
+
+## 安装
+
+#### **uni-app插件市场链接** —— [https://ext.dcloud.net.cn/plugin?name=uview-plus](https://ext.dcloud.net.cn/plugin?name=uview-plus)
+
+请通过[官网安装文档](https://uview-plus.jiangruyi.com/components/install.html)了解更详细的内容
+
+## 快速上手
+
+请通过[快速上手](https://uview-plus.jiangruyi.com/components/quickstart.html)了解更详细的内容
+
+## 使用方法
+配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。
+
+```html
+
+
+
+```
+
+## 版权信息
+uview-plus遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uview-plus应用到您的产品中。
+
diff --git a/uni_modules/uview-plus/changelog.md b/uni_modules/uview-plus/changelog.md
new file mode 100644
index 0000000..82d2ea7
--- /dev/null
+++ b/uni_modules/uview-plus/changelog.md
@@ -0,0 +1,586 @@
+## 3.3.65(2025-02-05)
+feat: number-box组件新增按钮圆角/按钮宽度/数据框背景色/迷你模式
+## 3.3.64(2025-01-18)
+feat: 日历组件支持自定义星期文案
+
+## 3.3.63(2025-01-13)
+fix: cate-tab支持支付宝小程序
+
+fix: textarea 修复 placeholder-style
+
+fix: 修复在图片加载及加载失败时容器宽度
+
+fix: waterfall组件报错Maximum recursive updates
+
+## 3.3.62(2025-01-10)
+feat: sleder滑动选择器双滑块增加外层触发值的变动功能
+
+fix: picker支持hasInput优化
+
+## 3.3.61(2024-12-31)
+fix: 修复微信getSystemInfoSync接口废弃警告
+
+fix: 'u-status-bar' symbol missing
+
+## 3.3.60(2024-12-30)
+feat: 日期组件支持禁用
+
+fix: ts定义修复 #600
+
+feat: Tabs组件选中时增加一个active的class #595
+
+## 3.3.59(2024-12-30)
+fix: Property "isH5" was accessed during render
+
+## 3.3.58(2024-12-26)
+fix: slider组件change事件传参
+
+## 3.3.57(2024-12-23)
+fix: slider组件change事件传参
+
+feat: 更新u-picker组件增加当前选中class类名
+
+## 3.3.56(2024-12-18)
+feat: 在u-alert组件中添加关闭事件
+
+## 3.3.55(2024-12-17)
+add: swiper增加双向绑定
+
+## 3.3.54(2024-12-11)
+add: qrcode支持props控制是否开启点击预览
+
+add: 新增cate-tab垂直分类组件
+
+## 3.3.53(2024-12-10)
+fix: 修复popup居中模式点击内容区域触发关闭
+
+## 3.3.52(2024-12-09)
+add: notice-bar支持justifyContent属性
+
+## 3.3.51(2024-12-09)
+add: radio增加label插槽
+
+## 3.3.50(2024-12-05)
+fix: 优化popup等对禁止背景滚动机制
+
+add: slider在弹窗使用示例
+
+fix: card组件类名问题
+
+## 3.3.49(2024-12-02)
+fix: 去除album多余的$u引用
+
+fix: 优化图片组件兼容性
+
+add: picker组件增加zIndex属性
+
+add: text增加是否占满剩余空间属性
+
+add: input颜色示例
+
+## 3.3.48(2024-11-29)
+add: 文本行数限制样式提高到10行
+
+del: 去除不跨端的inputmode
+## 3.3.47(2024-11-28)
+fix: 时间选择器在hasInput模式下部分机型键盘弹出
+
+## 3.3.46(2024-11-26)
+fix: 修复text传递事件参数
+
+## 3.3.45(2024-11-24)
+add: navbar组件支持配置标题颜色
+
+fix: 边框按钮警告类型下颜色变量使用错误
+
+## 3.3.43(2024-11-18)
+fix: 支持瀑布流组件v-model置为[]
+
+add: 新增字符串路径访问工具方法getValueByPath
+
+add: 新增float-button悬浮按钮组件
+
+## 3.3.42(2024-11-15)
+add: button组件支持stop参数阻止冒泡
+
+## 3.3.41(2024-11-13)
+fix: u-radio-group invalid import
+
+improvement: 优化图片组件宽高及修复事件event传递
+
+## 3.3.40(2024-11-11)
+add: 组件radioGroup增加gap属性用于设置item间隔
+
+fix: 修复H5全局导入
+
+## 3.3.39(2024-11-04)
+fix: 修复相册组件
+
+## 3.3.38(2024-11-04)
+fix: 修复视频预览报错 #510
+
+add: album组件增加stop参数支持阻止事件冒泡
+
+## 3.3.37(2024-10-21)
+fix: 修复因为修改组件名称前缀,导致h5打包后$parent方法内找不到父组件的问题
+
+fix: 修复datetime-picker选择2000年以前日期出错
+
+## 3.3.36(2024-10-09)
+fix: toast 自动关闭
+
+feat: 增加微信小程序用户昵称审核完毕回调及修改 ts 定义文件
+
+## 3.3.35(2024-10-08)
+feat: modal和picker支持v-model:show双向绑定
+
+feat: 支持checkbox使用slot自定义label后自带点击事件 #522
+
+feat: swipe-action支持自动关闭特性及初始化打开状态
+
+## 3.3.34(2024-09-23)
+feat: 支持toast设置duration值为-1时不自动关闭
+
+## 3.3.33(2024-09-18)
+fix: 修复test.date('008')等验证结果不准确
+
+## 3.3.32(2024-09-09)
+fix: u-keyboard名称冲突warning
+
+## 3.3.31(2024-08-31)
+feat: qrcode初步支持nvue
+
+## 3.3.30(2024-08-30)
+fix: slider兼容step为字符串类型
+
+## 3.3.29(2024-08-30)
+fix: 修复tabs组件current参数为字符串处理逻辑
+
+## 3.3.28(2024-08-26)
+fix: list组件滑动偏移量不一样取绝对值导致iOS下拉偏移量计算错误
+
+## 3.3.27(2024-08-22)
+fix: 修复up-datetime-picker组件toolbarRightSlot定义缺失
+
+fix: 修复FormItem的rules更新错误的问题
+
+## 3.3.26(2024-08-22)
+fix: 批量注册全局组件优化
+
+## 3.3.25(2024-08-21)
+fix: 修复slider在app-vue下样式问题
+
+## 3.3.24(2024-08-19)
+fix: 修复时间选择器hasInput模式小程序不生效
+
+feat: 支持H5导入所有组件
+
+## 3.3.23(2024-08-17)
+feat: swipe-action增加closeAll方法
+
+fix: 兼容tabs在某些场景下index小于0时自动设置为0
+
+add: 通用mixin新增navTo页面跳转方法
+
+## 3.3.21(2024-08-15)
+improvement: 优化二维码组件loading及支持预览与长按事件 #351
+
+fix: 修复swipe-action自动关闭其它功能及组件卸载自动关闭
+
+## 3.3.20(2024-08-15)
+refactor: props默认值文件移至组件文件夹内便于查找
+## 3.3.19(2024-08-14)
+fix: 修复2被rpx兼容处理只在数字值生效
+
+add: 增加swiper自定义插槽示例
+
+## 3.3.18(2024-08-13)
+feat: 新增支持datetime-picker工具栏插槽及picker插槽支持修复
+## 3.3.17(2024-08-12)
+feat: swiper组件增加默认slot便于自定义
+
+feat: grid新增间隔参数
+
+feat: picker新增toolbar-right和toolbar-bottom插槽
+
+## 3.3.16(2024-08-12)
+fix: 解决swiper中title换行后多余的内容未被遮挡问题
+
+fix: 修复迷你导航适配异形屏
+
+## 3.3.15(2024-08-09)
+fix: 修复默认单位设置为rpx时一些组件高度间距异常
+
+fix: 修复日历在rpx单位下布局异常
+
+feat: code-input支持App端展示输入光标
+
+## 3.3.14(2024-08-09)
+add: 增加box组件
+
+add: 增加card卡片组件
+
+
+## 3.3.13(2024-08-08)
+feat: input支持调用原生组件的focus和blur方法
+
+improvement: grid-item条件编译优化
+
+add: 新增迷你导航组件
+
+## 3.3.12(2024-08-06)
+improvement: $u挂载时机调整便于打包分离chunk
+
+fix: steps新增itemStyle属性名称冲突
+
+## 3.3.11(2024-08-05)
+feat: 新增支持upload组件的deletable/maxCount/accept变更监听 #333
+
+feat: 新增支持tabs在swiper中使用
+
+feat: 新增FormItem支持独立设置验证规则rules
+
+fix: 修复index-list未设置$slots.header时索引高亮失效
+
+## 3.3.10(2024-08-02)
+fix: 修复index-list偶发的滑动最后一个索引报错top不存在
+
+fix: 修复gird在QQ、抖音小程序下布局
+
+feat: 优化step支持自定义样式prop
+
+feat: action-sheet组件支持v-model:show双向绑定
+
+fix: 小程序下steps和grid都统一采用grid布局
+
+fix: 修复支付宝小程序下input类型为数字时双向绑定失效
+
+feat : form 表单 validate 校验不通过后 error增加字段prop信息 #304
+
+fix: form组件异步校异常验问题 #393
+
+## 3.3.9(2024-08-01)
+fix: 优化获取nvue元素
+
+feat: modal新增contentTextAlign设置文案对齐方式
+
+fix: 修复NVUE下tabbar文字不显示 #458
+
+feat: loading-page增加zIndex属性
+
+fix: 相册在宽度较小时换行问题
+
+feat: album相册增加自适应自动换行模式
+
+feat: album相册增加图片尺寸单位prop
+
+fix: 修复calendar日历月份居中
+
+## 3.3.8(2024-07-31)
+feat: slider支持进度条任意位置触发按钮拖动
+
+fix: 修复app-vue下modal标题不居中
+
+fix: #459 TS setConfig 声明异常
+
+feat: tabs组件增加longPress长按事件
+
+feat: 新增showRight属性控制collapse右侧图标显隐
+
+fix: 优化nvue下css警告
+
+## 3.3.7(2024-07-29)
+feat: 支持IndexList组件支持在弹窗等场景下使用及联动优化
+
+feat: popup组件支持v-model:show双向绑定
+
+feat: 优化tabs的current双向绑定
+
+fix: checkbox独立使用时checked赋初始值可以,但是手动切换时值没有做双向绑定! #455
+
+feat: slider组件支持区间双滑块
+
+fix: toast 支持自定义图标?可传入了决对路径的 icon也没有用 #409
+
+feat: form-item校验失败时 增加class方便自定义显示错误的展示方式 #394
+
+fix: up-cell的required配置不生效 #395
+
+fix: 横向滚动组件,微信小程序编译后会有警告 #415
+
+fix: u-picker内部对默认值defaultIndex的监听 #425
+
+feat: toast 组件支持遮掩层穿透 #417
+
+fix: 兼容vue的slot编译bug #423
+
+fix: upload 微信小程序 点击预览视频报错 #424
+
+fix: u-number-box 组件修改【integer, decimalLength, min, max 】props时没有触发绑定值更新 #429
+
+feat: Tabs组件能否支持自定义插槽 #439
+
+feat: ActionSheet 可以配置最大高度吗, 我当做select使用了。 #445
+
+fix: cursor-pointer优化
+
+feat: 新版slider组件兼容NVUE改造
+
+feat: 新增slider组件手动实现以支持样式自定义
+
+perf:补充TS声明提示信息
+
+修复:ActionSheet 操作菜单cancelText属性为空DOM节点还存在并且可以点击问题
+
+fix: 去除预留的beforeDestroy兼容容易在某些sdk下不识别条件编译
+
+## 3.3.6(2024-07-23)
+feat: u-album组件添加radius,shape参数,定义参考当前u-image参数
+
+fix: 修复了calendar组件title和日期title未垂直居中的问题
+
+fix: update:modelValue缺失emit定义
+
+## 3.3.5(2024-07-10)
+picker组件支持hasInput模式
+
+## 3.3.4(2024-07-07)
+fix: input组件双向绑定问题 #419
+
+lazy-load完善emit
+
+优化通用小程序分享
+
+## 3.3.2(2024-06-27)
+fix: 在Nvue环境中编译,出现大量警告 #406
+## 3.3.1(2024-06-27)
+u-button组件报错,找不到button mixins #407
+## 3.3.0(2024-06-27)
+feat: checkbox支持label设置slot
+
+feat: modal增加customClass
+
+feat: navbar、popup、tabs、text支持customClass
+
+fix: cell组建缺少flex布局
+
+fix: 修复微信小程序真机调试时快速输入出现文本回退问题
+
+feat: tag增加默认slot
+
+公共mixin改造为按需导入语法
+
+refactor: 组件props混入mixin改造为按需导入语法
+
+fix: u-tabbar 安卓手机点击按钮变蓝问题 #396
+
+feat: upload组建增加extension属性
+
+fix: upload组件参数mode添加left
+
+fix: 修复阴影在非nvue时白色背景色不显示
+
+## 3.2.24(2024-06-11)
+fix: 修复时间选择器confirm事件触发时机导致2次才会触发v-model更新
+## 3.2.23(2024-05-30)
+fix: #378 H5 u-input 在表单中初始值为空也会触发一次 formValidate(this,"change")事件导致进入页面直接校验了一次
+
+fix: #373 搜索组件up-search的@clear事件无效
+
+fix: #372 ActionSheet 组件的取消按钮触发区域太小
+
+## 3.2.22(2024-05-13)
+上传组件支持微信小程序预览视频
+
+修复折叠面板右侧箭头不显示
+
+修复uxp2px
+
+## 3.2.21(2024-05-10)
+fix: loading-icon修复flex布局
+## 3.2.20(2024-05-10)
+修复瀑布流大小写#355
+## 3.2.19(2024-05-10)
+去除意外的文件引入
+## 3.2.18(2024-05-09)
+fix: 349 popup 组件设置 zIndex 属性后,组件渲染异常#
+feat: 搜索框增加adjustPosition属性
+fix: #331增加u-action-sheet__cancel
+优化mixin兼容性
+feat: #326 up-list增加下拉刷新功能
+fix: #319 优化up-tabs参数与定义匹配
+fix: index-list组件微信小程序端使用自定义导航栏异常
+fix: #285 pickerimmediateChange 写死为true
+fix: #111 u-scroll-list组件,隐藏指示器后报错, 提示找不到ref
+list增加微信小程序防抖配置
+
+## 3.2.17(2024-05-08)
+fix: 支付宝小程序二维码渲染
+## 3.2.16(2024-05-06)
+修复tabs中,当前激活样式的undefined bug
+
+fix: #341u-code 倒计时没结束前退出,再次进入结束后退出界面,再次进入重新开始倒计时bug
+
+受到uni-app内置text样式影响修复
+
+## 3.2.15(2024-04-28)
+优化时间选择器hasInput模式初始化值
+## 3.2.14(2024-04-24)
+去除pleaseSetTranspileDependencies
+
+http采用useStore
+
+## 3.2.13(2024-04-22)
+修复modal标题样式
+
+优化日期选择器hasInput模式宽度
+
+## 3.2.12(2024-04-22)
+修复color应用
+## 3.2.11(2024-04-18)
+修复import化带来的问题
+## 3.2.10(2024-04-17)
+完善input清空事件App端失效的兼容性
+
+修复日历组件二次打开后当前月份显示不正确
+
+## 3.2.9(2024-04-16)
+组件内uni.$u用法改为import引入
+
+规范化及兼容性增强
+
+## 3.2.8(2024-04-15)
+修复up-tag语法错
+## 3.2.7(2024-04-15)
+修复下拉菜单背景色在支付宝小程序无效
+
+setConfig改为浅拷贝解决无法用import导入代替uni.$u.props设置
+
+## 3.2.6(2024-04-14)
+修复某些情况下滑动单元格默认右侧按钮是展开的问题
+## 3.2.5(2024-04-13)
+调整分段器尺寸及修复窗口大小改变时重新计算尺寸
+
+多个组件支持cursor-pointer增强PC端体验
+
+## 3.2.4(2024-04-12)
+初步支持typescript
+## 3.2.3(2024-04-12)
+fix: 修复square属性在小程序下无效问题
+
+fix:修复lastIndex异常导致的column异常问题
+
+fix: alipayapp picker style
+
+feat(button): 添加用户同意隐私协议事件回调
+
+fix: input switch password
+
+fix: 修复u-code组件keepRuning失效问题
+
+feat: form-item添加labelPosition属性
+
+新增dropdown组件
+
+分段器支持内部current值
+
+优化cell和action-sheet视觉大小
+
+修复tabs文字换行
+
+## 3.2.2(2024-04-11)
+修复换行符问题
+## 3.2.1(2024-04-11)
+修复演示H5二维码
+
+fix: #270 ReadMore 展开阅读更多内容变化兼容
+
+fix: #238Calendar组件maxDate修改为不能小于minDate
+
+checkbox支持独立使用
+
+修复popup中在微信小程序中真机调试滚动失效
+
+## 3.2.0(2024-04-10)
+修复轮播图在nvue显示
+修复疑似u-slider名称被占用导致slider在App下不显示
+解决微信小程序提示 Some selectors are not allowed in component wxss
+示例中u-前缀统一为up-
+增加瀑布流与图片懒加载组件
+fix: #308修复tag组件缺失iconColor参数
+fix: #297使用grid布局解决目前编译为抖音小程序无法开启virtualHost
+## 3.1.52(2024-04-07)
+工具类方法调用import化改造
+新增up-copy复制组件
+## 3.1.51(2024-04-07)
+优化时间选择器自带输入框格式化显示
+防止按钮文字换行
+修复订单列表模板滑动
+增加u-qrcode二维码组件
+## 3.1.49(2024-03-27)
+日期时间组件支持自带输入框
+fix: popup弹窗滚动穿透问题
+fix: 修复小程序numberbox bug
+## 3.1.48(2024-03-18)
+fix:[plugin:uni:pre-css] Unbalanced delimiter found in string
+## 3.1.47(2024-03-18)
+fix: setConfig设置组件默认参数无效问题
+fix: 修复自定义图标无效问题
+feat: 增加u-form-item单独设置规则变量
+fix:#293小程序是自定义导航栏的时候即传了customNavHeight的时候会出现跳转偏移的情况
+
+## 3.1.46(2024-01-29)
+beforeUnmount
+## 3.1.45(2024-01-24)
+fix: #262ext组件为超链接的情况下size属性不生效
+fix: #263最新版本3.1.42中微信小程序u-swipe-action-item报错
+fix: #224最新版本3.1.42中微信小程序u-swipe-action-item报错
+fix: #263支持支付宝小程序
+fix: #261u-input在直接修改v-model的绑定值时,每隔一次会无法出发change事件
+优化折叠面板兼容微信小程序
+## 3.1.42(2024-01-15)
+修复u-number-box默认值0时在小程序不显示值
+优化u-code的timer判断
+优化支付宝小程序下textarea字数统计兼容
+优化u-calendar
+## 3.1.41(2023-11-18)
+#215优化u-cell图标容器间距问题
+## 3.1.40(2023-11-16)
+修复u-slider双向绑定
+## 3.1.39(2023-11-10)
+修复头条小程序不支持env(safe-area-inset-bottom)
+优化#201u-grid 指定列数导致闪烁
+#193IndexList 索引列表 高度错误
+其他优化
+## 3.1.38(2023-10-08)
+修复u-slider
+## 3.1.37(2023-09-13)
+完善emits定义及修复code-input双向数据绑定
+## 3.1.36(2023-08-08)
+修复富文本事件名称大小写
+## 3.1.35(2023-08-02)
+修复编译到支付宝小程序u-form报错
+## 3.1.34(2023-07-27)
+修复App打包uni.$u.mpMixin方式sdk暂时不支持导致报错
+## 3.1.33(2023-07-13)
+修复弹窗进入动画、模板页面样式等
+## 3.1.31(2023-07-11)
+修复dayjs引用
+## 3.0.8(2022-07-12)
+修复u-tag默认宽度撑满容器
+## 3.0.7(2022-07-12)
+修复u-navbar自定义插槽演示示例
+## 3.0.6(2022-07-11)
+修复u-image缺少emits申明
+## 3.0.5(2022-07-11)
+修复u-upload缺少emits申明
+## 3.0.4(2022-07-10)
+修复u-textarea/u-input/u-datetime-picker/u-number-box/u-radio-group/u-switch/u-rate在vue3下数据绑定
+## 3.0.3(2022-07-09)
+启用自建演示二维码
+## 3.0.2(2022-07-09)
+修复dayjs/clipboard等导致打包报错
+## 3.0.1(2022-07-09)
+增加插件市场地址
+## 3.0.0(2022-07-09)
+# uview-plus(vue3)初步发布
diff --git a/uni_modules/uview-plus/components/u--form/u--form.vue b/uni_modules/uview-plus/components/u--form/u--form.vue
new file mode 100644
index 0000000..78e9dc4
--- /dev/null
+++ b/uni_modules/uview-plus/components/u--form/u--form.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
+
+
diff --git a/uni_modules/uview-plus/components/u--image/u--image.vue b/uni_modules/uview-plus/components/u--image/u--image.vue
new file mode 100644
index 0000000..5916065
--- /dev/null
+++ b/uni_modules/uview-plus/components/u--image/u--image.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uni_modules/uview-plus/components/u--input/u--input.vue b/uni_modules/uview-plus/components/u--input/u--input.vue
new file mode 100644
index 0000000..2a8933f
--- /dev/null
+++ b/uni_modules/uview-plus/components/u--input/u--input.vue
@@ -0,0 +1,74 @@
+
+
+ :value="value"
+ @input="e => $emit('input', e)"
+
+
+ :modelValue="modelValue"
+ @update:modelValue="e => $emit('update:modelValue', e)"
+
+ :type="type"
+ :fixed="fixed"
+ :disabled="disabled"
+ :disabledColor="disabledColor"
+ :clearable="clearable"
+ :password="password"
+ :maxlength="maxlength"
+ :placeholder="placeholder"
+ :placeholderClass="placeholderClass"
+ :placeholderStyle="placeholderStyle"
+ :showWordLimit="showWordLimit"
+ :confirmType="confirmType"
+ :confirmHold="confirmHold"
+ :holdKeyboard="holdKeyboard"
+ :focus="focus"
+ :autoBlur="autoBlur"
+ :disableDefaultPadding="disableDefaultPadding"
+ :cursor="cursor"
+ :cursorSpacing="cursorSpacing"
+ :selectionStart="selectionStart"
+ :selectionEnd="selectionEnd"
+ :adjustPosition="adjustPosition"
+ :inputAlign="inputAlign"
+ :fontSize="fontSize"
+ :color="color"
+ :prefixIcon="prefixIcon"
+ :suffixIcon="suffixIcon"
+ :suffixIconStyle="suffixIconStyle"
+ :prefixIconStyle="prefixIconStyle"
+ :border="border"
+ :readonly="readonly"
+ :shape="shape"
+ :customStyle="customStyle"
+ :formatter="formatter"
+ :ignoreCompositionEvent="ignoreCompositionEvent"
+ >
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/uni_modules/uview-plus/components/u--text/u--text.vue b/uni_modules/uview-plus/components/u--text/u--text.vue
new file mode 100644
index 0000000..9cdcf7b
--- /dev/null
+++ b/uni_modules/uview-plus/components/u--text/u--text.vue
@@ -0,0 +1,45 @@
+
+
+
+
+
diff --git a/uni_modules/uview-plus/components/u--textarea/u--textarea.vue b/uni_modules/uview-plus/components/u--textarea/u--textarea.vue
new file mode 100644
index 0000000..becd23d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u--textarea/u--textarea.vue
@@ -0,0 +1,47 @@
+
+ $emit('input', e)"
+ @update:modelValue="e => $emit('update:modelValue', e)"
+ >
+
+
+
diff --git a/uni_modules/uview-plus/components/u-action-sheet/actionSheet.js b/uni_modules/uview-plus/components/u-action-sheet/actionSheet.js
new file mode 100644
index 0000000..086898d
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-action-sheet/actionSheet.js
@@ -0,0 +1,26 @@
+/*
+ * @Author : LQ
+ * @Description :
+ * @version : 1.0
+ * @Date : 2021-08-20 16:44:21
+ * @LastAuthor : LQ
+ * @lastTime : 2021-08-20 16:44:35
+ * @FilePath : /u-view2.0/uview-ui/libs/config/props/actionSheet.js
+ */
+export default {
+ // action-sheet组件
+ actionSheet: {
+ show: false,
+ title: '',
+ description: '',
+ actions: [],
+ index: '',
+ cancelText: '',
+ closeOnClickAction: true,
+ safeAreaInsetBottom: true,
+ openType: '',
+ closeOnClickOverlay: true,
+ round: 0,
+ wrapMaxHeight: '600px'
+ }
+}
diff --git a/uni_modules/uview-plus/components/u-action-sheet/props.js b/uni_modules/uview-plus/components/u-action-sheet/props.js
new file mode 100644
index 0000000..eb45834
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-action-sheet/props.js
@@ -0,0 +1,62 @@
+import { defineMixin } from '../../libs/vue'
+import defProps from '../../libs/config/props.js'
+
+export const props = defineMixin({
+ props: {
+ // 操作菜单是否展示 (默认false)
+ show: {
+ type: Boolean,
+ default: () => defProps.actionSheet.show
+ },
+ // 标题
+ title: {
+ type: String,
+ default: () => defProps.actionSheet.title
+ },
+ // 选项上方的描述信息
+ description: {
+ type: String,
+ default: () => defProps.actionSheet.description
+ },
+ // 数据
+ actions: {
+ type: Array,
+ default: () => defProps.actionSheet.actions
+ },
+ // 取消按钮的文字,不为空时显示按钮
+ cancelText: {
+ type: String,
+ default: () => defProps.actionSheet.cancelText
+ },
+ // 点击某个菜单项时是否关闭弹窗
+ closeOnClickAction: {
+ type: Boolean,
+ default: () => defProps.actionSheet.closeOnClickAction
+ },
+ // 处理底部安全区(默认true)
+ safeAreaInsetBottom: {
+ type: Boolean,
+ default: () => defProps.actionSheet.safeAreaInsetBottom
+ },
+ // 小程序的打开方式
+ openType: {
+ type: String,
+ default: () => defProps.actionSheet.openType
+ },
+ // 点击遮罩是否允许关闭 (默认true)
+ closeOnClickOverlay: {
+ type: Boolean,
+ default: () => defProps.actionSheet.closeOnClickOverlay
+ },
+ // 圆角值
+ round: {
+ type: [Boolean, String, Number],
+ default: () => defProps.actionSheet.round
+ },
+ // 选项区域最大高度
+ wrapMaxHeight: {
+ type: [String],
+ default: () => defProps.actionSheet.wrapMaxHeight
+ },
+ }
+})
diff --git a/uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue b/uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue
new file mode 100644
index 0000000..98174b8
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-action-sheet/u-action-sheet.vue
@@ -0,0 +1,283 @@
+
+
+
+
+
+ {{description}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{cancelText}}
+
+
+
+
+
+
+
+
diff --git a/uni_modules/uview-plus/components/u-album/album.js b/uni_modules/uview-plus/components/u-album/album.js
new file mode 100644
index 0000000..8aebaba
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-album/album.js
@@ -0,0 +1,28 @@
+/*
+ * @Author : LQ
+ * @Description :
+ * @version : 1.0
+ * @Date : 2021-08-20 16:44:21
+ * @LastAuthor : LQ
+ * @lastTime : 2021-08-20 16:47:24
+ * @FilePath : /u-view2.0/uview-ui/libs/config/props/album.js
+ */
+export default {
+ // album 组件
+ album: {
+ urls: [],
+ keyName: '',
+ singleSize: 180,
+ multipleSize: 70,
+ space: 6,
+ singleMode: 'scaleToFill',
+ multipleMode: 'aspectFill',
+ maxCount: 9,
+ previewFullImage: true,
+ rowCount: 3,
+ showMore: true,
+ autoWrap: false,
+ unit: 'px',
+ stop: true,
+ }
+}
diff --git a/uni_modules/uview-plus/components/u-album/props.js b/uni_modules/uview-plus/components/u-album/props.js
new file mode 100644
index 0000000..a219acb
--- /dev/null
+++ b/uni_modules/uview-plus/components/u-album/props.js
@@ -0,0 +1,86 @@
+import { defineMixin } from '../../libs/vue'
+import defProps from '../../libs/config/props.js'
+export const props = defineMixin({
+ props: {
+ // 图片地址,Array|Array