├── .gitignore ├── README.md ├── babel.config.js ├── doc └── images │ ├── index.jpg │ ├── like-list.png │ ├── like.jpg │ ├── mime.jpg │ ├── preview.png │ └── search.png ├── jest.config.js ├── package.json ├── postcss.config.js ├── public └── index.html ├── src ├── App.vue ├── api │ ├── index.js │ └── product.js ├── components │ ├── List │ │ ├── Item.vue │ │ └── index.vue │ ├── ListBottomTips.vue │ ├── Navbar.vue │ ├── SearchInput.vue │ ├── TabBar.vue │ ├── Tag │ │ ├── TagGroup.vue │ │ └── index.vue │ └── ZButton.vue ├── main.js ├── manifest.json ├── pages.json ├── pages │ ├── index │ │ └── index.vue │ ├── like │ │ ├── like.vue │ │ └── list.vue │ ├── mine │ │ └── mine.vue │ └── search │ │ └── search.vue ├── static │ ├── dpx.png │ ├── like │ │ ├── expand.png │ │ └── fold.png │ ├── logo.png │ ├── navbar │ │ └── back.png │ ├── tabbar │ │ ├── home-active.png │ │ ├── home.png │ │ ├── like-active.png │ │ ├── like.png │ │ ├── mine-active.png │ │ ├── mine.png │ │ ├── search-active.png │ │ └── search.png │ └── welcome │ │ ├── game-large.svg │ │ └── game-middle.svg ├── style │ ├── index.less │ ├── layout.less │ └── variable.less ├── uni.scss └── utils │ ├── clipboard.js │ ├── index.js │ ├── request.js │ ├── sha1.js │ └── sign.js ├── temp.ts ├── tsconfig.json ├── vue.config.js └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules/ 3 | unpackage/ 4 | dist/ 5 | 6 | # local env files 7 | .env.local 8 | .env.*.local 9 | 10 | # Log files 11 | npm-debug.log* 12 | yarn-debug.log* 13 | yarn-error.log* 14 | 15 | # Editor directories and files 16 | .project 17 | .idea 18 | .vscode 19 | *.suo 20 | *.ntvs* 21 | *.njsproj 22 | *.sln 23 | *.sw* 24 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ZGame 2 | Vue3 + uniapp 实现的一个游戏筛选案例 3 | 4 | # Preview 5 | ![预览图](./doc/images/preview.png) 6 | ## Project setup 7 | ``` 8 | yarn install 9 | ``` 10 | 11 | ### Compiles and hot-reloads for development 12 | ``` 13 | yarn serve 14 | ``` 15 | 16 | ### Compiles and minifies for production 17 | ``` 18 | yarn build 19 | ``` 20 | 21 | ### Customize configuration 22 | See [Configuration Reference](https://cli.vuejs.org/config/). 23 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | const plugins = [] 2 | 3 | if (process.env.UNI_OPT_TREESHAKINGNG) { 4 | plugins.push(require('@dcloudio/vue-cli-plugin-uni-optimize/packages/babel-plugin-uni-api/index.js')) 5 | } 6 | 7 | if ( 8 | ( 9 | process.env.UNI_PLATFORM === 'app-plus' && 10 | process.env.UNI_USING_V8 11 | ) || 12 | ( 13 | process.env.UNI_PLATFORM === 'h5' && 14 | process.env.UNI_H5_BROWSER === 'builtin' 15 | ) 16 | ) { 17 | const path = require('path') 18 | 19 | const isWin = /^win/.test(process.platform) 20 | 21 | const normalizePath = path => (isWin ? path.replace(/\\/g, '/') : path) 22 | 23 | const input = normalizePath(process.env.UNI_INPUT_DIR) 24 | try { 25 | plugins.push([ 26 | require('@dcloudio/vue-cli-plugin-hbuilderx/packages/babel-plugin-console'), 27 | { 28 | file (file) { 29 | file = normalizePath(file) 30 | if (file.indexOf(input) === 0) { 31 | return path.relative(input, file) 32 | } 33 | return false 34 | } 35 | } 36 | ]) 37 | } catch (e) {} 38 | } 39 | 40 | process.UNI_LIBRARIES = process.UNI_LIBRARIES || ['@dcloudio/uni-ui'] 41 | process.UNI_LIBRARIES.forEach(libraryName => { 42 | plugins.push([ 43 | 'import', 44 | { 45 | 'libraryName': libraryName, 46 | 'customName': (name) => { 47 | return `${libraryName}/lib/${name}/${name}` 48 | } 49 | } 50 | ]) 51 | }) 52 | module.exports = { 53 | presets: [ 54 | [ 55 | '@vue/app', 56 | { 57 | useBuiltIns: process.env.UNI_PLATFORM === 'h5' ? 'usage' : 'entry' 58 | } 59 | ] 60 | ], 61 | plugins 62 | } 63 | -------------------------------------------------------------------------------- /doc/images/index.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/doc/images/index.jpg -------------------------------------------------------------------------------- /doc/images/like-list.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/doc/images/like-list.png -------------------------------------------------------------------------------- /doc/images/like.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/doc/images/like.jpg -------------------------------------------------------------------------------- /doc/images/mime.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/doc/images/mime.jpg -------------------------------------------------------------------------------- /doc/images/preview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/doc/images/preview.png -------------------------------------------------------------------------------- /doc/images/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/doc/images/search.png -------------------------------------------------------------------------------- /jest.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | globalTeardown: '@dcloudio/uni-automator/dist/teardown.js', 3 | testEnvironment: '@dcloudio/uni-automator/dist/environment.js', 4 | testEnvironmentOptions: {}, 5 | testTimeout: 15000, 6 | reporters: [ 7 | 'default' 8 | ], 9 | watchPathIgnorePatterns: ['/node_modules/', '/dist/', '/.git/'], 10 | moduleFileExtensions: ['js', 'json'], 11 | rootDir: __dirname, 12 | testMatch: ['/src/**/*test.[jt]s?(x)'], 13 | testPathIgnorePatterns: ['/node_modules/'] 14 | } 15 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "mp-app", 3 | "version": "1.0.0", 4 | "private": true, 5 | "scripts": { 6 | "serve": "npm run dev:h5", 7 | "build": "npm run build:h5", 8 | "dev": "npm run dev:mp-weixin", 9 | "build:app-plus": "cross-env NODE_ENV=production UNI_PLATFORM=app-plus vue-cli-service uni-build", 10 | "build:custom": "cross-env NODE_ENV=production uniapp-cli custom", 11 | "build:h5": "cross-env NODE_ENV=production UNI_PLATFORM=h5 vue-cli-service uni-build", 12 | "build:mp-360": "cross-env NODE_ENV=production UNI_PLATFORM=mp-360 vue-cli-service uni-build", 13 | "build:mp-alipay": "cross-env NODE_ENV=production UNI_PLATFORM=mp-alipay vue-cli-service uni-build", 14 | "build:mp-baidu": "cross-env NODE_ENV=production UNI_PLATFORM=mp-baidu vue-cli-service uni-build", 15 | "build:mp-kuaishou": "cross-env NODE_ENV=production UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build", 16 | "build:mp-qq": "cross-env NODE_ENV=production UNI_PLATFORM=mp-qq vue-cli-service uni-build", 17 | "build:mp-toutiao": "cross-env NODE_ENV=production UNI_PLATFORM=mp-toutiao vue-cli-service uni-build", 18 | "build:mp-weixin": "cross-env NODE_ENV=production UNI_PLATFORM=mp-weixin vue-cli-service uni-build", 19 | "build:quickapp-native": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-native vue-cli-service uni-build", 20 | "build:quickapp-webview": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview vue-cli-service uni-build", 21 | "build:quickapp-webview-huawei": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build", 22 | "build:quickapp-webview-union": "cross-env NODE_ENV=production UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build", 23 | "dev:app-plus": "cross-env NODE_ENV=development UNI_PLATFORM=app-plus vue-cli-service uni-build --watch", 24 | "dev:custom": "cross-env NODE_ENV=development uniapp-cli custom", 25 | "dev:h5": "cross-env NODE_ENV=development UNI_PLATFORM=h5 vue-cli-service uni-serve", 26 | "dev:mp-360": "cross-env NODE_ENV=development UNI_PLATFORM=mp-360 vue-cli-service uni-build --watch", 27 | "dev:mp-alipay": "cross-env NODE_ENV=development UNI_PLATFORM=mp-alipay vue-cli-service uni-build --watch", 28 | "dev:mp-baidu": "cross-env NODE_ENV=development UNI_PLATFORM=mp-baidu vue-cli-service uni-build --watch", 29 | "dev:mp-kuaishou": "cross-env NODE_ENV=development UNI_PLATFORM=mp-kuaishou vue-cli-service uni-build --watch", 30 | "dev:mp-qq": "cross-env NODE_ENV=development UNI_PLATFORM=mp-qq vue-cli-service uni-build --watch", 31 | "dev:mp-toutiao": "cross-env NODE_ENV=development UNI_PLATFORM=mp-toutiao vue-cli-service uni-build --watch", 32 | "dev:mp-weixin": "cross-env NODE_ENV=development UNI_PLATFORM=mp-weixin vue-cli-service uni-build --watch", 33 | "dev:quickapp-native": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-native vue-cli-service uni-build --watch", 34 | "dev:quickapp-webview": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview vue-cli-service uni-build --watch", 35 | "dev:quickapp-webview-huawei": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-huawei vue-cli-service uni-build --watch", 36 | "dev:quickapp-webview-union": "cross-env NODE_ENV=development UNI_PLATFORM=quickapp-webview-union vue-cli-service uni-build --watch", 37 | "info": "node node_modules/@dcloudio/vue-cli-plugin-uni/commands/info.js", 38 | "serve:quickapp-native": "node node_modules/@dcloudio/uni-quickapp-native/bin/serve.js", 39 | "test:android": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=android jest -i", 40 | "test:h5": "cross-env UNI_PLATFORM=h5 jest -i", 41 | "test:ios": "cross-env UNI_PLATFORM=app-plus UNI_OS_NAME=ios jest -i", 42 | "test:mp-baidu": "cross-env UNI_PLATFORM=mp-baidu jest -i", 43 | "test:mp-weixin": "cross-env UNI_PLATFORM=mp-weixin jest -i" 44 | }, 45 | "dependencies": { 46 | "@dcloudio/uni-app-plus": "^2.0.0", 47 | "@dcloudio/uni-h5": "^2.0.0", 48 | "@dcloudio/uni-helper-json": "*", 49 | "@dcloudio/uni-i18n": "^2.0.0", 50 | "@dcloudio/uni-mp-360": "^2.0.0", 51 | "@dcloudio/uni-mp-alipay": "^2.0.0", 52 | "@dcloudio/uni-mp-baidu": "^2.0.0", 53 | "@dcloudio/uni-mp-kuaishou": "^2.0.0", 54 | "@dcloudio/uni-mp-qq": "^2.0.0", 55 | "@dcloudio/uni-mp-toutiao": "^2.0.0", 56 | "@dcloudio/uni-mp-vue": "^2.0.0", 57 | "@dcloudio/uni-mp-weixin": "^2.0.0", 58 | "@dcloudio/uni-quickapp-native": "^2.0.0", 59 | "@dcloudio/uni-quickapp-webview": "^2.0.0", 60 | "@dcloudio/uni-stat": "^2.0.0", 61 | "@vue/shared": "^3.0.0", 62 | "axios": "^0.24.0", 63 | "core-js": "^3.6.5", 64 | "flyio": "^0.6.2", 65 | "less": "^4.1.2", 66 | "less-loader": "^7.0.0", 67 | "regenerator-runtime": "^0.12.1", 68 | "vue": "^3.0.0", 69 | "vuex": "^3.2.0" 70 | }, 71 | "devDependencies": { 72 | "@dcloudio/types": "*", 73 | "@dcloudio/uni-automator": "^2.0.0", 74 | "@dcloudio/uni-cli-shared": "^2.0.0", 75 | "@dcloudio/uni-migration": "^2.0.0", 76 | "@dcloudio/uni-template-compiler": "^2.0.0", 77 | "@dcloudio/vue-cli-plugin-hbuilderx": "^2.0.0", 78 | "@dcloudio/vue-cli-plugin-uni": "^2.0.0", 79 | "@dcloudio/vue-cli-plugin-uni-optimize": "^2.0.0", 80 | "@dcloudio/webpack-uni-mp-loader": "^2.0.0", 81 | "@dcloudio/webpack-uni-pages-loader": "^2.0.0", 82 | "@vue/cli-plugin-babel": "~4.5.0", 83 | "@vue/cli-service": "~4.5.0", 84 | "@vue/compiler-sfc": "^3.0.0", 85 | "babel-plugin-import": "^1.11.0", 86 | "cross-env": "^7.0.2", 87 | "jest": "^25.4.0", 88 | "mini-types": "*", 89 | "miniprogram-api-typings": "*", 90 | "postcss-comment": "^2.0.0" 91 | }, 92 | "browserslist": [ 93 | "Android >= 4", 94 | "ios >= 8" 95 | ], 96 | "uni-app": { 97 | "scripts": {} 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | const path = require('path') 2 | module.exports = { 3 | parser: require('postcss-comment'), 4 | plugins: [ 5 | require('postcss-import')({ 6 | resolve (id, basedir, importOptions) { 7 | if (id.startsWith('~@/')) { 8 | return path.resolve(process.env.UNI_INPUT_DIR, id.substr(3)) 9 | } else if (id.startsWith('@/')) { 10 | return path.resolve(process.env.UNI_INPUT_DIR, id.substr(2)) 11 | } else if (id.startsWith('/') && !id.startsWith('//')) { 12 | return path.resolve(process.env.UNI_INPUT_DIR, id.substr(1)) 13 | } 14 | return id 15 | } 16 | }), 17 | require('autoprefixer')({ 18 | remove: process.env.UNI_PLATFORM !== 'h5' 19 | }), 20 | require('@dcloudio/vue-cli-plugin-uni/packages/postcss') 21 | ] 22 | } 23 | -------------------------------------------------------------------------------- /public/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | <%= htmlWebpackPlugin.options.title %> 9 | 10 | 17 | 18 | 19 | 20 | 21 | 24 |
25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /src/App.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 18 | -------------------------------------------------------------------------------- /src/api/index.js: -------------------------------------------------------------------------------- 1 | import { request } from '@/utils/request' 2 | export * from './product' 3 | 4 | // 清单 restful 5 | export function inventoryRestful(data = {}, action = 'GET') { 6 | let url = '/inventory' 7 | if (action === 'PUT') { 8 | url += `/${data.id}` 9 | const newData = { ...data } 10 | delete newData.id 11 | data = { $set: newData } 12 | } 13 | return request({ 14 | url, 15 | method: action, 16 | data 17 | }) 18 | } -------------------------------------------------------------------------------- /src/api/product.js: -------------------------------------------------------------------------------- 1 | import { request } from '@/utils/request' 2 | 3 | const CLASS_NAME = 'product' 4 | 5 | export function productRestful(data, action = 'GET') { 6 | let url = `/${CLASS_NAME}` 7 | if (action === 'PUT') { 8 | url += `/${data.id}` 9 | const newData = { ...data } 10 | delete newData.id 11 | data = { $set: newData } 12 | } 13 | return request({ 14 | url, 15 | method: action, 16 | data 17 | }) 18 | } 19 | 20 | export function fetchProductTypeAction() { 21 | return request({ url: '/type', data: { limit: -1 } }) 22 | } -------------------------------------------------------------------------------- /src/components/List/Item.vue: -------------------------------------------------------------------------------- 1 | 32 | 33 | 120 | 121 | 230 | -------------------------------------------------------------------------------- /src/components/List/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | 18 | 22 | -------------------------------------------------------------------------------- /src/components/ListBottomTips.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 21 | 22 | 30 | -------------------------------------------------------------------------------- /src/components/Navbar.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 38 | 39 | 61 | -------------------------------------------------------------------------------- /src/components/SearchInput.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 28 | 29 | -------------------------------------------------------------------------------- /src/components/TabBar.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 76 | 77 | 101 | -------------------------------------------------------------------------------- /src/components/Tag/TagGroup.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 19 | 20 | -------------------------------------------------------------------------------- /src/components/Tag/index.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 21 | 22 | -------------------------------------------------------------------------------- /src/components/ZButton.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 19 | -------------------------------------------------------------------------------- /src/main.js: -------------------------------------------------------------------------------- 1 | import { createApp } from 'vue' 2 | import App from './App.vue' 3 | import './style/index.less' 4 | 5 | const app = createApp(App) 6 | app.mount() 7 | -------------------------------------------------------------------------------- /src/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "", 3 | "appid": "", 4 | "description": "", 5 | "versionName": "1.0.0", 6 | "versionCode": "100", 7 | "transformPx": false, 8 | "app-plus": { 9 | "usingComponents": true, 10 | "splashscreen": { 11 | "alwaysShowBeforeRender": true, 12 | "waiting": true, 13 | "autoclose": true, 14 | "delay": 0 15 | }, 16 | "modules": { 17 | 18 | }, 19 | "distribute": { 20 | "android": { 21 | "permissions": ["", 22 | "", 23 | "", 24 | "", 25 | "", 26 | "", 27 | "", 28 | "", 29 | "", 30 | "", 31 | "", 32 | "", 33 | "", 34 | "", 35 | "", 36 | "", 37 | "", 38 | "", 39 | "", 40 | "", 41 | "", 42 | "" 43 | ] 44 | }, 45 | "ios": { 46 | 47 | }, 48 | "sdkConfigs": { 49 | 50 | } 51 | } 52 | }, 53 | "quickapp": { 54 | 55 | }, 56 | "mp-weixin": { 57 | "appid": "wxb52b3bf4e0fd2f88", 58 | "setting": { 59 | "urlCheck": false 60 | }, 61 | "usingComponents": true 62 | }, 63 | "mp-alipay" : { 64 | "usingComponents" : true 65 | }, 66 | "mp-baidu" : { 67 | "usingComponents" : true 68 | }, 69 | "mp-toutiao" : { 70 | "usingComponents" : true 71 | }, 72 | "mp-qq" : { 73 | "usingComponents" : true 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/pages.json: -------------------------------------------------------------------------------- 1 | { 2 | "pages": [ 3 | { 4 | "path": "pages/search/search", 5 | "style": { 6 | "navigationBarTitleText": "寻找宝贝", 7 | "backgroundColor": "#DBE4F3" 8 | } 9 | }, 10 | { 11 | "path": "pages/like/like", 12 | "style": { 13 | "navigationBarTitleText": "", 14 | "backgroundColor": "#DBE4F3" 15 | } 16 | }, 17 | { 18 | "path": "pages/like/list", 19 | "style": { 20 | "navigationBarTitleText": "我想要", 21 | "backgroundColor": "#DBE4F3", 22 | "navigationStyle": "custom", 23 | "enablePullDownRefresh": true 24 | } 25 | }, 26 | { 27 | "path": "pages/index/index", 28 | "style": { 29 | "navigationBarTitleText": "", 30 | "backgroundColor": "#DBE4F3" 31 | } 32 | }, 33 | { 34 | "path": "pages/mine/mine", 35 | "style": { 36 | "navigationBarTitleText": "我的", 37 | "backgroundColor": "#DBE4F3" 38 | } 39 | } 40 | ], 41 | "globalStyle": { 42 | "navigationBarTextStyle": "black", 43 | "navigationBarTitleText": "uni-app", 44 | "navigationBarBackgroundColor": "#DBE4F3", 45 | "backgroundColor": "#F8F8F8" 46 | }, 47 | "tabBar": { 48 | "selectedColor": "#6C63FF", 49 | "color": "#999999", 50 | "backgroundColor": "#DBE4F3", 51 | "borderStyle": "white", 52 | "list": [ 53 | { 54 | "text": "首页", 55 | "pagePath": "pages/index/index", 56 | "iconPath": "/static/tabbar/home.png", 57 | "selectedIconPath": "/static/tabbar/home-active.png" 58 | }, 59 | { 60 | "text": "搜索", 61 | "pagePath": "pages/search/search", 62 | "iconPath": "/static/tabbar/search.png", 63 | "selectedIconPath": "/static/tabbar/search-active.png" 64 | }, 65 | { 66 | "text": "想要", 67 | "pagePath": "pages/like/like", 68 | "iconPath": "/static/tabbar/like.png", 69 | "selectedIconPath": "/static/tabbar/like-active.png" 70 | }, 71 | { 72 | "text": "我的", 73 | "pagePath": "pages/mine/mine", 74 | "iconPath": "/static/tabbar/mine.png", 75 | "selectedIconPath": "/static/tabbar/mine-active.png" 76 | } 77 | ] 78 | } 79 | } -------------------------------------------------------------------------------- /src/pages/index/index.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 73 | 74 | 195 | -------------------------------------------------------------------------------- /src/pages/like/like.vue: -------------------------------------------------------------------------------- 1 | 66 | 67 | 348 | 349 | 496 | -------------------------------------------------------------------------------- /src/pages/like/list.vue: -------------------------------------------------------------------------------- 1 | 76 | 216 | 217 | -------------------------------------------------------------------------------- /src/pages/mine/mine.vue: -------------------------------------------------------------------------------- 1 | 26 | 27 | 59 | 60 | 155 | -------------------------------------------------------------------------------- /src/pages/search/search.vue: -------------------------------------------------------------------------------- 1 | 51 | 52 | 213 | 214 | 255 | -------------------------------------------------------------------------------- /src/static/dpx.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/dpx.png -------------------------------------------------------------------------------- /src/static/like/expand.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/like/expand.png -------------------------------------------------------------------------------- /src/static/like/fold.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/like/fold.png -------------------------------------------------------------------------------- /src/static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/logo.png -------------------------------------------------------------------------------- /src/static/navbar/back.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/navbar/back.png -------------------------------------------------------------------------------- /src/static/tabbar/home-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/tabbar/home-active.png -------------------------------------------------------------------------------- /src/static/tabbar/home.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/tabbar/home.png -------------------------------------------------------------------------------- /src/static/tabbar/like-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/tabbar/like-active.png -------------------------------------------------------------------------------- /src/static/tabbar/like.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/tabbar/like.png -------------------------------------------------------------------------------- /src/static/tabbar/mine-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/tabbar/mine-active.png -------------------------------------------------------------------------------- /src/static/tabbar/mine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/tabbar/mine.png -------------------------------------------------------------------------------- /src/static/tabbar/search-active.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/tabbar/search-active.png -------------------------------------------------------------------------------- /src/static/tabbar/search.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/src/static/tabbar/search.png -------------------------------------------------------------------------------- /src/static/welcome/game-large.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/static/welcome/game-middle.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/style/index.less: -------------------------------------------------------------------------------- 1 | @import './variable.less'; 2 | @import './layout.less'; -------------------------------------------------------------------------------- /src/style/layout.less: -------------------------------------------------------------------------------- 1 | .app-page { 2 | min-height: calc(100vh - 60upx); 3 | width: calc(100% - 80upx); 4 | background-color: @bg-color; 5 | padding: 40upx 40upx 20upx; 6 | // padding-top: calc(64px + 40upx); 7 | } -------------------------------------------------------------------------------- /src/style/variable.less: -------------------------------------------------------------------------------- 1 | @bg-color: #DBE4F3; -------------------------------------------------------------------------------- /src/uni.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * 这里是uni-app内置的常用样式变量 3 | * 4 | * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 5 | * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App 6 | * 7 | */ 8 | 9 | /** 10 | * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 11 | * 12 | * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 13 | */ 14 | 15 | /* 颜色变量 */ 16 | 17 | /* 行为相关颜色 */ 18 | $uni-color-primary: #007aff; 19 | $uni-color-success: #4cd964; 20 | $uni-color-warning: #f0ad4e; 21 | $uni-color-error: #dd524d; 22 | 23 | /* 文字基本颜色 */ 24 | $uni-text-color:#333;//基本色 25 | $uni-text-color-inverse:#fff;//反色 26 | $uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 27 | $uni-text-color-placeholder: #808080; 28 | $uni-text-color-disable:#c0c0c0; 29 | 30 | /* 背景颜色 */ 31 | $uni-bg-color:#ffffff; 32 | $uni-bg-color-grey:#f8f8f8; 33 | $uni-bg-color-hover:#f1f1f1;//点击状态颜色 34 | $uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 35 | 36 | /* 边框颜色 */ 37 | $uni-border-color:#c8c7cc; 38 | 39 | /* 尺寸变量 */ 40 | 41 | /* 文字尺寸 */ 42 | $uni-font-size-sm:24upx; 43 | $uni-font-size-base:28upx; 44 | $uni-font-size-lg:32upx; 45 | 46 | /* 图片尺寸 */ 47 | $uni-img-size-sm:40upx; 48 | $uni-img-size-base:52upx; 49 | $uni-img-size-lg:80upx; 50 | 51 | /* Border Radius */ 52 | $uni-border-radius-sm: 4upx; 53 | $uni-border-radius-base: 6upx; 54 | $uni-border-radius-lg: 12upx; 55 | $uni-border-radius-circle: 50%; 56 | 57 | /* 水平间距 */ 58 | $uni-spacing-row-sm: 10px; 59 | $uni-spacing-row-base: 20upx; 60 | $uni-spacing-row-lg: 30upx; 61 | 62 | /* 垂直间距 */ 63 | $uni-spacing-col-sm: 8upx; 64 | $uni-spacing-col-base: 16upx; 65 | $uni-spacing-col-lg: 24upx; 66 | 67 | /* 透明度 */ 68 | $uni-opacity-disabled: 0.3; // 组件禁用态的透明度 69 | 70 | /* 文章场景相关 */ 71 | $uni-color-title: #2C405A; // 文章标题颜色 72 | $uni-font-size-title:40upx; 73 | $uni-color-subtitle: #555555; // 二级标题颜色 74 | $uni-font-size-subtitle:36upx; 75 | $uni-color-paragraph: #3F536E; // 文章段落颜色 76 | $uni-font-size-paragraph:30upx; -------------------------------------------------------------------------------- /src/utils/clipboard.js: -------------------------------------------------------------------------------- 1 | export function handleClipboard(data) { 2 | uni.setClipboardData({ 3 | data, 4 | success() { 5 | uni.showToast({ title: '已复制!' }) 6 | }, 7 | fail(e) { 8 | uni.showToast({ title: '复制失败:' + e }) 9 | } 10 | }) 11 | } 12 | -------------------------------------------------------------------------------- /src/utils/index.js: -------------------------------------------------------------------------------- 1 | export const delay = (function() { 2 | let timer = 0 3 | return function(cb, ms) { 4 | clearTimeout(timer) 5 | timer = setTimeout(cb, ms) 6 | } 7 | })() -------------------------------------------------------------------------------- /src/utils/request.js: -------------------------------------------------------------------------------- 1 | import { SHA1 } from './sha1' 2 | // https://docs.apicloud.com/Cloud-API/data-cloud-api#6 3 | 4 | const now = Date.now() 5 | const APP_ID = 'A6025488616288' 6 | const APP_KEY = '66F96C1B-95B9-4ACD-6D40-DB4A85F0523A' 7 | // export const request = axios.create({ 8 | // baseURL: '/mcm/api', 9 | // headers: { 10 | // 'Content-Type': 'application/json', 11 | // 'X-APICloud-AppId': APP_ID, 12 | // 'X-APICloud-AppKey': SHA1(`${APP_ID}UZ${APP_KEY}UZ${now}.${now}`) 13 | // } 14 | // }) 15 | 16 | export const request = (params) => { 17 | return new Promise((resolve, reject) => { 18 | uni.request({ 19 | ...params, 20 | url: `https://d.apicloud.com/mcm/api${params.url}`, 21 | header: { 22 | 'Content-Type': 'application/json', 23 | 'X-APICloud-AppId': APP_ID, 24 | 'X-APICloud-AppKey': SHA1(`${APP_ID}UZ${APP_KEY}UZ${now}`) + '.' + now 25 | }, 26 | success(res) { 27 | resolve(res.data) 28 | }, 29 | fail(err) { 30 | reject(err) 31 | } 32 | }) 33 | }) 34 | } -------------------------------------------------------------------------------- /src/utils/sha1.js: -------------------------------------------------------------------------------- 1 | export function SHA1(msg) { 2 | 3 | function rotate_left(n, s) { 4 | var t4 = (n << s) | (n >>> (32 - s)); 5 | return t4; 6 | }; 7 | 8 | function lsb_hex(val) { 9 | var str = ""; 10 | var i; 11 | var vh; 12 | var vl; 13 | 14 | for (i = 0; i <= 6; i += 2) { 15 | vh = (val >>> (i * 4 + 4)) & 0x0f; 16 | vl = (val >>> (i * 4)) & 0x0f; 17 | str += vh.toString(16) + vl.toString(16); 18 | } 19 | return str; 20 | }; 21 | 22 | function cvt_hex(val) { 23 | var str = ""; 24 | var i; 25 | var v; 26 | 27 | for (i = 7; i >= 0; i--) { 28 | v = (val >>> (i * 4)) & 0x0f; 29 | str += v.toString(16); 30 | } 31 | return str; 32 | }; 33 | 34 | 35 | function Utf8Encode(string) { 36 | string = string.replace(/\r\n/g, "\n"); 37 | var utftext = ""; 38 | 39 | for (var n = 0; n < string.length; n++) { 40 | 41 | var c = string.charCodeAt(n); 42 | 43 | if (c < 128) { 44 | utftext += String.fromCharCode(c); 45 | } 46 | else if ((c > 127) && (c < 2048)) { 47 | utftext += String.fromCharCode((c >> 6) | 192); 48 | utftext += String.fromCharCode((c & 63) | 128); 49 | } 50 | else { 51 | utftext += String.fromCharCode((c >> 12) | 224); 52 | utftext += String.fromCharCode(((c >> 6) & 63) | 128); 53 | utftext += String.fromCharCode((c & 63) | 128); 54 | } 55 | 56 | } 57 | 58 | return utftext; 59 | }; 60 | 61 | var blockstart; 62 | var i, j; 63 | var W = new Array(80); 64 | var H0 = 0x67452301; 65 | var H1 = 0xEFCDAB89; 66 | var H2 = 0x98BADCFE; 67 | var H3 = 0x10325476; 68 | var H4 = 0xC3D2E1F0; 69 | var A, B, C, D, E; 70 | var temp; 71 | 72 | msg = Utf8Encode(msg); 73 | 74 | var msg_len = msg.length; 75 | 76 | var word_array = new Array(); 77 | for (i = 0; i < msg_len - 3; i += 4) { 78 | j = msg.charCodeAt(i) << 24 | msg.charCodeAt(i + 1) << 16 | 79 | msg.charCodeAt(i + 2) << 8 | msg.charCodeAt(i + 3); 80 | word_array.push(j); 81 | } 82 | 83 | switch (msg_len % 4) { 84 | case 0: 85 | i = 0x080000000; 86 | break; 87 | case 1: 88 | i = msg.charCodeAt(msg_len - 1) << 24 | 0x0800000; 89 | break; 90 | 91 | case 2: 92 | i = msg.charCodeAt(msg_len - 2) << 24 | msg.charCodeAt(msg_len - 1) << 16 | 0x08000; 93 | break; 94 | 95 | case 3: 96 | i = msg.charCodeAt(msg_len - 3) << 24 | msg.charCodeAt(msg_len - 2) << 16 | msg.charCodeAt(msg_len - 1) << 8 | 0x80; 97 | break; 98 | } 99 | 100 | word_array.push(i); 101 | 102 | while ((word_array.length % 16) != 14) word_array.push(0); 103 | 104 | word_array.push(msg_len >>> 29); 105 | word_array.push((msg_len << 3) & 0x0ffffffff); 106 | 107 | 108 | for (blockstart = 0; blockstart < word_array.length; blockstart += 16) { 109 | 110 | for (i = 0; i < 16; i++) W[i] = word_array[blockstart + i]; 111 | for (i = 16; i <= 79; i++) W[i] = rotate_left(W[i - 3] ^ W[i - 8] ^ W[i - 14] ^ W[i - 16], 1); 112 | 113 | A = H0; 114 | B = H1; 115 | C = H2; 116 | D = H3; 117 | E = H4; 118 | 119 | for (i = 0; i <= 19; i++) { 120 | temp = (rotate_left(A, 5) + ((B & C) | (~B & D)) + E + W[i] + 0x5A827999) & 0x0ffffffff; 121 | E = D; 122 | D = C; 123 | C = rotate_left(B, 30); 124 | B = A; 125 | A = temp; 126 | } 127 | 128 | for (i = 20; i <= 39; i++) { 129 | temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0x6ED9EBA1) & 0x0ffffffff; 130 | E = D; 131 | D = C; 132 | C = rotate_left(B, 30); 133 | B = A; 134 | A = temp; 135 | } 136 | 137 | for (i = 40; i <= 59; i++) { 138 | temp = (rotate_left(A, 5) + ((B & C) | (B & D) | (C & D)) + E + W[i] + 0x8F1BBCDC) & 0x0ffffffff; 139 | E = D; 140 | D = C; 141 | C = rotate_left(B, 30); 142 | B = A; 143 | A = temp; 144 | } 145 | 146 | for (i = 60; i <= 79; i++) { 147 | temp = (rotate_left(A, 5) + (B ^ C ^ D) + E + W[i] + 0xCA62C1D6) & 0x0ffffffff; 148 | E = D; 149 | D = C; 150 | C = rotate_left(B, 30); 151 | B = A; 152 | A = temp; 153 | } 154 | 155 | H0 = (H0 + A) & 0x0ffffffff; 156 | H1 = (H1 + B) & 0x0ffffffff; 157 | H2 = (H2 + C) & 0x0ffffffff; 158 | H3 = (H3 + D) & 0x0ffffffff; 159 | H4 = (H4 + E) & 0x0ffffffff; 160 | 161 | } 162 | 163 | var temp = cvt_hex(H0) + cvt_hex(H1) + cvt_hex(H2) + cvt_hex(H3) + cvt_hex(H4); 164 | 165 | return temp.toLowerCase(); 166 | 167 | } -------------------------------------------------------------------------------- /src/utils/sign.js: -------------------------------------------------------------------------------- 1 | import { ref, computed } from 'vue' 2 | 3 | export function useSign() { 4 | const user = ref({}) 5 | const isLogin = computed(() => user.value.nickName) 6 | const getLocaleUser = () => uni.getStorageSync('_uo') 7 | const localeUser = getLocaleUser() 8 | if (localeUser) { 9 | user.value = JSON.parse(localeUser) 10 | } 11 | const signin = async () => { 12 | // 登录逻辑待补充 13 | // 授权用户信息 14 | getUserInfo() 15 | } 16 | 17 | const signout = () => { 18 | uni.clearStorage() 19 | user.value = {} 20 | } 21 | 22 | const getUserInfo = () => { 23 | uni.getUserProfile({ 24 | provider: 'weixin', 25 | desc: '显示用户昵称', 26 | success({ userInfo }) { 27 | user.value = userInfo 28 | uni.setStorageSync('_uo', JSON.stringify(userInfo)) 29 | }, 30 | fail() { 31 | console.log('拉去用户信息失败') 32 | } 33 | }) 34 | } 35 | return { user, isLogin, getLocaleUser, signin, signout } 36 | } -------------------------------------------------------------------------------- /temp.ts: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/zeroojs/game-mp.zeroojs/e86e94e1ec90d19e3fedb2e126ecfb85afcf5bf7/temp.ts -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "types": [ 4 | "@dcloudio/types", 5 | "miniprogram-api-typings", 6 | "mini-types" 7 | ] 8 | }, 9 | "files": ["temp.ts"] 10 | } 11 | -------------------------------------------------------------------------------- /vue.config.js: -------------------------------------------------------------------------------- 1 | process.env.UNI_USING_VUE3 = true 2 | process.env.UNI_USING_VUE3_OPTIONS_API = true 3 | module.exports = { 4 | css: { 5 | loaderOptions: { 6 | scss: { 7 | prependData: '@import "~@/uni.scss"' 8 | } 9 | } 10 | } 11 | } 12 | --------------------------------------------------------------------------------