From e1ad1d4ebe93e23c919b51756d72497c3238ca81 Mon Sep 17 00:00:00 2001 From: yuanlei <18627959669@163.com> Date: Fri, 28 Mar 2025 10:37:56 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 16 + .env.production | 14 + .gitignore | 2 + App.vue | 104 ++++ api/chat.js | 35 ++ api/login.js | 62 ++ index.html | 21 + main.js | 23 + manifest.json | 79 +++ pages.json | 105 ++++ pages/home/user.vue | 158 +++++ pages/setting/about.vue | 44 ++ pages/setting/contact.vue | 81 +++ pages/setting/setting.vue | 75 +++ pages/user/login.vue | 259 ++++++++ pages/user/register.vue | 173 ++++++ permission.js | 96 +++ plugins/modal.js | 72 +++ plugins/pluginTool.js | 15 + plugins/tab.js | 74 +++ static/image/app.png | Bin 0 -> 14128 bytes static/image/favicon.ico | Bin 0 -> 4781 bytes static/image/ninecloud-white.png | Bin 0 -> 6036 bytes static/image/tabbar/chat-fill.png | Bin 0 -> 7684 bytes static/image/tabbar/chat.png | Bin 0 -> 7379 bytes static/image/tabbar/home-fill.png | Bin 0 -> 7250 bytes static/image/tabbar/home.png | Bin 0 -> 9787 bytes static/image/tabbar/type-fill.png | Bin 0 -> 20721 bytes static/image/tabbar/type.png | Bin 0 -> 28776 bytes static/image/tabbar/user-fill.png | Bin 0 -> 15207 bytes static/image/tabbar/user.png | Bin 0 -> 17797 bytes static/image/user/cc.png | Bin 0 -> 1752 bytes static/image/user/login-password-blue.png | Bin 0 -> 5281 bytes static/image/user/login-phone-blue.png | Bin 0 -> 3403 bytes static/image/user/message.png | Bin 0 -> 5545 bytes static/image/user/uset.png | Bin 0 -> 6670 bytes static/image/user/yy.png | Bin 0 -> 7318 bytes static/style/nine-base-001.scss | 555 +++++++++++++++++ static/style/nine-base-002.scss | 136 +++++ static/style/nine-btn-001.scss | 27 + static/style/nine-chat-friend-001.scss | 1 + static/style/nine-chat-home-001.scss | 1 + static/style/nine-image-001.scss | 36 ++ static/style/nine-list-001.scss | 9 + static/style/nine-nav-001.scss | 39 ++ store/getters.js | 8 + store/index.js | 15 + store/modules/user.js | 94 +++ uni.scss | 76 +++ uni_modules/uni-icons/changelog.md | 42 ++ .../uni-icons/components/uni-icons/uni-icons.uvue | 91 +++ .../uni-icons/components/uni-icons/uni-icons.vue | 110 ++++ .../uni-icons/components/uni-icons/uniicons.css | 664 +++++++++++++++++++++ .../uni-icons/components/uni-icons/uniicons.ttf | Bin 0 -> 35824 bytes .../components/uni-icons/uniicons_file.ts | 664 +++++++++++++++++++++ .../components/uni-icons/uniicons_file_vue.js | 649 ++++++++++++++++++++ uni_modules/uni-icons/package.json | 89 +++ uni_modules/uni-icons/readme.md | 8 + uni_modules/uni-scss/changelog.md | 8 + uni_modules/uni-scss/index.scss | 1 + uni_modules/uni-scss/package.json | 82 +++ uni_modules/uni-scss/readme.md | 4 + uni_modules/uni-scss/styles/index.scss | 7 + uni_modules/uni-scss/styles/setting/_border.scss | 3 + uni_modules/uni-scss/styles/setting/_color.scss | 66 ++ uni_modules/uni-scss/styles/setting/_radius.scss | 55 ++ uni_modules/uni-scss/styles/setting/_space.scss | 56 ++ uni_modules/uni-scss/styles/setting/_styles.scss | 167 ++++++ uni_modules/uni-scss/styles/setting/_text.scss | 24 + .../uni-scss/styles/setting/_variables.scss | 146 +++++ uni_modules/uni-scss/styles/tools/functions.scss | 19 + uni_modules/uni-scss/theme.scss | 31 + uni_modules/uni-scss/variables.scss | 62 ++ uni_modules/vrapile-im/changelog.md | 40 ++ .../components/vrapile-im/vrapile-im.vue | 5 + uni_modules/vrapile-im/package.json | 86 +++ uni_modules/vrapile-im/pages/chat/chatFriend.vue | 335 +++++++++++ uni_modules/vrapile-im/pages/home/chatHome.vue | 184 ++++++ uni_modules/vrapile-im/pages_init.json | 20 + uni_modules/vrapile-im/readme.md | 105 ++++ uni_modules/vrapile-im/static/image/emoji.png | Bin 0 -> 9617 bytes uni_modules/vrapile-im/static/image/message.png | Bin 0 -> 5545 bytes uni_modules/vrapile-im/static/image/more.png | Bin 0 -> 8428 bytes uni_modules/vrapile-im/static/image/voice.png | Bin 0 -> 9685 bytes uni_modules/vrapile-im/static/image/yy.png | Bin 0 -> 7318 bytes .../static/style/nine-chat-friend-001.scss | 165 +++++ .../static/style/nine-chat-home-001.scss | 112 ++++ uni_modules/vrapile-im/store/getters.js | 11 + uni_modules/vrapile-im/store/index.js | 16 + uni_modules/vrapile-im/store/modules/chat.js | 138 +++++ uni_modules/vrapile-im/store/modules/socket.js | 116 ++++ uni_modules/vrapile-im/utils/cache.js | 26 + uni_modules/vrapile-im/utils/constant.js | 6 + uni_modules/vrapile-im/utils/errorCode.js | 6 + uni_modules/vrapile-im/utils/nineTool.js | 348 +++++++++++ uni_modules/vrapile-im/utils/storage.js | 33 + uni_modules/vrapile-im/utils/tiosocket.js | 181 ++++++ utils/cache.js | 26 + utils/constant.js | 8 + utils/errorCode.js | 6 + utils/frameTool.js | 15 + utils/nineTool.js | 348 +++++++++++ utils/nodeId.js | 13 + utils/queryByDiy.js | 17 + utils/request.js | 106 ++++ utils/requestTool.js | 54 ++ utils/storage.js | 32 + utils/token.js | 13 + 108 files changed, 8124 insertions(+) create mode 100644 .env.development create mode 100644 .env.production create mode 100644 .gitignore create mode 100644 App.vue create mode 100644 api/chat.js create mode 100644 api/login.js create mode 100644 index.html create mode 100644 main.js create mode 100644 manifest.json create mode 100644 pages.json create mode 100644 pages/home/user.vue create mode 100644 pages/setting/about.vue create mode 100644 pages/setting/contact.vue create mode 100644 pages/setting/setting.vue create mode 100644 pages/user/login.vue create mode 100644 pages/user/register.vue create mode 100644 permission.js create mode 100644 plugins/modal.js create mode 100644 plugins/pluginTool.js create mode 100644 plugins/tab.js create mode 100644 static/image/app.png create mode 100644 static/image/favicon.ico create mode 100644 static/image/ninecloud-white.png create mode 100644 static/image/tabbar/chat-fill.png create mode 100644 static/image/tabbar/chat.png create mode 100644 static/image/tabbar/home-fill.png create mode 100644 static/image/tabbar/home.png create mode 100644 static/image/tabbar/type-fill.png create mode 100644 static/image/tabbar/type.png create mode 100644 static/image/tabbar/user-fill.png create mode 100644 static/image/tabbar/user.png create mode 100644 static/image/user/cc.png create mode 100644 static/image/user/login-password-blue.png create mode 100644 static/image/user/login-phone-blue.png create mode 100644 static/image/user/message.png create mode 100644 static/image/user/uset.png create mode 100644 static/image/user/yy.png create mode 100644 static/style/nine-base-001.scss create mode 100644 static/style/nine-base-002.scss create mode 100644 static/style/nine-btn-001.scss create mode 100644 static/style/nine-chat-friend-001.scss create mode 100644 static/style/nine-chat-home-001.scss create mode 100644 static/style/nine-image-001.scss create mode 100644 static/style/nine-list-001.scss create mode 100644 static/style/nine-nav-001.scss create mode 100644 store/getters.js create mode 100644 store/index.js create mode 100644 store/modules/user.js create mode 100644 uni.scss create mode 100644 uni_modules/uni-icons/changelog.md create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.uvue create mode 100644 uni_modules/uni-icons/components/uni-icons/uni-icons.vue create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.css create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons.ttf create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons_file.ts create mode 100644 uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js create mode 100644 uni_modules/uni-icons/package.json create mode 100644 uni_modules/uni-icons/readme.md create mode 100644 uni_modules/uni-scss/changelog.md create mode 100644 uni_modules/uni-scss/index.scss create mode 100644 uni_modules/uni-scss/package.json create mode 100644 uni_modules/uni-scss/readme.md create mode 100644 uni_modules/uni-scss/styles/index.scss create mode 100644 uni_modules/uni-scss/styles/setting/_border.scss create mode 100644 uni_modules/uni-scss/styles/setting/_color.scss create mode 100644 uni_modules/uni-scss/styles/setting/_radius.scss create mode 100644 uni_modules/uni-scss/styles/setting/_space.scss create mode 100644 uni_modules/uni-scss/styles/setting/_styles.scss create mode 100644 uni_modules/uni-scss/styles/setting/_text.scss create mode 100644 uni_modules/uni-scss/styles/setting/_variables.scss create mode 100644 uni_modules/uni-scss/styles/tools/functions.scss create mode 100644 uni_modules/uni-scss/theme.scss create mode 100644 uni_modules/uni-scss/variables.scss create mode 100644 uni_modules/vrapile-im/changelog.md create mode 100644 uni_modules/vrapile-im/components/vrapile-im/vrapile-im.vue create mode 100644 uni_modules/vrapile-im/package.json create mode 100644 uni_modules/vrapile-im/pages/chat/chatFriend.vue create mode 100644 uni_modules/vrapile-im/pages/home/chatHome.vue create mode 100644 uni_modules/vrapile-im/pages_init.json create mode 100644 uni_modules/vrapile-im/readme.md create mode 100644 uni_modules/vrapile-im/static/image/emoji.png create mode 100644 uni_modules/vrapile-im/static/image/message.png create mode 100644 uni_modules/vrapile-im/static/image/more.png create mode 100644 uni_modules/vrapile-im/static/image/voice.png create mode 100644 uni_modules/vrapile-im/static/image/yy.png create mode 100644 uni_modules/vrapile-im/static/style/nine-chat-friend-001.scss create mode 100644 uni_modules/vrapile-im/static/style/nine-chat-home-001.scss create mode 100644 uni_modules/vrapile-im/store/getters.js create mode 100644 uni_modules/vrapile-im/store/index.js create mode 100644 uni_modules/vrapile-im/store/modules/chat.js create mode 100644 uni_modules/vrapile-im/store/modules/socket.js create mode 100644 uni_modules/vrapile-im/utils/cache.js create mode 100644 uni_modules/vrapile-im/utils/constant.js create mode 100644 uni_modules/vrapile-im/utils/errorCode.js create mode 100644 uni_modules/vrapile-im/utils/nineTool.js create mode 100644 uni_modules/vrapile-im/utils/storage.js create mode 100644 uni_modules/vrapile-im/utils/tiosocket.js create mode 100644 utils/cache.js create mode 100644 utils/constant.js create mode 100644 utils/errorCode.js create mode 100644 utils/frameTool.js create mode 100644 utils/nineTool.js create mode 100644 utils/nodeId.js create mode 100644 utils/queryByDiy.js create mode 100644 utils/request.js create mode 100644 utils/requestTool.js create mode 100644 utils/storage.js create mode 100644 utils/token.js diff --git a/.env.development b/.env.development new file mode 100644 index 0000000..470abb6 --- /dev/null +++ b/.env.development @@ -0,0 +1,16 @@ +# 页面标题 +VITE_APP_TITLE = IM示例工程 + +# 开发环境配置 +VITE_APP_ENV = 'development' + +# 基础地址 +VITE_APP_BASE_URL = 'http://localhost:18081' +# VITE_APP_BASE_URL = 'https://api.ninecloud.top/msm' + +# socket地址 +# VITE_APP_SOCKET_URL = 'ws://localhost:9326' +VITE_APP_SOCKET_URL = 'wss://api.ninecloud.top/socket/' + +# 网站地址 +VITE_APP_WEB_URL = 'https://www.ninecloud.top/udemo/im/index.html' diff --git a/.env.production b/.env.production new file mode 100644 index 0000000..36b8984 --- /dev/null +++ b/.env.production @@ -0,0 +1,14 @@ +# 页面标题 +VITE_APP_TITLE = 九云商城 + +# 生产环境配置 +VITE_APP_ENV = 'production' + +# 基础地址 +VITE_APP_BASE_URL = 'https://api.ninecloud.top/msm' + +# socket地址 +VITE_APP_SOCKET_URL = 'wss://api.ninecloud.top/socket/' + +# 网站地址 +VITE_APP_WEB_URL = 'https://www.ninecloud.top/udemo/im/index.html' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..89bc518 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/.hbuilderx +/unpackage \ No newline at end of file diff --git a/App.vue b/App.vue new file mode 100644 index 0000000..9740e25 --- /dev/null +++ b/App.vue @@ -0,0 +1,104 @@ + + + diff --git a/api/chat.js b/api/chat.js new file mode 100644 index 0000000..5320148 --- /dev/null +++ b/api/chat.js @@ -0,0 +1,35 @@ +import request from "@/utils/request" + +// 查询用户所有好友 +export function getUserAllFriend() { + return request({ + url: "/im/friend/getUserAllFriend", + method: "get" + }) +} + +// 查询用户所有群 +export function getUserAllGroup() { + return request({ + url: "/im/group/getUserAllGroup", + method: "get" + }) +} + +// 查询组用户 +export function getGroupUser(id) { + return request({ + url: "/im/groupUser/getGroupUser/"+ id + "?r=" + Math.random(), + method: "get" + }) +} + + +// 通过唯一会话key获取消息 +export function getMessageByChatKey(data) { + return request({ + url: "/im/message/getMessageByChatKey", + method: "post", + data: data + }) +} diff --git a/api/login.js b/api/login.js new file mode 100644 index 0000000..64440cd --- /dev/null +++ b/api/login.js @@ -0,0 +1,62 @@ +import request from '@/utils/request' + +// 登录方法 +export function login(type, username, password, smsCode, registerFlag, code, uuid) { + const data = { + type, + username, + password, + smsCode, + registerFlag, + code, + uuid + } + return request({ + url: '/appLogin', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +// 注册方法 +export function register(data) { + return request({ + url: '/register', + headers: { + isToken: false + }, + method: 'post', + data: data + }) +} + +// 获取用户详细信息 +export function getInfo() { + return request({ + url: '/getInfo', + method: 'get' + }) +} + +// 退出方法 +export function logout() { + return request({ + url: '/logout', + method: 'post' + }) +} + +// 获取验证码 +export function getCodeImg() { + return request({ + url: '/captchaImage', + headers: { + isToken: false + }, + method: 'get', + timeout: 20000 + }) +} diff --git a/index.html b/index.html new file mode 100644 index 0000000..912b511 --- /dev/null +++ b/index.html @@ -0,0 +1,21 @@ + + + + + + + + + + + +
+ + + diff --git a/main.js b/main.js new file mode 100644 index 0000000..fafb871 --- /dev/null +++ b/main.js @@ -0,0 +1,23 @@ +import { createSSRApp } from 'vue' +import App from './App' +// 存储 +import store from '@/store' +// 路由权限控制 +import '@/permission.js' + +// 框架方法 +import frameTool from "@/utils/frameTool"; +// 插件方法 +import pluginTool from "@/plugins/pluginTool.js"; + +const app = createSSRApp(App) + +app.use(store) +app.use(frameTool) +app.use(pluginTool) + +export function createApp() { + return { + app + } +} \ No newline at end of file diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..973d02f --- /dev/null +++ b/manifest.json @@ -0,0 +1,79 @@ +{ + "name" : "udemo-im", + "appid" : "__UNI__D1DA2B6", + "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", + "h5" : { + "title" : "im", + "router" : { + "mode" : "hash", + "base" : "/udemo/im/" + } + } +} diff --git a/pages.json b/pages.json new file mode 100644 index 0000000..4be6b97 --- /dev/null +++ b/pages.json @@ -0,0 +1,105 @@ +{ + "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + // 我的 + { + "path": "pages/home/user", + "style" : { + "navigationBarTitleText": "我的", + "enablePullDownRefresh": false + } + }, + { + "path": "uni_modules/vrapile-im/pages/home/chatHome", + "style": { + "enablePullDownRefresh": false, + "navigationBarTitleText": "消息" + } + }, + { + "path": "uni_modules/vrapile-im/pages/chat/chatFriend", + "style": { + "enablePullDownRefresh": true, + "navigationBarTitleText": "聊天" + } + } + ], + "subPackages": [ + //用户 + { + "root": "pages/user", + "pages": [ + { + "path": "login", + "style": { + "navigationBarTitleText": "登录", + "enablePullDownRefresh": false + } + }, + { + "path": "register", + "style": { + "navigationBarTitleText": "注册", + "enablePullDownRefresh": false + } + } + ] + }, + //设置 + { + "root": "pages/setting", + "pages": [ + { + "path" : "about", + "style" : { + "navigationBarTitleText": "关于", + "enablePullDownRefresh": false + } + }, + { + "path" : "contact", + "style" : { + "navigationBarTitleText": "联系我们", + "enablePullDownRefresh": false + } + }, + { + "path" : "setting", + "style" : { + "navigationBarTitleText": "设置", + "enablePullDownRefresh": false + } + } + ] + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "IM", + "navigationBarBackgroundColor": "#FFFFFF", + "h5": { + "titleNView": false, + "maxWidth": 1190, + "navigationBarTextStyle": "black", + "navigationBarBackgroundColor": "#FFFFFF" + }, + "backgroundColor": "#F8F8F8" + }, + "tabBar": { + "selectedColor": "#0000ff", + "list": [ + { + "pagePath": "uni_modules/vrapile-im/pages/home/chatHome", + "iconPath": "static/image/tabbar/chat.png", + "selectedIconPath": "static/image/tabbar/chat-fill.png", + "text": "消息" + }, + { + "pagePath": "pages/home/user", + "iconPath": "static/image/tabbar/user.png", + "selectedIconPath": "static/image/tabbar/user-fill.png", + "text": "我的" + } + ] + }, + "uniIdRouter": {} +} diff --git a/pages/home/user.vue b/pages/home/user.vue new file mode 100644 index 0000000..acab0d7 --- /dev/null +++ b/pages/home/user.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/pages/setting/about.vue b/pages/setting/about.vue new file mode 100644 index 0000000..48abcc1 --- /dev/null +++ b/pages/setting/about.vue @@ -0,0 +1,44 @@ + diff --git a/pages/setting/contact.vue b/pages/setting/contact.vue new file mode 100644 index 0000000..0064bc0 --- /dev/null +++ b/pages/setting/contact.vue @@ -0,0 +1,81 @@ + + + diff --git a/pages/setting/setting.vue b/pages/setting/setting.vue new file mode 100644 index 0000000..28ef981 --- /dev/null +++ b/pages/setting/setting.vue @@ -0,0 +1,75 @@ + + + diff --git a/pages/user/login.vue b/pages/user/login.vue new file mode 100644 index 0000000..eb23f2b --- /dev/null +++ b/pages/user/login.vue @@ -0,0 +1,259 @@ + + + + + diff --git a/pages/user/register.vue b/pages/user/register.vue new file mode 100644 index 0000000..4aff2ff --- /dev/null +++ b/pages/user/register.vue @@ -0,0 +1,173 @@ + + + \ No newline at end of file diff --git a/permission.js b/permission.js new file mode 100644 index 0000000..03ae2c4 --- /dev/null +++ b/permission.js @@ -0,0 +1,96 @@ +import store from '@/store' +import { getToken } from '@/utils/token' +import { setNodeId, getNodeId } from '@/utils/nodeId' +import { diyApi } from '@/utils/queryByDiy'; +import { getLongRandom } from '@/utils/nineTool'; + +// 登录页面 +const loginPage = "/pages/user/login" + +// 页面白名单 +const whiteList = [ + '/pages/user/login', + '/pages/user/register', + '/pages/user/forget', + '/pages/setting/protocol', + '/pages/common/webview/index' +] + +// 检查地址白名单 +function checkWhite(url) { + const path = url.split('?')[0] + return whiteList.indexOf(path) !== -1 +} + +// 保存访问日志 +function saveAccessLog(to, f) { + // 开发环境不保存日志 + if(import.meta.env.VITE_APP_ENV == 'development'){ + return; + } + // 生成一个nodeId,用于记录日志 + let nodeId = getNodeId(); + if(!nodeId){ + nodeId = getLongRandom(24) + setNodeId(nodeId) + } + let flag = "udemo_im_other_" + f; + // #ifdef MP-WEIXIN + flag = "udemo_im_wx_" + f; + // #endif + // #ifdef H5 + flag = "udemo_im_h5_" + f; + // #endif + // #ifdef APP-PLUS + flag = "udemo_im_app_" + f; + // #endif + let data = { + flag: flag, + fullPath: to.url.split("?")[0], + allPath: to.url, + menuName: to.tabBarText, + userId: store.state.user.userInfo.userId, + userName: store.state.user.userInfo.userName, + nodeId: nodeId + } + diyApi("/system/log/insSysAccessLog", data); +} + +// 页面跳转验证拦截器 +let list = ["navigateTo", "redirectTo", "reLaunch", "switchTab"] +list.forEach(item => { + uni.addInterceptor(item, { + invoke(to) { + if (getToken()) { + if (to.url === loginPage) { + uni.reLaunch({ url: "/" }) + } + saveAccessLog(to, "generate"); + return true + } else { + if (checkWhite(to.url)) { + saveAccessLog(to, "white"); + return true + } + saveAccessLog(to, "nologin"); + // 密码登录的,实现自动重新登录 + let loginInfo = store.state.user.loginInfo; + if(loginInfo && loginInfo.loginType == 0){ + store.dispatch('Login', { + loginType: loginInfo.loginType, + userName: loginInfo.userName, + password: loginInfo.password, + registerFlag: "N" + }).then(() => { + store.dispatch('GetInfo'); + }) + return true + } + return true + } + }, + fail(err) { + console.error(err) + } + }) +}) diff --git a/plugins/modal.js b/plugins/modal.js new file mode 100644 index 0000000..f9fbc68 --- /dev/null +++ b/plugins/modal.js @@ -0,0 +1,72 @@ +// 消息提示 +export function msg(content) { + uni.showToast({ + title: content, + icon: 'none' + }) +} +// 错误消息 +export function msgError(content) { + uni.showToast({ + title: content, + icon: 'error' + }) +} +// 成功消息 +export function msgSuccess(content) { + uni.showToast({ + title: content, + icon: 'success' + }) +} +// 隐藏消息 +export function hideMsg(content) { + uni.hideToast() +} +// 弹出提示 +export function alert(content, title) { + uni.showModal({ + title: title || '系统提示', + content: content, + showCancel: false + }) +} +// 确认窗体 +export function confirm(content, title) { + return new Promise((resolve, reject) => { + uni.showModal({ + title: title || '系统提示', + content: content, + cancelText: '取消', + confirmText: '确定', + success: function(res) { + if (res.confirm) { + resolve(res.confirm) + } + } + }) + }) +} +// 提示信息 +export function showToast(option) { + if (typeof option === "object") { + uni.showToast(option) + } else { + uni.showToast({ + title: option, + icon: "none", + duration: 2500 + }) + } +} +// 打开遮罩层 +export function loading(content) { + uni.showLoading({ + title: content, + icon: 'none' + }) +} +// 关闭遮罩层 +export function closeLoading() { + uni.hideLoading() +} diff --git a/plugins/pluginTool.js b/plugins/pluginTool.js new file mode 100644 index 0000000..91c0af2 --- /dev/null +++ b/plugins/pluginTool.js @@ -0,0 +1,15 @@ +import * as tab from '@/plugins/tab.js' +import * as modal from '@/plugins/modal.js' + +export default { + install(app) { + // tab工具 + Object.keys(tab).forEach((key) => { + app.config.globalProperties[key] = tab[key]; + }) + // modal工具 + Object.keys(modal).forEach((key) => { + app.config.globalProperties[key] = modal[key]; + }); + } +}; \ No newline at end of file diff --git a/plugins/tab.js b/plugins/tab.js new file mode 100644 index 0000000..f3ff2ca --- /dev/null +++ b/plugins/tab.js @@ -0,0 +1,74 @@ + // 关闭所有页面,打开到应用内的某个页面 +export function reLaunch(url) { + return uni.reLaunch({ + url: url + }) +} +export function reLaunchLogin() { + return uni.reLaunch({ + url: '/pages/user/login' + }) +} +// 跳转到tabBar页面,并关闭其他所有非tabBar页面 +export function switchTab(url) { + return uni.switchTab({ + url: url + }) +} +// 关闭当前页面,跳转到应用内的某个页面 +export function redirectTo(url) { + return uni.redirectTo({ + url: url + }) +} +// 保留当前页面,跳转到应用内的某个页面 +export function navigateTo(url) { + return uni.navigateTo({ + url: url + }) +} +// 保留当前页面,跳转到应用内的某个页面 +export function navigateToLogin() { + return uni.navigateTo({ + url: '/pages/user/login' + }) +} +// 关闭当前页面,返回上一页面或多级页面 +export function navigateBack() { + return uni.navigateBack() +} + +export function openUrl(url) { + if(!url || typeof url == 'object' || url == '#'){ + uni.showToast({ + title: '此功能正开发中,敬请期待!', + icon: 'none' + }) + return; + } + uni.navigateTo({ + url: url + }) +} + +export function pageScrollTo(scrollTop, duration=0) { + uni.pageScrollTo({ + scrollTop: scrollTop, + duration: duration + }); +} + +// 复制 +export function setClipboardData(content) { + return new Promise((resolve, reject) => { + uni.setClipboardData({ + data: content, + success: (res) => { + if (res.confirm) { + resolve(res.confirm) + } + } + }) + }) +} + diff --git a/static/image/app.png b/static/image/app.png new file mode 100644 index 0000000000000000000000000000000000000000..3f632506c77b8ef630757c8059bca165c041e29b GIT binary patch literal 14128 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 Hu0mjfl8Q_r literal 0 HcmV?d00001 diff --git a/static/image/ninecloud-white.png b/static/image/ninecloud-white.png new file mode 100644 index 0000000000000000000000000000000000000000..7d8009882cbe00dd190e2f22a00a52f1f2ad612e GIT binary patch literal 6036 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 J4cIjF{{Sn(rIP>v literal 0 HcmV?d00001 diff --git a/static/image/tabbar/chat.png b/static/image/tabbar/chat.png new file mode 100644 index 0000000000000000000000000000000000000000..2872220f2d5134580cd0570b3c85dc40bce0f4ea GIT binary patch literal 7379 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≈<5DIe; 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 literal 0 HcmV?d00001 diff --git a/static/image/tabbar/user-fill.png b/static/image/tabbar/user-fill.png new file mode 100644 index 0000000000000000000000000000000000000000..119edbecf57690f3e9f76e97013e05241eda7290 GIT binary patch literal 15207 zcmV-tJD9|YP)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C zFqBC|K~#9!?7exEW$RTR_S^gWzH`nUYVPXkjT(`og(EPdv?L%#QY=~EtYE`ate|BF zlLY}|nJh0aj7^9V+p!sJq}X5<#s)z!3W9)1gdAgROCn)KUf7!T{N~sFs;8Rny=VBo zy?6dNr>3szr`N65U3Kf--RoP`tGaIWJ?H+;9)5cwGs8?~a<7DEw_qkSz|CX^xS7mk z2Dq8b05_AF%m6o&8Q^9z1Kdnza@WP*?hC%|Kl#YXyb@BtJO~W-4NM%=Je-eUBE-gn z*gy<0DV$fRDpJ!2Kw#IjzlJ0bxx#?lamt7+fh-YO!%jt&2F|A~Gh!7UFxyDg2LQP# zWvXmu)IeE`Y^>rE3;+nKjF49#a*)UXDO4Q@0J{W$kP^fB1R_R?48TAfPb`2w{>iu8 zUBI1E2{0^yQ4ofT1Rqk{xAc?1?M~bV-a?h>*-M z2CxYr%{1IgS&VW3bHrAFNSSp+gl)hg$N&)V!ZUxe14bg-Hiv7JC=lC%F$xp(0GgQ5 zhzQLLa4#jC8G0}*g}h15p-C~nY%O4(-)fTq)O`g2vc10_`cD7=5x}+fbriCq8v3kS ziPb>OXp^YZkTbxYR-_>iaMn4?olon|>AI=Gi~xEbkb$5|5OGlTNXqT^i~$uG0Zg{1 z4GD)dqZvhJS$9rYeOe&m`$V{c;W7w1i&9S&&HxY=i0M8ei1YdcfORv18MlDjCn^pp z1^7_6PWz6{6bBOzNdb}qOaesQ9?Hnzd;?R09R?gs8D^wJw(h(<$pjEv>F~wM1Qt^!$K)V>zHY#LkfoBX82Vw=tfPG*jG8h@CLx3lQ+{ry;ilSGqdq%(*n5f2%d@~iXI+)yeFL9Y zEdqBkj8WBBYhJ2>srqG5O z&<`P<3qfuGwy8?HrVTKtGE@RWUV`k%Xq1>W6A3}p^~~T5@PL(|&S0968G2-tL|kIh zl2{Xw)raa@2{1D>O$G*mSiASqnsox!d`M?h-9aD?0-YS@x0q*3;ybrd@4o|C6 z-0{^+30XdYbAr?qyG}k}0KoxRR;4*rjs}bXY^4|^_y+7+f6Tc~v8mrxqt2o3zzS0! z#SDN1gPQ|rnTS@&(H6+Aqs7{;6#Z?8_}!qzj6kGimNl1CQ>-LoCbIF&hda6aTAv-S z5b@Kh)a*r{1Q5Zo9HKl3G_S(6Pz)eAh^U?+?JKr{fD%DwDu4j33 zUd81vaSeA8b-clpUEZtC6op(eqXwjqz}3?M9UZ3##r+RSwkoxJJ-Q%^@`d zFiQ&_MEEd9Q`@piC{oi~G{rg7a2})#$aBoJrV`d&s4AaT*JC|^YL3_tR2W%49uwz_NEMB?8Vgi7peFz9a!hBq#17R2_Mb)&8Kl zN-VW0w-kmlKnd(x@KKi~AhIPjT1tsGnC%8qhS&^1Bp?t}LheHK_G-NR%E{K*Z;+IK zMQVDBYfru|H}!ne{V*TuTGVf**!x2w{nuG<>(SH{ze$`XA~|9+M93zkS}Fmol5-Dv zpRN+wwsirp3lRoDI?$Ohh?=q(PPWtLa8*Rtc4?KD65yPZ69zVb$(_qGQvhX0t{&vT zIx2!#q2gAW#?PzJvrMQ{96(YJAxr?^4YBEcS2bCAlSp`3YWk3rwLoNPb^Fb!Ec297 zUf6i4Fm-QnKEB0gV=&8;y}7F&cRczTGxxjY_$++bhR-&yn&~7q{+tVriFDK8S}hkM zm=z{%CZh!(ZG~J1GNH3(xI*+21KiE5{P9~;p3D19?t?t3!utS0UF6p}t85VQXUoxm z)aY@?fN2gg29Z5dj?R2{HCg(GrW&>ctr3V5d?>%Dhd}_)`G;nNSPuZQhw5_SA)igY zqv&sZ%;(k5z}!EPG=y{YI0>E_Z`*2rP#KYK?FJ1_VDNx=q}T>0-lr?QJ|3(p?h`P< z6o;<24LG@(xIEqj-Px<|$BfQ=O@VWpZl z)@09wEP-f@(dLD}JJ~w-mz!!1%xSj(^TpL31m+eznlg+wF21pvEd1a7;q~_qmM*=A z2u%}liAwiyZ=f}?Zo^tl=QthU5QuD)S^2Vtq$fV6_G@&S=`EsxYAUiVp4r+Xt)!i&zZ5}oh3<5cl^rT zgnL&XL`JTz!fK4}Imh12@;9%qz2bw_cxm4G2JG+sXU47pjIed%!7p#Bxqmf(=BYnT zlzm8S`+ACWHsrVj>(cuSq$b-fpCVFmPQflM19EK|eYxAGMNYs)sv&qseKYrTihDjK z`?SyDH>5-tVq+u6KB)}r2>PlqKe zk;j*PaD^#VdvW(pMHIknrDH2n^Z{(~R0Hm~g9c^|&ZT6g`>HH>_iYgjs;0z>?duPH zupFPcc#^@k`$2>X)nsYF8xQ~L(z#E4Q;KBFdrAE^Ehp_)Hux;YrU^mCMVg}e^r@;A zF(YEOLX8>`h6r~Ww{0?3Wr(`I2$#)d<-5jP7v92ddRjr*MO5Q6Z>Yx0Kd7cPj58Rw z)g;PY|3&+E0yV_y&Gz))ah!V)r5>*$V1if4l66(O*{F&BAXk7(~9xdkx5Lt3;ePv9DXlkCSsme4ESpm34 z#qB;^OcAOK>ZlM^O_S}jKh#w7!G#Lb##K3ABh_D*}#Bi|GUt{oo8TRr-;qqb(78eziU_PO`)($7;l|_M?SdzP3-I6 zHEpX&vaD{ab*ybeB%;LaJ*iGD;Epe7Ab`vL|#-~+;LZT*mt$o|4GT8 zEypW=3a6o~m=x7``K^PwwTl2QnRG2$n+$>&K<5Vn$b7+5s#XNH9f}z_+jAba+e# zl~_eBAxTU2YDIWh>WIbUD_Q0Zg5NyDxyT5By0H*A_Z}|8?C0;`!b0ce0G{f zau`fKMBLXh3skgAs&Yq9kuyZ6rgCaE9J%t?ZazB>rdgZQGJ>RD=jkv^!&eZW!XaxU zF!QfTsh6c#G(M{VN-%Q(D43cMm3nFcXL@WAU;?o@-(*Bus(3VYr)`OQrv5BW;~+^g zsD!!H^otaGjSn?^C}C~Gv=?FqveRo)iH@njWVfqC0!T{`bwgzcD#m8)rnQsl`QucB zN*JW37g8)BSq2l2Hh_Rvp_A7u{Gw_&JI0D%GZM)hsdcsfq3u+M3#vRIoI)YMjGU?` z72j4hlK|Km6>DjluKV@@cbsV>qtbCQ<^;zPl1~tu9vqnxA>#Ck?L^o!=Mu;zWU_@6b2yiTNE!p3MySELSou&T78xki*JZ{DMSly#1{2GH&=9Ge zY99{AI3JFPpbAmtjM++Jg>wyv6PzzUK`eiE|IoqHBFypQ#IYOkDj)`$n0Xa0nWn24 zYpMVT7}U5*(GQr-xsb%lIn?7JoR=$EK1Q3~IvqRIR2_Ui2D|ilJzhcH-)zh2m3>Ms zfONx7dtWLaGn;RwDgp*DbUtln#RTPO4lay8P9znKi__!4IXD+J6kDH8u?HU_hyY1$ zL4<5~Na8eU>pOeN@f{+Dh}(=Y%u5Vl-yq~;5XHx`V(U{lRXcxc1#AG&8(jS`S(mIQ zLyTb|HLeEfRF*a0fe&~5*GUAZ@djXX-piI1CF(LD6kETP6{Ghy)v%=xrrLk=@S%dw z$Nv~EAuDP)pD4x9Q>E+7Je9iq4pLhugSs>2QHq-7eeD(fvP?}M65Zp);Ko0%%el8t zy?&E`-r}<#4`KB0K^cmof(Q>J*@Pfd+mbdt1(-)rBr(!xpepQ96w%GKL_t$>X zhqG^2%}(Tq{}=X9GhC=q46gkoV3rqSs03Gyv$>e)3X@`5w>I2brVBPz!t(_9t9 zcXC5c${{kS;aXk!eu{q1I|d;`fBw=BhHTuGFHITT)WiE4{rP8pFl06Q!wDq0g}QcZ z(CgD)f^`R}Eq9_WfB>y)T7&Uw(XS_7A)xUm=9ZrLx%Dfr`E%`lt?BuY)EwrQp7>zM zCm+d+1Sa@N73Nce=V;&fu9uL8J9$E|GDcokrSn-)6BD7o@XYu1hS#o2nx5TgB02Kj z#%ON&iSG+pgu!!F<`zx%3f^}EBvYyjzYH3>1r;sTR{ z8BgX{zVIy}8;f+UgeTf>lK|&x3>TmJHYR#5%Oj;G+}G4@Or(=L`JG2ka--=29MhM2 zTF`-X7l0rJ^G-L?4$0Zw8@7EvhnxPscZd{8!j;KrprW`x%M4ku@%sy_pZx(Qfu`() znpT5q01>db`h_3u4X%IKhlmvY#k%yh8Lscm4?1wcH+}EspK+bX|B;Jdc*7QTRQi-zX#Y}U*`z}8;r2D`h|beo4fuuLM8y)!;?urs@j#kImY`>H#mtL zn5jDfOc_D|oCkS%4m;;EYt)l}UtCr)Fa^nx0fql2c7=VK#hI0&9-hz-^dlPRm zA?^2Mt!ccO@%=;@`tw(QVCnqlehQ=~2y_OO0KhPR=J8*gTe|#i=M*ab{-*Y07_PMa zN(UdV7H}S>0k8n)2<&#v0hl`%*03^UKeE|KjSS@1`ITqhKAz zKID_Jw!27=C8kyh$a)*~%EeEbd2oe?rwD!WW&duV;BvIxlD!f=oZSUKHYYDu8E3053WxgOD|20P9Ni*7o|Di<)|G z6v^Ih=2nhl@J-k7vRIE-{%WiTzwLba(Y(L?1?LoIwq%h8fZqnNiBl-24R9HN6(SVQ zrATbgq^3`k(c&9p(|>nUExw}~FRhw7FsE(;(LDwnE2{DG#mV;SBTV{8K3Lxj#n%6k zWs`r}8?OHzk*u@R`^>Oxg364pnNgep?j-3nqk>>P_Nic!F|%DxsX$ZC|Ci-x<-40| z_~w)fm^!d)z&;);H9#!w0$yX3qcaQDWbs|jH}5J(TmQNkZ2ZH)!lhqsheykNU|AtZ zZN?J-^$c*wYd!k_R`a416}?tX=GVmtn!>k@w=Vo}UCsSbi8+V`%mVC=(x>MEFYoe= zy0Zo5P^Zel-P43_cS4sj;Vx2c0~)=haRu4#%5zN_##`s#RF{iyswWG7eYo`O|7gm; zL}Xk2g{wVNcQ(}pnbB1Mq#!aY^3gRP>MiHuRlu$j=^99h$i@K7j0Ph zj&-E`O960ZM8q=hd>lBIng~xd)ew@xLopVAeYA1^pNq`^MAGfBzqKY)@w;oweW+3N z*DL4ikLJD6XPmDe^S=6jeKGnJvqnIo#H<0eJfG|Kcd0m-d8jEus55|rDu+}LUzK9< z)gt+;>vH&NiNzaZGZ?0(=>AVey93N_VQvK`0psnnU)40j|6RrZiVxLa^I7?5UW~4K zk8@@?3)t9IinzHZO-gw~eRO96ZB7t+wEzM@D z9X-q#As-`Tlg}0X8z1%A_yg?qiLBUotSOfOBd~8k&`$fc$IxaeO!oi>Fw`0lg~mBF z1O@x%4@klvcsD_BcnPUlcu3T}Oq$-Gsm9B1icRmevFXFqgIzq*>=Fwc1gR;oarG77 zp7*x?-HSL_ys3jqXupDfD-@I8n(IIP-lm#+=Va^rw>S0h^|9`QSq}SpWMCIz>M-88 z_$O4t$NF#LOk2+SBpizd`^|uQp_L< zq$dAw*VkV4(b2|zui%~N^9YU87G4sDinW2h!RqhnHgQmit2jE znlmsyb5ivjpFptX#QHKH)cX*hC0Lze0H8?q!jFwNFZ_d858G+wbVTx69aJ6q^J`Bm zp8djKDEb>;4$@yqvDc0%Jwd}bTA$K&4+nm;H@yD!%jZAyX9x3_KWXN6#;P8=M(-;~ z3RqwJvL73--~aPOkz(BgkxfFDF0-S82oIW(n*r|m{k4!~akVI_ZDzgHR0Zm)2j?pu zZC?Dq^~e;ml+2Up)Ky*ZFMxk0ceHFLtske$5z?3iwccVDapu zU$b=X^Z#?mO0?Se@W;e1!PMc#+H1aZymjF>*ri@IS%Rb>&ZTFvqN#m|=hZmO0C(gq z=Y=e<&*i;pjh$ReF<>%UfU5cN#{IvudG%HAWKQ5idr%G9`D1g7&wgt8{O7(g%O?Mw zN!Z+}H=8CVTO~l%mmwSf(DH>(zi#f#6Ccyg|GW8Ghy~8q*u3`2cZ|0#d`yLx##<|h zO$NtlZ7|$k&-3bnDi3FX+jXV^1FeKiRzpZv0gAECkdlWFWq-VR|3|j2zx2s z-v6tc*Ix0Bx8kZKW$>ZI%EeE8&tPHgohkOVO&w0f_fsH^26MXD)p5&*Z)B zbZgKhY+rxikBzs^{g%%wADawS*#lq`AJWr4q{Wsxd8q=f?S(lvn5%nP-dr|=Hg$%S z9DFD-y7AC2ZC-oj+nleD23su9o4a~_e)*|4F{gjfrlwA(XbK>bUtK)==vVdU)*fp& z@X%q<`376pAO70y^#^|2XC>+~M_m;FC}zFtnf~17fC$USsp^@kr}ZjJ<7iaqofp8JoBtB=0fjQ`C^C>g)&pwkSd?hhBwe&Nl- z#i##2N!cN{VaL2~U4Pk|$D8;4gbOud(SE`0h8F#2~bbznIC(q>Ey{Mh2zPkzmC z@#)`F$q&&yL<;7Ft!uCNfqH!Ydz@D^(IM6u%t%70p3Hh>AD{)>-R^U$H5@PYhcOQ! zJ!611jYn+SY=BDmimmnge_px*$)mw``IAfMKlMgazor^qB49fRIuWn)%a8x(!^LMl zB9a{j9ShVL+t(g`ze;$E4>jtlXw55;W?A!Gua_1Heh%ik*Wa7Q)O$9}rrmMs=Ca(D zLmsb!462N}%DXr2v(0O-{Do?=1n24_z*b-|zjkT)+-JYl)LofA%Hzf4>>N}>wQ%P1 z-#S=$<`XIQ4*isK5lu6|=CxP+EY#=BhFBL+AsCQC(90pvs;TRpXboqiw|}5egY&u0 z1#i!qBAF1zTYaP^fL+9B{o$XUY+Zb<57nV3M^c8~;D#)n|Lh+J=rKEBMhP!PG4(K| za_QV>-rApEyK+?Y>U@oAboPPq<^#VPd<{(=b=m9olWCI`^`)$cORDTnEa2{l%rtUY z&~v?Bb)8(SofoJwAcT-ti1p&zwr@Q6?skBn9U?-re2j&aC*E%AK6}`V>PrM-JDu~i zd;MK8z_rEI$G#=+ZALjFcw$Z%t>6ESa=iM8%W9|+R2)KHA!KFMAC?;-=-IYY>?8v2 zb}T8{%{5H!Lf(@|9Bbzrr0Af+@L3JV8b&uB{#i-+p_J9mddm4TkA9!e*FS6~FvNCg zEfUyOC&EkE&2=7^i=A>s&;45Rf2|5tWt znOs6S8X`7%I}C_rQuLz|@p)4M!EWo^eUoZ0{75pu+)~jKWtOW%hLkdlwic0M4lpp< zyzj>+qty$0g_HYqmwC*edHgqu;nnxGJ*0LM^0loYW9@nmPABNh9Eclm*anc=Su7ko zZ-QYE3A%K=OShyjWHS8lIA_`S5R>15Au%h4NLdwQ_&^t&}?w|J}6 zCbpG8u0qH*PpO8pBTVW+P-)818(#Y>z2WswA2zLR&%|is!ADZl`%3l|%oNomhb9MR zMXz68F8Z-=Ms9DE+7~}325_cKA<$~kiyH=0c7hlKnzGluS;b`Q+~0}ykl3X|rquZc zb4!nXFQMKrrPfuu#W4klN`$Zh>nd)iKN96`xb!wav0cpjeD~WNL})U%`1rd*K0cJ} zXO4(X597@T|E^<(cZ{aaQI#!Apvoy^w&@(5xtr-PzB?uWAja8{Cza%?wxcRwyt&kB zBvQnt|8?Wd3xDdU0!k5&`IRR=Pz*MI6IOs7zW8AVC_~7`$oiYNs3n^g6Y3GNEqFhI z;~LJ@V2)q>P(t3n@ri|%|M<7s5_fmdw7Le9&HKJ7)(daF49$&z@+kkUkzxZ+1FM6p6S##Blz@%u(9z-12wT&+IWcf!@?163~cr|4x`s>^M z`Dgx$h=bkEA2SfwU_SzLGsS>oIA88w1G8eMy7~E!Le-%+TzhYCc>TKEq~(YODP@>! zpZ^hJ0a1dfK~)j58q5iKQD4dOG;fCN1xJRrA-AmtB!%ZSw`PWrrNumt*Fh@Ix1CQh z<{;KKYD(Gb%F&s(9?mATQyGVgPycP8epXU}+nxW>ngfONV@T{n)WJEO5}>uLKf4n0 zCCss7m&Sv|r~do8od3CYgqiMB7!AtpvtQMpyZp`Us(&FVgQ_4eHW9K2B8!B4J*9j_ zL@pD(xOB-KM5%Pkqe?L2US7lr`7~;uPC--WP$4)M;e3O7vivtAcRA-9fBxBJ1*pQPY$yJE;K0m8|{?I6HXAD24wjr*iS&5x@K(L(J^)C4X^y;{_x6Y zBpnPOh!iR2m~3D8As_(A5Suwv6Pco!$Dda?z_7LKe5p z+KW?Vq{v`jcg@Lopd78f^(ZsKE}=jF?B4?{wi|EmG{5IsD#6w8VH-Y-I_~ZyBCUPT zK8)e~Hpn$?R7naVxx=F{W%L#xs~tagQuQKcB!ct z1cGveqyXk_v9D#QCTISeqa02Hp+9%|?=v@*XmLj@_VY%~)PR`K7B8L*u$g(dP=kF1 ziTxMe0l0+GAHY^$oWK`+uU zz1!clMd8Q~l-U-1mPRm6Dh|wsdc1%n3}$KlJn`Syl=H8;nF>+KkQLi8?_dA zQiBj0s4)muWw}(brUiqp9~0n?dI@uuHypC^hG`pVngNOcz{AYoeT~W1egB2TUYiHJ z2@J*H+P@{jOXJF#Yb)q z9whcqjaT0`TzvLJk}@zGR2__T*FWc}f?aYGS@aoUETV>MS|H!!l5uvu_dmOzIR6RmI0-JV| z%4NSRp z&b>^$m&Fu)No@BPaQk_{E`>ZFf;e^-O{i;c<8B954Q5439@S*-9kK4==Dew@N7mc? zbsy?$u^HSm|H=Rq!!^Ks+XH&n@$C`vZ2%4Kb!EQ~WtA06zdYW&@E7;j(-8?I=7>%4 z9WG2hYHbc2)npz;f2*79$zamRUNVa`gxTnx0?r`&w41@P8^U-LtGq*??Ia9fV5osq z*izH`nwv>$GlmZ(d{+NKtmmNjl(rzCqYLbgS*6z`pNy_I5a^S(M%Y|2BnHQO5!*=Nt>PCm@PE@_AlHF&~J0g{P2Dtrn3^6TuucdQh z#?+Ze+U=Jl2qbxv*#BCQ;x&iNr2#%vPZ7(<+QP!)90VYH3+U*@)ugHEgHnEcYzzTR z@@$rmo^0y5FFyoF$CQA$7fy+BX_v}z>pPNPf8qi^;^eCjTysy)42pM65_fP6Ycn|$C%C~ zm*Dg9Cr$aw54ez|Pzi|j;GEA&uroGmwaU&ov7PCj42+3+sKR%AEw@jLbj=oK9D9dZb~BQr`SK#*lg_UaqI)&CAjRwe+1yt9xUV)OR>=Z6Yr1h902I`fcM+Kduc=`l4n&W4mxpW3 zsdMP5^0q1Ob%^o-&LpV9OfyKzUVHPvXETSa*oI12pKRWblO$#g=OP9RW!J;`LVe3N z!i!D68$fe%>hKJJ^G)ePiP-d7pLL&Kt|@y}ioM{yvUBG4et;k`bh%Z788t*!s8V$& zo`=7)w@#j&GLa=!ZZ(6tZjAg+h)M&s6itIy2^Vj^`DP5}h%6tCj@_Id$(uQ(m?QTu zeBC^ep-mA*xZ>n(De}I$L@e7dn!7m=OwI62GdbgEaK$KvAz+*P-6-2BQzA>uD9nh6 zZa>v^M;eaEhD1gxtgZ8deJg_671^rPGs9+zy+Tqke`ut=5r}OgWYrq;$sE~W7N9Bb z$XfSBENM51)7ot|CsByw8bL1um^;i7Qjc6oDl}2YEA4he>VPWP3HXRCnX!sc53tEy z2VA!(HZu)K((R%Lbycc63^p7=LaG<68lCfIlpmdtw=JTyMRYQ|tcVDbeAjf0TR8sI z)hxE{ihN95;tS(YH4@1c0Ixp$a8Z``#sgJ1Hnkqu7}lapk^^>oehn}pA`C!u_W@@H zurp#Wdz(*;yQLVr@o6q8RL(V+TYlQzc<$AF)bwy7y=0^#qZ8b7U<4p^c~3hOAP_aX zAS2cjUC2(XU?-!)*P+mq7tZ-rQ@J9^C1PYSs&)5k%9o37v=l5~$?ZzVQH5-HD1upZ~opBo^-G87>4s)n^jJ zP}`>KWQNeSH?)e3Xjh>SA%WnD5OAA2T<<``kz>}1oZ0Tc8snYx8;A^1T%(eeDdu3- zO&4mdtNDGEB5jE6vvN}ekSQ8~MAYUMtI;w{8II%BOsQj1n5%13!u~R&odzcM%~eed zRadDhJ5JaM3W)&hDiu>EZos$ieBS}_s{ue`x}QR@J#$X*X6D${+EhId$;M#*xu34a z%YQM&w$IeeA@6OVH@N;&v0S{zRU$8rdG*;Qvf{>6jYMp_x%^Mn<-(t?#w%SDdaJbt z3(x$5AwF(afLS7QBA->xY>y${;aQ0cntY?`{9OkewXbRR2LaCQ&2=MImNXQJnGqX^ z7%r4QFu(E?*X8_QfN{>Qxs>-ee;9_}FypBMTicHyuqhkBX$1`=1j#BEV9{N*sU?_|7DR#v%3#Cf-1t_4OGjig+x29!;2y)Q%QRwaG zQ|}~sU*li}-!3CwsgH?Oj5|XwPvr+cEdX`)#E;WW@+3+)f9Y$q5XC2+k{1_&_-p!NJHK@LKof z#7)h5048@8a4K#9V6>x&cP1xwj5MiQA#yOOOAv6j1z2zP`JObmnV~nl0S?W<5`RL3 zqHO0CbXw5q{stWLT`%k1)o^a#m~1jg3NZ0qtrUoWZSSo)iUUf~pi0NlM>3P6KTUuI zpa^LWxjY#=T_LvdZXIeDJnXZ?@m@r!+k2#&wTnMkcS2?Z$WdDYd?NDgr(yAq#@lo1fJKb&OahqE1_REu$Jh4^Ujq-GyV2-;flNLmfi5|7rWGC5b09WYE zJv-&bXi5Vhj$MJML4|Qk0^4BhtQYdSYO@XPfJ9T@R{uK1ovci{ZNN2k820*&iqfR5 za_LxTP9R{VE`tJJgrFhAw9~$7r(xxiJ>NeWDF^4>GO=7$BeG$^oHj$si%My25KCGsBoL1KVj61Cl9C_KKPbrc?pAqfVhV1ewW9?pd%k zlbOr_HKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C zIqT1PD+70g})gYRJ69nfBgm^^bFI zRu1)^D(k(f%&M0=;zW&^dG9^nS>w09MP`PJb8+t1;fs&p;#>gk;#>gk;#`~yz+IdR zz+Ie+a{;)Ea{;)Ea{;)Eb8+tZai{%)kNwDheh%LT0Te)1fCcdR8Zi_|p+a76;GAKz znn0XFoWi*PpZ5p>XjWH2aFA>X<^(`lguIz^E^ApND#27-O2lev=Dkln3rGiT8B85g@|etTfXJh7GXN1OWgq}Ps{s(2x&J*2MFlo*7m_tAMDn=A`W3JIzV zmct>Tjrmjr!2mL7atOg-TES9)89`M*908*Nj3fAnhU+l+Oj*T+#%FYv6~UX(>1q>~bp zxHP}~*i%_n^h;A-o6&(qAy#C0i!6^I0Gb#nI;13E){`!kba1Jx!|&;+abi}4Ac&D* z${tfsQci*|GAkta%)I8)^dz&+qD)O)WxdC|u#@0P&PU|o|(UaU~f zZh-k#axegEYoWG41BgK5XLfKAfpF;m-1-`fRt{h`%y#xrPF6@s4swvuk;chDyEAjbDsB2SqA_Tj0{=cgUHZ#9;$Q%XhcS4loOfj`$BI#b;ZPm#4LSE zYMR(YSeXYyr^--8=gpBuroI>Mn_aJ_nfEn=tS7Sm@PnX91`EguS=K|9hu5YAQ*7ot zn~tTQE^l7mz$kz&0C&EV1EZpvq$(?PKlDzwfw(H8n%zX^BihXrFdTB1MgXdqDA(ju z46cuT-X)#sWN`zI6H;RMEP>F1Woy6$PAsVnv0I9Qrk=wrh!r7YmWp5#k<<}c12Q8r zY)i=VOV<$k3^rygLn2~vGTW@`)nd|_BR&M!3&5Q>%Vy@wf-2{E83LtkJY`A{XAs|y zO@&(lK45tWzKp?JjA^CO1tTD@mJpX9BoNnv#lR$pF^zyTQ1Wn&LA-$)U{+u~_nPC=y3>%>;c{q9{8Mk6Gik{J}|LpI3X=A2D%h4OoN;^0EQD9^SX; z`x#QmfuaSoF3e)X2W^=evx zwD6g(hZKdNN>CGISwP>FL$YH8<`geIvbTa!wOPxW<>9E+of>e?ov-4!!H|NdqN3{3 z)lDtZM@a(agcNfC9lQ?+(G8gp~u{ks$EpCj~F08|H`Mb-mA3!`hy{HHWozR`?-Gxpi9vZViJ0El{I#ReLRu(zBC zmbPN)cXGCxNIPIiX0oC|sf^I)01Qb5Ol`RI$W7_{E0eDAYjz#*fCqJ_2b>S*=hYLC zqJc7*PUogj4oVC&LP`!I0U{BahPNqBp;4;kvdm*&tbEqSqH5r?c3XFQiSykj7FGR8 zMD`vc(HU?MV{K!v!Pd~W23LUeMNZO-T-JTyP;POi%D>Y$)enR&e=UID$tN{t1~j#= zyC#n?O!IP0EZS-s>VHMGf%6e5W}|D(0HSs}5A(j0i7IWFpJx{CJh@a;f*JC~rHzzT zT*b&B^*G2%?N)J3L=k#Fx&F3CDJk8|iXJ|Ta1vn3e_dSs{Ke%bK9MD`nH+%j&OQqo zLCB-KHgXc)Gs|zjXA1tG#OQw5%)Q!Y@uy)xi0Ip<+dfh~{!w78edzj@& z!J}=mG0sct-7Blb-i@p$@B^K>o*Hl=_;X|3G!mxsE}zW0wON9xK%*P~nZ};z0Jc8J z{Q46WnoY61^yp2P5;XC<=9BizUEX~L(SXeu@)O;IyLu2HNYOzgA7jo^JZX4Wz!CuBNZbeqsgxmimP(g(Iecls># zoW!oCfC%#WPTLbSn(?6y!BNYWqA#yMIibF#{c>7^0AyA3_wu~{XD$nq6x~n{8{1dU z*)u_QP-g=xvZ8tA;&OOJ*HvE`y5cJ*v(}nMRyVJei>r@m0;djUqowP{7LfQ;*N3Yq39>Du~mI z%gO4Si>m&3RYDBecw6nZE|XcYZCxF>(XA^z{P$xYblW{RioBur7W)h=(O0wmujpL( zP)&=!<1+n&dhM5wzxC?m(HA}*M53z7SmvRTt)j356lK%R7VC1oR|R6V2hp{j8gO(D zqE<5?%dIMM)4t1WxY;z+$HpG!=uUaLUry>(zMk!FkQe%{MYaEC?$t8lOxq3~- zeh74co4jbilAuO#PSJHVT`#GdE}B$U;e*TB`lp0b5qp1|>cU_ZMLL)XV$9yyu4k_? z!_WG>dt=v>*HZ$DssoRidWwRsnSdpsoGf=Y%d0N|r4O4-m!HIv-diMMuvT>9N5wva z^Zg4&`d^LN4CDHVm352Wldcy%Sm|AWWM|{V%UH+!F zp8VssUVM+5q9`{oNg&cYEVd5u-j*Y0WItMOWh4cFS4S0w-nvr9uI+5)qy2u zMYZ{%vUTsh+MB#_G7ppKVjWWy5ERZw^j$T^js~Au+jm*fcLElB$N|^oXAL;TC0={$gW;Mmh9a3>qE82fw(y|C9A{{?hf{Y_BY9Noing z5^U(ajjoy4qR%w7buKVV4>jOO&d!FbF?<#!%erKiU|_%unrNI!Ffb|l-kYk!ThFZpCswe8)YOwNY3j*uE-qjHHkMRq;#-Du zbg$y#i>|)liT|*7ZSjhFUBYJuQ@}>+>3o1;ARUyIrS<-dV~|9w4=>*hOqNb%k#L*gP< zH+H`h7T$9C9j^U&>@#-+bO1C8imLqtU*w-zZ}RV4WWAVi+7^LX6@bDZVAkYZaG~?y z2Pk(qHQ@LxgH$qRBJR6s8pxA?a|u}htqikoB#r@J$~io zU7f$q`};>m5FgOg<EvkuM_h6rXw zy_x)PF4GTlE?rHDkHwjh%BuU~&3f{=EIL>}C8%ac>N?C(2BN}4YT=BUGb{NT3QaLj zhvOBd2E++4h7e_W)qJYmX1GMGWrE^(OlUkRmDF=0WO^R3L14 zF3iO+os|%R08o(n+daLgm(y=8tNQQytbdmj{6YCfl_4%&aiSj`BfpkdL137%zP!M0>IA`@Bp}>ft#Mt-&5nk$C|4w?C znKAO&x-S0()%*|X4wcyn*>y(NBI4DM&0Z(oMw z4&16K!}<7VQMK=9#y>}_h+Tnpm0{>E5Qt5k8_F#YXVRd>Spm*s;ABb$3_P{ImoeTE z6jlB1EP9NUF%Ta^pZx?=IwB@>XO+JeDGhC>0d(}VV2jZq#0U|BxcpSJ9|}R=*-sW_ z`?AAs)r=snhsNwZHp`u#6BjWw@7n=z<1mjZKfGBg;@QM-1jIgYuu-#tIKXGuwjmls z(z~Ac8Xlhf(8;g%JwZ-E9v!S^f`#EB^SM4_ET%~yz8Oli#;3afgXOhf+tTC@gVl`T z^X4U4ArKeG!h61rO$oH&J`CL8hqDgnZ=4a}j2weCO#x$oBAg#UpbR*d{`~RBoXDVw zTNeCLIq65|d)i{mn1Gl(jfEQkrpY1Cwp8`g7splkk5ZC7k+5SX$E;j<$E<82(j)W> zgf0hB0>EOX%DiU}iV)VR0jKF~2$%*_M;UzH2^0~WAY;Z!%wW++#;E^D9nF-kfoNYu z@BSwPFx8Q48OIhCMy_0fCI+HMd=^$lmG`oueo`EE4ug4A*4zagV1RQSgu@u;5rrUR zRy{C0%)6i`omG-LST&Z8A;W--YBfFt4rZ+kC6Zf)h**(Qd866vE=8Vw{m=}E0hsMP z36P;)z5`<9Q;;;D{-oskDy{d3T5O4=+vJETUUF`ev!pKc6=Ez03rEH&3aRqL3pnT* z&7}^h0z&V^RKOgO6*oYnP+=C13p0O&_eLC`n$`X0MJBF&b`c~gL;|`^35^AOaTB4h zuE3;1j^Bq-17 zvoRQyP6q!30BS=Q3(mK2z5{bY*Hq}*G7vvFq~Ft*MQ}!MjsR5-%rVdM7OI4l3P3%~ z*kIfoPYTQg?E0Nza1RG{h(;!2i)(9Jkv#P)ZL@#eS z-isVc3Tc*-zC#TDt;~1!ux#67gDWM3K6^$UAaO$9PEpew;_CsBrz!j@!)M_I;^Nig zt+#=8C6CA6!DRt?)j(LG>YOPh=4A9RQ_P9aP63pOkdj#lPS_24A~6h;>EhGx6D<#9 z6}ClFB89m4eksbY-D#{dFq8~keF-oRCPjKXH^+F&_cR@=)Q{R6SswmI4DQ?Sbh?R1p~)e|YS6`(J9*E8`%S5YYJ~WDP;k0KFl2fA z5r?Jvw?NcET=91%vzy5B4k2U^Ht8BCBwZ_F50sM9U5MG7?b{=QhF%D;JS+NEZ6B+C zj?mL@#+Y4quD@)D0&Y`+`1s*wHYdZtA~9!p71xLQ^I^_2Ln!i3OQP>U2=WHHf-nDC$}|DK)?*Pp#0p(@4AerYrdx$~*Z zvL0O$bglpXylOx0c0qJjbe~&qs(;U_<3P*Nn9XdcwXyK2c2+)ZP0e^vJ?~|-d?($j zjSs|h-hb|G1AhYgUVcDa59bIlLEjWb(};pJJ&3A=r;p)ybLKCa*${%XW|rq=-5EUE zrbO3eKa!GcSahO?Xyz#jvaJ8hdC`4**W|Ao=-P(>Yy^UUnpt&%Qe=o6ou3*Gy-dukV}eb*2VlJJ5gAK4`M2)o?dKflmBoR*`%cxY{^y(3X=RX^V~Tkhq5vRYREYBq1aJjUDHaNjR3Klb>KJo%P) z{18p@Cvu;9k;AeQd%@*Lul;9ncKL|J!>TOx0>NMEcY_@ZgiXvgXU;X0{-ETUdj<2Xh3K>M=pTF{gxBQCu z@Bzo`U-t%V0_XepzWTyH`vr0OZpXnk_I+VWf3#T_UsTN+fE=y%rn7qGYNF>tc<|Yl zd(HrGBK9mV9J>r63g&?YAqUr;eLoh1a|)u=-+XG3n)PhvoB)>L#*;g*)X0r<>1Z>Z z3?XE2zJF|S>Bi5Bi~nm%a?f0=sz6+Pd&H>o43!c)bT;$+{AnZWo zz$Dw1-=l8s!3uB?8<-FMnFippM6}I(bN$IjEoquh=RIO@zrS~V@o6k4M+CQ)4o1~{ z=jQ)C-@Wl&X8ad!sg4iD+tY&3M!9?&rSoC*BA<2tv6}6@hREhA_!D3oR5BBmd-Kl; zA%Fd3)}rgO+5U|xrN|8tVYqm_Wc>BSMsy4{9RiU9P=F|da}4hZWIGT%0w+@t^H3UM zJge*8Ck@-h7oWgWC8~*{C=4PwU{f%c z$a4qp2SVx)wx1ng^9&`)kIISLfg9Mm7$8N!Gy@?(T!1)5v#FqokmYNbDRf+HyLBH7 zfl=J7_9v71r8LiTEJIiPoAokf)5YrRY>cOl$4|qS7@bzLy)V}&pC`@qb-w7nzu(M$ z-m~tfL}2m;{zUAwwjT)Osc&cy)) zM+9$%z9tfbMRzCjz0XQYpB2l^o1Mhhhd%qQuG_p>BtDs9@sv0-=j*FJ>#n-2f5$9e zzf@!P{^I*TKkRg1JY6y}=)Vn%q1QKezF5tDqx0Z)=@)fhwOO%jSRzv5p})(9qOdL9 z92#>FJcb#L!wCUKcm5C+e$U4lp4y>qHB88pEnx6)t_SlBOpF-0Rz>Ptx5&$W?Ogrs zdrw{YliBXxw~C8@L2n0$5qR63Sw3rD4A6`7s(wXQHqaz6+Z?P|8Z?84-YdIy5FdQT zwU-3v1Nts|e7$%13yQM&K1=M|jZFJa)*>1}4CfR;g&1?>u7S92bm1e>0Qx}Qxd(jR z>!I=pwl~3nIRl8`gi*~_9k{9M^=wv7*Kk??AJL(x3{c z@q9Yp|B{&amzR5&f6BXbJG+2-Fw-ehel0 zHhW2y*PoV`?Z>&Sd#~*rfSyU!o{(kz`v7O$ym}gnsc;W(;P_^0F<7QZnVP?HS9J`y=E!lzo+f2zy+pI+@f@-@QU&txw4<#gZ0zM6JTMW(cYQMdryeep&I zg<401i3mBL#YR(B$DZJQ{k~b*e7Vc|SMd0MhmFs;eeG#1;u7mf$kcJrnUSKa3HHZk z^fm)OVM+Fq@=YQo0NwZvbEtqgEyTqIfJce+1qOO2<}_hW!_cyB7xs=Iyv@dF(;>Sh zR`|U6h)a*W`6FVN|5(>lU)9y+FR|EumiH6%eijl()oep}@LcT!1vrfk&V|AiUB*t6 z!R>b~gN5eI=~a`(%`YQ{XcEL@#oZ$y8;6{Sme~NZ*yq0&gMUL-G{4%lli%x`>6_TK ze?m-M3K%#38Hgg-rSbI$U>ZfNRHbW7y775GRi%k3dQIFC+Xdk6L7Y~I z)8dgA{%PO0<*M0C43?mpf6U^_^;bI=-zh~0jfdRbZH~AAVnvMJQuM#nZWjMJ_WsAk z^}pBD^LFRzTZg#=BbW~DwLvkRFsK*l!S`lXs1B4NXCq}D+?&xK0``Y7WU-@F={v<=wvKb)-2bS~>JD0D$rth*3SuJO; zVv2jt#Z5V_i)J&Kq~tSITH~D8Qrvk48XeK^Si3t0lXXtW)6!UkU@9uqPUN#?; zl0d_@O=U-2C+n~=*?_K|{A^QC{~gSJsBf#9WmL431ilXvWZR!L4p+Y+^u-%CUG{Z( z-h5PEHh;_c{^Q(sXRDrEWi+fSS7c@TcV?^~6x!lb_O3nhyJp<7SeIpKnv%^m@#f67 zx7^9+a4ustWoVM=?$y0==gN(>CSHY}v0hFA&?hV|U;E9xXg(;0?8Hj%TjhpfRw4B6 z$GRr}>&u&$KfG_N*D$C0uq8XQ51td4wNvHSb#3+Wo7Lidx~}?OmI#;i2Q|CHR@6o} zo8|pWC-eQ^0NH2Mn+hqKnb~T(Sk~3NuFUwzzK09IJ*`dRyBA8o*Y6&KHJ6XG)_-Zb=M&FD8m zmwod7wW}Z5Z07$(d>A-KGX$9av(>i?GUabIzw7RX%rm z`sW64W`vYTCbRWqacQp;(Pdlb*0#eS@no_3hQ*cZ|5_8BWO^L3YDCu8>)AiryME;Z z`?h!;p95=lr@#{l2wm}0drv*`VVk}A7XY?@%i0|cOf?BoV$64M{-eok_3a=ah8(fa z&57;L7t2^q>S>D17l6Bca!^bc`_sjxy$v(!7znHV3eBd(e0TL7^PQW2H+FugWzo@C zjmhAAK-ZQ(vE18zX$slDB-ZqF7UCSk4lD`65iw-{W_kVcOY6<#dwkZ9(_D0{gu)2H zVYXO)?qs(5fxfBGY;wc|5Zn67V~;oU-J7!%U48+$gGxIAuyVR+s>!U`m~yH&1^RBt zI%hkZ@2F<=XNKP2cD)bFKo6={^RH<()kkTPKNy1Z2e|P~!~0UBH#h6)D_48F{}7;_ zT|AkC8X<%XMOnYRn(hCf8gbtVnx=qA3X^$V=T$dJiE~wcegjSu0YsC@eC^9gcavao zvz%bPKYoT0 zKAeE-&IjN&!qYK$6qEgrucoW-He=N563e|gU=)h7+b^oFB(^gL-I@J#RRRlUkGx>d zSJQf>23zgVu->0TRWMsDziBqFKliql%?RQmLZAJ1y`H?6DgVI31hkVGtwIz3!e%vp zY1>x6a&jf+VD@70D5~a@XN%Q;fDvw9Uts^{3}%$3i}n817rZ57)>4x^zW}F7Ag1Z1 zM;bSocKa~0dX=H6Gh{`Foy#{qZ!%wgVR)KVnJ()Qy5jZAn~RTv(I4?c47MYo1Ms%J z>sLOismmYpd3!QTA1&QvzWnUjV);)7OIM-Z15)%P86!;}`6 zlSz`I3OCJQP3^GRIEV|FF4iBubLINCXyn@}f;$(`HN`Kkmy5qjjJMMB0Bi?vVg-}! zUw?Avqu2Y3@AG*)Vg1bp(Cu8g`4yM0+;~M+v}o!K&8C2vXkM-M=9jN~zzR*k{ccR$ z1>oqeu0i#lKupEe$2Kl6!@e0|y{xcVXX6KI?^u-0_r@p(bne4H*ZGLHDSm$M`tC;( zSsG?spI>KSwj@0HmUsH3_1>k|W_fc2GoxxIQe@0`mfz)lcz0sMdNsvre+DR9HQB5$ zKe8@`^PJ%B`kvlRjqff17f*c|B9a-@T)x>}rw| z@5Q-*&}YBCUM^lnWc34`g+2!{9kb!aQ}a)0H~CNbES&^h5&%}t7VGcxJ}{G_tqW)( zsIpdNTux>>(d7O8>`I(oTZF>tF9d{WJY95oQH7-@(i9lio|q%_4w?kBdGpVzN%NOa z#BBzMO9;XJ>3V8fXE=?qMUz3YpQ>bm?loj+DGAwvirdD*?&VrThH zL2=VpcS0n+&1L z;IjxO!eVFr?}^fhB!SoB$Xk{-7oRdnLL6PCX(QouI^TR7u`!cj|M~)LU4URaoJC}QiiyH!?Yf4;u{3=ouq$DV&^*?ZV|6a%C5X=DQBkFba zjrF?topLbTBqi+KSRjTR!U2m*d#l|m zYj0p0RI1L2dXgHy{R@ng9F-L&^PRSZsf|+i2t6S$S}-L{=j*Q!mu4x-k+_X$SmD0j zn|^xVx^STGd7Fz2qqYdpZ1PdU%N`DZ5zsXbsy)Q7A<{#nyZz-_KqL0APd{5t!qDtL zWaW~8IQjX`=4*)tI_{jQH49UT84-e87X-P+kMsU zeQv=9^qt?%a*Voo`i#t%tzKc@`9I$5Prr12Y58hRIFUe9llGI_ru~K#+^;y_q3a!* z&2-r5B^L6`mm$Oo7Hhf(C4f^~IG?4re>wF#ml{`2nl*GF81@}Q6GH?r6=ZpQ)i5!2 zOjOw=gg$$6xi|faq$73d4lgsH?*v`z59F&JOvC{(3R2oyYaaJFyuFG5fyL0)**AyY zzfs&VkQ#$nF`d?5uA>x7>Rn~%8bUZT^ zN$9%#cS7|4v6{8dDi$*v0_?uckmvom2OG1YZ*v$0h{LG%d6(Zy6n&rlc-!XxZ(epE za+uy_N`NFxcItmvud7cJmyiNuvnfzb8-yruzH8^Z8-DU_3#S_6bLm-64LFxQ{XkHP zMAP{uFRQ*b9fo{k6l|8&sM07P!Xz)dPkXxfs@Y^;MU*h8kKesd8hVO^&P zld3H1TGsp=TDjAUN^^bNi>QY4T{WHcV2%m{L=^RUs1tz{DG_|ueUkI>(h*LU4Nql^ z{!J;!YaEARUp?;jQosyM3T8#@hYrSh%wC6C4o258fHbN)Vbp}XyGzwTNa#EF(|w!$ z0=uKVR#k?$IPrP-6f**gA|*z=SY(n2MvOEm6B4L!1_A^gdHyQx9x;gp!zNYr;Gv zO(_9B(-RBco^9em3FzAVUl&#P!N(+(VMZv*@R=#OR}&N>gtik9=O6}R^dREedz;^a=i*gb=GpC{V!y?`2U>3oWV9H=l@9JFoYkI72$C8kOTi5II zdj_$Z=RU}%v5*&|9F!W)E;|@hmO}6#iz5T!-n^i0lmA$#nzy(-yy&3bNf;{z@qLB$ ze>B7EK?;neyOB%=GmDd17qQ|zCA9n;XqenZ9j-cI-7Gnp&h}_B-D{FEw$!6;Z-S%@ zwxP0JO}hU@B+2ncF%i%;`45Vu8(H4pQ%a!fcB=nu-Kd!%_QRf5(7h8t&?tS|Z_Td@Ky!Tlf ziOom{SJC$lBtYheB!ku9eEP_fiNHV@>^k?I;`&3nZ1>Q*7@(TrEQW-c2{8}|Ey~IA z-h*2SDbasQNxtm3^vcjjO@D*fUd1#>Rns^~KKNaLoyNSfuwGtv3W?8F$no?p)v}{c zP-0Bxn@oJD`+oShm>dX#>9hwJ2%SghJOzj{1=V>ZMjZ%&DS@qXNYQvyp5<1{Lv z-(S$FrhzKX>AwB!l<2o(kYCU8_`WIf(d0qW`({OaH#7QOfx?uLBEe^2kkL>>QS_lG z`@E^kD9@50aeBZV3+RQds3w83%rwTKzm}pKq)p90W=N3{BR+&#Gt-lSb68J)B!#lM zUu(6uOETITNXdimgT5Lu5IP6+!@RAbyl+sCQ6RGV;k?*?-@}E8tv+3f^pPp}-(?x7 zOA@u$p0c|LFYpM_8)BFBD+0b|VOEJ19oePhs9a@uZ zfb;47*cmay28GbAW$Oq;pe=FG zK|CJK^8O`97`>y?QSANihT#7MXIhvY6)j1@WY3XQxE&}X`K$vW9&p&s&KYg58HoE~ z@Eh5gN>iE&`jGv9S=oHd@p#rrECG7w80AgHq$Z7nDK_JAF&#mZfe67l@lQ9Peop|m zRRvE;WV+KNm-TU5$fbi1dk||@WeLGYcI}J620K)L+v?c%o&W8=^I$n2bfU07h4cEX z=;}mX>r9(iclnZGYh0z>#6n;-KeW6xGxdgr#uz@*|bi$g+@kkY}(Ay_o{oTRQN zEOK{l^)9khg$;dD_P$dfV4L}1!~q(;x0l@RrVPT(cq4Jd`59^^q-bD2 zM%$+b+t3^j-C=qB^FWU>Xv}^eI&k9b$iNcA`R*^K6`^l4%JMXHdki2>kgVH=Q&v=} z>-`x+P4DJy-JNYTf^*4ha$VOjpfqsY4_T?CBq6fWpl$oY+p$$u+48b|Yf&{gUq=CR z=)2PvhY1EnR<7ZTb4V0WeljK57fFj_!Y%AX1zOz&WMnO79lGVSmGmg+iykJ%!p`=o*v#4-^_`)cZ#1F4d2nI);u4{-{O#KjCl0Do@* zrz-G1!DTkkI>?~O!PJjWH~~->dLPYz7`%5b6y%OhQStC~H@mhx-&6BLfg51i_8t#c z+5l7JSr29#;vAg!L(8E+fAoQ2(Vg8(&Cc~FX8T?3RR~Uv0}ZwwrbnO>iOpHO4=z=h z*g18~v9T>Bj}xK}Lq0@+CGv)l%BlwuRYW$o6DHiiOexE<(OjR~8-!bfu!E%|>V^ct zfEaZkET-Yl=NWLSfG=$GG_NtKnKBb%bWzP55yF;sDOo%epIcB9-$prg0 zjZ-obUu)kHIHJ**fBkf^`3A#K@fH`MiDT&f*NMajQktP{`~&xzO#xzjySo(rw)1fw zg9o$1`GDokoo{N^jq$WQ?r?T zOi?x8%ADSXfW2n5_)p6lyRXt@U~$lxSq#b48agaKeNgThDhw)odO7sFuyCdXI`AY! z1ACRm=#q>`Q>VZ_Qeed3k(V_>Uwma!yt*ix$J)C3eQfuR8eJgaeu9n-s{9M}diGwk z#m#q(U2(l_s_V=NFhOYNNHK#rGcq?oWDHXe3wRU3nE5_fI7!4VDUI<9vqD&h&G5q_ zTh7akx@X4{Mzx)N0E3F@LmiasCtRyyd72w&Xja~s=@&;E4QK-`!p z5Hv+6hb1Qt*Gmb|yO9RIi?T=}VH<--MT!m~=0hMk$SWAYy2ZX3!MXVS5#xOj0jC6U z0g@#U$)LGs%&^uo#ok7BCe?f#);1VHneRiVfmyr3p$KX=MtHaM>%*bX>+$&APj*%I~v;`=Qq%{iP}mg=rt>YQL-BgGVrc52 zdVK!{!FeK(I~b}V9u%<-wem*Er+WxEu(2uWw$SUd7N!gxCV>o4PD;0hk|jpHnL#)J z6bDk@0|__+^Su+GxtCZY9?Kx+(AGN;Hh6cNey~|Ib?ev8A^56ju02D}D;s^1#m+N-19a-jr zFDG>z#yb;O0#fua69_9*??W$jvnul4D{I6gfyST{W^k?pkxtq=S2MM@|56_84nxp~ zAr^gln)M7q zqsr5!&ZwzrUtDL;1Gqgej)-d4R?9WXY_@Zg0Bm4X)T?RMtjiV4{;9LnQ#YK(bReWC zX-t<%6T_5xqKnGzLwGbs34>745Zk5bh9$Un;~4Cs<#ciGr>nmB2rkYA;4aPu;4aR^ zxd7b7xd7b7xi}YqyEqqsyEqqsyEqr;0&o}S0&o}S;#>gk;#>gk;#`~yz+IdRz+If@ c(fR)e07(_`g8%^e{{R4h=>PzAFaQARU;qF*m;eA5Z<1fd zMgRZ?UP(kjRCwB~SWT!TR~bF`x9+W~es49qS%@MeAjDn7g~XA}L?W}%85BfDa3dHL zm%6YU5?p6ORx!9xA`BSu2aFTZi5qpJE)+LWL`4@f@Ob@Gb^ou6saw?R>G!5va-nJH zuDYkb?>pyw-!0<3M@k7X#yX|+YD(!Jl+uL|0zwE7LXdODMT-!EeHI4*W6YB=#yc^_ z59OS}7(>o^K`9029PicQ0B$+wUX3xbeFY1cVS!N*~$eacQ1L_D!wzEXMePa}M5n7-LE*=bUro zoEHTw=R9s+emf*Gv~BxU05k9Xt<`FUzV8uZM2rzisrf*bMIlU#5dgp#I~+_(nVY8h zQV5|5A>3H4R$-ZmT>f;k*-BoR*=)XLtwjg{DW${GSW;QO zbI$*+s_H6$dpYOJ07_kvbB6bRv^J&GXx_W@$Io-^sV&uY{WmG)RUyPXl+sJ9)e7Ew z6t+q!=K#PtA7!z3WZO#!0mj&02_aWQ2=~1A$0;SGltz0agv^By;GCb4#hCzhnd-Js zCtmm`Ddlro>rGWvpp+t|1ZypfF)+r=jWJ^lFN|y(X#43XrI1qou4$U9y-a?Vjz)#x;{*=$klY%hXLz3+@jDZL|vXi`eAbIwWM z_ed!rgiw0ooDhPhX%>tz95i4|nlu}>NT1O!SNYPNapcHpnoAQ70!@(1uH^#i_oReMGjV*>T2Bj2~ zQa|FH-vAJgj*cGo%EyslJAFgpuXyk8IOn9b7S`JF0U2YEQodDH)n^%Fae6P-}f-az*-B&7^9`xm9uwWeuKl~QMfy>l$s1vD`8vbFZEG3N4= z-o@PsA@A08eN`!Se;epRupP#GDd&7Qgzy3HJxcn@fkFuJFV6WVq?G>=LhL+FJ;KHq z1!cV;SAKBKCloEAapVoE#oYwl!=do_D zAvJ^`LkM@QwO6Jw&bi_cQEPomO8MrYWY`&*_x_^~9y}Ns zH_Ypp&1U)d`1s38sqa@+b)kPA@;YfzRn;@43x^QEIfvHz>s3{~w(k*kuhC*S*u5{t u_>A}d<0++&F~(k3O1-GHeoxKLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z3C>AGK~#9!)LZ#)6xSX9%$s9p5AWsmeFEk*U@%a^RV$D{nzX1%Thee83X%VTNd2j* zRH;>es-j9gB&U#shKLX;p{S5hC{2sOK)AwTvltf}8+);L?OpFVJG1lp!#;?y*JiQD z#(brb?b+Fx_nFW4dY|{q)oxE#w7)T*L7YlI|#-*DU+nKEE|*85#* zJXXBFseBHAg#hLNn90E905CJgcmUiex1sD%0mK1>01N==0?+}Vb!%7tj$y+36~);wsV7DP?TgYfO!Bs z8CcfV)rS9g~aQ5&cK#p zvvB8(%o=uwaER5l;jvcok2}@ns-~MK42+~;0#E|Lohc@lRzxo!_-AgDk-!>G+C%HA z{FjEE76Ie}C?kY38xdm<>xq4W1=xuC=42V!Hep~?*Q|^&YsNB=YqVUuSRcg&}{?l6Keoy8ZKDq8Aa z8Fa8_I1@0dA&gOQ3JcoI(*uHp(ZG@_E$IweM;n_B;NnIwMp@;bN~2?pP0S`cKe>)^ zd?Zt0e$;Go)NsZGg2*VYnC=~QaP{9CX(W|G*^p^IH{<}*G${L<9}-UwB{^NE+=7E=Tz}3mHF}Ix z0G&J6^t@s+o4XoLI%7`+w*7_nm0CQxLP==y=iUYHuy*QMwo;>67(nyZnzr9dR!bX^ zq^^Bm<@SyMwtZ7jP9#*9>g#>=@80Sc0jyx^lL^z)bf!Um1E6tRZD*s&Vr|~n=+~7kL%wMK%>9Mal`8%dTG45&gHpz!CrkDCIyvcm=>9(o3bO zsf>0l#aRu$Weh-EAe>4>lb8h1gY+VI(#WR_gvqk8K99t?B7>XaAb=hs3Y6%CB;KrP z>qC0wK5nEthGJyYiQtaa!I$m_O~poPKmhu-)^v37gs5cSsoaogHa%dh1&nmZ8{H1) zrkcPPnLc|E(BA19w3rM`8c_hai}VJP2(l0)v#l*>ZhK~IUfK7jhbMmi^1#d=E)D#)EnulM zkgWs&AAozDzz;qG*6^h(C<=W4rdikT0_ZoGHJhr@q02t0!&h=&^2f}w!EANBG4r}t z5Qy@aN_FsDS(D%?`U8NwEd3jmL_~j3sN1n|U;_YX9A*KSZBVD9GY{(q(CjWO>})vY z3XYK9OcEd2oc~QT(-Mqgjr+RIJu?zfS8QGHe=8nSXJZV>d>jSY2jJTFMgO}+Wbwh! zj`)#%cG?yD$*i7c^kS~jn#bp7^M7Y_eP>zx4uG42+1%D}${8Ihh&=8$X6X)q7MA{X zOi!cC1@8g4@m5XyE#4&d3|D#{Gs$i125=KV8!On;(G>RLo3|`!|F13A(YW`t$2TT0 zUK09tuIg+CaGA9z(-G7FfYvwWd9PY+=6mm*az!&~bC22Hlb(>|vNZ!Z58xPp+pM|N zrwOQj)=ZqU<~onR-&oKx+H`tk8WVVB_sfB+YB-t<4@6rId*^RuT7r{l3uKA`>8xe) z0q}0FYChx6b2Li!oQ|<{f)Unm#I6D81#)}0t?C{`dUHBUwo1PGNzd<^8KCP={&B4;~fWE<}5^7Qm#N+qGQ zvcP-MoMZ8dvfTB=;+gH%+4>Frxyfj<4XnaWQgjow00MN;P@7!7EYc*NScN@NNDC6qmCh`vjX%`L2nv!x* zO_ivk+C#k|fl@eiP+8Y$jz+0ODI^V)2SBZ6f#WzN2q8&KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z0(eP8K~#9!?AXss6k!;^@$dWYkI@BfGjkO@6lR1W#ab9%%IJrP7o$tCh87e`lDfJcCz&58C{RJ)TokgIU@z=KW10d!rx9xu%th|CVwwJq-lhJc-HevAQ! zV^M8U{=`)R{fgiKYJe^PPoZ|sKl(ZN3aCb{IC!hi_#ncO)LWn)HDggKi~|UG*E8$< z>Di-qpY0g_^&B{nr~vSKSpX2g?fzggbH1}FQEazfVqQOG8Wg7Hjm9Sn>w48yaVFi?Kl9jZzOKG64o25?Pyt64$oK9Q8oPmZxfs?>* z3wp!T(NL>x8-ydN4S)6drSYRAOpon6pEU4F(^}Gf>ux`9K6c`7uuP;)4{6gQ@>YZH zt8Oa*^HPJMz>?ljmF(VDBpwRM%)4>#i}++oxiY{*dlTJ#@rp}XLlwtsr=Aavl%G^0 z#bw*&%{5~|>%KBI=<_kN<~?pvq6}~@X|}8$o0^ra`B+2LO`Vy;E@_yKevh002ovPDHLkV1jOrgQx%i literal 0 HcmV?d00001 diff --git a/static/image/user/message.png b/static/image/user/message.png new file mode 100644 index 0000000000000000000000000000000000000000..5ae809ed310d38bfe3b11be65e9086d0b49da860 GIT binary patch literal 5545 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 literal 0 HcmV?d00001 diff --git a/static/image/user/uset.png b/static/image/user/uset.png new file mode 100644 index 0000000000000000000000000000000000000000..6d4bbea0bac138e617a15e64167b8eeb15a7dea2 GIT binary patch literal 6670 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 Y0BGd%-CgKY0000007*qoM6N<$g3uZ=(*OVf literal 0 HcmV?d00001 diff --git a/static/image/user/yy.png b/static/image/user/yy.png new file mode 100644 index 0000000000000000000000000000000000000000..2ffff1b7a5c46cc521677ae8996bde1d7834f5b0 GIT binary patch literal 7318 zcmV;H9BJc;P)KLZ*U+5Lu!Sk^o_Z5E4Meg@_7P6crJiNL9pw)e1;Xm069{HJUZAPk55R%$-RIA z6-eL&AQ0xu!e<4=008gy@A0LT~suv4>S3ILP<0Bm`DLLvaF4FK%)Nj?Pt*r}7;7Xa9z9H|HZjR63e zC`Tj$K)V27Re@400>HumpsYY5E(E}?0f1SyGDiY{y#)Yvj#!WnKwtoXnL;eg03bL5 z07D)V%>y7z1E4U{zu>7~aD})?0RX_umCct+(lZpemCzb@^6=o|A>zVpu|i=NDG+7} zl4`aK{0#b-!z=TL9Wt0BGO&T{GJWpjryhdijfaIQ&2!o}p04JRKYg3k&Tf zVxhe-O!X z{f;To;xw^bEES6JSc$k$B2CA6xl)ltA<32E66t?3@gJ7`36pmX0IY^jz)rRYwaaY4 ze(nJRiw;=Qb^t(r^DT@T3y}a2XEZW-_W%Hszxj_qD**t_m!#tW0KDiJT&R>6OvVTR z07RgHDzHHZ48atvzz&?j9lXF70$~P3Knx_nJP<+#`N z#-MZ2bTkiLfR>_b(HgWKJ%F~Nr_oF3b#wrIijHG|(J>BYjM-sajE6;FiC7vY#};Gd zST$CUHDeuEH+B^pz@B062qXfFfD`NpUW5?BY=V%GM_5c)L#QR}BeW8_2v-S%gfYS= zB9o|3v?Y2H`NVi)In3rTB8+ej^> zQ=~r95NVuDChL%G$=>7$vVg20myx%S50Foi`^m%Pw-h?Xh~i8Mq9jtJloCocWk2Nv zrJpiFnV_ms&8eQ$2&#xWpIS+6pmtC%Q-`S&GF4Q#^mhymh7E(qNMa}%YZ-ePrx>>xFPTiH1=E+A$W$=bG8>s^ zm=Bn5Rah$aDtr}@$`X}2l~$F0mFKEdRdZE8)p@E5RI61Ft6o-prbbn>P~)iy)E2AN zsU20jsWz_8Qg>31P|s0cqrPALg8E|(vWA65poU1JRAaZs8I2(p#xiB`SVGovRs-uS zYnV-9TeA7=Om+qP8+I>yOjAR1s%ETak!GFdam@h^# z)@rS0t$wXH+Irf)+G6c;?H29p+V6F6oj{!|o%K3xI`?%6x;DB|x`n#ibhIR?(H}Q3Gzd138Ei2)WAMz7W9Vy`X}HnwgyEn!VS)>mv$8&{hQn>w4zwy3R}t;BYlZQm5)6pty=DfLrs+A-|>>;~;Q z_F?uV_HFjh9n2gO9o9Q^JA86v({H5aB!kjoO6 zc9$1ZZKsN-Zl8L~mE{`ly3)1N^`o1+o7}D0ZPeY&J;i;i`%NyJ8_8Y6J?}yE@b_5a zam?eLr<8@mESk|3$_SkmS{wQ>%qC18))9_|&j{ZT zes8AvOzF(F2#DZEY>2oYX&IRp`F#{ADl)1r>QS^)ba8a|EY_^#S^HO&t^Rgqwv=MZThqqEWH8 zxJo>d=ABlR_Bh=;eM9Tw|Ih34~oTE|= zX_mAr*D$vzw@+p(E0Yc6dFE}(8oqt`+R{gE3x4zjX+Sb3_cYE^= zgB=w+-tUy`ytONMS8KgRef4hA?t0j zufM;t32jm~jUGrkaOInTZ`zyfns>EuS}G30LFK_G-==(f<51|K&cocp&EJ`SxAh3? zNO>#LI=^+SEu(FqJ)ynt=!~PC9bO$rzPJB=?=j6w@a-(u02P7 zaQ)#(uUl{HW%tYNS3ItC^iAtK(eKlL`f9+{bJzISE?u8_z3;~C8@FyI-5j_jy7l;W z_U#vU3hqqYU3!mrul&B+{ptt$59)uk{;_4iZQ%G|z+lhASr6|H35TBkl>gI*;nGLU zN7W-nBaM%pA0HbH8olyl&XeJ%vZoWz%6?Y=dFykl=imL}`%BMQ{Mhgd`HRoLu6e2R za__6DuR6yg#~-}Tc|Gx_{H@O0eebyMy5GmWADJlpK>kqk(fVV@r_fLLKIeS?{4e)} z^ZO;zpECde03c&XQcVB=dL;k=fP(-4`Tqa_faw4Lbua(`>RI+y?e7jKeZ#YO-C z5yMGDK~#9!teIJ?W!G_@zpAy?-un!9?zu^cY!2dJH$|GHNQtll&mwHg7EDJCI}w6d zu%hH4lK>%(kr&G_U?304qn`3a1+?MNKx8C=6WgREk(8SzDUz*j^~7eg=f1YN=7A7Oz3&fbTXwV#7gKz!)e82 zHbK?F;_Bli#gCV6`iLQSsmeZJ86ilKDA6`l?4lP=R>Q&3WbzGC_wqDnQahok95M6} z6Wpw$4h|a^^eSo{c;?&52~whVFkfRIU@oJ%+#0$ zR)gxHrVbyMIQs{rhzst`X~}=oSA7<u=j1%4lR?fZqIf7=&izAJ>^@u7ZY zR{3As@}g5SvMRZ*NR=mghXsdJ0dw)N zQOVy0=wjutc>SjK>ff4(gqA>&00;(*N}o*|&}t2;)Dju$m|b#>#j23|2gtev3<>n` z7LWo`GKP`Vh)zQE?zdtczG=o`75U+ghXBs`PtVBDCTG1Qj&U-Q&fhZ#xRj`+qgOjZ zo)X#-I=My}T}7wYNz!MyaERsAB`j2Q1=?a{6nr0%4xvz_kkr!__einwt;JN10MGwF zK^yWnE}H;Z^|PIG&lWRO9Z?(-1Xqku3RO2|!3le0oxHWdyC>h~+U0lf?PbDj6Kgk- zS&OG(w7eI;c00QJE|xy@0Nr3W6AJ{Hp(T-gAeT&WN~cwC+{ORmiyd(yUn?Ty9Zc_o zc9uR6T|v~5OrLIX&$b8wMI=x}@#4Tb7UGzFKH|q4j9&epochkI1kEhehL4+6Hp6RX zm}k_}DVyu3*gAWRjphv|tFN+r-=iFS@W;@qur-^qoeNbxBx!{e$iY)`el`}{s&oE& zWyS|d&j*XQUOMUBH^D#OijuA1@Te(jAf@0^%bL&3PJfpRM_;6W?ltbLJ)x>GYcT;W zilxG=)U<9$Rrgpb4M7v@8}D%CrT37_ud)B5pJZvzhoOs%+A*OrFbAbTsM+dxes7n4 zbU`_mKY-dt!UsT`=4^iu6>ny!fe|TA$x`D`4h)BkUjHl3z3_F0+gI2#tWk`~WJCd6 z@R;+c7AExB&db!6sl4Gyth&fRCTxE9&v^anHSYSvFR=EZJ7`m;wSpmtBrwJIhTb~< zU{=!Ms8(*^bU*!%{t0FZ2vNiDw!wWSNx>1RN+RfGrv5q`>}431XpVi8t^e^=_KeTc z51HaJ(>%izoZlfMaTtnZVW17>60wTR+?1j-d}&!$!MB%~UO3IZm4k%UJ9$qU#yyXx zqs~)&acFRRqF9|Q|7jK@i=pHe(iAM-39DT(oHf)l}0aAr7zAd0j3J@FD)tQ=+IGRMC8m&j;?#h_>b%u~!` zWHLrlzO03Nd=Y#Rw2&y0!0T7Cf|(&ZceVJ!I5*U?hXZNEUFXF2uK|6E!Eh>@T>T>$tcL7*$i_bY9|%85yI^ z#yG<#fA(qWm0fI2M)=@xX82-+IY(gvO$gLEvbQdD=iWlDoMA~LVvb@JMIcisB6Lok zi8&s^GTPNf7x?_d=BdEuWNijXz?@R2$olbDSc#Xh*@&z)k-&JgK{0T357UY$HJj16 z_s2fQ$A0~bJoMC4Tp4dNP92lkjM;RC6=T}Y=t`!`f`~GdmS+1R>)$&{KaI$-CFO#n zpgWZ}8KB|wm9NmY%e2m(iEfAU>?Z$Zarmk*yMBW4l@lxtD#p@dTUD557R}>MUh%s}C&={Lnk24-!fLfUiS2?~Z zM8CjNuVQI=6{&}uyL5%+-TQdvAAf;r=^)cMCHEKk%x`{A3@Aq+w$PcLz8{T&t-l;8}VMO;p3HY^%axXXz?>U+8Wl;(_g@4N4yC0^cZ7`vm zY}4!S;qQOpU(hs*Y+iT|ienfmZac7#J$vBtKkuk&5%um^OrVx=j0{sICwX`W`Ry1)=I3voS|i>W*C$*mv$=Lp(?T$oAX=} zB{@e9N_L5)BT{OSspt0F4{&+&9PeB^Nm~`RljG@M{X9SV6Fl;&6*Y?q-#4IOD5VAAu zmfmpwSw#1GU>U$f$qGdP%V_GbHnX(2f?HnW#7oCHGkJ@uzrfzRKf)*f-ea{iYAG(*n_|ISC z8!!9`E1MH0qiu#uE3B-paCvK!X1GeNisb@k^ZGF_)63qB+JJ&!cydX&7ztg=zJ(#5 zy#FpX!y{aN`;YmNM}C2O9(jWM9{o8&a{$^2gW(#36k#$ZM1>^O(HLmWP(02VE*r#5 z)ikg$fa!!?x82QW{?(Vb@3F&Nyn2??Z@hu7M}GcOPxJicDOW}#hE1PRc8bQ$Cad-W zZ4nz}aTF6&JU#I&VSIGoUT*LASv$0!r#|tM{KU`v6fECPq0i>%I+aeT>66l2YpYjS z91#0~jWT0c33bU(BB)W?7Kw@khqW76Q6Bj5pXCAI1^p@~UOmOi?mKv7(K!CntIVXu ziQ;Z;Tv|2Qu=gVm9>v-z;vm%u zi#?VL@v4Ktz~!GfElL9}aoq6Hfs`gRt5kkaNLy6sg?o z8#nxDz$ItlkQ($%XtLpFU`e<>4Xg}0NL#Gje;?acBUQ%7Oh1Bj4G4&|%++BFX6$HNy{P!)h~6`E zk>JWDb~iO23O%qnWz6o>!}LGVAjql z>jQRxAUD(O1YeAt4XJ8I(etfiC%D)uSK2^y4Vp8CfD^zqq{q_+=q6_m+NzcN2> z8NozvZsvb{V_P=t#u*n!6puEmyng;1ube&&%gdB7w<#pg5SyD|1{BK#ug^_#Lgx># zuR_6RBP0kJLKdt9deYLQ>zHdeKW_N%M=x?_J=3_rpiX!xP!duK6q`p#=E8k04|Io5 z4N(y9z&Y@NUS09#+2efst?!Tr1G>hOT|sP&rU_z#BA|kaVOG8x0goAGc1p?5nYw3+ zD5jud^ov67@Qo*C0p~eC9`WDaxXil;YCg2quvQOP?hP@Cs2FKFrNoS{YSbI0MASFn z0{A{ti;T857*98N`@%XWu8y(68kO(S6+=lV3DZJ$641h+_%cIG|uU;$ZLBJ~`u8qzNnN(9R{b)4+*kj**2S2=9f{$48Ogp@h+$bWqC z#ha$Ns7^&+-wN)*>~(&=lG3yeQ``BD;kc>1q6E@pn>$u}Jg|F>%0}F_y2@g+K!vh? z{u&pqZ?IK_*Uq13Q-rwK&{jfI7I3A)+R z#Qn;^?2VC$j|FNCw=iz8f>@bnCnf6WIeh!QJaYG5ZUau9J;wPHXITEo{amQT>rLPZmPx-VI{jXiTF_Q2%MfhB75K}@$cYe=V3Ii^jJI-WnoAoQ(^jB6{ zTw4R+&ZR{bA3DtJufM}P>zmXI4O!AoqUWGxhj~)$SWM;9K{!T^JM^~$x^jPWG!RSv zy5F81S*!ccP7zG!XIad!Qr>^~-o1PI=$*T13`iNA(Hjmp{OF@p{Ur_#mgic83}(bO zve5K+?9kn8{?!}IW*tRk{@fiq*Qwr!{E;f#*8`bs{|Clm^CR^BM#u(I>}#u1{nEhK z)2xcBLq*>Q9eO?X9o$dPLCP~C6ADvg5E$&)$A%MFSYT;!8LWdmq4Gum4lFi&cyWbx zdrYzNKHvh(x^5~WzvR6CS{5iGnBKbe|2H8ranJX2dSWo!I+|s|sGiaG3rJ#Z9C={o z@f4zuL@%Tr)s^yurN$UofzDtSpzA|w$Z2k$g~b+n4O*{32~GX*#@;ulN zHz+CszU0@dID3-q&96wBM)3u&hEApoV#EPr9wi_I$US0cB08H~X zF?F~s^wh=BwO{d*>64+9*X@TL6x{?a6w$8M@Ndhgea>tA(r_?5GLvnc_7y>Cq<8ZN zRecNFv_Q2J9b-P*1CXNl(R%5*-m}A|`u$1puSGNdHo!m7@UsXwk=G>WUuQD?-MZ2v z=PqCP<&CZS!I;uqtgGUj!*anRbXu55rZyqud9#p8#tnLJhOYe4{)NG_netXniDI|3 zRDVYk+nq?62rBZHV!wUv-E+Tvb+q+(m($0C_m6n*?}|C?D`v|WL6ulJHZ*gwLQi(1 w@zL0I-`I28!Iz~Hf^Uc>w=@dh&-&j305J23KO%-!asU7T07*qoM6N<$f;&7(MgRZ+ literal 0 HcmV?d00001 diff --git a/static/style/nine-base-001.scss b/static/style/nine-base-001.scss new file mode 100644 index 0000000..0c44685 --- /dev/null +++ b/static/style/nine-base-001.scss @@ -0,0 +1,555 @@ +.text-center{ text-align: center } +.text-right{ text-align: right } +.text-left{ text-align: left } + +.font-size6{ font-size: 6px } +.font-size8{ font-size: 8px } +.font-size10{ font-size: 10px } +.font-size12{ font-size: 12px } +.font-size14{ font-size: 14px } +.font-size16{ font-size: 16px } +.font-size18{ font-size: 18px } +.font-size20{ font-size: 20px } +.font-size22{ font-size: 22px } +.font-size24{ font-size: 24px } +.font-size26{ font-size: 26px } +.font-size28{ font-size: 28px } +.font-size30{ font-size: 30px } +.font-size32{ font-size: 32px } +.font-size34{ font-size: 34px } +.font-size36{ font-size: 36px } +.font-size38{ font-size: 38px } +.font-size40{ font-size: 40px } +.font-size60{ font-size: 60px } +.font-size80{ font-size: 80px } + +.font-bold{ font-weight: bold } + +.color-red{ color: red } +.color-green{ color: green } +.color-white{ color: white } +.color-gray{ color: gray } +.color-blue{ color: blue } +.color-yellow{ color: yellow } +.color-black{ color: black } +.color-f1f1f1{ color: #f1f1f1 } + +.bgcolor-blue{ background-color: blue } +.bgcolor-red{ background-color: red } +.bgcolor-pink{ background-color: pink } +.bgcolor-white{ background-color: white } +.bgcolor-lightblue{ background-color: lightblue } +.bgcolor-cce1e6{ background-color: #cce1e6 } +.bgcolor-787fff{ background-color: #787fff } +.bgcolor-eef0ff{ background-color: #eef0ff } +.bgcolor-ff4769{ background-color: #ff4769 } +.bgcolor-f1f1f1{ background-color: #f1f1f1 } + +.border-gray{ border: 3rpx solid gray } +.border-lightblue{ border: 3rpx solid lightblue } +.border-pink{ border: 3rpx solid pink } +.border-blue{ border: 3rpx solid blue } +.border-red{ border: 3rpx solid red } +.border-white{ border: 3rpx solid white } +.border-f1f1f1{ border: 3rpx solid #f1f1f1 } +.border-cce1e6{ border: 3rpx solid #cce1e6 } +.border-787fff{ border: 3rpx solid #787fff } +.border-eef0ff{ border: 3rpx solid #eef0ff } +.border-ff4769{ border: 3rpx solid #ff4769 } +.border-f1f1f1{ border: 3rpx solid #f1f1f1 } + +.border-radius10{ border-radius: 10rpx } + +.position-fixed{ position: fixed } +.position-absolute{ position: absolute } +.position-relative{ position: relative } + +.top0{ top: 0rpx } +.top10{ top: 10rpx } +.top20{ top: 20rpx } +.top30{ top: 30rpx } +.top40{ top: 40rpx } +.top50{ top: 50rpx } +.top60{ top: 60rpx } +.top70{ top: 70rpx } +.top80{ top: 80rpx } +.top90{ top: 90rpx } +.top100{ top: 100rpx } +.top110{ top: 110rpx } +.top120{ top: 120rpx } +.top130{ top: 130rpx } +.top140{ top: 140rpx } +.top150{ top: 150rpx } +.top200{ top: 200rpx } +.left0{ left: 0rpx } +.left10{ left: 10rpx } +.left20{ left: 20rpx } +.left30{ left: 30rpx } +.left40{ left: 40rpx } +.left50{ left: 50rpx } +.left60{ left: 60rpx } +.right0{ right: 0rpx } +.right10{ right: 10rpx } +.right20{ right: 20rpx } +.right30{ right: 30rpx } +.right40{ right: 40rpx } +.right50{ right: 50rpx } +.right60{ right: 60rpx } +.bottom0{ bottom: 0rpx } +.bottom10{ bottom: 10rpx } +.bottom20{ bottom: 20rpx } +.bottom30{ bottom: 30rpx } +.bottom40{ bottom: 40rpx } +.bottom50{ bottom: 50rpx } +.bottom60{ bottom: 60rpx } +.bottom70{ bottom: 70rpx } +.bottom80{ bottom: 80rpx } +.bottom90{ bottom: 90rpx } +.bottom100{ bottom: 100rpx } +.bottom110{ bottom: 110rpx } +.bottom120{ bottom: 120rpx } +.bottom130{ bottom: 130rpx } +.bottom140{ bottom: 140rpx } +.bottom150{ bottom: 150rpx } +.bottom200{ bottom: 200rpx } + +.lh20{ line-height: 20rpx } +.lh25{ line-height: 25rpx } +.lh30{ line-height: 30rpx } +.lh35{ line-height: 35rpx } +.lh40{ line-height: 40rpx } +.lh50{ line-height: 50rpx } + +.pa0{ padding: 0rpx } +.pa5{ padding: 5rpx } +.pa10{ padding: 10rpx } +.pa15{ padding: 15rpx } +.pa20{ padding: 20rpx } +.pa25{ padding: 25rpx } +.pa30{ padding: 30rpx } +.pa40{ padding: 40rpx } +.pa45{ padding: 45rpx } +.pa50{ padding: 50rpx } +.pa60{ padding: 60rpx } +.pa70{ padding: 70rpx } +.pa80{ padding: 80rpx } +.pa90{ padding: 90rpx } +.pa100{ padding: 100rpx } +.pa120{ padding: 120rpx } +.pa140{ padding: 140rpx } +.pa160{ padding: 160rpx } +.pa180{ padding: 180rpx } +.pa200{ padding: 200rpx } +.pa250{ padding: 250rpx } +.pa300{ padding: 300rpx } + +.ptb0{ padding-top: 0rpx; padding-bottom: 0rpx } +.ptb5{ padding-top: 5rpx; padding-bottom: 5rpx } +.ptb10{ padding-top: 10rpx; padding-bottom: 10rpx } +.ptb15{ padding-top: 15rpx; padding-bottom: 15rpx } +.ptb20{ padding-top: 20rpx; padding-bottom: 20rpx } +.ptb25{ padding-top: 25rpx; padding-bottom: 25rpx } +.ptb30{ padding-top: 30rpx; padding-bottom: 30rpx } +.ptb35{ padding-top: 35rpx; padding-bottom: 35rpx } +.ptb40{ padding-top: 40rpx; padding-bottom: 40rpx } +.ptb45{ padding-top: 45rpx; padding-bottom: 45rpx } +.ptb50{ padding-top: 50rpx; padding-bottom: 50rpx } +.ptb60{ padding-top: 60rpx; padding-bottom: 60rpx } +.ptb70{ padding-top: 70rpx; padding-bottom: 70rpx } +.ptb80{ padding-top: 80rpx; padding-bottom: 80rpx } +.ptb90{ padding-top: 90rpx; padding-bottom: 90rpx } +.ptb100{ padding-top: 100rpx; padding-bottom: 100rpx } +.ptb120{ padding-top: 120rpx; padding-bottom: 120rpx } +.ptb140{ padding-top: 140rpx; padding-bottom: 140rpx } +.ptb160{ padding-top: 160rpx; padding-bottom: 160rpx } +.ptb180{ padding-top: 180rpx; padding-bottom: 180rpx } +.ptb200{ padding-top: 200rpx; padding-bottom: 200rpx } +.ptb250{ padding-top: 250rpx; padding-bottom: 250rpx } +.ptb300{ padding-top: 300rpx; padding-bottom: 300rpx } + +.plr0{ padding-left: 0rpx; padding-right: 0rpx } +.plr5{ padding-left: 5rpx; padding-right: 5rpx } +.plr10{ padding-left: 10rpx; padding-right: 10rpx } +.plr15{ padding-left: 15rpx; padding-right: 15rpx } +.plr20{ padding-left: 20rpx; padding-right: 20rpx } +.plr25{ padding-left: 25rpx; padding-right: 25rpx } +.plr30{ padding-left: 30rpx; padding-right: 30rpx } +.plr35{ padding-left: 35rpx; padding-right: 35rpx } +.plr40{ padding-left: 40rpx; padding-right: 40rpx } +.plr45{ padding-left: 45rpx; padding-right: 45rpx } +.plr50{ padding-left: 50rpx; padding-right: 50rpx } +.plr60{ padding-left: 60rpx; padding-right: 60rpx } +.plr70{ padding-left: 70rpx; padding-right: 70rpx } +.plr80{ padding-left: 80rpx; padding-right: 80rpx } +.plr90{ padding-left: 90rpx; padding-right: 90rpx } +.plr100{ padding-left: 100rpx; padding-right: 100rpx } +.plr120{ padding-left: 120rpx; padding-right: 120rpx } +.plr140{ padding-left: 140rpx; padding-right: 140rpx } +.plr160{ padding-left: 160rpx; padding-right: 160rpx } +.plr180{ padding-left: 180rpx; padding-right: 180rpx } +.plr200{ padding-left: 200rpx; padding-right: 200rpx } +.plr250{ padding-left: 250rpx; padding-right: 250rpx } +.plr300{ padding-left: 300rpx; padding-right: 300rpx } + +.pt0{ padding-top: 0rpx } +.pt5{ padding-top: 5rpx } +.pt10{ padding-top: 10rpx } +.pt15{ padding-top: 15rpx } +.pt20{ padding-top: 20rpx } +.pt25{ padding-top: 25rpx } +.pt30{ padding-top: 30rpx } +.pt35{ padding-top: 35rpx } +.pt40{ padding-top: 40rpx } +.pt45{ padding-top: 45rpx } +.pt50{ padding-top: 50rpx } +.pt60{ padding-top: 60rpx } +.pt70{ padding-top: 70rpx } +.pt80{ padding-top: 80rpx } +.pt90{ padding-top: 90rpx } +.pt100{ padding-top: 100rpx } +.pt120{ padding-top: 120rpx } +.pt140{ padding-top: 140rpx } +.pt160{ padding-top: 160rpx } +.pt180{ padding-top: 180rpx } +.pt200{ padding-top: 200rpx } +.pt250{ padding-top: 250rpx } +.pt300{ padding-top: 300rpx } + +.pb0{ padding-bottom: 0rpx } +.pb5{ padding-bottom: 5rpx } +.pb10{ padding-bottom: 10rpx } +.pb15{ padding-bottom: 15rpx } +.pb20{ padding-bottom: 20rpx } +.pb25{ padding-bottom: 25rpx } +.pb30{ padding-bottom: 30rpx } +.pb35{ padding-bottom: 35rpx } +.pb40{ padding-bottom: 40rpx } +.pb45{ padding-bottom: 45rpx } +.pb50{ padding-bottom: 50rpx } +.pb60{ padding-bottom: 60rpx } +.pb70{ padding-bottom: 70rpx } +.pb80{ padding-bottom: 80rpx } +.pb90{ padding-bottom: 90rpx } +.pb100{ padding-bottom: 100rpx } +.pb120{ padding-bottom: 120rpx } +.pb140{ padding-bottom: 140rpx } +.pb160{ padding-bottom: 160rpx } +.pb180{ padding-bottom: 180rpx } +.pb200{ padding-bottom: 200rpx } +.pb250{ padding-bottom: 250rpx } +.pb300{ padding-bottom: 300rpx } + +.pl0{ padding-left: 0rpx } +.pl5{ padding-left: 5rpx } +.pl10{ padding-left: 10rpx } +.pl15{ padding-left: 15rpx } +.pl20{ padding-left: 20rpx } +.pl25{ padding-left: 25rpx } +.pl30{ padding-left: 30rpx } +.pl35{ padding-left: 35rpx } +.pl40{ padding-left: 40rpx } +.pl45{ padding-left: 45rpx } +.pl50{ padding-left: 50rpx } +.pl60{ padding-left: 60rpx } +.pl70{ padding-left: 70rpx } +.pl80{ padding-left: 80rpx } +.pl90{ padding-left: 90rpx } +.pl100{ padding-left: 100rpx } +.pl120{ padding-left: 120rpx } +.pl140{ padding-left: 140rpx } +.pl160{ padding-left: 160rpx } +.pl180{ padding-left: 180rpx } +.pl200{ padding-left: 200rpx } +.pl250{ padding-left: 250rpx } +.pl300{ padding-left: 300rpx } + +.pr0{ padding-right: 0rpx } +.pr5{ padding-right: 5rpx } +.pr10{ padding-right: 10rpx } +.pr15{ padding-right: 15rpx } +.pr20{ padding-right: 20rpx } +.pr25{ padding-right: 25rpx } +.pr30{ padding-right: 30rpx } +.pr35{ padding-right: 35rpx } +.pr40{ padding-right: 40rpx } +.pr45{ padding-right: 45rpx } +.pr50{ padding-right: 50rpx } +.pr60{ padding-right: 60rpx } +.pr70{ padding-right: 70rpx } +.pr80{ padding-right: 80rpx } +.pr90{ padding-right: 90rpx } +.pr100{ padding-right: 100rpx } +.pr120{ padding-right: 120rpx } +.pr140{ padding-right: 140rpx } +.pr160{ padding-right: 160rpx } +.pr180{ padding-right: 180rpx } +.pr200{ padding-right: 200rpx } +.pr250{ padding-right: 250rpx } +.pr300{ padding-right: 300rpx } + +.ma0{ margin: 0rpx } +.ma5{ margin: 5rpx } +.ma10{ margin: 10rpx } +.ma15{ margin: 15rpx } +.ma20{ margin: 20rpx } +.ma25{ margin: 25rpx } +.ma30{ margin: 30rpx } +.ma35{ margin: 35rpx } +.ma40{ margin: 40rpx } +.ma45{ margin: 45rpx } +.ma50{ margin: 50rpx } +.ma60{ margin: 60rpx } +.ma70{ margin: 70rpx } +.ma80{ margin: 80rpx } +.ma90{ margin: 90rpx } +.ma100{ margin: 100rpx } +.ma120{ margin: 120rpx } +.ma140{ margin: 140rpx } +.ma160{ margin: 160rpx } +.ma180{ margin: 180rpx } +.ma200{ margin: 200rpx } +.ma250{ margin: 250rpx } +.ma300{ margin: 300rpx } + +.mlr0{ margin-left: 0rpx; margin-right: 0rpx } +.mlr5{ margin-left: 5rpx; margin-right: 5rpx } +.mlr10{ margin-left: 10rpx; margin-right: 10rpx } +.mlr15{ margin-left: 15rpx; margin-right: 15rpx } +.mlr20{ margin-left: 20rpx; margin-right: 20rpx } +.mlr25{ margin-left: 25rpx; margin-right: 25rpx } +.mlr30{ margin-left: 30rpx; margin-right: 30rpx } +.mlr35{ margin-left: 35rpx; margin-right: 35rpx } +.mlr40{ margin-left: 40rpx; margin-right: 40rpx } +.mlr45{ margin-left: 45rpx; margin-right: 45rpx } +.mlr50{ margin-left: 50rpx; margin-right: 50rpx } +.mlr50{ margin-left: 50rpx; margin-right: 50rpx } +.mlr60{ margin-left: 60rpx; margin-right: 60rpx } +.mlr70{ margin-left: 70rpx; margin-right: 70rpx } +.mlr80{ margin-left: 80rpx; margin-right: 80rpx } +.mlr90{ margin-left: 90rpx; margin-right: 90rpx } +.mlr100{ margin-left: 100rpx; margin-right: 100rpx } +.mlr120{ margin-left: 120rpx; margin-right: 120rpx } +.mlr140{ margin-left: 140rpx; margin-right: 140rpx } +.mlr160{ margin-left: 160rpx; margin-right: 160rpx } +.mlr180{ margin-left: 180rpx; margin-right: 180rpx } +.mlr200{ margin-left: 200rpx; margin-right: 200rpx } +.mlr250{ margin-left: 250rpx; margin-right: 250rpx } +.mlr300{ margin-left: 300rpx; margin-right: 300rpx } + +.mtb0{ margin-top: 0rpx; margin-bottom: 0rpx } +.mtb5{ margin-top: 5rpx; margin-bottom: 5rpx } +.mtb10{ margin-top: 10rpx; margin-bottom: 10rpx } +.mtb15{ margin-top: 15rpx; margin-bottom: 15rpx } +.mtb20{ margin-top: 20rpx; margin-bottom: 20rpx } +.mtb25{ margin-top: 25rpx; margin-bottom: 25rpx } +.mtb30{ margin-top: 30rpx; margin-bottom: 30rpx } +.mtb35{ margin-top: 35rpx; margin-bottom: 35rpx } +.mtb40{ margin-top: 40rpx; margin-bottom: 40rpx } +.mtb45{ margin-top: 45rpx; margin-bottom: 45rpx } +.mtb50{ margin-top: 50rpx; margin-bottom: 50rpx } +.mtb60{ margin-top: 60rpx; margin-bottom: 60rpx } +.mtb70{ margin-top: 70rpx; margin-bottom: 70rpx } +.mtb80{ margin-top: 80rpx; margin-bottom: 80rpx } +.mtb90{ margin-top: 90rpx; margin-bottom: 90rpx } +.mtb100{ margin-top: 100rpx; margin-bottom: 100rpx } +.mtb120{ margin-top: 120rpx; margin-bottom: 120rpx } +.mtb140{ margin-top: 140rpx; margin-bottom: 140rpx } +.mtb160{ margin-top: 160rpx; margin-bottom: 160rpx } +.mtb180{ margin-top: 180rpx; margin-bottom: 180rpx } +.mtb200{ margin-top: 200rpx; margin-bottom: 200rpx } +.mtb250{ margin-top: 250rpx; margin-bottom: 250rpx } +.mtb300{ margin-top: 300rpx; margin-bottom: 300rpx } + +.mt0{ margin-top: 0rpx } +.mt5{ margin-top: 5rpx } +.mt10{ margin-top: 10rpx } +.mt12{ margin-top: 10rpx } +.mt15{ margin-top: 15rpx } +.mt20{ margin-top: 20rpx } +.mt25{ margin-top: 25rpx } +.mt30{ margin-top: 30rpx } +.mt35{ margin-top: 35rpx } +.mt40{ margin-top: 40rpx } +.mt45{ margin-top: 45rpx } +.mt50{ margin-top: 50rpx } +.mt60{ margin-top: 60rpx } +.mt65{ margin-top: 65rpx } +.mt70{ margin-top: 70rpx } +.mt80{ margin-top: 80rpx } +.mt90{ margin-top: 90rpx } +.mt100{ margin-top: 100rpx } +.mt120{ margin-top: 120rpx } +.mt140{ margin-top: 140rpx } +.mt160{ margin-top: 160rpx } +.mt180{ margin-top: 180rpx } +.mt200{ margin-top: 200rpx } +.mt250{ margin-top: 250rpx } +.mt300{ margin-top: 300rpx } + +.mt-1{ margin-top: -1rpx } +.mt-5{ margin-top: -5rpx } +.mt-10{ margin-top: -10rpx } +.mt-15{ margin-top: -15rpx } +.mt-20{ margin-top: -20rpx } +.mt-25{ margin-top: -25rpx } +.mt-30{ margin-top: -30rpx } +.mt-35{ margin-top: -35rpx } +.mt-40{ margin-top: -40rpx } +.mt-45{ margin-top: -45rpx } +.mt-50{ margin-top: -50rpx } +.mt-60{ margin-top: -60rpx } +.mt-70{ margin-top: -70rpx } +.mt-80{ margin-top: -80rpx } +.mt-90{ margin-top: -90rpx } +.mt-100{ margin-top: -100rpx } +.mt-120{ margin-top: -120rpx } +.mt-140{ margin-top: -140rpx } +.mt-160{ margin-top: -160rpx } +.mt-180{ margin-top: -180rpx } +.mt-200{ margin-top: -200rpx } +.mt-250{ margin-top: -250rpx } +.mt-300{ margin-top: -300rpx } + +.mb0{ margin-bottom: 0rpx } +.mb5{ margin-bottom: 5rpx } +.mb10{ margin-bottom: 10rpx } +.mb15{ margin-bottom: 15rpx } +.mb20{ margin-bottom: 20rpx } +.mb25{ margin-bottom: 25rpx } +.mb30{ margin-bottom: 30rpx } +.mb35{ margin-bottom: 35rpx } +.mb40{ margin-bottom: 40rpx } +.mb45{ margin-bottom: 45rpx } +.mb50{ margin-bottom: 50rpx } +.mb60{ margin-bottom: 60rpx } +.mb70{ margin-bottom: 70rpx } +.mb80{ margin-bottom: 80rpx } +.mb90{ margin-bottom: 90rpx } +.mb100{ margin-bottom: 100rpx } +.mb120{ margin-bottom: 120rpx } +.mb140{ margin-bottom: 140rpx } +.mb160{ margin-bottom: 160rpx } +.mb180{ margin-bottom: 180rpx } +.mb200{ margin-bottom: 200rpx } +.mb250{ margin-bottom: 250rpx } +.mb300{ margin-bottom: 300rpx } + +.mb-1{ margin-bottom: -1rpx } +.mb-5{ margin-bottom: -5rpx } +.mb-10{ margin-bottom: -10rpx } +.mb-15{ margin-bottom: -15rpx } +.mb-20{ margin-bottom: -20rpx } +.mb-25{ margin-bottom: -25rpx } +.mb-30{ margin-bottom: -30rpx } +.mb-35{ margin-bottom: -35rpx } +.mb-40{ margin-bottom: -40rpx } +.mb-45{ margin-bottom: -45rpx } +.mb-50{ margin-bottom: -50rpx } +.mb-60{ margin-bottom: -60rpx } +.mb-70{ margin-bottom: -70rpx } +.mb-80{ margin-bottom: -80rpx } +.mb-90{ margin-bottom: -90rpx } +.mb-100{ margin-bottom: -100rpx } +.mb-120{ margin-bottom: -120rpx } +.mb-140{ margin-bottom: -140rpx } +.mb-160{ margin-bottom: -160rpx } +.mb-180{ margin-bottom: -180rpx } +.mb-200{ margin-bottom: -200rpx } +.mb-250{ margin-bottom: -250rpx } +.mb-300{ margin-bottom: -300rpx } + +.ml0{ margin-left: 0rpx } +.ml5{ margin-left: 5rpx } +.ml10{ margin-left: 10rpx } +.ml15{ margin-left: 15rpx } +.ml20{ margin-left: 20rpx } +.ml25{ margin-left: 25rpx } +.ml30{ margin-left: 30rpx } +.ml35{ margin-left: 35rpx } +.ml40{ margin-left: 40rpx } +.ml45{ margin-left: 45rpx } +.ml50{ margin-left: 50rpx } +.ml60{ margin-left: 60rpx } +.ml70{ margin-left: 70rpx } +.ml80{ margin-left: 80rpx } +.ml90{ margin-left: 90rpx } +.ml100{ margin-left: 100rpx } +.ml120{ margin-left: 120rpx } +.ml140{ margin-left: 140rpx } +.ml160{ margin-left: 160rpx } +.ml180{ margin-left: 180rpx } +.ml200{ margin-left: 200rpx } +.ml250{ margin-left: 250rpx } +.ml300{ margin-left: 300rpx } + +.ml-1{ margin-left: -1rpx } +.ml-5{ margin-left: -5rpx } +.ml-10{ margin-left: -10rpx } +.ml-15{ margin-left: -15rpx } +.ml-20{ margin-left: -20rpx } +.ml-25{ margin-left: -25rpx } +.ml-30{ margin-left: -30rpx } +.ml-35{ margin-left: -35rpx } +.ml-40{ margin-left: -40rpx } +.ml-45{ margin-left: -45rpx } +.ml-50{ margin-left: -50rpx } +.ml-60{ margin-left: -60rpx } +.ml-70{ margin-left: -70rpx } +.ml-80{ margin-left: -80rpx } +.ml-90{ margin-left: -90rpx } +.ml-100{ margin-left: -100rpx } +.ml-120{ margin-left: -120rpx } +.ml-140{ margin-left: -140rpx } +.ml-160{ margin-left: -160rpx } +.ml-180{ margin-left: -180rpx } +.ml-200{ margin-left: -200rpx } +.ml-250{ margin-left: -250rpx } +.ml-300{ margin-left: -300rpx } + +.mr0{ margin-right: 0rpx } +.mr5{ margin-right: 5rpx } +.mr10{ margin-right: 10rpx } +.mr15{ margin-right: 15rpx } +.mr20{ margin-right: 20rpx } +.mr25{ margin-right: 25rpx } +.mr30{ margin-right: 30rpx } +.mr35{ margin-right: 35rpx } +.mr40{ margin-right: 40rpx } +.mr45{ margin-right: 45rpx } +.mr50{ margin-right: 50rpx } +.mr60{ margin-right: 60rpx } +.mr70{ margin-right: 70rpx } +.mr80{ margin-right: 80rpx } +.mr90{ margin-right: 90rpx } +.mr100{ margin-right: 100rpx } +.mr120{ margin-right: 120rpx } +.mr140{ margin-right: 140rpx } +.mr160{ margin-right: 160rpx } +.mr180{ margin-right: 180rpx } +.mr200{ margin-right: 200rpx } +.mr250{ margin-right: 250rpx } +.mr300{ margin-right: 300rpx } + +.mr-1{ margin-right: -1rpx } +.mr-5{ margin-right: -5rpx } +.mr-10{ margin-right: -10rpx } +.mr-15{ margin-right: -15rpx } +.mr-20{ margin-right: -20rpx } +.mr-25{ margin-right: -25rpx } +.mr-30{ margin-right: -30rpx } +.mr-35{ margin-right: -35rpx } +.mr-40{ margin-right: -40rpx } +.mr-45{ margin-right: -45rpx } +.mr-50{ margin-right: -50rpx } +.mr-60{ margin-right: -60rpx } +.mr-70{ margin-right: -70rpx } +.mr-80{ margin-right: -80rpx } +.mr-90{ margin-right: -90rpx } +.mr-100{ margin-right: -100rpx } +.mr-120{ margin-right: -120rpx } +.mr-140{ margin-right: -140rpx } +.mr-160{ margin-right: -160rpx } +.mr-180{ margin-right: -180rpx } +.mr-200{ margin-right: -200rpx } +.mr-250{ margin-right: -250rpx } +.mr-300{ margin-right: -300rpx } \ No newline at end of file diff --git a/static/style/nine-base-002.scss b/static/style/nine-base-002.scss new file mode 100644 index 0000000..4ce38eb --- /dev/null +++ b/static/style/nine-base-002.scss @@ -0,0 +1,136 @@ +.height100{ + height: 100%; +} +.width25{ + width: 25%; +} +.width30{ + width: 30%; +} +.width45{ + width: 45%; +} +.width46{ + width: 46%; +} +.width47{ + width: 47%; +} +.width48{ + width: 48%; +} +.width49{ + width: 49%; +} +.width50{ + width: 50%; +} +.width80{ + width: 80%; +} +.width90{ + width: 90%; +} +.width100{ + width: 100%; +} + +.test{ border: 3rpx solid red} +.test-red{ border: 3rpx solid red} +.test-blue{ border: 3rpx solid blue} +.test-green{ border: 3rpx solid green} +.test-white{ border: 3rpx solid white} +.test-box{ box-sizing: border-box; border: 3rpx solid red} +.test-box-red{ box-sizing: border-box; border: 3rpx solid red} +.test-box-blue{ box-sizing: border-box; border: 3rpx solid blue} +.test-box-green{ box-sizing: border-box; border: 3rpx solid green} +.test-box-white{ box-sizing: border-box; border: 3rpx solid white} + +.float{ float: left; } +.float-left{ float: left; } +.float-right{ float: right; } + +// 允许文本复制 +.nine-user-select { + cursor: auto; + -webkit-user-select: text; + user-select: text; +} + +.display-flex-row{ + display: flex; + flex-direction: row; + align-items: center; +} +.display-flex-column{ + display: flex; + flex-direction: column; +} +.display-flex-column-center{ + display: flex; + flex-direction: column; + justify-content: center; +} +.display-flex-row-between{ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; +} +.display-flex-row-center{ + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; +} +.display-flex-row-around{ + display: flex; + flex-direction: row; + justify-content: space-around; + align-items: center; +} +.display-flex-column-between{ + display: flex; + flex-direction: column; + justify-content: space-between; + align-items: center; +} +.display-flex-column-around{ + display: flex; + flex-direction: column; + justify-content: space-around; + align-items: center; +} +.justify-content-center{ + justify-content: center +} +.flex1{ + flex: 1 +} + + +.text-nowrap{ + white-space:nowrap; +} +.text-ellipsis{ + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +// 放大缩小比例 +.transform-scale05{ + transform: scale(0.5); +} +.transform-scale06{ + transform: scale(0.6); +} +.transform-scale07{ + transform: scale(0.7); +} +.transform-scale08{ + transform: scale(0.8); +} +.transform-scale09{ + transform: scale(0.9); +} \ No newline at end of file diff --git a/static/style/nine-btn-001.scss b/static/style/nine-btn-001.scss new file mode 100644 index 0000000..daf61f9 --- /dev/null +++ b/static/style/nine-btn-001.scss @@ -0,0 +1,27 @@ +// 边框蓝,字体蓝,用于获取短信验证码按钮 +.nine-btn-verify-001{ + border-radius: 10rpx; + color: #1e1eff; + border: 3rpx solid #1e1eff; +} +// 保存按钮 +.nine-btn-save-001{ + padding: 20rpx; + border-radius: 10rpx; + color: #fff; + background-color: #0000ff; + text-align: center; +} +// 退出登录 +.nine-btn-login-out-001{ + padding: 20rpx; + border-radius: 10rpx; + color: red; + background: #fff; + text-align: center; +} +// 灰色横线 +.nine-line-001{ + height: 1rpx; + border-top: 1rpx solid #d9d9d9; +} \ No newline at end of file diff --git a/static/style/nine-chat-friend-001.scss b/static/style/nine-chat-friend-001.scss new file mode 100644 index 0000000..4ceda16 --- /dev/null +++ b/static/style/nine-chat-friend-001.scss @@ -0,0 +1 @@ +/* 可重写内部/uni_modules/vrapile-im/static/style/nine-chat-friend-001.scss样式 */ diff --git a/static/style/nine-chat-home-001.scss b/static/style/nine-chat-home-001.scss new file mode 100644 index 0000000..bab177d --- /dev/null +++ b/static/style/nine-chat-home-001.scss @@ -0,0 +1 @@ +/* 可重写内部/uni_modules/vrapile-im/static/style/nine-chat-home-001.scss样式 */ diff --git a/static/style/nine-image-001.scss b/static/style/nine-image-001.scss new file mode 100644 index 0000000..fdd71d9 --- /dev/null +++ b/static/style/nine-image-001.scss @@ -0,0 +1,36 @@ +.image35{ + width: 35rpx; + height: 35rpx; +} +.image40{ + width: 40rpx; + height: 40rpx; +} +.image50{ + width: 40rpx; + height: 40rpx; +} +.image70{ + width: 70rpx; + height: 70rpx; +} +.image80{ + width: 70rpx; + height: 70rpx; +} +.image90{ + width: 90rpx; + height: 90rpx; +} +.image150{ + width: 150rpx; + height: 150rpx; +} +.image200{ + width: 200rpx; + height: 200rpx; +} +.image400{ + width: 400rpx; + height: 400rpx; +} \ No newline at end of file diff --git a/static/style/nine-list-001.scss b/static/style/nine-list-001.scss new file mode 100644 index 0000000..4780b21 --- /dev/null +++ b/static/style/nine-list-001.scss @@ -0,0 +1,9 @@ +.nine-list-001{ + padding: 10rpx; +} +.nine-list-001-item{ + background-color: #fff; + margin: 10rpx 0; + padding: 10rpx 30rpx; + border-radius: 10rpx; +} \ No newline at end of file diff --git a/static/style/nine-nav-001.scss b/static/style/nine-nav-001.scss new file mode 100644 index 0000000..7ddfb98 --- /dev/null +++ b/static/style/nine-nav-001.scss @@ -0,0 +1,39 @@ +.nine-nav-001{ + display: flex; + flex-direction: column; + padding: 10rpx; + flex: 1; + height: 100%; + overflow-y: auto; +} +.nine-nav-001-item{ + background: #fff; + display: flex; + flex-direction: row; + align-items: center; + justify-content: space-between; + margin-top: 5rpx; + padding: 20rpx 15rpx; + border-radius: 1rpx; + border-style: solid; + border-width: 0px; +} +.nine-nav-001-item-left{ + display: flex; + flex-direction: row; + align-items: center; + padding: 2rpx 10rpx; +} +.nine-nav-001-item-left-text{ + font-size: 16px; + padding-left: 20rpx; +} +.nine-nav-001-item-right{ + display: flex; + flex-direction: row; + align-items: center; +} +.nine-nav-001-item-right-image{ + width: 16rpx; + height: 35rpx; +} \ No newline at end of file diff --git a/store/getters.js b/store/getters.js new file mode 100644 index 0000000..95053e9 --- /dev/null +++ b/store/getters.js @@ -0,0 +1,8 @@ +const getters = { + token: state => state.user.token, + userInfo: state => state.user.userInfo, + loginInfo: state => state.user.loginInfo, + avatar: state => state.user.avatar, + name: state => state.user.name +} +export default getters diff --git a/store/index.js b/store/index.js new file mode 100644 index 0000000..2e6be07 --- /dev/null +++ b/store/index.js @@ -0,0 +1,15 @@ +// import Vue from 'vue' +import Vuex from 'vuex' +import user from '@/store/modules/user' +import getters from './getters' + +// Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + user + }, + getters +}) + +export default store diff --git a/store/modules/user.js b/store/modules/user.js new file mode 100644 index 0000000..12eeb2d --- /dev/null +++ b/store/modules/user.js @@ -0,0 +1,94 @@ +import store from '@/store' +import storage from '@/utils/storage' +import constant from '@/utils/constant' +import { login, logout, getInfo } from '@/api/login' +import { getToken, setToken, removeToken } from '@/utils/token' + +const user = { + state: { + token: getToken(), + userInfo: storage.get(constant.userInfo), + loginInfo: storage.get(constant.loginInfo), + name: storage.get(constant.name), + avatar: storage.get(constant.avatar) + }, + + mutations: { + SET_TOKEN: (state, token) => { + state.token = token + }, + SET_USER_INFO: (state, userInfo) => { + state.userInfo = userInfo + storage.set(constant.userInfo, userInfo) + }, + SET_LOGIN_INFO: (state, loginInfo) => { + state.loginInfo = loginInfo + storage.set(constant.loginInfo, loginInfo) + }, + SET_NAME: (state, name) => { + state.name = name + storage.set(constant.name, name) + }, + SET_AVATAR: (state, avatar) => { + state.avatar = avatar + storage.set(constant.avatar, avatar) + } + }, + + actions: { + // 登录 + Login({ commit }, userInfo) { + const loginType = userInfo.loginType + const userName = userInfo.userName + const password = userInfo.password + const smsCode = userInfo.smsCode + const registerFlag = userInfo.registerFlag + const code = userInfo.code + const uuid = userInfo.uuid + return new Promise((resolve, reject) => { + login(loginType, userName, password, smsCode, registerFlag, code, uuid).then(res => { + setToken(res.data.token) + commit('SET_TOKEN', res.data.token) + commit('SET_LOGIN_INFO', userInfo) // 保存登录信息,后续可以自动登录 + resolve() + }).catch(error => { + reject(error) + }) + }) + }, + + // 获取用户信息 + GetInfo({ commit, state }) { + return new Promise((resolve, reject) => { + getInfo().then(res => { + const user = res.data.user + const avatar = (user == null || user.avatar == "" || user.avatar == null) ? "/static/image/user/yy.png" : user.avatar + const userName = (user == null || user.userName == "" || user.userName == null) ? "" : user.userName + commit('SET_USER_INFO', user) + commit('SET_NAME', userName) + commit('SET_AVATAR', avatar) + resolve(res) + }).catch(error => { + reject(error) + }) + }) + }, + + // 退出系统 + LogOut({ commit, state }) { + return new Promise((resolve, reject) => { + logout(state.token).then(() => { + commit('SET_TOKEN', '') + commit('SET_USER_INFO', {}) + removeToken() + storage.clean() + resolve() + }).catch(error => { + reject(error) + }) + }) + } + } +} + +export default user diff --git a/uni.scss b/uni.scss new file mode 100644 index 0000000..b9249e9 --- /dev/null +++ b/uni.scss @@ -0,0 +1,76 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ + +/* 行为相关颜色 */ +$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/uni-icons/changelog.md b/uni_modules/uni-icons/changelog.md new file mode 100644 index 0000000..0261131 --- /dev/null +++ b/uni_modules/uni-icons/changelog.md @@ -0,0 +1,42 @@ +## 2.0.10(2024-06-07) +- 优化 uni-app x 中,size 属性的类型 +## 2.0.9(2024-01-12) +fix: 修复图标大小默认值错误的问题 +## 2.0.8(2023-12-14) +- 修复 项目未使用 ts 情况下,打包报错的bug +## 2.0.7(2023-12-14) +- 修复 size 属性为 string 时,不加单位导致尺寸异常的bug +## 2.0.6(2023-12-11) +- 优化 兼容老版本icon类型,如 top ,bottom 等 +## 2.0.5(2023-12-11) +- 优化 兼容老版本icon类型,如 top ,bottom 等 +## 2.0.4(2023-12-06) +- 优化 uni-app x 下示例项目图标排序 +## 2.0.3(2023-12-06) +- 修复 nvue下引入组件报错的bug +## 2.0.2(2023-12-05) +-优化 size 属性支持单位 +## 2.0.1(2023-12-05) +- 新增 uni-app x 支持定义图标 +## 1.3.5(2022-01-24) +- 优化 size 属性可以传入不带单位的字符串数值 +## 1.3.4(2022-01-24) +- 优化 size 支持其他单位 +## 1.3.3(2022-01-17) +- 修复 nvue 有些图标不显示的bug,兼容老版本图标 +## 1.3.2(2021-12-01) +- 优化 示例可复制图标名称 +## 1.3.1(2021-11-23) +- 优化 兼容旧组件 type 值 +## 1.3.0(2021-11-19) +- 新增 更多图标 +- 优化 自定义图标使用方式 +- 优化 组件UI,并提供设计资源,详见:[https://uniapp.dcloud.io/component/uniui/resource](https://uniapp.dcloud.io/component/uniui/resource) +- 文档迁移,详见:[https://uniapp.dcloud.io/component/uniui/uni-icons](https://uniapp.dcloud.io/component/uniui/uni-icons) +## 1.1.7(2021-11-08) +## 1.2.0(2021-07-30) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.1.5(2021-05-12) +- 新增 组件示例地址 +## 1.1.4(2021-02-05) +- 调整为uni_modules目录规范 diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue b/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue new file mode 100644 index 0000000..8740559 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.uvue @@ -0,0 +1,91 @@ + + + + + diff --git a/uni_modules/uni-icons/components/uni-icons/uni-icons.vue b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue new file mode 100644 index 0000000..7da5356 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uni-icons.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.css b/uni_modules/uni-icons/components/uni-icons/uniicons.css new file mode 100644 index 0000000..0a6b6fe --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons.css @@ -0,0 +1,664 @@ + +.uniui-cart-filled:before { + content: "\e6d0"; +} + +.uniui-gift-filled:before { + content: "\e6c4"; +} + +.uniui-color:before { + content: "\e6cf"; +} + +.uniui-wallet:before { + content: "\e6b1"; +} + +.uniui-settings-filled:before { + content: "\e6ce"; +} + +.uniui-auth-filled:before { + content: "\e6cc"; +} + +.uniui-shop-filled:before { + content: "\e6cd"; +} + +.uniui-staff-filled:before { + content: "\e6cb"; +} + +.uniui-vip-filled:before { + content: "\e6c6"; +} + +.uniui-plus-filled:before { + content: "\e6c7"; +} + +.uniui-folder-add-filled:before { + content: "\e6c8"; +} + +.uniui-color-filled:before { + content: "\e6c9"; +} + +.uniui-tune-filled:before { + content: "\e6ca"; +} + +.uniui-calendar-filled:before { + content: "\e6c0"; +} + +.uniui-notification-filled:before { + content: "\e6c1"; +} + +.uniui-wallet-filled:before { + content: "\e6c2"; +} + +.uniui-medal-filled:before { + content: "\e6c3"; +} + +.uniui-fire-filled:before { + content: "\e6c5"; +} + +.uniui-refreshempty:before { + content: "\e6bf"; +} + +.uniui-location-filled:before { + content: "\e6af"; +} + +.uniui-person-filled:before { + content: "\e69d"; +} + +.uniui-personadd-filled:before { + content: "\e698"; +} + +.uniui-arrowthinleft:before { + content: "\e6d2"; +} + +.uniui-arrowthinup:before { + content: "\e6d3"; +} + +.uniui-arrowthindown:before { + content: "\e6d4"; +} + +.uniui-back:before { + content: "\e6b9"; +} + +.uniui-forward:before { + content: "\e6ba"; +} + +.uniui-arrow-right:before { + content: "\e6bb"; +} + +.uniui-arrow-left:before { + content: "\e6bc"; +} + +.uniui-arrow-up:before { + content: "\e6bd"; +} + +.uniui-arrow-down:before { + content: "\e6be"; +} + +.uniui-arrowthinright:before { + content: "\e6d1"; +} + +.uniui-down:before { + content: "\e6b8"; +} + +.uniui-bottom:before { + content: "\e6b8"; +} + +.uniui-arrowright:before { + content: "\e6d5"; +} + +.uniui-right:before { + content: "\e6b5"; +} + +.uniui-up:before { + content: "\e6b6"; +} + +.uniui-top:before { + content: "\e6b6"; +} + +.uniui-left:before { + content: "\e6b7"; +} + +.uniui-arrowup:before { + content: "\e6d6"; +} + +.uniui-eye:before { + content: "\e651"; +} + +.uniui-eye-filled:before { + content: "\e66a"; +} + +.uniui-eye-slash:before { + content: "\e6b3"; +} + +.uniui-eye-slash-filled:before { + content: "\e6b4"; +} + +.uniui-info-filled:before { + content: "\e649"; +} + +.uniui-reload:before { + content: "\e6b2"; +} + +.uniui-micoff-filled:before { + content: "\e6b0"; +} + +.uniui-map-pin-ellipse:before { + content: "\e6ac"; +} + +.uniui-map-pin:before { + content: "\e6ad"; +} + +.uniui-location:before { + content: "\e6ae"; +} + +.uniui-starhalf:before { + content: "\e683"; +} + +.uniui-star:before { + content: "\e688"; +} + +.uniui-star-filled:before { + content: "\e68f"; +} + +.uniui-calendar:before { + content: "\e6a0"; +} + +.uniui-fire:before { + content: "\e6a1"; +} + +.uniui-medal:before { + content: "\e6a2"; +} + +.uniui-font:before { + content: "\e6a3"; +} + +.uniui-gift:before { + content: "\e6a4"; +} + +.uniui-link:before { + content: "\e6a5"; +} + +.uniui-notification:before { + content: "\e6a6"; +} + +.uniui-staff:before { + content: "\e6a7"; +} + +.uniui-vip:before { + content: "\e6a8"; +} + +.uniui-folder-add:before { + content: "\e6a9"; +} + +.uniui-tune:before { + content: "\e6aa"; +} + +.uniui-auth:before { + content: "\e6ab"; +} + +.uniui-person:before { + content: "\e699"; +} + +.uniui-email-filled:before { + content: "\e69a"; +} + +.uniui-phone-filled:before { + content: "\e69b"; +} + +.uniui-phone:before { + content: "\e69c"; +} + +.uniui-email:before { + content: "\e69e"; +} + +.uniui-personadd:before { + content: "\e69f"; +} + +.uniui-chatboxes-filled:before { + content: "\e692"; +} + +.uniui-contact:before { + content: "\e693"; +} + +.uniui-chatbubble-filled:before { + content: "\e694"; +} + +.uniui-contact-filled:before { + content: "\e695"; +} + +.uniui-chatboxes:before { + content: "\e696"; +} + +.uniui-chatbubble:before { + content: "\e697"; +} + +.uniui-upload-filled:before { + content: "\e68e"; +} + +.uniui-upload:before { + content: "\e690"; +} + +.uniui-weixin:before { + content: "\e691"; +} + +.uniui-compose:before { + content: "\e67f"; +} + +.uniui-qq:before { + content: "\e680"; +} + +.uniui-download-filled:before { + content: "\e681"; +} + +.uniui-pyq:before { + content: "\e682"; +} + +.uniui-sound:before { + content: "\e684"; +} + +.uniui-trash-filled:before { + content: "\e685"; +} + +.uniui-sound-filled:before { + content: "\e686"; +} + +.uniui-trash:before { + content: "\e687"; +} + +.uniui-videocam-filled:before { + content: "\e689"; +} + +.uniui-spinner-cycle:before { + content: "\e68a"; +} + +.uniui-weibo:before { + content: "\e68b"; +} + +.uniui-videocam:before { + content: "\e68c"; +} + +.uniui-download:before { + content: "\e68d"; +} + +.uniui-help:before { + content: "\e679"; +} + +.uniui-navigate-filled:before { + content: "\e67a"; +} + +.uniui-plusempty:before { + content: "\e67b"; +} + +.uniui-smallcircle:before { + content: "\e67c"; +} + +.uniui-minus-filled:before { + content: "\e67d"; +} + +.uniui-micoff:before { + content: "\e67e"; +} + +.uniui-closeempty:before { + content: "\e66c"; +} + +.uniui-clear:before { + content: "\e66d"; +} + +.uniui-navigate:before { + content: "\e66e"; +} + +.uniui-minus:before { + content: "\e66f"; +} + +.uniui-image:before { + content: "\e670"; +} + +.uniui-mic:before { + content: "\e671"; +} + +.uniui-paperplane:before { + content: "\e672"; +} + +.uniui-close:before { + content: "\e673"; +} + +.uniui-help-filled:before { + content: "\e674"; +} + +.uniui-paperplane-filled:before { + content: "\e675"; +} + +.uniui-plus:before { + content: "\e676"; +} + +.uniui-mic-filled:before { + content: "\e677"; +} + +.uniui-image-filled:before { + content: "\e678"; +} + +.uniui-locked-filled:before { + content: "\e668"; +} + +.uniui-info:before { + content: "\e669"; +} + +.uniui-locked:before { + content: "\e66b"; +} + +.uniui-camera-filled:before { + content: "\e658"; +} + +.uniui-chat-filled:before { + content: "\e659"; +} + +.uniui-camera:before { + content: "\e65a"; +} + +.uniui-circle:before { + content: "\e65b"; +} + +.uniui-checkmarkempty:before { + content: "\e65c"; +} + +.uniui-chat:before { + content: "\e65d"; +} + +.uniui-circle-filled:before { + content: "\e65e"; +} + +.uniui-flag:before { + content: "\e65f"; +} + +.uniui-flag-filled:before { + content: "\e660"; +} + +.uniui-gear-filled:before { + content: "\e661"; +} + +.uniui-home:before { + content: "\e662"; +} + +.uniui-home-filled:before { + content: "\e663"; +} + +.uniui-gear:before { + content: "\e664"; +} + +.uniui-smallcircle-filled:before { + content: "\e665"; +} + +.uniui-map-filled:before { + content: "\e666"; +} + +.uniui-map:before { + content: "\e667"; +} + +.uniui-refresh-filled:before { + content: "\e656"; +} + +.uniui-refresh:before { + content: "\e657"; +} + +.uniui-cloud-upload:before { + content: "\e645"; +} + +.uniui-cloud-download-filled:before { + content: "\e646"; +} + +.uniui-cloud-download:before { + content: "\e647"; +} + +.uniui-cloud-upload-filled:before { + content: "\e648"; +} + +.uniui-redo:before { + content: "\e64a"; +} + +.uniui-images-filled:before { + content: "\e64b"; +} + +.uniui-undo-filled:before { + content: "\e64c"; +} + +.uniui-more:before { + content: "\e64d"; +} + +.uniui-more-filled:before { + content: "\e64e"; +} + +.uniui-undo:before { + content: "\e64f"; +} + +.uniui-images:before { + content: "\e650"; +} + +.uniui-paperclip:before { + content: "\e652"; +} + +.uniui-settings:before { + content: "\e653"; +} + +.uniui-search:before { + content: "\e654"; +} + +.uniui-redo-filled:before { + content: "\e655"; +} + +.uniui-list:before { + content: "\e644"; +} + +.uniui-mail-open-filled:before { + content: "\e63a"; +} + +.uniui-hand-down-filled:before { + content: "\e63c"; +} + +.uniui-hand-down:before { + content: "\e63d"; +} + +.uniui-hand-up-filled:before { + content: "\e63e"; +} + +.uniui-hand-up:before { + content: "\e63f"; +} + +.uniui-heart-filled:before { + content: "\e641"; +} + +.uniui-mail-open:before { + content: "\e643"; +} + +.uniui-heart:before { + content: "\e639"; +} + +.uniui-loop:before { + content: "\e633"; +} + +.uniui-pulldown:before { + content: "\e632"; +} + +.uniui-scan:before { + content: "\e62a"; +} + +.uniui-bars:before { + content: "\e627"; +} + +.uniui-checkbox:before { + content: "\e62b"; +} + +.uniui-checkbox-filled:before { + content: "\e62c"; +} + +.uniui-shop:before { + content: "\e62f"; +} + +.uniui-headphones:before { + content: "\e630"; +} + +.uniui-cart:before { + content: "\e631"; +} diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons.ttf b/uni_modules/uni-icons/components/uni-icons/uniicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..14696d038d828073edac09ea4e5ba1dec2f58115 GIT binary patch literal 35824 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 F{2S@rCxHL} literal 0 HcmV?d00001 diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts b/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts new file mode 100644 index 0000000..98e93aa --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons_file.ts @@ -0,0 +1,664 @@ + +export type IconsData = { + id : string + name : string + font_family : string + css_prefix_text : string + description : string + glyphs : Array +} + +export type IconsDataItem = { + font_class : string + unicode : string +} + + +export const fontData = [ + { + "font_class": "arrow-down", + "unicode": "\ue6be" + }, + { + "font_class": "arrow-left", + "unicode": "\ue6bc" + }, + { + "font_class": "arrow-right", + "unicode": "\ue6bb" + }, + { + "font_class": "arrow-up", + "unicode": "\ue6bd" + }, + { + "font_class": "auth", + "unicode": "\ue6ab" + }, + { + "font_class": "auth-filled", + "unicode": "\ue6cc" + }, + { + "font_class": "back", + "unicode": "\ue6b9" + }, + { + "font_class": "bars", + "unicode": "\ue627" + }, + { + "font_class": "calendar", + "unicode": "\ue6a0" + }, + { + "font_class": "calendar-filled", + "unicode": "\ue6c0" + }, + { + "font_class": "camera", + "unicode": "\ue65a" + }, + { + "font_class": "camera-filled", + "unicode": "\ue658" + }, + { + "font_class": "cart", + "unicode": "\ue631" + }, + { + "font_class": "cart-filled", + "unicode": "\ue6d0" + }, + { + "font_class": "chat", + "unicode": "\ue65d" + }, + { + "font_class": "chat-filled", + "unicode": "\ue659" + }, + { + "font_class": "chatboxes", + "unicode": "\ue696" + }, + { + "font_class": "chatboxes-filled", + "unicode": "\ue692" + }, + { + "font_class": "chatbubble", + "unicode": "\ue697" + }, + { + "font_class": "chatbubble-filled", + "unicode": "\ue694" + }, + { + "font_class": "checkbox", + "unicode": "\ue62b" + }, + { + "font_class": "checkbox-filled", + "unicode": "\ue62c" + }, + { + "font_class": "checkmarkempty", + "unicode": "\ue65c" + }, + { + "font_class": "circle", + "unicode": "\ue65b" + }, + { + "font_class": "circle-filled", + "unicode": "\ue65e" + }, + { + "font_class": "clear", + "unicode": "\ue66d" + }, + { + "font_class": "close", + "unicode": "\ue673" + }, + { + "font_class": "closeempty", + "unicode": "\ue66c" + }, + { + "font_class": "cloud-download", + "unicode": "\ue647" + }, + { + "font_class": "cloud-download-filled", + "unicode": "\ue646" + }, + { + "font_class": "cloud-upload", + "unicode": "\ue645" + }, + { + "font_class": "cloud-upload-filled", + "unicode": "\ue648" + }, + { + "font_class": "color", + "unicode": "\ue6cf" + }, + { + "font_class": "color-filled", + "unicode": "\ue6c9" + }, + { + "font_class": "compose", + "unicode": "\ue67f" + }, + { + "font_class": "contact", + "unicode": "\ue693" + }, + { + "font_class": "contact-filled", + "unicode": "\ue695" + }, + { + "font_class": "down", + "unicode": "\ue6b8" + }, + { + "font_class": "bottom", + "unicode": "\ue6b8" + }, + { + "font_class": "download", + "unicode": "\ue68d" + }, + { + "font_class": "download-filled", + "unicode": "\ue681" + }, + { + "font_class": "email", + "unicode": "\ue69e" + }, + { + "font_class": "email-filled", + "unicode": "\ue69a" + }, + { + "font_class": "eye", + "unicode": "\ue651" + }, + { + "font_class": "eye-filled", + "unicode": "\ue66a" + }, + { + "font_class": "eye-slash", + "unicode": "\ue6b3" + }, + { + "font_class": "eye-slash-filled", + "unicode": "\ue6b4" + }, + { + "font_class": "fire", + "unicode": "\ue6a1" + }, + { + "font_class": "fire-filled", + "unicode": "\ue6c5" + }, + { + "font_class": "flag", + "unicode": "\ue65f" + }, + { + "font_class": "flag-filled", + "unicode": "\ue660" + }, + { + "font_class": "folder-add", + "unicode": "\ue6a9" + }, + { + "font_class": "folder-add-filled", + "unicode": "\ue6c8" + }, + { + "font_class": "font", + "unicode": "\ue6a3" + }, + { + "font_class": "forward", + "unicode": "\ue6ba" + }, + { + "font_class": "gear", + "unicode": "\ue664" + }, + { + "font_class": "gear-filled", + "unicode": "\ue661" + }, + { + "font_class": "gift", + "unicode": "\ue6a4" + }, + { + "font_class": "gift-filled", + "unicode": "\ue6c4" + }, + { + "font_class": "hand-down", + "unicode": "\ue63d" + }, + { + "font_class": "hand-down-filled", + "unicode": "\ue63c" + }, + { + "font_class": "hand-up", + "unicode": "\ue63f" + }, + { + "font_class": "hand-up-filled", + "unicode": "\ue63e" + }, + { + "font_class": "headphones", + "unicode": "\ue630" + }, + { + "font_class": "heart", + "unicode": "\ue639" + }, + { + "font_class": "heart-filled", + "unicode": "\ue641" + }, + { + "font_class": "help", + "unicode": "\ue679" + }, + { + "font_class": "help-filled", + "unicode": "\ue674" + }, + { + "font_class": "home", + "unicode": "\ue662" + }, + { + "font_class": "home-filled", + "unicode": "\ue663" + }, + { + "font_class": "image", + "unicode": "\ue670" + }, + { + "font_class": "image-filled", + "unicode": "\ue678" + }, + { + "font_class": "images", + "unicode": "\ue650" + }, + { + "font_class": "images-filled", + "unicode": "\ue64b" + }, + { + "font_class": "info", + "unicode": "\ue669" + }, + { + "font_class": "info-filled", + "unicode": "\ue649" + }, + { + "font_class": "left", + "unicode": "\ue6b7" + }, + { + "font_class": "link", + "unicode": "\ue6a5" + }, + { + "font_class": "list", + "unicode": "\ue644" + }, + { + "font_class": "location", + "unicode": "\ue6ae" + }, + { + "font_class": "location-filled", + "unicode": "\ue6af" + }, + { + "font_class": "locked", + "unicode": "\ue66b" + }, + { + "font_class": "locked-filled", + "unicode": "\ue668" + }, + { + "font_class": "loop", + "unicode": "\ue633" + }, + { + "font_class": "mail-open", + "unicode": "\ue643" + }, + { + "font_class": "mail-open-filled", + "unicode": "\ue63a" + }, + { + "font_class": "map", + "unicode": "\ue667" + }, + { + "font_class": "map-filled", + "unicode": "\ue666" + }, + { + "font_class": "map-pin", + "unicode": "\ue6ad" + }, + { + "font_class": "map-pin-ellipse", + "unicode": "\ue6ac" + }, + { + "font_class": "medal", + "unicode": "\ue6a2" + }, + { + "font_class": "medal-filled", + "unicode": "\ue6c3" + }, + { + "font_class": "mic", + "unicode": "\ue671" + }, + { + "font_class": "mic-filled", + "unicode": "\ue677" + }, + { + "font_class": "micoff", + "unicode": "\ue67e" + }, + { + "font_class": "micoff-filled", + "unicode": "\ue6b0" + }, + { + "font_class": "minus", + "unicode": "\ue66f" + }, + { + "font_class": "minus-filled", + "unicode": "\ue67d" + }, + { + "font_class": "more", + "unicode": "\ue64d" + }, + { + "font_class": "more-filled", + "unicode": "\ue64e" + }, + { + "font_class": "navigate", + "unicode": "\ue66e" + }, + { + "font_class": "navigate-filled", + "unicode": "\ue67a" + }, + { + "font_class": "notification", + "unicode": "\ue6a6" + }, + { + "font_class": "notification-filled", + "unicode": "\ue6c1" + }, + { + "font_class": "paperclip", + "unicode": "\ue652" + }, + { + "font_class": "paperplane", + "unicode": "\ue672" + }, + { + "font_class": "paperplane-filled", + "unicode": "\ue675" + }, + { + "font_class": "person", + "unicode": "\ue699" + }, + { + "font_class": "person-filled", + "unicode": "\ue69d" + }, + { + "font_class": "personadd", + "unicode": "\ue69f" + }, + { + "font_class": "personadd-filled", + "unicode": "\ue698" + }, + { + "font_class": "personadd-filled-copy", + "unicode": "\ue6d1" + }, + { + "font_class": "phone", + "unicode": "\ue69c" + }, + { + "font_class": "phone-filled", + "unicode": "\ue69b" + }, + { + "font_class": "plus", + "unicode": "\ue676" + }, + { + "font_class": "plus-filled", + "unicode": "\ue6c7" + }, + { + "font_class": "plusempty", + "unicode": "\ue67b" + }, + { + "font_class": "pulldown", + "unicode": "\ue632" + }, + { + "font_class": "pyq", + "unicode": "\ue682" + }, + { + "font_class": "qq", + "unicode": "\ue680" + }, + { + "font_class": "redo", + "unicode": "\ue64a" + }, + { + "font_class": "redo-filled", + "unicode": "\ue655" + }, + { + "font_class": "refresh", + "unicode": "\ue657" + }, + { + "font_class": "refresh-filled", + "unicode": "\ue656" + }, + { + "font_class": "refreshempty", + "unicode": "\ue6bf" + }, + { + "font_class": "reload", + "unicode": "\ue6b2" + }, + { + "font_class": "right", + "unicode": "\ue6b5" + }, + { + "font_class": "scan", + "unicode": "\ue62a" + }, + { + "font_class": "search", + "unicode": "\ue654" + }, + { + "font_class": "settings", + "unicode": "\ue653" + }, + { + "font_class": "settings-filled", + "unicode": "\ue6ce" + }, + { + "font_class": "shop", + "unicode": "\ue62f" + }, + { + "font_class": "shop-filled", + "unicode": "\ue6cd" + }, + { + "font_class": "smallcircle", + "unicode": "\ue67c" + }, + { + "font_class": "smallcircle-filled", + "unicode": "\ue665" + }, + { + "font_class": "sound", + "unicode": "\ue684" + }, + { + "font_class": "sound-filled", + "unicode": "\ue686" + }, + { + "font_class": "spinner-cycle", + "unicode": "\ue68a" + }, + { + "font_class": "staff", + "unicode": "\ue6a7" + }, + { + "font_class": "staff-filled", + "unicode": "\ue6cb" + }, + { + "font_class": "star", + "unicode": "\ue688" + }, + { + "font_class": "star-filled", + "unicode": "\ue68f" + }, + { + "font_class": "starhalf", + "unicode": "\ue683" + }, + { + "font_class": "trash", + "unicode": "\ue687" + }, + { + "font_class": "trash-filled", + "unicode": "\ue685" + }, + { + "font_class": "tune", + "unicode": "\ue6aa" + }, + { + "font_class": "tune-filled", + "unicode": "\ue6ca" + }, + { + "font_class": "undo", + "unicode": "\ue64f" + }, + { + "font_class": "undo-filled", + "unicode": "\ue64c" + }, + { + "font_class": "up", + "unicode": "\ue6b6" + }, + { + "font_class": "top", + "unicode": "\ue6b6" + }, + { + "font_class": "upload", + "unicode": "\ue690" + }, + { + "font_class": "upload-filled", + "unicode": "\ue68e" + }, + { + "font_class": "videocam", + "unicode": "\ue68c" + }, + { + "font_class": "videocam-filled", + "unicode": "\ue689" + }, + { + "font_class": "vip", + "unicode": "\ue6a8" + }, + { + "font_class": "vip-filled", + "unicode": "\ue6c6" + }, + { + "font_class": "wallet", + "unicode": "\ue6b1" + }, + { + "font_class": "wallet-filled", + "unicode": "\ue6c2" + }, + { + "font_class": "weibo", + "unicode": "\ue68b" + }, + { + "font_class": "weixin", + "unicode": "\ue691" + } +] as IconsDataItem[] + +// export const fontData = JSON.parse(fontDataJson) diff --git a/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js b/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js new file mode 100644 index 0000000..1cd11e1 --- /dev/null +++ b/uni_modules/uni-icons/components/uni-icons/uniicons_file_vue.js @@ -0,0 +1,649 @@ + +export const fontData = [ + { + "font_class": "arrow-down", + "unicode": "\ue6be" + }, + { + "font_class": "arrow-left", + "unicode": "\ue6bc" + }, + { + "font_class": "arrow-right", + "unicode": "\ue6bb" + }, + { + "font_class": "arrow-up", + "unicode": "\ue6bd" + }, + { + "font_class": "auth", + "unicode": "\ue6ab" + }, + { + "font_class": "auth-filled", + "unicode": "\ue6cc" + }, + { + "font_class": "back", + "unicode": "\ue6b9" + }, + { + "font_class": "bars", + "unicode": "\ue627" + }, + { + "font_class": "calendar", + "unicode": "\ue6a0" + }, + { + "font_class": "calendar-filled", + "unicode": "\ue6c0" + }, + { + "font_class": "camera", + "unicode": "\ue65a" + }, + { + "font_class": "camera-filled", + "unicode": "\ue658" + }, + { + "font_class": "cart", + "unicode": "\ue631" + }, + { + "font_class": "cart-filled", + "unicode": "\ue6d0" + }, + { + "font_class": "chat", + "unicode": "\ue65d" + }, + { + "font_class": "chat-filled", + "unicode": "\ue659" + }, + { + "font_class": "chatboxes", + "unicode": "\ue696" + }, + { + "font_class": "chatboxes-filled", + "unicode": "\ue692" + }, + { + "font_class": "chatbubble", + "unicode": "\ue697" + }, + { + "font_class": "chatbubble-filled", + "unicode": "\ue694" + }, + { + "font_class": "checkbox", + "unicode": "\ue62b" + }, + { + "font_class": "checkbox-filled", + "unicode": "\ue62c" + }, + { + "font_class": "checkmarkempty", + "unicode": "\ue65c" + }, + { + "font_class": "circle", + "unicode": "\ue65b" + }, + { + "font_class": "circle-filled", + "unicode": "\ue65e" + }, + { + "font_class": "clear", + "unicode": "\ue66d" + }, + { + "font_class": "close", + "unicode": "\ue673" + }, + { + "font_class": "closeempty", + "unicode": "\ue66c" + }, + { + "font_class": "cloud-download", + "unicode": "\ue647" + }, + { + "font_class": "cloud-download-filled", + "unicode": "\ue646" + }, + { + "font_class": "cloud-upload", + "unicode": "\ue645" + }, + { + "font_class": "cloud-upload-filled", + "unicode": "\ue648" + }, + { + "font_class": "color", + "unicode": "\ue6cf" + }, + { + "font_class": "color-filled", + "unicode": "\ue6c9" + }, + { + "font_class": "compose", + "unicode": "\ue67f" + }, + { + "font_class": "contact", + "unicode": "\ue693" + }, + { + "font_class": "contact-filled", + "unicode": "\ue695" + }, + { + "font_class": "down", + "unicode": "\ue6b8" + }, + { + "font_class": "bottom", + "unicode": "\ue6b8" + }, + { + "font_class": "download", + "unicode": "\ue68d" + }, + { + "font_class": "download-filled", + "unicode": "\ue681" + }, + { + "font_class": "email", + "unicode": "\ue69e" + }, + { + "font_class": "email-filled", + "unicode": "\ue69a" + }, + { + "font_class": "eye", + "unicode": "\ue651" + }, + { + "font_class": "eye-filled", + "unicode": "\ue66a" + }, + { + "font_class": "eye-slash", + "unicode": "\ue6b3" + }, + { + "font_class": "eye-slash-filled", + "unicode": "\ue6b4" + }, + { + "font_class": "fire", + "unicode": "\ue6a1" + }, + { + "font_class": "fire-filled", + "unicode": "\ue6c5" + }, + { + "font_class": "flag", + "unicode": "\ue65f" + }, + { + "font_class": "flag-filled", + "unicode": "\ue660" + }, + { + "font_class": "folder-add", + "unicode": "\ue6a9" + }, + { + "font_class": "folder-add-filled", + "unicode": "\ue6c8" + }, + { + "font_class": "font", + "unicode": "\ue6a3" + }, + { + "font_class": "forward", + "unicode": "\ue6ba" + }, + { + "font_class": "gear", + "unicode": "\ue664" + }, + { + "font_class": "gear-filled", + "unicode": "\ue661" + }, + { + "font_class": "gift", + "unicode": "\ue6a4" + }, + { + "font_class": "gift-filled", + "unicode": "\ue6c4" + }, + { + "font_class": "hand-down", + "unicode": "\ue63d" + }, + { + "font_class": "hand-down-filled", + "unicode": "\ue63c" + }, + { + "font_class": "hand-up", + "unicode": "\ue63f" + }, + { + "font_class": "hand-up-filled", + "unicode": "\ue63e" + }, + { + "font_class": "headphones", + "unicode": "\ue630" + }, + { + "font_class": "heart", + "unicode": "\ue639" + }, + { + "font_class": "heart-filled", + "unicode": "\ue641" + }, + { + "font_class": "help", + "unicode": "\ue679" + }, + { + "font_class": "help-filled", + "unicode": "\ue674" + }, + { + "font_class": "home", + "unicode": "\ue662" + }, + { + "font_class": "home-filled", + "unicode": "\ue663" + }, + { + "font_class": "image", + "unicode": "\ue670" + }, + { + "font_class": "image-filled", + "unicode": "\ue678" + }, + { + "font_class": "images", + "unicode": "\ue650" + }, + { + "font_class": "images-filled", + "unicode": "\ue64b" + }, + { + "font_class": "info", + "unicode": "\ue669" + }, + { + "font_class": "info-filled", + "unicode": "\ue649" + }, + { + "font_class": "left", + "unicode": "\ue6b7" + }, + { + "font_class": "link", + "unicode": "\ue6a5" + }, + { + "font_class": "list", + "unicode": "\ue644" + }, + { + "font_class": "location", + "unicode": "\ue6ae" + }, + { + "font_class": "location-filled", + "unicode": "\ue6af" + }, + { + "font_class": "locked", + "unicode": "\ue66b" + }, + { + "font_class": "locked-filled", + "unicode": "\ue668" + }, + { + "font_class": "loop", + "unicode": "\ue633" + }, + { + "font_class": "mail-open", + "unicode": "\ue643" + }, + { + "font_class": "mail-open-filled", + "unicode": "\ue63a" + }, + { + "font_class": "map", + "unicode": "\ue667" + }, + { + "font_class": "map-filled", + "unicode": "\ue666" + }, + { + "font_class": "map-pin", + "unicode": "\ue6ad" + }, + { + "font_class": "map-pin-ellipse", + "unicode": "\ue6ac" + }, + { + "font_class": "medal", + "unicode": "\ue6a2" + }, + { + "font_class": "medal-filled", + "unicode": "\ue6c3" + }, + { + "font_class": "mic", + "unicode": "\ue671" + }, + { + "font_class": "mic-filled", + "unicode": "\ue677" + }, + { + "font_class": "micoff", + "unicode": "\ue67e" + }, + { + "font_class": "micoff-filled", + "unicode": "\ue6b0" + }, + { + "font_class": "minus", + "unicode": "\ue66f" + }, + { + "font_class": "minus-filled", + "unicode": "\ue67d" + }, + { + "font_class": "more", + "unicode": "\ue64d" + }, + { + "font_class": "more-filled", + "unicode": "\ue64e" + }, + { + "font_class": "navigate", + "unicode": "\ue66e" + }, + { + "font_class": "navigate-filled", + "unicode": "\ue67a" + }, + { + "font_class": "notification", + "unicode": "\ue6a6" + }, + { + "font_class": "notification-filled", + "unicode": "\ue6c1" + }, + { + "font_class": "paperclip", + "unicode": "\ue652" + }, + { + "font_class": "paperplane", + "unicode": "\ue672" + }, + { + "font_class": "paperplane-filled", + "unicode": "\ue675" + }, + { + "font_class": "person", + "unicode": "\ue699" + }, + { + "font_class": "person-filled", + "unicode": "\ue69d" + }, + { + "font_class": "personadd", + "unicode": "\ue69f" + }, + { + "font_class": "personadd-filled", + "unicode": "\ue698" + }, + { + "font_class": "personadd-filled-copy", + "unicode": "\ue6d1" + }, + { + "font_class": "phone", + "unicode": "\ue69c" + }, + { + "font_class": "phone-filled", + "unicode": "\ue69b" + }, + { + "font_class": "plus", + "unicode": "\ue676" + }, + { + "font_class": "plus-filled", + "unicode": "\ue6c7" + }, + { + "font_class": "plusempty", + "unicode": "\ue67b" + }, + { + "font_class": "pulldown", + "unicode": "\ue632" + }, + { + "font_class": "pyq", + "unicode": "\ue682" + }, + { + "font_class": "qq", + "unicode": "\ue680" + }, + { + "font_class": "redo", + "unicode": "\ue64a" + }, + { + "font_class": "redo-filled", + "unicode": "\ue655" + }, + { + "font_class": "refresh", + "unicode": "\ue657" + }, + { + "font_class": "refresh-filled", + "unicode": "\ue656" + }, + { + "font_class": "refreshempty", + "unicode": "\ue6bf" + }, + { + "font_class": "reload", + "unicode": "\ue6b2" + }, + { + "font_class": "right", + "unicode": "\ue6b5" + }, + { + "font_class": "scan", + "unicode": "\ue62a" + }, + { + "font_class": "search", + "unicode": "\ue654" + }, + { + "font_class": "settings", + "unicode": "\ue653" + }, + { + "font_class": "settings-filled", + "unicode": "\ue6ce" + }, + { + "font_class": "shop", + "unicode": "\ue62f" + }, + { + "font_class": "shop-filled", + "unicode": "\ue6cd" + }, + { + "font_class": "smallcircle", + "unicode": "\ue67c" + }, + { + "font_class": "smallcircle-filled", + "unicode": "\ue665" + }, + { + "font_class": "sound", + "unicode": "\ue684" + }, + { + "font_class": "sound-filled", + "unicode": "\ue686" + }, + { + "font_class": "spinner-cycle", + "unicode": "\ue68a" + }, + { + "font_class": "staff", + "unicode": "\ue6a7" + }, + { + "font_class": "staff-filled", + "unicode": "\ue6cb" + }, + { + "font_class": "star", + "unicode": "\ue688" + }, + { + "font_class": "star-filled", + "unicode": "\ue68f" + }, + { + "font_class": "starhalf", + "unicode": "\ue683" + }, + { + "font_class": "trash", + "unicode": "\ue687" + }, + { + "font_class": "trash-filled", + "unicode": "\ue685" + }, + { + "font_class": "tune", + "unicode": "\ue6aa" + }, + { + "font_class": "tune-filled", + "unicode": "\ue6ca" + }, + { + "font_class": "undo", + "unicode": "\ue64f" + }, + { + "font_class": "undo-filled", + "unicode": "\ue64c" + }, + { + "font_class": "up", + "unicode": "\ue6b6" + }, + { + "font_class": "top", + "unicode": "\ue6b6" + }, + { + "font_class": "upload", + "unicode": "\ue690" + }, + { + "font_class": "upload-filled", + "unicode": "\ue68e" + }, + { + "font_class": "videocam", + "unicode": "\ue68c" + }, + { + "font_class": "videocam-filled", + "unicode": "\ue689" + }, + { + "font_class": "vip", + "unicode": "\ue6a8" + }, + { + "font_class": "vip-filled", + "unicode": "\ue6c6" + }, + { + "font_class": "wallet", + "unicode": "\ue6b1" + }, + { + "font_class": "wallet-filled", + "unicode": "\ue6c2" + }, + { + "font_class": "weibo", + "unicode": "\ue68b" + }, + { + "font_class": "weixin", + "unicode": "\ue691" + } +] + +// export const fontData = JSON.parse(fontDataJson) diff --git a/uni_modules/uni-icons/package.json b/uni_modules/uni-icons/package.json new file mode 100644 index 0000000..6b681b4 --- /dev/null +++ b/uni_modules/uni-icons/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-icons", + "displayName": "uni-icons 图标", + "version": "2.0.10", + "description": "图标组件,用于展示移动端常见的图标,可自定义颜色、大小。", + "keywords": [ + "uni-ui", + "uniui", + "icon", + "图标" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.2.14" + }, + "directories": { + "example": "../../temps/example_temps" + }, +"dcloudext": { + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui", + "type": "component-vue" + }, + "uni_modules": { + "dependencies": ["uni-scss"], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "n" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y", + "app-uvue": "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" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-icons/readme.md b/uni_modules/uni-icons/readme.md new file mode 100644 index 0000000..86234ba --- /dev/null +++ b/uni_modules/uni-icons/readme.md @@ -0,0 +1,8 @@ +## Icons 图标 +> **组件名:uni-icons** +> 代码块: `uIcons` + +用于展示 icons 图标 。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-icons) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 diff --git a/uni_modules/uni-scss/changelog.md b/uni_modules/uni-scss/changelog.md new file mode 100644 index 0000000..b863bb0 --- /dev/null +++ b/uni_modules/uni-scss/changelog.md @@ -0,0 +1,8 @@ +## 1.0.3(2022-01-21) +- 优化 组件示例 +## 1.0.2(2021-11-22) +- 修复 / 符号在 vue 不同版本兼容问题引起的报错问题 +## 1.0.1(2021-11-22) +- 修复 vue3中scss语法兼容问题 +## 1.0.0(2021-11-18) +- init diff --git a/uni_modules/uni-scss/index.scss b/uni_modules/uni-scss/index.scss new file mode 100644 index 0000000..1744a5f --- /dev/null +++ b/uni_modules/uni-scss/index.scss @@ -0,0 +1 @@ +@import './styles/index.scss'; diff --git a/uni_modules/uni-scss/package.json b/uni_modules/uni-scss/package.json new file mode 100644 index 0000000..7cc0ccb --- /dev/null +++ b/uni_modules/uni-scss/package.json @@ -0,0 +1,82 @@ +{ + "id": "uni-scss", + "displayName": "uni-scss 辅助样式", + "version": "1.0.3", + "description": "uni-sass是uni-ui提供的一套全局样式 ,通过一些简单的类名和sass变量,实现简单的页面布局操作,比如颜色、边距、圆角等。", + "keywords": [ + "uni-scss", + "uni-ui", + "辅助样式" +], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "^3.1.0" + }, + "dcloudext": { + "category": [ + "JS SDK", + "通用 SDK" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "u" + }, + "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" + }, + "快应用": { + "华为": "n", + "联盟": "n" + }, + "Vue": { + "vue2": "y", + "vue3": "y" + } + } + } + } +} diff --git a/uni_modules/uni-scss/readme.md b/uni_modules/uni-scss/readme.md new file mode 100644 index 0000000..b7d1c25 --- /dev/null +++ b/uni_modules/uni-scss/readme.md @@ -0,0 +1,4 @@ +`uni-sass` 是 `uni-ui`提供的一套全局样式 ,通过一些简单的类名和`sass`变量,实现简单的页面布局操作,比如颜色、边距、圆角等。 + +### [查看文档](https://uniapp.dcloud.io/component/uniui/uni-sass) +#### 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/index.scss b/uni_modules/uni-scss/styles/index.scss new file mode 100644 index 0000000..ffac4fe --- /dev/null +++ b/uni_modules/uni-scss/styles/index.scss @@ -0,0 +1,7 @@ +@import './setting/_variables.scss'; +@import './setting/_border.scss'; +@import './setting/_color.scss'; +@import './setting/_space.scss'; +@import './setting/_radius.scss'; +@import './setting/_text.scss'; +@import './setting/_styles.scss'; diff --git a/uni_modules/uni-scss/styles/setting/_border.scss b/uni_modules/uni-scss/styles/setting/_border.scss new file mode 100644 index 0000000..12a11c3 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_border.scss @@ -0,0 +1,3 @@ +.uni-border { + border: 1px $uni-border-1 solid; +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_color.scss b/uni_modules/uni-scss/styles/setting/_color.scss new file mode 100644 index 0000000..1ededd9 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_color.scss @@ -0,0 +1,66 @@ + +// TODO 暂时不需要 class ,需要用户使用变量实现 ,如果使用类名其实并不推荐 +// @mixin get-styles($k,$c) { +// @if $k == size or $k == weight{ +// font-#{$k}:#{$c} +// }@else{ +// #{$k}:#{$c} +// } +// } +$uni-ui-color:( + // 主色 + primary: $uni-primary, + primary-disable: $uni-primary-disable, + primary-light: $uni-primary-light, + // 辅助色 + success: $uni-success, + success-disable: $uni-success-disable, + success-light: $uni-success-light, + warning: $uni-warning, + warning-disable: $uni-warning-disable, + warning-light: $uni-warning-light, + error: $uni-error, + error-disable: $uni-error-disable, + error-light: $uni-error-light, + info: $uni-info, + info-disable: $uni-info-disable, + info-light: $uni-info-light, + // 中性色 + main-color: $uni-main-color, + base-color: $uni-base-color, + secondary-color: $uni-secondary-color, + extra-color: $uni-extra-color, + // 背景色 + bg-color: $uni-bg-color, + // 边框颜色 + border-1: $uni-border-1, + border-2: $uni-border-2, + border-3: $uni-border-3, + border-4: $uni-border-4, + // 黑色 + black:$uni-black, + // 白色 + white:$uni-white, + // 透明 + transparent:$uni-transparent +) !default; +@each $key, $child in $uni-ui-color { + .uni-#{"" + $key} { + color: $child; + } + .uni-#{"" + $key}-bg { + background-color: $child; + } +} +.uni-shadow-sm { + box-shadow: $uni-shadow-sm; +} +.uni-shadow-base { + box-shadow: $uni-shadow-base; +} +.uni-shadow-lg { + box-shadow: $uni-shadow-lg; +} +.uni-mask { + background-color:$uni-mask; +} diff --git a/uni_modules/uni-scss/styles/setting/_radius.scss b/uni_modules/uni-scss/styles/setting/_radius.scss new file mode 100644 index 0000000..9a0428b --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_radius.scss @@ -0,0 +1,55 @@ +@mixin radius($r,$d:null ,$important: false){ + $radius-value:map-get($uni-radius, $r) if($important, !important, null); + // Key exists within the $uni-radius variable + @if (map-has-key($uni-radius, $r) and $d){ + @if $d == t { + border-top-left-radius:$radius-value; + border-top-right-radius:$radius-value; + }@else if $d == r { + border-top-right-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == b { + border-bottom-left-radius:$radius-value; + border-bottom-right-radius:$radius-value; + }@else if $d == l { + border-top-left-radius:$radius-value; + border-bottom-left-radius:$radius-value; + }@else if $d == tl { + border-top-left-radius:$radius-value; + }@else if $d == tr { + border-top-right-radius:$radius-value; + }@else if $d == br { + border-bottom-right-radius:$radius-value; + }@else if $d == bl { + border-bottom-left-radius:$radius-value; + } + }@else{ + border-radius:$radius-value; + } +} + +@each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $key} { + @include radius($key) + } + }@else{ + .uni-radius { + @include radius($key) + } + } +} + +@each $direction in t, r, b, l,tl, tr, br, bl { + @each $key, $child in $uni-radius { + @if($key){ + .uni-radius-#{"" + $direction}-#{"" + $key} { + @include radius($key,$direction,false) + } + }@else{ + .uni-radius-#{$direction} { + @include radius($key,$direction,false) + } + } + } +} diff --git a/uni_modules/uni-scss/styles/setting/_space.scss b/uni_modules/uni-scss/styles/setting/_space.scss new file mode 100644 index 0000000..3c89528 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_space.scss @@ -0,0 +1,56 @@ + +@mixin fn($space,$direction,$size,$n) { + @if $n { + #{$space}-#{$direction}: #{$size*$uni-space-root}px + } @else { + #{$space}-#{$direction}: #{-$size*$uni-space-root}px + } +} +@mixin get-styles($direction,$i,$space,$n){ + @if $direction == t { + @include fn($space, top,$i,$n); + } + @if $direction == r { + @include fn($space, right,$i,$n); + } + @if $direction == b { + @include fn($space, bottom,$i,$n); + } + @if $direction == l { + @include fn($space, left,$i,$n); + } + @if $direction == x { + @include fn($space, left,$i,$n); + @include fn($space, right,$i,$n); + } + @if $direction == y { + @include fn($space, top,$i,$n); + @include fn($space, bottom,$i,$n); + } + @if $direction == a { + @if $n { + #{$space}:#{$i*$uni-space-root}px; + } @else { + #{$space}:#{-$i*$uni-space-root}px; + } + } +} + +@each $orientation in m,p { + $space: margin; + @if $orientation == m { + $space: margin; + } @else { + $space: padding; + } + @for $i from 0 through 16 { + @each $direction in t, r, b, l, x, y, a { + .uni-#{$orientation}#{$direction}-#{$i} { + @include get-styles($direction,$i,$space,true); + } + .uni-#{$orientation}#{$direction}-n#{$i} { + @include get-styles($direction,$i,$space,false); + } + } + } +} \ No newline at end of file diff --git a/uni_modules/uni-scss/styles/setting/_styles.scss b/uni_modules/uni-scss/styles/setting/_styles.scss new file mode 100644 index 0000000..689afec --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_styles.scss @@ -0,0 +1,167 @@ +/* #ifndef APP-NVUE */ + +$-color-white:#fff; +$-color-black:#000; +@mixin base-style($color) { + color: #fff; + background-color: $color; + border-color: mix($-color-black, $color, 8%); + &:not([hover-class]):active { + background: mix($-color-black, $color, 10%); + border-color: mix($-color-black, $color, 20%); + color: $-color-white; + outline: none; + } +} +@mixin is-color($color) { + @include base-style($color); + &[loading] { + @include base-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &[loading], + &:not([hover-class]):active { + color: $-color-white; + border-color: mix(darken($color,10%), $-color-white); + background-color: mix($color, $-color-white); + } + } + +} +@mixin base-plain-style($color) { + color:$color; + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 70%); + &:not([hover-class]):active { + background: mix($-color-white, $color, 80%); + color: $color; + outline: none; + border-color: mix($-color-white, $color, 50%); + } +} +@mixin is-plain($color){ + &[plain] { + @include base-plain-style($color); + &[loading] { + @include base-plain-style($color); + &::before { + margin-right:5px; + } + } + &[disabled] { + &, + &:active { + color: mix($-color-white, $color, 40%); + background-color: mix($-color-white, $color, 90%); + border-color: mix($-color-white, $color, 80%); + } + } + } +} + + +.uni-btn { + margin: 5px; + color: #393939; + border:1px solid #ccc; + font-size: 16px; + font-weight: 200; + background-color: #F9F9F9; + // TODO 暂时处理边框隐藏一边的问题 + overflow: visible; + &::after{ + border: none; + } + + &:not([type]),&[type=default] { + color: #999; + &[loading] { + background: none; + &::before { + margin-right:5px; + } + } + + + + &[disabled]{ + color: mix($-color-white, #999, 60%); + &, + &[loading], + &:active { + color: mix($-color-white, #999, 60%); + background-color: mix($-color-white,$-color-black , 98%); + border-color: mix($-color-white, #999, 85%); + } + } + + &[plain] { + color: #999; + background: none; + border-color: $uni-border-1; + &:not([hover-class]):active { + background: none; + color: mix($-color-white, $-color-black, 80%); + border-color: mix($-color-white, $-color-black, 90%); + outline: none; + } + &[disabled]{ + &, + &[loading], + &:active { + background: none; + color: mix($-color-white, #999, 60%); + border-color: mix($-color-white, #999, 85%); + } + } + } + } + + &:not([hover-class]):active { + color: mix($-color-white, $-color-black, 50%); + } + + &[size=mini] { + font-size: 16px; + font-weight: 200; + border-radius: 8px; + } + + + + &.uni-btn-small { + font-size: 14px; + } + &.uni-btn-mini { + font-size: 12px; + } + + &.uni-btn-radius { + border-radius: 999px; + } + &[type=primary] { + @include is-color($uni-primary); + @include is-plain($uni-primary) + } + &[type=success] { + @include is-color($uni-success); + @include is-plain($uni-success) + } + &[type=error] { + @include is-color($uni-error); + @include is-plain($uni-error) + } + &[type=warning] { + @include is-color($uni-warning); + @include is-plain($uni-warning) + } + &[type=info] { + @include is-color($uni-info); + @include is-plain($uni-info) + } +} +/* #endif */ diff --git a/uni_modules/uni-scss/styles/setting/_text.scss b/uni_modules/uni-scss/styles/setting/_text.scss new file mode 100644 index 0000000..a34d08f --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_text.scss @@ -0,0 +1,24 @@ +@mixin get-styles($k,$c) { + @if $k == size or $k == weight{ + font-#{$k}:#{$c} + }@else{ + #{$k}:#{$c} + } +} + +@each $key, $child in $uni-headings { + /* #ifndef APP-NVUE */ + .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ + /* #ifdef APP-NVUE */ + .container .uni-#{$key} { + @each $k, $c in $child { + @include get-styles($k,$c) + } + } + /* #endif */ +} diff --git a/uni_modules/uni-scss/styles/setting/_variables.scss b/uni_modules/uni-scss/styles/setting/_variables.scss new file mode 100644 index 0000000..557d3d7 --- /dev/null +++ b/uni_modules/uni-scss/styles/setting/_variables.scss @@ -0,0 +1,146 @@ +// @use "sass:math"; +@import '../tools/functions.scss'; +// 间距基础倍数 +$uni-space-root: 2 !default; +// 边框半径默认值 +$uni-radius-root:5px !default; +$uni-radius: () !default; +// 边框半径断点 +$uni-radius: map-deep-merge( + ( + 0: 0, + // TODO 当前版本暂时不支持 sm 属性 + // 'sm': math.div($uni-radius-root, 2), + null: $uni-radius-root, + 'lg': $uni-radius-root * 2, + 'xl': $uni-radius-root * 6, + 'pill': 9999px, + 'circle': 50% + ), + $uni-radius +); +// 字体家族 +$body-font-family: 'Roboto', sans-serif !default; +// 文本 +$heading-font-family: $body-font-family !default; +$uni-headings: () !default; +$letterSpacing: -0.01562em; +$uni-headings: map-deep-merge( + ( + 'h1': ( + size: 32px, + weight: 300, + line-height: 50px, + // letter-spacing:-0.01562em + ), + 'h2': ( + size: 28px, + weight: 300, + line-height: 40px, + // letter-spacing: -0.00833em + ), + 'h3': ( + size: 24px, + weight: 400, + line-height: 32px, + // letter-spacing: normal + ), + 'h4': ( + size: 20px, + weight: 400, + line-height: 30px, + // letter-spacing: 0.00735em + ), + 'h5': ( + size: 16px, + weight: 400, + line-height: 24px, + // letter-spacing: normal + ), + 'h6': ( + size: 14px, + weight: 500, + line-height: 18px, + // letter-spacing: 0.0125em + ), + 'subtitle': ( + size: 12px, + weight: 400, + line-height: 20px, + // letter-spacing: 0.00937em + ), + 'body': ( + font-size: 14px, + font-weight: 400, + line-height: 22px, + // letter-spacing: 0.03125em + ), + 'caption': ( + 'size': 12px, + 'weight': 400, + 'line-height': 20px, + // 'letter-spacing': 0.03333em, + // 'text-transform': false + ) + ), + $uni-headings +); + + + +// 主色 +$uni-primary: #2979ff !default; +$uni-primary-disable:lighten($uni-primary,20%) !default; +$uni-primary-light: lighten($uni-primary,25%) !default; + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37 !default; +$uni-success-disable:lighten($uni-success,20%) !default; +$uni-success-light: lighten($uni-success,25%) !default; + +$uni-warning: #f3a73f !default; +$uni-warning-disable:lighten($uni-warning,20%) !default; +$uni-warning-light: lighten($uni-warning,25%) !default; + +$uni-error: #e43d33 !default; +$uni-error-disable:lighten($uni-error,20%) !default; +$uni-error-light: lighten($uni-error,25%) !default; + +$uni-info: #8f939c !default; +$uni-info-disable:lighten($uni-info,20%) !default; +$uni-info-light: lighten($uni-info,25%) !default; + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a !default; // 主要文字 +$uni-base-color: #6a6a6a !default; // 常规文字 +$uni-secondary-color: #909399 !default; // 次要文字 +$uni-extra-color: #c7c7c7 !default; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0 !default; +$uni-border-2: #EDEDED !default; +$uni-border-3: #DCDCDC !default; +$uni-border-4: #B9B9B9 !default; + +// 常规色 +$uni-black: #000000 !default; +$uni-white: #ffffff !default; +$uni-transparent: rgba($color: #000000, $alpha: 0) !default; + +// 背景色 +$uni-bg-color: #f7f7f7 !default; + +/* 水平间距 */ +$uni-spacing-sm: 8px !default; +$uni-spacing-base: 15px !default; +$uni-spacing-lg: 30px !default; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5) !default; +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2) !default; +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5) !default; + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4) !default; diff --git a/uni_modules/uni-scss/styles/tools/functions.scss b/uni_modules/uni-scss/styles/tools/functions.scss new file mode 100644 index 0000000..ac6f63e --- /dev/null +++ b/uni_modules/uni-scss/styles/tools/functions.scss @@ -0,0 +1,19 @@ +// 合并 map +@function map-deep-merge($parent-map, $child-map){ + $result: $parent-map; + @each $key, $child in $child-map { + $parent-has-key: map-has-key($result, $key); + $parent-value: map-get($result, $key); + $parent-type: type-of($parent-value); + $child-type: type-of($child); + $parent-is-map: $parent-type == map; + $child-is-map: $child-type == map; + + @if (not $parent-has-key) or ($parent-type != $child-type) or (not ($parent-is-map and $child-is-map)){ + $result: map-merge($result, ( $key: $child )); + }@else { + $result: map-merge($result, ( $key: map-deep-merge($parent-value, $child) )); + } + } + @return $result; +}; diff --git a/uni_modules/uni-scss/theme.scss b/uni_modules/uni-scss/theme.scss new file mode 100644 index 0000000..80ee62f --- /dev/null +++ b/uni_modules/uni-scss/theme.scss @@ -0,0 +1,31 @@ +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; +// 主色 +$uni-primary: #2979ff; +// 辅助色 +$uni-success: #4cd964; +// 警告色 +$uni-warning: #f0ad4e; +// 错误色 +$uni-error: #dd524d; +// 描述色 +$uni-info: #909399; +// 中性色 +$uni-main-color: #303133; +$uni-base-color: #606266; +$uni-secondary-color: #909399; +$uni-extra-color: #C0C4CC; +// 背景色 +$uni-bg-color: #f5f5f5; +// 边框颜色 +$uni-border-1: #DCDFE6; +$uni-border-2: #E4E7ED; +$uni-border-3: #EBEEF5; +$uni-border-4: #F2F6FC; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); diff --git a/uni_modules/uni-scss/variables.scss b/uni_modules/uni-scss/variables.scss new file mode 100644 index 0000000..1c062d4 --- /dev/null +++ b/uni_modules/uni-scss/variables.scss @@ -0,0 +1,62 @@ +@import './styles/setting/_variables.scss'; +// 间距基础倍数 +$uni-space-root: 2; +// 边框半径默认值 +$uni-radius-root:5px; + +// 主色 +$uni-primary: #2979ff; +$uni-primary-disable:mix(#fff,$uni-primary,50%); +$uni-primary-light: mix(#fff,$uni-primary,80%); + +// 辅助色 +// 除了主色外的场景色,需要在不同的场景中使用(例如危险色表示危险的操作)。 +$uni-success: #18bc37; +$uni-success-disable:mix(#fff,$uni-success,50%); +$uni-success-light: mix(#fff,$uni-success,80%); + +$uni-warning: #f3a73f; +$uni-warning-disable:mix(#fff,$uni-warning,50%); +$uni-warning-light: mix(#fff,$uni-warning,80%); + +$uni-error: #e43d33; +$uni-error-disable:mix(#fff,$uni-error,50%); +$uni-error-light: mix(#fff,$uni-error,80%); + +$uni-info: #8f939c; +$uni-info-disable:mix(#fff,$uni-info,50%); +$uni-info-light: mix(#fff,$uni-info,80%); + +// 中性色 +// 中性色用于文本、背景和边框颜色。通过运用不同的中性色,来表现层次结构。 +$uni-main-color: #3a3a3a; // 主要文字 +$uni-base-color: #6a6a6a; // 常规文字 +$uni-secondary-color: #909399; // 次要文字 +$uni-extra-color: #c7c7c7; // 辅助说明 + +// 边框颜色 +$uni-border-1: #F0F0F0; +$uni-border-2: #EDEDED; +$uni-border-3: #DCDCDC; +$uni-border-4: #B9B9B9; + +// 常规色 +$uni-black: #000000; +$uni-white: #ffffff; +$uni-transparent: rgba($color: #000000, $alpha: 0); + +// 背景色 +$uni-bg-color: #f7f7f7; + +/* 水平间距 */ +$uni-spacing-sm: 8px; +$uni-spacing-base: 15px; +$uni-spacing-lg: 30px; + +// 阴影 +$uni-shadow-sm:0 0 5px rgba($color: #d8d8d8, $alpha: 0.5); +$uni-shadow-base:0 1px 8px 1px rgba($color: #a5a5a5, $alpha: 0.2); +$uni-shadow-lg:0px 1px 10px 2px rgba($color: #a5a4a4, $alpha: 0.5); + +// 蒙版 +$uni-mask: rgba($color: #000000, $alpha: 0.4); diff --git a/uni_modules/vrapile-im/changelog.md b/uni_modules/vrapile-im/changelog.md new file mode 100644 index 0000000..131479a --- /dev/null +++ b/uni_modules/vrapile-im/changelog.md @@ -0,0 +1,40 @@ +## 1.1.9(2025-03-27) +示例工程接口配置,改为通过环境变量实现 +## 1.1.8(2025-03-26) +上传示例工程 +## 1.1.7(2025-03-26) +更新已知问题 +## 1.1.6(2025-03-25) +将demo插件使用示例工程上传 +## 1.1.5(2025-03-18) +修复已知问题 +## 1.1.4(2025-03-18) +聊天页下拉刷新,查看更多历史功能 +## 1.1.3(2025-03-18) +优化已知问题 +## 1.1.2(2025-03-18) +解决页面组件内部store监听bug,解决问题:发送消息后没有自动滚动到最底部,也没有已读当前人 +## 1.1.1(2025-03-18) +更新插件演示程序 +## 1.1.0(2025-02-26) +修复已知问题 +## 1.0.9(2025-02-26) +修复已知问题 +## 1.0.8(2025-02-26) +将demo放在组件中,细节继续调试 +## 1.0.7(2025-02-26) +功能还在调试中,敬请期待... +## 1.0.6(2025-02-21) +开发中... +## 1.0.5(2025-02-21) +开发中... +## 1.0.4(2025-02-21) +开发中 +## 1.0.3(2025-02-21) +开发中 +## 1.0.2(2025-02-21) +开发中 +## 1.0.1(2025-02-21) +开发中 +## 1.0.0(2025-02-21) +开发中,敬请期待 diff --git a/uni_modules/vrapile-im/components/vrapile-im/vrapile-im.vue b/uni_modules/vrapile-im/components/vrapile-im/vrapile-im.vue new file mode 100644 index 0000000..a50a980 --- /dev/null +++ b/uni_modules/vrapile-im/components/vrapile-im/vrapile-im.vue @@ -0,0 +1,5 @@ + diff --git a/uni_modules/vrapile-im/package.json b/uni_modules/vrapile-im/package.json new file mode 100644 index 0000000..4da7903 --- /dev/null +++ b/uni_modules/vrapile-im/package.json @@ -0,0 +1,86 @@ +{ + "id": "vrapile-im", + "displayName": "im页面组件", + "version": "1.1.9", + "description": "实现WebSocket连接/好友/群组/新消息/历史消息,都是全局配置并本地化存储,已调试兼容H5/微信小程序/安卓App/PC多端同步通讯", + "keywords": [ + "IM页面组件,websocket应用" +], + "repository": "", + "engines": { + "HBuilderX": "^3.94" + }, + "dcloudext": { + "type": "component-vue", + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "插件不采集任何数据", + "permissions": "无" + }, + "npmurl": "" + }, + "uni_modules": { + "dependencies": [ + "uni-icons" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y", + "alipay": "y" + }, + "client": { + "Vue": { + "vue2": "y", + "vue3": "y" + }, + "App": { + "app-vue": "y", + "app-nvue": "y", + "app-uvue": "u", + "app-harmony": "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" + } + } + } + } +} \ No newline at end of file diff --git a/uni_modules/vrapile-im/pages/chat/chatFriend.vue b/uni_modules/vrapile-im/pages/chat/chatFriend.vue new file mode 100644 index 0000000..e73583b --- /dev/null +++ b/uni_modules/vrapile-im/pages/chat/chatFriend.vue @@ -0,0 +1,335 @@ + + + + diff --git a/uni_modules/vrapile-im/pages/home/chatHome.vue b/uni_modules/vrapile-im/pages/home/chatHome.vue new file mode 100644 index 0000000..6f16c44 --- /dev/null +++ b/uni_modules/vrapile-im/pages/home/chatHome.vue @@ -0,0 +1,184 @@ + + + + diff --git a/uni_modules/vrapile-im/pages_init.json b/uni_modules/vrapile-im/pages_init.json new file mode 100644 index 0000000..c277650 --- /dev/null +++ b/uni_modules/vrapile-im/pages_init.json @@ -0,0 +1,20 @@ +{ + "pages": [ + // 消息 + { + "path": "uni_modules/vrapile-im/pages/home/chatHome", + "style": { + "navigationBarTitleText": "消息", + "enablePullDownRefresh": false + } + }, + // 聊天 + { + "path": "uni_modules/vrapile-im/pages/chat/chatFriend", + "style": { + "navigationBarTitleText": "聊天", + "enablePullDownRefresh": true + } + } + ] +} diff --git a/uni_modules/vrapile-im/readme.md b/uni_modules/vrapile-im/readme.md new file mode 100644 index 0000000..14116ed --- /dev/null +++ b/uni_modules/vrapile-im/readme.md @@ -0,0 +1,105 @@ +## 组件说明 +1. 此组件为页面组件,实现了Socket连接/好友/群组/新消息/历史消息,且都是全局配置全局本地化存储,兼容H5/微信小程序/安卓App(其他平台未做调试) + +2. 此组件中已提供示例工程,其中的接口和websocket服务,仅供各位开发者调试使用,正式发布需自行实现接口和websocket服务。 + + +## 自行准备内容 + +1. WebSocket服务,替换.env.development下VITE_APP_SOCKET_URL地址 + + websocket需要实现连接,实现心跳检测/离线消息/在线消息/已读回执4种消息类型 + +2. 接口服务,实现聊天/api/chat.js和/api/login.js里面的方法 + + +## 引用说明 + +### 1. 路由说明 + +导入组件后,在pages.json中会自动注册组件,若未注册可手动添加 +``` javascript +{ + "path": "uni_modules/vrapile-im/pages/home/chatHome", + "style": { + "enablePullDownRefresh": false, + "navigationBarTitleText": "消息" + } +}, +{ + "path": "uni_modules/vrapile-im/pages/chat/chatFriend", + "style": { + "enablePullDownRefresh": false, + "navigationBarTitleText": "聊天" + } +} +``` + +可在导航中配置IM消息页面 + +``` javascript +"tabBar": { + "selectedColor": "#0000ff", + "list": [ + { + "pagePath": "uni_modules/vrapile-im/pages/home/chatHome", + "iconPath": "static/image/tabbar/chat.png", + "selectedIconPath": "static/image/tabbar/chat-fill.png", + "text": "消息" + }, + { + "pagePath": "pages/home/user", + "iconPath": "static/image/tabbar/user.png", + "selectedIconPath": "static/image/tabbar/user-fill.png", + "text": "我的" + } + ] +}, +``` + +### 2. 页面样式修改 + 页面样式在/uni_modules/vrapile-im/static/style/下的nine-chat-home-001.scss和nine-chat-friend-001.scss中, + + 可通过重写/static/style/下的nine-chat-home-001.scss和nine-chat-friend-001.scss,将原样式替换 + + +## 演示说明 + +以下共用一个后端,全部互通 + +
+ +示例工程运行效果: + +
https://www.ninecloud.top/udemo/im/index.html + + + +
+
+ + +演示商城H5效果: + +https://www.ninecloud.top/unine/index.html + + + +H5中可下载安卓App + +
+
+ +演示PC前端(与此组件无关,可用于多端消息互相发送测试): + +https://www.ninecloud.top/msw/index + + +
+
+ +注:新注册账号,默认添加【visitor】为好友,默认加入【客服专用群】群 + +因此,可用访客/注册账号登录以上任意系统,可任意发送消息,皆能同步显示 + +(*以上系统皆可用访客账号/密码:visitor/visitor*) \ No newline at end of file diff --git a/uni_modules/vrapile-im/static/image/emoji.png b/uni_modules/vrapile-im/static/image/emoji.png new file mode 100644 index 0000000000000000000000000000000000000000..62091e23856796151801465c2bb1d15781be5efe GIT binary patch literal 9617 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 literal 0 HcmV?d00001 diff --git a/uni_modules/vrapile-im/static/image/more.png b/uni_modules/vrapile-im/static/image/more.png new file mode 100644 index 0000000000000000000000000000000000000000..08330116025520cb23c6750198866f15e1de6376 GIT binary patch literal 8428 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 literal 0 HcmV?d00001 diff --git a/uni_modules/vrapile-im/static/image/yy.png b/uni_modules/vrapile-im/static/image/yy.png new file mode 100644 index 0000000000000000000000000000000000000000..2ffff1b7a5c46cc521677ae8996bde1d7834f5b0 GIT binary patch literal 7318 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 literal 0 HcmV?d00001 diff --git a/uni_modules/vrapile-im/static/style/nine-chat-friend-001.scss b/uni_modules/vrapile-im/static/style/nine-chat-friend-001.scss new file mode 100644 index 0000000..c1c1346 --- /dev/null +++ b/uni_modules/vrapile-im/static/style/nine-chat-friend-001.scss @@ -0,0 +1,165 @@ +html, body, #app{ + height: 100%; + background-color: #f1f1f1; +} +.nine-content-001{ + display: flex; + flex-direction: column; + width: 750rpx; + height: calc(100vh - 0px); + margin: 0; + padding: 0; + background-color: #f1f1f1; +} +.chat-body { + /* #ifdef MP-WEIXIN */ + background-color: #fff; + /* #endif */ +} +.chat-body-main{ + padding-top: 20rpx; + padding-left: 20rpx; + padding-right: 20rpx; + box-sizing: border-box; + -webkit-overflow-scrolling: touch; + padding-bottom: 100rpx; +} +.chat-body-history{ + width: 100%; + height: 90rpx; + line-height: 90rpx; + font-size: 24rpx; + color: grey; + text-align: center; +} +.chat-body-history-have{ + color: rgb(79, 172, 249); +} +.chat-conversation{ + display: flex; + align-items: flex-start; + padding: 20rpx 5rpx; + word-break: break-all; +} +.chat-conversation-text{ + flex: 1; + display: flex; + flex-direction: column; + align-items: flex-start; + margin: 0 20rpx; +} +.chat-conversation-text-time{ + font-size: 10px; + color: gray; +} +.chat-conversation-text-text{ + position: relative; + display: flex; + align-items: center; + max-width: 70%; + min-height: 45rpx; + padding: 15rpx 20rpx; + border-radius: 10rpx; + background-color: #FFF; + /* #ifdef MP-WEIXIN */ + background-color: #f1f1f1; + /* #endif */ +} +.chat-conversation-text-text::after { + content: ''; + position: absolute; + top: 16rpx; + left: -35rpx; + border-width: 19rpx; + border-style: solid; + border-top-color: transparent; + border-left-color: transparent; + border-right-color: #FFF; + /* #ifdef MP-WEIXIN */ + border-right-color: #f1f1f1; + /* #endif */ + border-bottom-color: transparent; +} +.chat-conversation-mine{ + align-items: flex-start; + flex-direction: row-reverse; +} +.chat-conversation-mine .chat-conversation-text{ + align-items: flex-end; +} +.chat-conversation-mine .chat-conversation-text-time{ + text-align: right; +} +.chat-conversation-mine .chat-conversation-text-text{ + background: #9ede86 !important; +} +.chat-conversation-mine .chat-conversation-text-text::after { + left: auto !important; + right: -35rpx !important; + border-left-color: #9ede86 !important; + border-right-color: transparent !important; +} +.chat-conversation-image{ +} +.chat-conversation-image-image{ + width: 80rpx; + height: 80rpx; + padding: 5rpx; + border-radius: 10rpx; +} + +.chat-footer { + position: fixed; + left: 0; + right: 0; + bottom: 0; + height: 100rpx; + background-color: #fff; + display: flex; + /* #ifdef MP-WEIXIN */ + border-top: 1rpx solid #f1f1f1; + /* #endif */ +} +.chat-footer-send{ + flex-grow: 1; + display: flex; + justify-content: space-between; + align-items: center; + padding: 0 10rpx; +} +.chat-footer-send-image{ + padding: 0 10rpx; + width: 60rpx; + height: 60rpx; +} +.chat-footer-send-input{ + flex-grow: 1; + text-align: left; + padding: 15rpx; + border-radius: 5rpx; + background-color: #f9f9f9; +} +.chat-footer-send-say{ + flex-grow: 1; + text-align: center; + padding: 20rpx; + border-radius: 5rpx; + background-color: #f9f9f9; +} +.chat-footer-send-button{ + line-height: 65rpx; + margin: 0 10rpx; + color: #FFFFFF; + background-color: #0000ff; + border-radius: 10rpx; +} +.chat-footer-send-button-span{ + padding: 0 25rpx; +} + +// 允许文本复制 +.nine-user-select { + cursor: auto; + -webkit-user-select: text; + user-select: text; +} \ No newline at end of file diff --git a/uni_modules/vrapile-im/static/style/nine-chat-home-001.scss b/uni_modules/vrapile-im/static/style/nine-chat-home-001.scss new file mode 100644 index 0000000..20c165f --- /dev/null +++ b/uni_modules/vrapile-im/static/style/nine-chat-home-001.scss @@ -0,0 +1,112 @@ +html, body, #app{ + height: 100%; + background-color: #f1f1f1; +} +.nine-content-002{ + display: flex; + flex-direction: column; + width: 750rpx; + height: calc(100vh - 50px); + /* #ifndef H5 */ + height: calc(100vh - 0px); + /* #endif */ + margin: 0; + padding: 0; + background-color: #f1f1f1; +} + +.chat-search{ + display: flex; + align-items: center; + padding: 5rpx; + background-color: #ffffff; +} +.chat-search-image{ + height: 45rpx; + line-height: 45rpx; + padding: 10rpx; + background-color: #f8f8f8; +} +.chat-search-input{ + width: 100%; + height: 45rpx; + line-height: 45rpx; + padding: 10rpx; + font-size: 16px; + background-color: #f8f8f8; +} + +.chat-list{ + flex: 1; + padding: 0; + overflow-y: auto; +} +.chat-list-item{ + display: flex; + align-items: center; + justify-content: space-between; + margin: 2rpx 0; + padding: 15rpx 10rpx; + border-radius: 10rpx; + background-color: #ffffff; +} +.chat-list-item-left{ + position: relative; + width: 84rpx; + height: 84rpx; +} +.chat-list-item-left-image{ + width: 82rpx; + height: 82rpx; + border: 1rpx solid #f1f1f1; + border-radius: 5rpx; +} +.chat-list-item-left-mark{ + position: absolute; + width: 30rpx; + top: -13rpx; + right: -13rpx; + padding: 1rpx; + border-radius: 50%; + font-size: 12px; + color: white; + background-color: red; + text-align: center; +} + +.chat-list-item-center{ + width: 450rpx; + margin: 0 20rpx; +} +.chat-list-item-center-top{ + width: 450rpx; + font-size: 16px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} +.chat-list-item-center-bottom{ + width: 450rpx; + font-size: 12px; + color: #969696; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; +} + +.chat-list-item-right{ + width: 130rpx; + color: #a7a7a7; +} +.chat-list-item-right-top{ + font-size: 12px; + text-align: right; +} +.chat-list-item-right-bottom{ + padding-top: 15rpx; + text-align: right; +} +.chat-list-item-right-bottom-image{ + width: 25rpx; + height: 30rpx; +} \ No newline at end of file diff --git a/uni_modules/vrapile-im/store/getters.js b/uni_modules/vrapile-im/store/getters.js new file mode 100644 index 0000000..7ec169e --- /dev/null +++ b/uni_modules/vrapile-im/store/getters.js @@ -0,0 +1,11 @@ +const getters = { + chatList: state => state.chat.chatList, + friendList: state => state.chat.friendList, + groupList: state => state.chat.groupList, + userObject: state => state.chat.userObject, + groupObject: state => state.chat.groupObject, + + websocket: state => state.socket.websocket, + websocketData: state => state.socket.websocketData +} +export default getters diff --git a/uni_modules/vrapile-im/store/index.js b/uni_modules/vrapile-im/store/index.js new file mode 100644 index 0000000..babbcd7 --- /dev/null +++ b/uni_modules/vrapile-im/store/index.js @@ -0,0 +1,16 @@ +import Vuex from 'vuex' +import socket from '@/uni_modules/vrapile-im/store/modules/socket' +import chat from '@/uni_modules/vrapile-im/store/modules/chat' +import getters from './getters' + +// Vue.use(Vuex) + +const store = new Vuex.Store({ + modules: { + chat, + socket + }, + getters +}) + +export default store diff --git a/uni_modules/vrapile-im/store/modules/chat.js b/uni_modules/vrapile-im/store/modules/chat.js new file mode 100644 index 0000000..5e83eaa --- /dev/null +++ b/uni_modules/vrapile-im/store/modules/chat.js @@ -0,0 +1,138 @@ +import storage from '@/uni_modules/vrapile-im/utils/storage' +import constant from '@/uni_modules/vrapile-im/utils/constant' +import { getChatKey } from '@/uni_modules/vrapile-im/utils/tiosocket'; + + // 外部需提供获取用户好友,获取用户所有群,以及群中所有用户三个接口 +import { getUserAllFriend, getUserAllGroup, getGroupUser } from '@/api/chat' + +const chat = { + state: { + friendList: storage.get(constant.friendList) || [], + groupList: storage.get(constant.groupList) || [], + userObject: storage.get(constant.userObject) || {}, + groupObject: storage.get(constant.groupObject) || {}, + chatList: storage.get(constant.chatList) || [] + }, + + mutations: { + // 清空聊天列表 + CLEAN_CHAT_LIST: (state) => { + state.chatList = new Array(); + storage.set(constant.chatList, state.chatList) + }, + // 存储好友聊天列表 + SET_CHAT_FRIEND_LIST: (state, data) => { + state.friendList = data; + storage.set(constant.friendList, data) + + for(let item of data){ + item["key"] = getChatKey(item["type"], item["friendId"], item["userId"]) + item["haveHistory"] = 1; + item["id"] = item["friendId"]; + item["name"] = item["remarkName"] || item["nickName"]; + item["messageNum"] = 0; + item["messageList"] = []; + item["messageShow"] = ""; + item["messageLast"] = {}; + state.chatList.push(item) + } + storage.set(constant.chatList, state.chatList) + }, + // 存储群聊列表 + SET_CHAT_GROUP_LIST: (state, data) => { + state.groupList = data; + storage.set(constant.groupList, data) + + for(let item of data){ + item["key"] = getChatKey(item["type"], item["id"], item["userId"]) + item["haveHistory"] = 1; + item["id"] = item["id"]; + item["name"] = item["remarkName"] || item["name"] + item["messageNum"] = 0; + item["messageList"] = []; + item["messageShow"] = ""; + item["messageLast"] = {}; + state.chatList.push(item) + } + storage.set(constant.chatList, state.chatList) + }, + // 存储用户对象,方便寻找用户名,头像等 + SET_USER_OBJECT: (state, userObject) => { + state.userObject[userObject.userId] = userObject; + storage.set(constant.userObject, state.userObject) + }, + // 存储群组对象,方便寻找群组名,头像等 + SET_GROUP_OBJECT: (state, groupObject) => { + state.groupObject[groupObject.id] = groupObject; + storage.set(constant.groupObject, state.groupObject) + } + }, + + actions: { + // 获取登录用户所有聊天列表 + GetChatList({ commit, state }, params) { + return new Promise((resolve, reject) => { + commit('CLEAN_CHAT_LIST'); + // 查询好友 + getUserAllFriend().then(res => { + let list = [] + for(let item of res.data){ + list.push({type: 0, ...item, userId: params.userId}) + commit('SET_USER_OBJECT', item) + } + commit('SET_CHAT_FRIEND_LIST', list) + + // 查询群组 + getUserAllGroup().then(res1 => { + let list = [] + for(let item1 of res1.data){ + list.push({type: 1, ...item1, userId: params.userId}) + // 查询群组人员 + getGroupUser(item1.id).then(res2 => { + for(let user of res2.data){ + commit('SET_USER_OBJECT', user) + } + resolve(res2) + }); + commit('SET_GROUP_OBJECT', item1) + } + commit('SET_CHAT_GROUP_LIST', list) + }).catch(error => { + reject(error) + }) + }).catch(error => { + reject(error) + }) + }) + } + }, + + getters: { + getUserAvatar: (state) => (userId, defaultAvatar) => { + if(state.userObject[userId] && state.userObject[userId]["avatar"]){ + return state.userObject[userId]["avatar"] + } + return defaultAvatar || '/uni_modules/vrapile-im/static/image/yy.png'; + }, + getGroupAvatar: (state) => (groupId, defaultAvatar) => { + if(state.groupObject[groupId] && state.groupObject[groupId]["avatar"]){ + return state.groupObject[groupId]["avatar"] + } + return defaultAvatar || '/uni_modules/vrapile-im/static/image/yy.png'; + }, + getUserName: (state) => (userId, defaultName) => { + if(state.userObject[userId]){ + return state.userObject[userId]["remarkName"] || state.userObject[userId]["nickName"] || defaultName + } + return defaultName || "无名"; + }, + getGroupName: (state) => (groupId, defaultName) => { + if(state.groupObject[groupId]){ + return state.groupObject[userId]["remarkName"] || state.groupObject[userId]["name"] || defaultName + } + return defaultName || "无名"; + } + } +} + +export default chat diff --git a/uni_modules/vrapile-im/store/modules/socket.js b/uni_modules/vrapile-im/store/modules/socket.js new file mode 100644 index 0000000..fe68749 --- /dev/null +++ b/uni_modules/vrapile-im/store/modules/socket.js @@ -0,0 +1,116 @@ +import store from '@/uni_modules/vrapile-im/store' +import storage from '@/uni_modules/vrapile-im/utils/storage' +import constant from '@/uni_modules/vrapile-im/utils/constant' +import { formatDate } from '@/uni_modules/vrapile-im/utils/nineTool'; +import { TioSocket, getChatKey } from '@/uni_modules/vrapile-im/utils/tiosocket'; + +const socket = { + state: { + websocket: storage.get(constant.websocket), + websocketData: storage.get(constant.websocketData) + }, + + mutations: { + // 存储登录链接 + SET_SOCKET: (state, socket) => { + state.websocket = socket; + storage.set(constant.websocket, socket) + }, + // 添加socket消息 + ADD_MESSAGE: (state, message) => { + state.websocketData.push(message) + storage.set(constant.websocketData, state.websocketData) + + // 添加消息 + for(let i=0;i { + // 删除未读消息 + for(let i=0;i { + let unReadNum = 0 + for(let i=0;i 0){ + uni.setTabBarBadge({ + index: getApp().globalData.msgTabBarIndex, + text: String(unReadNum), + fail: (e) => { + // console.log(e) + } + }) + }else{ + uni.removeTabBarBadge({ + index: getApp().globalData.msgTabBarIndex + }) + } + }catch(e){ + + } + }, + // 清空消息 + CLEAN_MESSAGE: (state, message) => { + state.websocketData = new Array(); + storage.set(constant.websocketData, new Array()) + } + }, + + actions: { + // 连接websocket + ConnSocket({ commit, state }, params) { + return new Promise((resolve, reject) => { + let url = params.url; + let heartbeatTimeout = 50000; // 心跳超时时间,单位:毫秒 + let reconnInterval = 5000; // 重连间隔时间,单位:毫秒 + let paramStr = "app=unine&token=" + params.token + let socket = new TioSocket(url, paramStr, heartbeatTimeout, reconnInterval); + socket.connect(false); + }) + } + } +} + +export default socket diff --git a/uni_modules/vrapile-im/utils/cache.js b/uni_modules/vrapile-im/utils/cache.js new file mode 100644 index 0000000..a248213 --- /dev/null +++ b/uni_modules/vrapile-im/utils/cache.js @@ -0,0 +1,26 @@ +const sessionCache = 'vrapile-im-session-cache' +const localCache = 'vrapile-im-local-cache' + +export function getSessionCache() { + return uni.getStorageSync(sessionCache) +} + +export function setSessionCache(cache) { + return uni.setStorageSync(sessionCache, cache) +} + +export function removeSessionCache() { + return uni.removeStorageSync(sessionCache) +} + +export function getLocalCache() { + return uni.getStorageSync(localCache) +} + +export function setLocalCache(cache) { + return uni.setStorageSync(localCache, cache) +} + +export function removeLocalCache() { + return uni.removeStorageSync(localCache) +} diff --git a/uni_modules/vrapile-im/utils/constant.js b/uni_modules/vrapile-im/utils/constant.js new file mode 100644 index 0000000..1158b94 --- /dev/null +++ b/uni_modules/vrapile-im/utils/constant.js @@ -0,0 +1,6 @@ +const constant = { + websocket: 'vuex_vrapile_im_websocket', + websocketData: 'vuex_vrapile_im_websocket_data' +} + + export default constant diff --git a/uni_modules/vrapile-im/utils/errorCode.js b/uni_modules/vrapile-im/utils/errorCode.js new file mode 100644 index 0000000..d2111ee --- /dev/null +++ b/uni_modules/vrapile-im/utils/errorCode.js @@ -0,0 +1,6 @@ +export default { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + 'default': '系统未知错误,请反馈给管理员' +} diff --git a/uni_modules/vrapile-im/utils/nineTool.js b/uni_modules/vrapile-im/utils/nineTool.js new file mode 100644 index 0000000..843ec96 --- /dev/null +++ b/uni_modules/vrapile-im/utils/nineTool.js @@ -0,0 +1,348 @@ + +export function isNull(o) { + if(o === 0 || o === "0"){ + return false; + } + if(o == "undefined" || o == null || o == ""){ + return true; + } + return false; +} +export function isPhone(o) { + if(/^1[23456789]\d{9}$/.test(o)){ + return true; + } + return false; +} +export function isMail(o) { + if(/^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$/.test(o)){ + return true; + } + return false; +} +export function isNumber(value) { + return !isNaN(parseFloat(value)) && isFinite(value) +} +export function isLetter(o) { + if(/^[A-Za-z]+$/.test(o)){ + return true; + } + return false; +} +export function isNumberOrLetter(o) { + if(/^[A-Za-z0-9]+$/.test(o)){ + return true; + } + return false; +} + +// 日期格式化 +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null + } + const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } else if (typeof time === 'string') { + time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), ''); + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} + +export function formatDate(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + + if (option) { + return parseTime(time, option) + } + + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } else if (diff < 3600 * 24 * 3) { + return '2天前' + } else if (diff < 3600 * 24 * 4) { + return '3天前' + } else if (diff < 3600 * 24 * 5) { + return '4天前' + } else if (diff < 3600 * 24 * 6) { + return '5天前' + } else if (diff < 3600 * 24 * 7) { + return '6天前' + } else if (diff < 3600 * 24 * 8) { + return '7天前' + } + if(diff < 3600 * 24 * 365) { + return ( + (d.getMonth()*1 + 1) + + '月' + + d.getDate() + + '日' + ) + } else { + return ( + d.getFullYear() + + '年' + + (d.getMonth()*1 + 1) + + '月' + ) + } +} + +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + + if (option) { + return parseTime(time, option) + } + + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + return ( + d.getFullYear() + + '-' + + ((d.getMonth()*1 + 1) + "").padStart(2,0) + + '-' + + (d.getDate() + '').padStart(2,0) + + ' ' + + (d.getHours() + '').padStart(2,0) + + ':' + + (d.getMinutes() + '').padStart(2,0) + + ':' + + (d.getSeconds() + '').padStart(2,0) + ) +} + +// number:要格式化的数字, +// decimals:保留几位小数, 默认0位 +// dec_point:小数点符号, 默认 . +// thousands_sep:千分位符号 默认 , +// tail_add: 小数点后面数据是否添加0补足位数, 默认空字符 +// null_default: 如果为空的值, 默认空字符 +function numberFormat(number, decimals, dec_point, thousands_sep, tail_add="", null_default="") { + number = (number + '').replace(/[^0-9+-Ee.]/g, ''); + var n = !isFinite(+number) ? 0 : +number, + prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), + sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, + dec = (typeof dec_point === 'undefined') ? '.' : dec_point, + s = '', + toFixedFix = function (n, prec) { + var k = Math.pow(10, prec); + return '' + Math.round(n * k) / k; + }; + + s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); + var re = /(-?\d+)(\d{3})/; + if(sep.length > 0){ + while (re.test(s[0])) { + s[0] = s[0].replace(re, "$1" + sep + "$2"); + } + } + if ((s[1] || '').length < prec) { + s[1] = s[1] || ''; + s[1] += new Array(prec - s[1].length + 1).join(tail_add); + } + if((s[1] || '').length == 0){ + return s[0] + } + return s.join(dec); +} +// number:要格式化的数字, +// decimals:保留几位小数, 默认0位 +// dec_point:小数点符号, 默认 . +// thousands_sep:千分位符号 默认 , +// tail_add: 小数点后面数据是否添加0补足位数, 默认空字符 +// null_default: 如果为空的值, 默认空字符 +export function formatNumber(number, decimals, tail_add, thousands_sep, dec_point, null_default) { + if(isNull(number) || isNull(String(number).trim())){return null_default;} + if(!isNumber(String(number).trim())){return number;} + number = String(number).trim(); + return numberFormat(number, decimals, tail_add, thousands_sep, dec_point, null_default); +} +// thousands_sep:千分位符号 默认空字符 +export function formatPercent(number, decimals, tail_add, thousands_sep="", dec_point, null_default) { + if(isNull(number) || isNull(String(number).trim().replaceAll(",", ""))){return null_default;} + if(!isNumber(String(number).trim().replaceAll(",", ""))){return number;} + number = String(number).trim().replaceAll(",", ""); + let value = numberFormat(number*100, decimals, tail_add, thousands_sep, dec_point, null_default); + if(value){ + return value + "%"; + } + return ""; +} + +// get brower +export function GetCurrentBrowser () { + let ua = navigator.userAgent.toLocaleLowerCase() + let browserType = null + if (ua.match(/msie/) != null || ua.match(/trident/) != null) { + browserType = 'IE' + } else if (ua.match(/firefox/) != null) { + browserType = 'firefox' + } else if (ua.match(/ucbrowser/) != null) { + browserType = 'UC' + } else if (ua.match(/opera/) != null || ua.match(/opr/) != null) { + browserType = 'opera' + } else if (ua.match(/bidubrowser/) != null) { + browserType = 'baidu' + } else if (ua.match(/metasr/) != null) { + browserType = 'sougou' + } else if (ua.match(/tencenttraveler/) != null || ua.match(/qqbrowse/) != null) { + browserType = 'QQ' + } else if (ua.match(/maxthon/) != null) { + browserType = 'maxthon' + } else if (ua.match(/chrome/) != null) { + var is360 = _mime('type', 'application/vnd.chromium.remoting-viewer') + if (is360) { + browserType = '360' + } else { + browserType = 'chrome' + } + } else if (ua.match(/safari/) != null) { + browserType = 'Safari' + } else { + browserType = 'others' + } + return browserType +} + +function _mime (option, value) { + var mimeTypes = navigator.mimeTypes + for (var mt in mimeTypes) { + if (mimeTypes[mt][option] === value) { + return true + } + } + return false +} + +// get os +export function GetOs () { + let sUserAgent = navigator.userAgent.toLocaleLowerCase() + let isWin = (navigator.platform.toLocaleLowerCase() == 'win32') || (navigator.platform.toLocaleLowerCase() === 'windows') + let isMac = (navigator.platform.toLocaleLowerCase() === 'mac68k') || (navigator.platform.toLocaleLowerCase() === 'macppc') + || (navigator.platform === 'macintosh') || (navigator.platform.toLocaleLowerCase() === 'macintel') + if (isMac) return 'Mac' + var isUnix = (navigator.platform === 'x11') && !isWin && !isMac + if (isUnix) return 'Unix' + var isLinux = (String(navigator.platform.toLocaleLowerCase()).indexOf('linux') > -1) + if (isLinux) return 'Linux' + if (isWin) { + var isWin2K = sUserAgent.indexOf('windows nt 5.0') > -1 || sUserAgent.indexOf('windows 2000') > -1 + if (isWin2K) return 'Win2000' + var isWinXP = sUserAgent.indexOf('windows nt 5.1') > -1 || sUserAgent.indexOf('windows xp') > -1 + if (isWinXP) return 'WinXP' + var isWin2003 = sUserAgent.indexOf('windows nt 5.2') > -1 || sUserAgent.indexOf('windows 2003') > -1 + if (isWin2003) return 'Win2003' + var isWinVista = sUserAgent.indexOf('windows nt 6.0') > -1 || sUserAgent.indexOf('windows vista') > -1 + if (isWinVista) return 'WinVista' + var isWin7 = sUserAgent.indexOf('windows nt 6.1') > -1 || sUserAgent.indexOf('windows 7') > -1 + if (isWin7) return 'Win7' + var isWin8 = sUserAgent.indexOf('windows nt 6.2') > -1 || sUserAgent.indexOf('windows 8') > -1 + if (isWin8) return 'Win8' + var isWin10 = sUserAgent.indexOf('windows nt 10.0') > -1 || sUserAgent.indexOf('windows nt 6.4') > -1 || sUserAgent.indexOf('windows 10') > -1 + if (isWin10) return 'Win10' + var isSimulator = sUserAgent.indexOf('linux') > -1 && sUserAgent.indexOf('android') > -1 + if (isSimulator) return 'Win手机模拟器' + return navigator.platform + } + if (sUserAgent.indexOf('android') > -1) return 'Android' + if (sUserAgent.indexOf('iphone') > -1) return 'iPhone' + if (sUserAgent.indexOf('symbianos') > -1) return 'SymbianOS' + if (sUserAgent.indexOf('windows phone') > -1) return 'Windows Phone' + if (sUserAgent.indexOf('ipad') > -1) return 'iPad' + if (sUserAgent.indexOf('ipod') > -1) return 'iPod' + return navigator.platform +} + +export function getRandom(len){ + let data = Math.random() + ""; + let index = 2; + while(data[index] == 0){ + index++; + } + return data.substr(index, len); +} + +export function getLongRandom(len){ + if(len <= 16){ + return getRandom(len) + } + let data = Math.random() + ""; + let index = 2; + while(data[index] == 0){ + index++; + } + return parseTime(Date.now(), '{y}{m}{d}{h}{i}{s}') + "" + data.substr(index, len-16); +} + +export function moveInArray(array, fromIndex, toIndex) { + const element = array.splice(fromIndex, 1)[0]; + array.splice(toIndex, 0, element); +} + +export function jsonCharBigInt(s){ + if(typeof s !== 'string'){ + return s + } + let re = /([\\]?['|"]{1})(\w+[\\]?['|"]{1}[ |\n|r|\t]*:[ |\n|r|\t]*)([-]?\d{15,})/g + return s.replaceAll(re, "$1$2$1$3$1") +} + +export function jsonParse(s){ + if(typeof s !== 'string'){ + return s + } + let re = /([\\]?['|"]{1})(\w+[\\]?['|"]{1}[ |\n|r|\t]*:[ |\n|r|\t]*)([-]?\d{15,})/g + return JSON.parse(s.replaceAll(re, "$1$2$1$3$1")) +} \ No newline at end of file diff --git a/uni_modules/vrapile-im/utils/storage.js b/uni_modules/vrapile-im/utils/storage.js new file mode 100644 index 0000000..88dc1ed --- /dev/null +++ b/uni_modules/vrapile-im/utils/storage.js @@ -0,0 +1,33 @@ +import constant from './constant' + +// 存储变量名 +let storageKey = 'vrapile_im_socket_storage_data' + +// 存储节点变量名 +let storageNodeKeys = [constant.chatList, constant.friendList, constant.groupList, + constant.userObject, constant.groupObject, constant.websocket, constant.websocketData] + +const storage = { + set: function(key, value) { + if (storageNodeKeys.indexOf(key) != -1) { + let tmp = uni.getStorageSync(storageKey) + tmp = tmp ? tmp : {} + tmp[key] = value + uni.setStorageSync(storageKey, tmp) + } + }, + get: function(key) { + let storageData = uni.getStorageSync(storageKey) || {} + return storageData[key] || "" + }, + remove: function(key) { + let storageData = uni.getStorageSync(storageKey) || {} + delete storageData[key] + uni.setStorageSync(storageKey, storageData) + }, + clean: function() { + uni.removeStorageSync(storageKey) + } +} + +export default storage diff --git a/uni_modules/vrapile-im/utils/tiosocket.js b/uni_modules/vrapile-im/utils/tiosocket.js new file mode 100644 index 0000000..58bfc0d --- /dev/null +++ b/uni_modules/vrapile-im/utils/tiosocket.js @@ -0,0 +1,181 @@ +import store from '@/uni_modules/vrapile-im/store' + +/** + * @param {*} url wss or ws + * @param {*} paramStr 加在ws url后面的请求参数,形如:name=张三&id=12 + * @param {*} heartbeatTimeout 心跳时间 单位:毫秒 + * @param {*} reconnInterval 重连间隔时间 单位:毫秒 + */ +export class TioSocket { + constructor(url, paramStr, heartbeatTimeout, reconnInterval) { + this.firstUrl = url; + this.reconnUrl = url; + if (paramStr) { + this.firstUrl += '?' + paramStr; + this.reconnUrl += '?' + paramStr + "&reconnect=true"; + } else { + this.reconnUrl += "?reconnect=true"; + } + + this.closeByUser = false; + this.lockReconnect = false; + this.reconnectCount = 0; + + // 最后连接时间 + this.lastConnectTime = new Date().getTime(); + // 重连时间 + this.reconnInterval = reconnInterval; + // 心跳时间 + this.heartbeatTimeout = heartbeatTimeout; + + this.ws = null; + + this.connect = function(isReconnect) { + // 这里连接的时候,先关闭,避免出现多个连接 + uni.closeSocket({ + success:() => { + this.ws = uni.connectSocket({ + url: this.firstUrl, + success(res) { + console.log("WebSocket成功关闭,连接成功") + }, + fail(err) { + console.log("WebSocket成功关闭,连接失败:" + err) + } + }); + }, + fail:() => { + this.ws = uni.connectSocket({ + url: this.firstUrl, + success(res) { + console.log("WebSocket关闭失败,连接成功") + }, + fail(err) { + console.log("WebSocket关闭失败,连接失败:" + err) + } + }); + } + }) + + this.ws.onOpen((e) => { + if(!isReconnect){ + uni.sendSocketMessage({ + data: JSON.stringify({code:1}) + }) + store.commit('CLEAN_MESSAGE', {}) + } + this.reset(); + }) + + store.commit('SET_SOCKET', this) + this.ws.onMessage((e) => { + let data = JSON.parse(e.data); + if(data.code == 2){ + store.commit('ADD_MESSAGE', data.message) + } + this.reset(); + }) + + this.ws.onClose((e) => { + console.error("WebSocket关闭了:" + JSON.stringify(e)) + this.clearAllTimeoutTask(); + }) + + this.ws.onError((e) => { + console.error("WebSocket错误了:" + JSON.stringify(e)) + this.clearAllTimeoutTask(); + if(!this.closeByUser){ + this.reconn(); + } + }) + + return this.ws + } + + this.reconn = () => { + // 重连次数,防止疯狂重连导致系统挂掉 + if(this.reconnectCount++ > 10){ return;} + // 防止多个方法调用,多处重连 + if (this.lockReconnect) { return;} + this.lockReconnect = true; + this.reconnIntervalTask = setTimeout(() => { + this.ws = this.connect(true) + this.lockReconnect = false; + }, this.reconnInterval) + } + + this.ping = () => { + uni.sendSocketMessage({ + data: JSON.stringify({code:0}) + }) + }; + + this.send = (data) => { + uni.sendSocketMessage({ + data: data + }) + }; + + this.close = (bool) => { + this.lockReconnect = false; + this.closeByUser = bool; + uni.closeSocket({ + success:() => { + console.info("WebSocket关闭成功") + } + }) + }; + + this.reset = () => { + this.clearAllTimeoutTask(); + // 重置重连次数 + this.reconnectCount = 0; + // 重置最后连接时间 + this.lastConnectTime = new Date().getTime(); + // 启动心跳任务 + this.pingIntervalTask = setTimeout(() => { + this.ping(); + }, this.heartbeatTimeout); + } + + this.clearAllTimeoutTask = () => { + // 清除重连任务 + if (this.reconnIntervalTask) { + clearTimeout(this.reconnIntervalTask); + } + // 清除心跳任务 + if(this.pingIntervalTask){ + clearTimeout(this.pingIntervalTask) + } + } + + this.getReadyState = () => { + // CONNECTING:值为0,表示正在连接。 + // OPEN:值为1,表示连接成功,可以通信了。 + // CLOSING:值为2,表示连接正在关闭。 + // CLOSED:值为3,表示连接已经关闭,或者打开连接失败。 + return this.ws.readyState; + } + + } +} + +/** + * 获取聊天唯一Key + * type 0-私聊,1-群里 + * chatId 聊天对象,好友ID或群聊ID + * fromId 发消息人ID + * +*/ +export function getChatKey(type, chatId, fromId) { + // 私聊 + if(type == 0){ + if(chatId*1 < fromId*1){ + return "im:message:friend-" + chatId + "-" + fromId + }else{ + return "im:message:friend-" + fromId + "-" + chatId + } + }else{ + return "im:message:group-" + chatId + } +} diff --git a/utils/cache.js b/utils/cache.js new file mode 100644 index 0000000..62c3ca1 --- /dev/null +++ b/utils/cache.js @@ -0,0 +1,26 @@ +const sessionCache = 'session-cache' +const localCache = 'local-cache' + +export function getSessionCache() { + return uni.getStorageSync(sessionCache) +} + +export function setSessionCache(cache) { + return uni.setStorageSync(sessionCache, cache) +} + +export function removeSessionCache() { + return uni.removeStorageSync(sessionCache) +} + +export function getLocalCache() { + return uni.getStorageSync(localCache) +} + +export function setLocalCache(cache) { + return uni.setStorageSync(localCache, cache) +} + +export function removeLocalCache() { + return uni.removeStorageSync(localCache) +} diff --git a/utils/constant.js b/utils/constant.js new file mode 100644 index 0000000..b75a236 --- /dev/null +++ b/utils/constant.js @@ -0,0 +1,8 @@ +const constant = { + avatar: 'vuex_avatar', + name: 'vuex_name', + userInfo: 'vuex_user_info', + loginInfo: 'vuex_login_info' +} + + export default constant diff --git a/utils/errorCode.js b/utils/errorCode.js new file mode 100644 index 0000000..d2111ee --- /dev/null +++ b/utils/errorCode.js @@ -0,0 +1,6 @@ +export default { + '401': '认证失败,无法访问系统资源', + '403': '当前操作没有权限', + '404': '访问资源不存在', + 'default': '系统未知错误,请反馈给管理员' +} diff --git a/utils/frameTool.js b/utils/frameTool.js new file mode 100644 index 0000000..150a7ca --- /dev/null +++ b/utils/frameTool.js @@ -0,0 +1,15 @@ + +import * as nineTool from "@/utils/nineTool.js"; +import { diyApi, diyApiGet } from '@/utils/queryByDiy.js'; + +export default { + install(app) { + // 九云工具 + Object.keys(nineTool).forEach((key) => { + app.config.globalProperties[key] = nineTool[key]; + }); + // 自定义查询工具 + app.config.globalProperties.diyApi = diyApi + app.config.globalProperties.diyApiGet = diyApiGet + } +}; diff --git a/utils/nineTool.js b/utils/nineTool.js new file mode 100644 index 0000000..b8d13c8 --- /dev/null +++ b/utils/nineTool.js @@ -0,0 +1,348 @@ + +export function isNull(o) { + if(o === 0 || o === "0"){ + return false; + } + if(o == "undefined" || o == null || o == ""){ + return true; + } + return false; +} +export function isPhone(o) { + if(/^1[23456789]\d{9}$/.test(o)){ + return true; + } + return false; +} +export function isMail(o) { + if(/^([a-z0-9A-Z]+[-|\.]?)+[a-z0-9A-Z]@([a-z0-9A-Z]+(-[a-z0-9A-Z]+)?\.)+[a-zA-Z]{2,}$/.test(o)){ + return true; + } + return false; +} +export function isNumber(value) { + return !isNaN(parseFloat(value)) && isFinite(value) +} +export function isLetter(o) { + if(/^[A-Za-z]+$/.test(o)){ + return true; + } + return false; +} +export function isNumberOrLetter(o) { + if(/^[A-Za-z0-9]+$/.test(o)){ + return true; + } + return false; +} + +// 日期格式化 +export function parseTime(time, pattern) { + if (arguments.length === 0 || !time) { + return null + } + const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}' + let date + if (typeof time === 'object') { + date = time + } else { + if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) { + time = parseInt(time) + } else if (typeof time === 'string') { + time = time.replace(new RegExp(/-/gm), '/').replace('T', ' ').replace(new RegExp(/\.[\d]{3}/gm), ''); + } + if ((typeof time === 'number') && (time.toString().length === 10)) { + time = time * 1000 + } + date = new Date(time) + } + const formatObj = { + y: date.getFullYear(), + m: date.getMonth() + 1, + d: date.getDate(), + h: date.getHours(), + i: date.getMinutes(), + s: date.getSeconds(), + a: date.getDay() + } + const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => { + let value = formatObj[key] + // Note: getDay() returns 0 on Sunday + if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] } + if (result.length > 0 && value < 10) { + value = '0' + value + } + return value || 0 + }) + return time_str +} + +export function formatDate(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + + if (option) { + return parseTime(time, option) + } + + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + if (diff < 30) { + return '刚刚' + } else if (diff < 3600) { + // less 1 hour + return Math.ceil(diff / 60) + '分钟前' + } else if (diff < 3600 * 24) { + return Math.ceil(diff / 3600) + '小时前' + } else if (diff < 3600 * 24 * 2) { + return '1天前' + } else if (diff < 3600 * 24 * 3) { + return '2天前' + } else if (diff < 3600 * 24 * 4) { + return '3天前' + } else if (diff < 3600 * 24 * 5) { + return '4天前' + } else if (diff < 3600 * 24 * 6) { + return '5天前' + } else if (diff < 3600 * 24 * 7) { + return '6天前' + } else if (diff < 3600 * 24 * 8) { + return '7天前' + } + if(diff < 3600 * 24 * 365) { + return ( + (d.getMonth()*1 + 1) + + '月' + + d.getDate() + + '日' + ) + } else { + return ( + d.getFullYear() + + '年' + + (d.getMonth()*1 + 1) + + '月' + ) + } +} + +export function formatTime(time, option) { + if (('' + time).length === 10) { + time = parseInt(time) * 1000 + } else { + time = +time + } + + if (option) { + return parseTime(time, option) + } + + const d = new Date(time) + const now = Date.now() + + const diff = (now - d) / 1000 + + return ( + d.getFullYear() + + '-' + + ((d.getMonth()*1 + 1) + "").padStart(2,0) + + '-' + + (d.getDate() + '').padStart(2,0) + + ' ' + + (d.getHours() + '').padStart(2,0) + + ':' + + (d.getMinutes() + '').padStart(2,0) + + ':' + + (d.getSeconds() + '').padStart(2,0) + ) +} + +// number:要格式化的数字, +// decimals:保留几位小数, 默认0位 +// dec_point:小数点符号, 默认 . +// thousands_sep:千分位符号 默认 , +// tail_add: 小数点后面数据是否添加0补足位数, 默认空字符 +// null_default: 如果为空的值, 默认空字符 +function numberFormat(number, decimals, tail_add="", thousands_sep, dec_point, null_default="") { + number = (number + '').replace(/[^0-9+-Ee.]/g, ''); + var n = !isFinite(+number) ? 0 : +number, + prec = !isFinite(+decimals) ? 0 : Math.abs(decimals), + sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep, + dec = (typeof dec_point === 'undefined') ? '.' : dec_point, + s = '', + toFixedFix = function (n, prec) { + var k = Math.pow(10, prec); + return '' + Math.round(n * k) / k; + }; + + s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.'); + var re = /(-?\d+)(\d{3})/; + if(sep.length > 0){ + while (re.test(s[0])) { + s[0] = s[0].replace(re, "$1" + sep + "$2"); + } + } + if ((s[1] || '').length < prec) { + s[1] = s[1] || ''; + s[1] += new Array(prec - s[1].length + 1).join(tail_add); + } + if((s[1] || '').length == 0){ + return s[0] + } + return s.join(dec); +} +// number:要格式化的数字, +// decimals:保留几位小数, 默认0位 +// dec_point:小数点符号, 默认 . +// thousands_sep:千分位符号 默认 , +// tail_add: 小数点后面数据是否添加0补足位数, 默认空字符 +// null_default: 如果为空的值, 默认空字符 +export function formatNumber(number, decimals, tail_add, thousands_sep, dec_point, null_default) { + if(isNull(number) || isNull(String(number).trim())){return null_default;} + if(!isNumber(String(number).trim())){return number;} + number = String(number).trim(); + return numberFormat(number, decimals, tail_add, thousands_sep, dec_point, null_default); +} +// thousands_sep:千分位符号 默认空字符 +export function formatPercent(number, decimals, tail_add, thousands_sep="", dec_point, null_default) { + if(isNull(number) || isNull(String(number).trim().replaceAll(",", ""))){return null_default;} + if(!isNumber(String(number).trim().replaceAll(",", ""))){return number;} + number = String(number).trim().replaceAll(",", ""); + let value = numberFormat(number*100, decimals, tail_add, thousands_sep, dec_point, null_default); + if(value){ + return value + "%"; + } + return ""; +} + +// get brower +export function GetCurrentBrowser () { + let ua = navigator.userAgent.toLocaleLowerCase() + let browserType = null + if (ua.match(/msie/) != null || ua.match(/trident/) != null) { + browserType = 'IE' + } else if (ua.match(/firefox/) != null) { + browserType = 'firefox' + } else if (ua.match(/ucbrowser/) != null) { + browserType = 'UC' + } else if (ua.match(/opera/) != null || ua.match(/opr/) != null) { + browserType = 'opera' + } else if (ua.match(/bidubrowser/) != null) { + browserType = 'baidu' + } else if (ua.match(/metasr/) != null) { + browserType = 'sougou' + } else if (ua.match(/tencenttraveler/) != null || ua.match(/qqbrowse/) != null) { + browserType = 'QQ' + } else if (ua.match(/maxthon/) != null) { + browserType = 'maxthon' + } else if (ua.match(/chrome/) != null) { + var is360 = _mime('type', 'application/vnd.chromium.remoting-viewer') + if (is360) { + browserType = '360' + } else { + browserType = 'chrome' + } + } else if (ua.match(/safari/) != null) { + browserType = 'Safari' + } else { + browserType = 'others' + } + return browserType +} + +function _mime (option, value) { + var mimeTypes = navigator.mimeTypes + for (var mt in mimeTypes) { + if (mimeTypes[mt][option] === value) { + return true + } + } + return false +} + +// get os +export function GetOs () { + let sUserAgent = navigator.userAgent.toLocaleLowerCase() + let isWin = (navigator.platform.toLocaleLowerCase() == 'win32') || (navigator.platform.toLocaleLowerCase() === 'windows') + let isMac = (navigator.platform.toLocaleLowerCase() === 'mac68k') || (navigator.platform.toLocaleLowerCase() === 'macppc') + || (navigator.platform === 'macintosh') || (navigator.platform.toLocaleLowerCase() === 'macintel') + if (isMac) return 'Mac' + var isUnix = (navigator.platform === 'x11') && !isWin && !isMac + if (isUnix) return 'Unix' + var isLinux = (String(navigator.platform.toLocaleLowerCase()).indexOf('linux') > -1) + if (isLinux) return 'Linux' + if (isWin) { + var isWin2K = sUserAgent.indexOf('windows nt 5.0') > -1 || sUserAgent.indexOf('windows 2000') > -1 + if (isWin2K) return 'Win2000' + var isWinXP = sUserAgent.indexOf('windows nt 5.1') > -1 || sUserAgent.indexOf('windows xp') > -1 + if (isWinXP) return 'WinXP' + var isWin2003 = sUserAgent.indexOf('windows nt 5.2') > -1 || sUserAgent.indexOf('windows 2003') > -1 + if (isWin2003) return 'Win2003' + var isWinVista = sUserAgent.indexOf('windows nt 6.0') > -1 || sUserAgent.indexOf('windows vista') > -1 + if (isWinVista) return 'WinVista' + var isWin7 = sUserAgent.indexOf('windows nt 6.1') > -1 || sUserAgent.indexOf('windows 7') > -1 + if (isWin7) return 'Win7' + var isWin8 = sUserAgent.indexOf('windows nt 6.2') > -1 || sUserAgent.indexOf('windows 8') > -1 + if (isWin8) return 'Win8' + var isWin10 = sUserAgent.indexOf('windows nt 10.0') > -1 || sUserAgent.indexOf('windows nt 6.4') > -1 || sUserAgent.indexOf('windows 10') > -1 + if (isWin10) return 'Win10' + var isSimulator = sUserAgent.indexOf('linux') > -1 && sUserAgent.indexOf('android') > -1 + if (isSimulator) return 'Win手机模拟器' + return navigator.platform + } + if (sUserAgent.indexOf('android') > -1) return 'Android' + if (sUserAgent.indexOf('iphone') > -1) return 'iPhone' + if (sUserAgent.indexOf('symbianos') > -1) return 'SymbianOS' + if (sUserAgent.indexOf('windows phone') > -1) return 'Windows Phone' + if (sUserAgent.indexOf('ipad') > -1) return 'iPad' + if (sUserAgent.indexOf('ipod') > -1) return 'iPod' + return navigator.platform +} + +export function getRandom(len){ + let data = Math.random() + ""; + let index = 2; + while(data[index] == 0){ + index++; + } + return data.substr(index, len); +} + +export function getLongRandom(len){ + if(len <= 16){ + return getRandom(len) + } + let data = Math.random() + ""; + let index = 2; + while(data[index] == 0){ + index++; + } + return parseTime(Date.now(), '{y}{m}{d}{h}{i}{s}') + "" + data.substr(index, len-16); +} + +export function moveInArray(array, fromIndex, toIndex) { + const element = array.splice(fromIndex, 1)[0]; + array.splice(toIndex, 0, element); +} + +export function jsonCharBigInt(s){ + if(typeof s !== 'string'){ + return s + } + let re = /([\\]?['|"]{1})(\w+[\\]?['|"]{1}[ |\n|r|\t]*:[ |\n|r|\t]*)([-]?\d{15,})/g + return s.replaceAll(re, "$1$2$1$3$1") +} + +export function jsonParse(s){ + if(typeof s !== 'string'){ + return s + } + let re = /([\\]?['|"]{1})(\w+[\\]?['|"]{1}[ |\n|r|\t]*:[ |\n|r|\t]*)([-]?\d{15,})/g + return JSON.parse(s.replaceAll(re, "$1$2$1$3$1")) +} \ No newline at end of file diff --git a/utils/nodeId.js b/utils/nodeId.js new file mode 100644 index 0000000..cceab2e --- /dev/null +++ b/utils/nodeId.js @@ -0,0 +1,13 @@ +const NodeIdKey = 'App-Node-Id' + +export function getNodeId() { + return uni.getStorageSync(NodeIdKey) +} + +export function setNodeId(nodeId) { + return uni.setStorageSync(NodeIdKey, nodeId) +} + +export function removeNodeId() { + return uni.removeStorageSync(NodeIdKey) +} diff --git a/utils/queryByDiy.js b/utils/queryByDiy.js new file mode 100644 index 0000000..bbc19ed --- /dev/null +++ b/utils/queryByDiy.js @@ -0,0 +1,17 @@ +import request from '@/utils/request' + +export function diyApi(url, data = {}, method = "POST", contentType = 'json') { + return request({ + 'url': url, + 'method': method, + 'data': data + }) +} + +export function diyApiGet(url, data = {}, method = "GET", contentType = 'json') { + return request({ + 'url': url, + 'method': method, + 'params': data + }) +} \ No newline at end of file diff --git a/utils/request.js b/utils/request.js new file mode 100644 index 0000000..37bf244 --- /dev/null +++ b/utils/request.js @@ -0,0 +1,106 @@ +import store from '@/store' +import { getToken } from '@/utils/token' +import errorCode from '@/utils/errorCode' +import { getSessionCache, setSessionCache } from '@/utils/cache' +import { toast, showConfirm, tansParams } from '@/utils/requestTool' + +let timeout = 10000 +const baseUrl = import.meta.env.VITE_APP_BASE_URL + +const request = config => { + // 是否需要设置 token + const isToken = (config.headers || {}).isToken === false + // 是否需要防止数据重复提交 + const isRepeatSubmit = (config.headers || {}).repeatSubmit === false + config.header = config.header || {} + if (getToken() && !isToken) { + config.header['Authorization'] = 'Vrapile ' + getToken() + } + // get请求映射params参数 + if (config.params) { + let url = config.url + '?' + tansParams(config.params) + url = url.slice(0, -1) + config.url = url + } + if (!isRepeatSubmit) { + const requestObj = { + url: config.url, + data: typeof config.data === 'object' ? JSON.stringify(config.data) : config.data, + time: new Date().getTime() + } + const sessionObj = getSessionCache() + if (sessionObj === undefined || sessionObj === null || sessionObj === '') { + setSessionCache(requestObj) + } else { + const s_url = sessionObj.url; // 请求地址 + const s_data = sessionObj.data; // 请求数据 + const s_time = sessionObj.time; // 请求时间 + const interval = 1000; // 间隔时间(ms),小于此时间视为重复提交 + if (s_data === requestObj.data && requestObj.time - s_time < interval && s_url === requestObj.url) { + const message = '数据正在处理,请勿重复提交:' + s_url; + console.warn(`[${s_url}]: ` + message) + return Promise.reject(new Error(message)) + } else { + setSessionCache(requestObj) + } + } + } + return new Promise((resolve, reject) => { + uni.request({ + method: config.method || 'get', + timeout: config.timeout || timeout, + url: config.baseUrl || baseUrl + config.url, + data: config.data, + header: config.header, + dataType: 'json' + }).then(res => { + const code = res.data.code || res.data.status || 200 + const msg = errorCode[code] || res.data.msg || errorCode['default'] + + if (code === 401) { + // 密码登录的,实现自动重新登录 + let loginInfo = store.state.user.loginInfo; + if(loginInfo && loginInfo.loginType == 0){ + store.dispatch('Login', { + loginType: loginInfo.loginType, + userName: loginInfo.userName, + password: loginInfo.password, + registerFlag: "N" + }).then(() => { + store.dispatch('GetInfo'); + }) + reject('无效的会话,或者会话已过期,已重新登录。') + }else{ + showConfirm('登录状态已过期,您可以继续留在该页面,或者重新登录?').then(res => { + if (res.confirm) { + uni.reLaunch({ url: '/pages/user/login' }) + } + }) + reject('无效的会话,或者会话已过期,请重新登录。') + } + } else if (code === 500) { + toast(msg) + reject('500') + } else if (code !== 200) { + toast(msg) + reject(code) + } + resolve(res.data) + }).catch(error => { + let { message } = error + if (message && message === 'Network Error') { + message = '后端接口连接异常' + } else if (message && message.includes('timeout')) { + message = '系统接口请求超时' + } else if (message && message.includes('Request failed with status code')) { + message = '系统接口' + message.substr(message.length - 3) + '异常' + }else{ + message = '系统繁忙' + } + toast(message) + reject(error) + }) + }) +} + +export default request diff --git a/utils/requestTool.js b/utils/requestTool.js new file mode 100644 index 0000000..00d4137 --- /dev/null +++ b/utils/requestTool.js @@ -0,0 +1,54 @@ +/** +* 显示消息提示框 +* @param content 提示的标题 +*/ +export function toast(content) { + uni.showToast({ + icon: 'none', + title: content + }) +} + +/** +* 显示模态弹窗 +* @param content 提示的标题 +*/ +export function showConfirm(content) { + return new Promise((resolve, reject) => { + uni.showModal({ + title: '提示', + content: content, + cancelText: '取消', + confirmText: '确定', + success: function(res) { + resolve(res) + } + }) + }) +} + +/** +* 参数处理 +* @param params 参数 +*/ +export function tansParams(params) { + let result = '' + for (const propName of Object.keys(params)) { + const value = params[propName] + var part = encodeURIComponent(propName) + "=" + if (value !== null && value !== "" && typeof (value) !== "undefined") { + if (typeof value === 'object') { + for (const key of Object.keys(value)) { + if (value[key] !== null && value[key] !== "" && typeof (value[key]) !== 'undefined') { + let params = propName + '[' + key + ']' + var subPart = encodeURIComponent(params) + "=" + result += subPart + encodeURIComponent(value[key]) + "&" + } + } + } else { + result += part + encodeURIComponent(value) + "&" + } + } + } + return result +} \ No newline at end of file diff --git a/utils/storage.js b/utils/storage.js new file mode 100644 index 0000000..1ab33d1 --- /dev/null +++ b/utils/storage.js @@ -0,0 +1,32 @@ +import constant from './constant' + +// 存储变量名 +let storageKey = 'storage_data' + +// 存储节点变量名 +let storageNodeKeys = [constant.avatar, constant.name, constant.userInfo, constant.loginInfo] + +const storage = { + set: function(key, value) { + if (storageNodeKeys.indexOf(key) != -1) { + let tmp = uni.getStorageSync(storageKey) + tmp = tmp ? tmp : {} + tmp[key] = value + uni.setStorageSync(storageKey, tmp) + } + }, + get: function(key) { + let storageData = uni.getStorageSync(storageKey) || {} + return storageData[key] || "" + }, + remove: function(key) { + let storageData = uni.getStorageSync(storageKey) || {} + delete storageData[key] + uni.setStorageSync(storageKey, storageData) + }, + clean: function() { + uni.removeStorageSync(storageKey) + } +} + +export default storage diff --git a/utils/token.js b/utils/token.js new file mode 100644 index 0000000..9a7cc04 --- /dev/null +++ b/utils/token.js @@ -0,0 +1,13 @@ +const TokenKey = 'App-Token' + +export function getToken() { + return uni.getStorageSync(TokenKey) +} + +export function setToken(token) { + return uni.setStorageSync(TokenKey, token) +} + +export function removeToken() { + return uni.removeStorageSync(TokenKey) +}