kola-web 6 months ago
commit
b3b83df867
  1. 9
      .editorconfig
  2. 1
      .eslintignore
  3. 31
      .eslintrc.js
  4. 5
      .gitignore
  5. 3
      .prettierrc
  6. 4
      .wepyignore
  7. 12815
      package-lock.json
  8. 47
      package.json
  9. 30
      project.config.json
  10. 21
      project.private.config.json
  11. 608
      src/app.wpy
  12. 206
      src/components/circle-view.wpy
  13. 174
      src/components/common-nav.wpy
  14. 49
      src/components/common-toast.wpy
  15. 76
      src/components/html-parser.wpy
  16. 62
      src/components/icon-button.wpy
  17. 73
      src/components/icon-counter-view.wpy
  18. 42
      src/components/share-icon.wpy
  19. 61
      src/components/sport-counter-view.wpy
  20. 350
      src/components/sport-line-view.wpy
  21. 16
      src/config.js
  22. BIN
      src/images/activity_202110/activity_index_icon.png
  23. BIN
      src/images/activity_202110/activity_index_popup_img.png
  24. BIN
      src/images/activity_202110/assist_no_rank.png
  25. BIN
      src/images/activity_202110/assist_rank1.png
  26. BIN
      src/images/activity_202110/assist_rank2.png
  27. BIN
      src/images/activity_202110/assist_rank3.png
  28. BIN
      src/images/activity_202110/assist_rule_font.png
  29. BIN
      src/images/activity_202110/assist_top_img.png
  30. BIN
      src/images/activity_202110/award1.png
  31. BIN
      src/images/activity_202110/award2.png
  32. BIN
      src/images/activity_202110/award4_small.png
  33. BIN
      src/images/activity_202110/award_get_font.png
  34. BIN
      src/images/activity_202110/award_not_get_font.png
  35. BIN
      src/images/activity_202110/award_prizes.png
  36. BIN
      src/images/activity_202110/award_rule_font.png
  37. BIN
      src/images/activity_202110/award_times_font.png
  38. BIN
      src/images/activity_202110/bottom_img.png
  39. BIN
      src/images/activity_202110/close.png
  40. BIN
      src/images/activity_202110/date_font.png
  41. BIN
      src/images/activity_202110/index_bottom_img.png
  42. BIN
      src/images/activity_202110/index_entry1.png
  43. BIN
      src/images/activity_202110/index_entry2.png
  44. BIN
      src/images/activity_202110/index_entry3.png
  45. BIN
      src/images/activity_202110/index_top_img.png
  46. BIN
      src/images/activity_202110/lottery_btn.png
  47. BIN
      src/images/activity_202110/not_bind_font.png
  48. BIN
      src/images/activity_202110/not_bind_img1.png
  49. BIN
      src/images/activity_202110/not_bind_img2.png
  50. BIN
      src/images/activity_202110/num1.png
  51. BIN
      src/images/activity_202110/num2.png
  52. BIN
      src/images/activity_202110/num3.png
  53. BIN
      src/images/activity_202110/num4.png
  54. BIN
      src/images/activity_202110/num5.png
  55. BIN
      src/images/activity_202110/prize_no_list.png
  56. BIN
      src/images/activity_202110/rank_rule_font.png
  57. BIN
      src/images/activity_202110/rule_bg.png
  58. BIN
      src/images/activity_202110/rule_font1.png
  59. BIN
      src/images/activity_202110/rule_font2.png
  60. BIN
      src/images/activity_202110/rule_font3.png
  61. BIN
      src/images/activity_202110/steps_font.png
  62. BIN
      src/images/activity_202110/steps_no_rank.png
  63. BIN
      src/images/activity_202110/steps_rank1.png
  64. BIN
      src/images/activity_202110/steps_rank2.png
  65. BIN
      src/images/activity_202110/steps_rank3.png
  66. BIN
      src/images/activity_202110/steps_top_img.png
  67. BIN
      src/images/activity_202201/fail.png
  68. BIN
      src/images/activity_202201/success.png
  69. BIN
      src/images/activity_award/address.png
  70. BIN
      src/images/activity_award/edit.png
  71. BIN
      src/images/activity_award/mobile.png
  72. BIN
      src/images/activity_award/tips.png
  73. BIN
      src/images/activity_award/user.png
  74. BIN
      src/images/activity_award/user/1.jpg
  75. BIN
      src/images/activity_award/user/10.jpg
  76. BIN
      src/images/activity_award/user/11.jpg
  77. BIN
      src/images/activity_award/user/12.jpg
  78. BIN
      src/images/activity_award/user/13.jpg
  79. BIN
      src/images/activity_award/user/2.jpg
  80. BIN
      src/images/activity_award/user/3.jpg
  81. BIN
      src/images/activity_award/user/4.jpg
  82. BIN
      src/images/activity_award/user/5.jpg
  83. BIN
      src/images/activity_award/user/6.jpg
  84. BIN
      src/images/activity_award/user/7.jpg
  85. BIN
      src/images/activity_award/user/8.jpg
  86. BIN
      src/images/activity_award/user/9.jpg
  87. BIN
      src/images/activity_rank/close_rule.png
  88. BIN
      src/images/activity_rank/default_img.png
  89. BIN
      src/images/back.png
  90. BIN
      src/images/close.png
  91. BIN
      src/images/collect.jpg
  92. BIN
      src/images/detail_read.png
  93. BIN
      src/images/fact.png
  94. BIN
      src/images/gugong-icon.png
  95. BIN
      src/images/header.png
  96. BIN
      src/images/home-icon.png
  97. BIN
      src/images/icon-add.png
  98. BIN
      src/images/icon-calories-blue.png
  99. BIN
      src/images/icon-calories.png
  100. BIN
      src/images/icon-calories2.png
  101. Some files were not shown because too many files have changed in this diff Show More

9
.editorconfig

@ -0,0 +1,9 @@ @@ -0,0 +1,9 @@
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true

1
.eslintignore

@ -0,0 +1 @@ @@ -0,0 +1 @@
dist/*

31
.eslintrc.js

@ -0,0 +1,31 @@ @@ -0,0 +1,31 @@
module.exports = {
root: true,
globals: { wx: true },
parser: 'babel-eslint',
parserOptions: {
sourceType: 'module'
},
env: {
browser: true
},
// https://github.com/feross/standard/blob/master/RULES.md#javascript-standard-style
extends: 'standard',
// required to lint *.wpy files
plugins: [
'html'
],
settings: {
'html/html-extensions': ['.html', '.wpy']
},
// add your custom rules here
'rules': {
// allow paren-less arrow functions
'arrow-parens': 0,
'semi': ["error", "always"],
// allow async-await
'generator-star-spacing': 0,
// allow debugger during development
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'space-before-function-paren': 0
}
}

5
.gitignore vendored

@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
node_modules
dist
.DS_Store
.idea
.wepycache

3
.prettierrc

@ -0,0 +1,3 @@ @@ -0,0 +1,3 @@
{
"singleQuote": true
}

4
.wepyignore

@ -0,0 +1,4 @@ @@ -0,0 +1,4 @@
node_modules
dist
.DS_Store
*.wpy___jb_tmp___

12815
package-lock.json generated

File diff suppressed because it is too large Load Diff

47
package.json

@ -0,0 +1,47 @@ @@ -0,0 +1,47 @@
{
"name": "sport2",
"version": "0.0.2",
"description": "糖友运动",
"main": "dist/app.js",
"scripts": {
"dev": "wepy build --watch",
"build": "cross-env NODE_ENV=production wepy build --no-cache",
"dev:web": "wepy build --output web",
"clean": "find ./dist -maxdepth 1 -not -name 'project.config.json' -not -name 'dist' | xargs rm -rf",
"test": "echo \"Error: no test specified\" && exit 1"
},
"wepy": {
"module-a": false,
"./src/components/list": "./src/components/wepy-list.wpy"
},
"author": "ygc <guocun.yang@dnurse.cn>",
"license": "MIT",
"dependencies": {
"moment": "^2.24.0",
"wepy": "^1.6.0",
"wepy-async-function": "^1.4.4",
"wepy-com-toast": "^1.0.2"
},
"devDependencies": {
"babel-eslint": "^7.2.1",
"babel-plugin-global-define": "^1.0.3",
"babel-plugin-transform-class-properties": "^6.24.1",
"babel-plugin-transform-decorators-legacy": "^1.3.4",
"babel-plugin-transform-export-extensions": "^6.22.0",
"babel-plugin-transform-object-rest-spread": "^6.26.0",
"babel-preset-env": "^1.6.1",
"cross-env": "^5.1.3",
"eslint": "^3.18.0",
"eslint-config-standard": "^7.1.0",
"eslint-friendly-formatter": "^2.0.7",
"eslint-plugin-html": "^2.0.1",
"eslint-plugin-promise": "^3.5.0",
"eslint-plugin-standard": "^2.0.1",
"less": "^3.8.1",
"wepy-compiler-babel": "^1.5.1",
"wepy-compiler-less": "^1.3.10",
"wepy-eslint": "^1.5.3",
"wepy-plugin-imagemin": "^1.5.3",
"wepy-plugin-uglifyjs": "^1.3.7"
}
}

30
project.config.json

@ -0,0 +1,30 @@ @@ -0,0 +1,30 @@
{
"description": "糖友运动",
"setting": {
"urlCheck": true,
"es6": true,
"postcss": true,
"minified": false,
"babelSetting": {
"ignore": [],
"disablePlugins": [],
"outputPath": ""
},
"enhance": true
},
"compileType": "miniprogram",
"appid": "wxc06a18569e063fdd",
"projectname": "sport2",
"miniprogramRoot": "dist/",
"libVersion": "3.3.4",
"srcMiniprogramRoot": "dist/",
"packOptions": {
"ignore": [],
"include": []
},
"condition": {},
"editorSetting": {
"tabIndent": "insertSpaces",
"tabSize": 4
}
}

21
project.private.config.json

@ -0,0 +1,21 @@ @@ -0,0 +1,21 @@
{
"description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
"projectname": "sport2",
"setting": {
"compileHotReLoad": true,
"urlCheck": true
},
"condition": {
"miniprogram": {
"list": [
{
"name": "pages/index",
"pathName": "pages/index",
"query": "scene=wid%3Da000025f",
"launchMode": "default",
"scene": null
}
]
}
}
}

608
src/app.wpy

@ -0,0 +1,608 @@ @@ -0,0 +1,608 @@
<style lang="less">
@import "style/reset.less";
page {
line-height: 1.6;
font-family: @novoFontDefault;
background:rgba(245,247,250,1);
}
icon{
vertical-align: middle;
}
.container {
height: 100%;
display: flex;
flex-direction: column;
align-items: center;
justify-content: space-between;
box-sizing: border-box;
padding: 0 40rpx 0 40rpx;
}
.right-arrow {
}
.page-bg {
position: absolute;
top: 0;
left: 0;
width: 100%;
height:100%;
z-index:-1;
}
.top-auth-btn {
padding: 0;
width: 100%;
height: 60rpx;
z-index: 1;
border-radius: 0;
background: linear-gradient(270deg,rgba(246,187,66,1) 0%,rgba(255,124,28,1) 100%);
&::after {
border: none;
}
.auth-font {
position: relative;
padding: 0 30rpx;
height: 100%;
font-size: 30rpx;
line-height: 60rpx;
color: #fff;
text-align: left;
&::after {
content: " ";
.setArrow(right, 20rpx, #fff, 4rpx);
position: absolute;
top: 50%;
margin-top: -12rpx;
right: 30rpx;
}
}
.award-tips {
span {
position: absolute;
right: 55rpx;
color: #48CFAD;
}
&::after {
content: " ";
.setArrow(right, 20rpx, #48CFAD, 4rpx);
position: absolute;
top: 50%;
margin-top: -12rpx;
right: 30rpx;
}
}
}
.rules-popup {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .6);
text-align: center;
font-size: 0;
z-index: 3;
.popup-content {
overflow: scroll;
margin: 240rpx 55rpx 0;
border: 5rpx solid #2f4b84;
padding: 30rpx 35rpx 20rpx;
max-height: 78%;
background: #fff;
border-radius: 30rpx;
text-align: left;
color: #2350ad;
h2 {
display: block;
margin-bottom: 25rpx;
text-align: center;
font-size: 55rpx;
line-height: 55rpx;
font-weight: bold;
}
p {
position: relative;
display: block;
padding-left: 50rpx;
font-size: 32rpx;
line-height: 36rpx;
margin-bottom: 13rpx;
span {
position: absolute;
left: 0;
}
}
p.tips {
font-weight: bold;
color: #ea6160;
}
& > span {
display: block;
margin-top: 35rpx;
font-size: 24rpx;
line-height: 24rpx;
text-align: center;
}
}
image {
margin-top: 30rpx;
width: 68rpx;
height: 68rpx;
}
}
.rank-rules-popup {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, .6);
text-align: center;
font-size: 0;
z-index: 3;
.popup-content {
position: relative;
margin: 35% auto 0;
padding: 46rpx 0 90rpx;
width: 640rpx;
font-size: 0;
text-align: center;
background: #FFAF00;
border-radius: 20rpx;
box-sizing: border-box;
& > image {
width: 270rpx;
}
.font {
padding: 52rpx 50rpx 0 118rpx;
text-align: left;
p {
position: relative;
display: block;
margin-bottom: 30rpx;
font-size: 30rpx;
font-family: PingFangSC-Regular, PingFang SC;
font-weight: 400;
color: #FFF;
line-height: 48rpx;
image {
position: absolute;
top: 12rpx;
left: -64rpx;
width: 34rpx;
}
}
p:first-child {
image {
left: -52rpx;
width: 22rpx;
}
}
}
}
& > image {
margin: 42rpx 0 0;
width: 68rpx;
}
}
</style>
<script>
import wepy from 'wepy';
import moment from 'moment';
import 'wepy-async-function';
import httpUtils from './utils/network';
const TOKEN_KEY = 'token';
export default class extends wepy.app {
config = {
pages: [
'pages/index',
'pages/share-assist-page',
'pages/activity-rule',
'pages/activity-daily-steps',
'pages/not-bind',
'pages/award',
'pages/activity',
'pages/steps-rank',
'pages/assist-rank',
'pages/address',
'pages/prize-list',
'pages/article-list',
'pages/article-detail',
'pages/step-history',
'pages/pledge-score',
'pages/share-page',
'pages/share-history-page',
'pages/sport-web',
'pages/logistics-web',
'pages/login'
],
window: {
backgroundTextStyle: 'light',
navigationBarBackgroundColor: '#333333',
navigationBarTitleText: 'WeChat',
navigationBarTextStyle: 'white',
navigationStyle: 'custom'
},
networkTimeout: {
'request': 1000000,
'connectSocket': 1000000,
'uploadFile': 1000000,
'downloadFile': 1000000
}
}
globalData = {
userInfo: null,
isBind: false,
status: 20,
navHeight: 44
}
customData = {
}
constructor() {
super();
this.use('requestfix');
// this.use('promisify');
}
onLaunch(option) {
if (option.query.scene && option.query.scene !== undefined) {
let indexScene = decodeURIComponent(option.query.scene);
// 保存当前用户uid
if (indexScene && indexScene.indexOf('STORE_UID:') !== -1) {
let CurOpenUid = indexScene.substr(indexScene.indexOf('STORE_UID:') + 'STORE_UID:'.length, indexScene.length);
wx.setStorageSync('cur_open_uid', CurOpenUid);
}
// 保存当前环境,是否为慢病平台
if (indexScene && indexScene.indexOf('STORE') !== -1) {
wx.setStorageSync('plat_form', 'STORE');
}
// 保存运动wid
if (indexScene && indexScene.indexOf('wid=') !== -1) {
let wid = indexScene.substr(indexScene.indexOf('wid=') + 'wid='.length, indexScene.length);
wx.setStorageSync('sport_wid', wid);
}
let shareOpenUId = decodeURIComponent(option.query.share_open_uid);
// 保存分享的用户
if (shareOpenUId && shareOpenUId !== 'undefined') {
wx.setStorageSync('share_open_uid', shareOpenUId);
}
let publicName = decodeURIComponent(option.query.public_name);
// 保存分享的药店信息
if (publicName && publicName !== 'undefined') {
wx.setStorageSync('public_name', publicName);
}
}
// this.testAsync();
// this.checkToken();
// 通过获取系统信息计算导航栏高度
let that = this;
wx.getSystemInfo({
success (res) {
let statusHeight = res.statusBarHeight;
let isiOS = res.system.indexOf('iOS') > -1;
let navHeight;
if (!isiOS) {
navHeight = 48;
} else {
navHeight = 44;
}
that.globalData.status = statusHeight;
that.globalData.navHeight = navHeight;
}
});
}
sleep(s) {
return new Promise((resolve, reject) => {
setTimeout(() => {
resolve('promise resolved');
}, s * 1000);
});
}
async testAsync() {
const data = await this.sleep(3);
console.log(data);
}
async bindFun(toUnBind) {
if (wx.getStorageSync('plat_form').indexOf('STORE') !== -1 || !wx.getStorageSync('sport_wid')) {
toUnBind();
} else {
let data = await httpUtils.post({url: 'mini-sport/new-bind-code', params: {token: wx.getStorageSync('token').token, id: wx.getStorageSync('sport_wid')}});
if (data.statusCode === 200 && data.data && data.data.success) {
console.log('绑定成功');
let tokenInfo = wx.getStorageSync('token');
tokenInfo.isBindCode = 1;
wx.setStorageSync('token', tokenInfo);
this.globalData.token = tokenInfo;
wepy.redirectTo({
url: '/pages/index'
});
} else {
if (data.data.msg === '登录过期,请重新登录') {
this.userLogin();
} else {
wx.showToast({
title: data.data.msg,
duration: 1500
});
}
}
}
}
checkToken(fun) {
let that = this;
return new Promise((resolve, reject) => {
if (that.globalData.token) {
if (!that.isBindUser()) {
that.bindFun(() => {
wepy.redirectTo({
url: '/pages/login'
});
});
} else {
resolve(true);
}
} else {
wepy.getStorage({
key: TOKEN_KEY,
complete(res) {
console.log('checkToken:', res);
if (res.data) {
that.globalData.token = res.data;
if (!that.isBindUser()) {
that.bindFun(() => {
wepy.redirectTo({
url: '/pages/login'
});
});
} else {
resolve(true);
}
} else {
that.userLogin(fun);
}
}
});
}
});
}
checkShareToken(fun) {
let that = this;
return new Promise((resolve, reject) => {
if (that.globalData.token) {
if (!that.isBindUser(1)) {
that.userShareLogin(fun);
} else {
resolve(true);
}
} else {
wepy.getStorage({
key: TOKEN_KEY,
complete(res) {
console.log('checkToken:', res);
if (res.data) {
that.globalData.token = res.data;
if (!that.isBindUser(1)) {
that.userShareLogin(fun);
} else {
resolve(true);
}
} else {
that.userShareLogin(fun);
}
}
});
}
});
}
userLogin(fun, clearStorageNo = 0) {
let that = this;
wepy.login({
complete(res) {
if (res.code) {
// 发起网络请求
that.loginFun(res.code, fun, clearStorageNo);
} else {
wx.showToast({
// icon: 'none',
title: '登录失败!' + res.errMsg,
duration: 1500
});
}
}
});
}
userShareLogin(fun, clearStorageNo = 0) {
let that = this;
wepy.login({
complete(res) {
if (res.code) {
// 发起网络请求
that.loginFun(res.code, fun, clearStorageNo, 1);
} else {
wx.showToast({
// icon: 'none',
title: '登录失败!' + res.errMsg,
duration: 1500
});
}
}
});
}
async loginFun(code, fun, clearStorageNo, type = 0) {
let that = this;
let params = {code: code};
if (type === 1) {
params.login_source = 'assist_act';
}
let CurOpenUid = wx.getStorageSync('cur_open_uid');
if (CurOpenUid) {
params.open_uid = CurOpenUid;
}
let platform = wx.getStorageSync('plat_form');
let shareOpenUId = wx.getStorageSync('share_open_uid');
let publicName = wx.getStorageSync('public_name');
let sportWid = wx.getStorageSync('sport_wid');
let data = await httpUtils.post({url: 'mini-sport/login', params: params});
console.log('登录接口');
console.log(data);
if (data.statusCode === 200 && data.data && data.data.success) {
that.globalData.token = data.data.detail;
if (clearStorageNo !== 1) {
wx.clearStorage({
success() {
wx.setStorageSync('cur_open_uid', CurOpenUid);
wx.setStorageSync('plat_form', platform);
wx.setStorageSync('share_open_uid', shareOpenUId);
wx.setStorageSync('public_name', publicName);
wx.setStorageSync('sport_wid', sportWid);
// 登录完成看是哪个公众号的
if (data.data.detail.public_name && data.data.detail.public_name !== 'undefined') {
wx.setStorageSync('public_name', data.data.detail.public_name);
}
that.saveToken(data.data.detail);
if (!that.isBindUser(type)) {
that.bindFun(() => {
wepy.redirectTo({
url: '/pages/login'
});
});
} else {
let now = moment().hours(0).minutes(0).seconds(0).milliseconds(0);
if (!wx.getStorageSync('indexAchieve')) {
let info = {
day: now.format('YYYY-MM-DD'),
show: false
};
wx.setStorageSync('indexAchieve', info);
} else {
let info = wx.getStorageSync('indexAchieve');
if (info.day !== now.format('YYYY-MM-DD')) {
info.day = now.format('YYYY-MM-DD');
info.show = false;
}
wx.setStorageSync('indexAchieve', info);
}
if (!wx.getStorageSync('indexStake')) {
let info = {
day: now.format('YYYY-MM-DD'),
getFun: false
};
wx.setStorageSync('indexStake', info);
} else {
let info = wx.getStorageSync('indexStake');
if (info.day !== now.format('YYYY-MM-DD')) {
info.day = now.format('YYYY-MM-DD');
info.getFun = false;
}
wx.setStorageSync('indexStake', info);
}
fun();
}
}
});
} else {
that.saveToken(data.data.detail);
if (!that.isBindUser(type)) {
that.bindFun(() => {
wepy.redirectTo({
url: '/pages/login'
});
});
} else {
fun();
}
}
} else {
wx.showToast({
// icon: 'none',
title: data.data.msg,
duration: 1500
});
}
}
saveToken(token) {
wepy.setStorage({
key: TOKEN_KEY,
data: token
});
}
isBindUser(type = 0) {
if (type === 1) {
return this.globalData.token != null;
} else {
return this.globalData.token != null && this.globalData.token.isBindCode;
}
}
getHeader() {
if (this.globalData.token) {
return this.globalData.token.headImg !== '' ? this.globalData.token.headImg : '/images/header.png';
} else {
return '/images/header.png';
}
}
getUserName() {
if (this.globalData.token) {
return this.globalData.token.userName;
} else {
return '';
}
}
checkUserAuth(auth) {
return new Promise((resolve, reject) => {
wx.getSetting({
success (res) {
let ret = -1;
if (res.authSetting.hasOwnProperty(auth)) {
if (res.authSetting[auth] === true) {
ret = 1;
} else {
ret = 0;
}
}
console.log(res, ret);
resolve(ret);
}
});
});
}
}
</script>

206
src/components/circle-view.wpy

@ -0,0 +1,206 @@ @@ -0,0 +1,206 @@
<style lang="less">
@import "../style/reset.less";
.circle-view {
position: relative;
width: 150px;
height: 150px;
left: 50%;
transform: translateX(-50%);
image {
width: 100%;
height: 100%;
}
}
.progress-layer {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
}
.information-container {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
justify-content: center;
font-size:14px;
font-weight:400;
color:rgba(255,255,255,1);
line-height:20px;
.steps {
font-size:30px;
color: white;
font-weight:500;
padding: 10px 0;
}
.dest {
padding: 0 8px 10px;
position: relative;
}
}
</style>
<template>
<view class="circle-view" @tap="onTargetClick">
<canvas style="top: {{showImg?'-200%':'0'}}" class="progress-layer" canvas-id="data-progress">
</canvas>
<image style="display: {{showImg?'':'none'}}" src="{{canvasImg}}"></image>
<view class= "information-container">
<text>{{isStakePage==0?'今日步数':'今日已完成'}}</text>
<text class="steps">{{isStakePage==0?steps:percentage}}<text>{{isStakePage==0?'':'%'}}</text></text>
<text class="dest">目标:{{targets}}</text>
</view>
</view>
</template>
<script>
import wepy from 'wepy';
export default class CircleView extends wepy.component {
props = {
steps: {
type: [Number, String],
default: 2500
},
targets: {
type: [Number, String],
coerce: function (v) {
return +v;
},
default: 6000
},
isStakePage: {
type: Number,
default: 0
},
showImg: {
type: Boolean,
default: false
}
}
centerX = 150 / 2
centerY = 150 / 2
progressWidth= 10
radius= 70
computed = {
percentage () {
let num = Math.round((Number(this.steps) / Number(this.targets)).toFixed(2) * 100);
num = num === Infinity ? '--' : (num > 100 ? 100 : num);
return num;
}
}
watch = {
steps (curVal, oldVal) {
this.draw();
},
targets (curVal, oldVal) {
this.draw();
},
showImg (curVal, oldVal) {
this.draw();
}
}
data = {
canvasImg: ''
}
methods = {
onTargetClick() {
this.$emit('onTargetClick');
}
}
onLoad() {
this.draw();
}
draw() {
const context = wx.createCanvasContext('data-progress');
this.drawBackground(context);
this.drawProgress(context);
this.getImg();
}
getImg() {
let that = this;
let a = setTimeout(function () {
wx.canvasToTempFilePath({
x: 0,
y: 0,
width: 150,
height: 150,
destWidth: 300,
destHeight: 300,
canvasId: 'data-progress',
success: function (res) {
that.canvasImg = res.tempFilePath;
that.$apply();
clearTimeout(a);
console.log('tempFilePath-------', res.tempFilePath);
},
fail: function (res) {
that.getImg();
}
});
}, 500);
}
drawBackground(context) {
context.save();
context.beginPath();
// context.setLineDash([5, 3], 2);
context.setLineWidth(this.progressWidth);
context.setGlobalAlpha(0.2);
context.setStrokeStyle('white');
context.arc(this.centerX, this.centerY, this.radius, 0, 2 * Math.PI);
context.stroke();
context.restore();
}
drawProgress(context) {
if (Number(this.steps) > 0) {
let progress = Number(this.steps) * 1.0 / Number(this.targets);
context.save();
context.beginPath();
context.setLineWidth(this.progressWidth);
let gr = context.createLinearGradient(0, 100, 200, 100);
gr.addColorStop(0, '#48CFAD');
gr.addColorStop(1, '#A0D486');
// context.setStrokeStyle('white');
context.strokeStyle = gr;
context.setLineCap('round');
if (progress > 0) {
if (progress < 1) {
context.arc(this.centerX, this.centerY, this.radius, 1.5 * Math.PI, progress * 2 * Math.PI - 0.5 * Math.PI, false);
} else {
context.arc(this.centerX, this.centerY, this.radius, 0, 2 * Math.PI);
}
}
context.stroke();
context.draw();
} else {
context.draw();
}
}
}
</script>

174
src/components/common-nav.wpy

@ -0,0 +1,174 @@ @@ -0,0 +1,174 @@
<style lang="less">
@import "../style/reset.less";
.nav {
position: fixed;
top: 0;
width: 100%;
z-index: 21;
}
.navbar{
position: relative
}
.back-icon, .home-icon{
width: 28px;
height: 100%;
position: absolute;
transform: translateY(-50%);
top: 50%;
display: flex;
}
.back-icon{
left: 10px;
}
.home-icon{
left: 44px
}
.home-icon:first-child {
left: 10px;
}
.back-icon image{
width: 28px;
height: 28px;
margin: auto;
}
.home-icon image{
width: 20px;
height: 20px;
margin: auto;
}
.nav-title, .nav-icon{
position: absolute;
transform: translate(-50%, -50%);
left: 50%;
top: 50%;
font-size: 0;
font-weight: bold;
}
</style>
<template>
<view class='nav' style='height: {{status + navHeight}}px'>
<view class='status' style='height: {{status}}px;{{containerStyle}}'></view>
<view class='navbar' style='height:{{navHeight}}px;{{containerStyle}}'>
<view class='back-icon' wx:if="{{backIcon}}" @tap='back'>
<image src='{{backIcon}}'></image>
</view>
<view class='home-icon' wx:if="{{homeIcon}}" @tap='home'>
<image src='{{homeIcon}}'></image>
</view>
<view class='nav-icon' wx:if="{{titleImg}}">
<image src='{{titleImg}}' style='{{iconStyle}}'></image>
</view>
<view class='nav-title' wx:if="{{titleText && !titleImg}}">
<text style='{{textStyle}}'>{{titleText}}</text>
</view>
</view>
</view>
</template>
<script>
import wepy from 'wepy';
export default class CircleView extends wepy.component {
props = {
background: {
type: String,
default: '#333'
},
color: {
type: String,
default: 'rgba(255, 255, 255, 1)'
},
titleText: {
type: String,
default: '导航栏'
},
titleImg: {
type: String,
default: ''
},
backIcon: {
type: String,
default: ''
},
homeIcon: {
type: String,
default: ''
},
fontSize: {
type: Number,
default: 16
},
iconHeight: {
type: Number,
default: 19
},
iconWidth: {
type: Number,
default: 58
}
};
data = {
status: 20,
navHeight: 44,
containerStyle: [],
textStyle: [],
iconStyle: []
};
methods = {
// 返回事件
back() {
wx.navigateBack({
delta: 1
});
// this.triggerEvent('back', {back: 1});
},
home() {
wx.reLaunch({
url: '/pages/index'
});
// this.triggerEvent('home', {});
}
}
onLoad() {
this.setNavSize();
this.setStyle();
}
// 通过获取系统信息计算导航栏高度
setNavSize() {
let sysinfo = wx.getSystemInfoSync();
let statusHeight = sysinfo.statusBarHeight;
let isiOS = sysinfo.system.indexOf('iOS') > -1;
let navHeight;
if (!isiOS) {
navHeight = 48;
} else {
navHeight = 44;
}
this.status = statusHeight;
this.navHeight = navHeight;
this.$apply();
}
setStyle() {
let containerStyle;
let textStyle;
let iconStyle;
containerStyle = [
'background:' + this.background
].join(';');
textStyle = [
'color:' + this.color,
'font-size:' + this.fontSize + 'px'
].join(';');
iconStyle = [
'width: ' + this.iconWidth + 'px',
'height: ' + this.iconHeight + 'px'
].join(';');
this.containerStyle = containerStyle;
this.textStyle = textStyle;
this.iconStyle = iconStyle;
this.$apply();
}
}
</script>

49
src/components/common-toast.wpy

@ -0,0 +1,49 @@ @@ -0,0 +1,49 @@
<style lang="less">
.common-toast {
/*display: none;*/
position: fixed;
bottom: 100rpx;
left: 15%;
padding: 20rpx 10rpx;
width: 70%;
background: rgba(255, 255, 255, .9);
color: #333;
font-size: 36rpx;
line-height: 46rpx;
border-radius: 20rpx;
text-align: center;
white-space: normal;
z-index: 1;
}
</style>
<template>
<cover-view class="common-toast" wx:if="{{showToast}}">
{{message}}
</cover-view>
</template>
<script>
import wepy from 'wepy';
export default class CommonToast extends wepy.component {
props = {
showToast: {
type: Boolean,
default: false
},
message: {
type: String,
default: '提示内容'
}
};
watch = {
showToast (curVal, oldVal) {
if (curVal === true && oldVal === false) {
this.$emit('hide');
}
}
}
methods = {
}
}
</script>

76
src/components/html-parser.wpy

@ -0,0 +1,76 @@ @@ -0,0 +1,76 @@
<style lang="less">
@import "../plugins/wxParse/wxParse.wxss";
.wxParse-img {
margin: 0 auto;
width: 100%;
min-height: 200rpx;
display: block;
background-color: transparent;
}
</style>
<template>
<import src="../plugins/wxParse/wxParse.wxml"/>
<block wx:for="{{htmlParserTpl.nodes}}" wx:key="{{index}}">
<template is="wxParse0" data="{{item}}"/>
</block>
</template>
<script>
import wepy from 'wepy';
import WxParse from '../plugins/wxParse/wxParse';
export default class HTMLParser extends wepy.component {
props = {
parserName: {
type: String,
default: 'htmlParserName'
},
parserContent: {
type: String,
default: "<p style='font-size: 32rpx; padding: 30rpx 0; text-align: center;'>没有任何内容</p>"
},
parserType: {
type: String,
default: 'html'
},
parserPadding: {
type: Number,
default: 0
}
};
data = {
htmlParserTpl: {}
};
events = {
'htmlParser-broadcast': ($event, ...args) => {
}
};
methods = {
htmlParserNotice() {
this.htmlParse();
}
};
async onLoad() {
this.htmlParse();
};
wxParseImgLoad(image) {
// let imgInfo = image.detail;
};
htmlParse() {
/**
* WxParse.wxParse(bindName , type, data, target,imagePadding)
* 1.bindName绑定的数据名(必填)
* 2.type可以为html或者md(必填)
* 3.data为传入的具体数据(必填)
* 4.target为Page对象,一般为this(必填)
* 5.imagePadding为当图片自适应是左右的单一padding(默认为0,可选)
*/
try {
let htmlContent = WxParse.wxParse(this.parserName, this.parserType, this.parserContent || this.props.parserContent.default, this, this.parserPadding);
// this.htmlParserTpl = this[this.parserName];
this.htmlParserTpl = htmlContent[this.parserName];
this.$apply();
} catch (e) {
console.warn('kinerHtmlParser:', '没有任何内容需要转换', e);
}
}
}
</script>

62
src/components/icon-button.wpy

@ -0,0 +1,62 @@ @@ -0,0 +1,62 @@
<style lang="less">
.icon-button-container {
width:100%;
height: 86rpx;
background:linear-gradient(270deg,rgba(55,188,155,1) 0%,rgba(140,193,82,1) 100%);
border-radius: 44rpx;
.icon-button-button {
font-size:18px;
font-weight:400;
color:rgba(255,255,255,1);
line-height: 86rpx;
text-align: center;
position: relative;
display: flex;
flex-direction: row;
justify-content: center;
align-items: center;
.confirm-icon {
width: 48rpx;
height: 48rpx;
margin-right: 22rpx;
}
}
}
</style>
<template>
<view class="icon-button-container" @tap="onClick">
<view class="icon-button-button">
<image class="confirm-icon" src="{{icon}}"></image>
<view>{{title}}</view>
</view>
</view>
</template>
<script>
import wepy from 'wepy';
export default class IconButton extends wepy.component {
props = {
title: {
type: [String, Number],
default: '确定'
},
icon: {
type: [String],
default: '/images/cali.png'
}
}
methods = {
onClick() {
this.$emit('onButtonClick');
}
}
}
</script>

73
src/components/icon-counter-view.wpy

@ -0,0 +1,73 @@ @@ -0,0 +1,73 @@
<style lang="less">
.icon-counter-container {
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
justify-content: center;
width: 100%;
height: 100%;
.counter-num {
/*width:100px;*/
height: 50rpx;
font-size: 36rpx;
font-weight:500;
color:rgba(72,207,173,1);
line-height:50rpx;
text-align: center;
margin-top: 12rpx;
span {
display: inline-block;
font-size: 28rpx;
font-weight:400;
margin-left: 10rpx;
color:rgba(227,227,227,1);
line-height:40rpx;
}
}
.counter-icon {
height: 52rpx;
width: 52rpx;
}
}
.sport-counter-text {
font-size:14px;
font-weight:400;
color:rgba(255,255,255,1);
line-height:20px;
}
</style>
<template>
<view @tap="onClick">
<view class="icon-counter-container">
<image class="counter-icon" src="{{icon}}" mode="aspectFit" ></image>
<view class="counter-num">{{title}}<span class="span-font">{{unit}}</span></view>
</view>
</view>
</template>
<script>
import wepy from 'wepy';
export default class IconCounterView extends wepy.component {
props = {
title: {
type: [String, Number],
default: '无'
},
unit: {
type: [String],
default: '单位'
},
icon: {
type: [String],
default: '/images/cali.png'
}
}
}
</script>

42
src/components/share-icon.wpy

@ -0,0 +1,42 @@ @@ -0,0 +1,42 @@
<style lang="less">
.share-container {
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
justify-content: center;
image {
width: 48rpx;
height: 48rpx;
}
}
.share-text {
font-size: 28rpx;
font-weight: 400;
color: rgba(255, 255, 255, 1);
line-height: 40rpx;
margin-top: 4rpx;
}
</style>
<template>
<button open-type="share">
<view class="share-container">
<image src="/images/share-icon.png"></image>
<view class="share-text">分享</view>
</view>
</button>
</template>
<script>
import wepy from 'wepy';
export default class ShareIcon extends wepy.component {
methods = {
// onClick() {
// this.$emit('onShareClick');
// }
}
}
</script>

61
src/components/sport-counter-view.wpy

@ -0,0 +1,61 @@ @@ -0,0 +1,61 @@
<style lang="less">
.sport-counter-container {
display: flex;
flex-direction: column;
align-items: center;
box-sizing: border-box;
justify-content: center;
.counter-num {
margin-top: -4rpx;
font-size: 48rpx;
font-weight: 500;
color: #48CFAD;
line-height: 66rpx;
span {
font-size:30rpx;
line-height: 42rpx;
}
}
.share-text {
margin-top: 2rpx;
font-size: 28rpx;
font-weight: 400;
color: rgba(255,255,255,1);
line-height: 40rpx;
}
}
</style>
<template>
<view @tap="onClick">
<view class="sport-counter-container">
<view class="share-text">{{title}}</view>
<view class="counter-num">{{num}}<span>{{unit}}</span></view>
</view>
</view>
</template>
<script>
import wepy from 'wepy';
export default class SportCounterView extends wepy.component {
props = {
title: {
type: [String],
default: '无'
},
unit: {
type: [String],
default: '单位'
},
num: {
type: [Number],
default: 0
}
}
}
</script>

350
src/components/sport-line-view.wpy

@ -0,0 +1,350 @@ @@ -0,0 +1,350 @@
<style lang="less">
.sport-canvas-container {
width: 100%;
height: 100%;
}
</style>
<template>
<slot class="sport-canvas-container" name="canvas">默认内容</slot>
</template>
<script>
import wepy from 'wepy';
import moment from 'moment';
// let hasLoaded = true;
export default class SportLineView extends wepy.component {
props = {
startDate: {
type: [Number, String],
default: 2500
},
endDate: {
type: [Number, String],
default: 2500
},
daySteps: {
type: [Array],
default: []
},
canvasId: String,
drawPaddingLeft: {
type: [Number],
default: 0
},
drawPaddingRight: {
type: [Number],
default: 4
}
}
watch = {
startDate (curVal, oldVal) {
if (this.hasLoaded) {
this.calculate();
this.draw();
}
},
endDate (curVal, oldVal) {
if (this.hasLoaded) {
this.calculate();
this.draw();
}
},
daySteps (curVal, oldVal) {
if (this.hasLoaded) {
this.calculate();
this.draw();
}
},
drawPaddingLeft (curVal, oldVal) {
if (this.hasLoaded) {
this.calculate();
this.draw();
}
}
}
hasLoaded = false;
canvasWidth= 0;
canvasHeight =0;
axisY = 0;
axisYLablePos = [];
axisLabelX = 52;
axisDrawWidth=0;
axisDayDistance=0;
pointInfo = [];
retries = 0;
barWidth = 6;
today = moment().hours(0).minutes(0).seconds(0).milliseconds(0).unix();
onLoad() {
this.getSize();
}
getSize() {
let that = this;
console.log(that.canvasId);
const query = wx.createSelectorQuery();
query.select('#' + this.canvasId).boundingClientRect();
query.selectViewport().scrollOffset();
query.exec(function (res) {
console.log('selectViewport:', res);
let found = false;
res.forEach(item => {
if (item != null && item.id === that.canvasId) {
that.canvasWidth = item.width;
that.canvasHeight = item.height;
found = true;
}
});
if (found) {
console.log('line view onLoad---------');
that.calculate();
that.draw();
that.hasLoaded = true;
console.log('line view onLoad--------- set hasLoaded to true', that);
// hasLoaded = true;
}
// else {
// that.retries ++;
// if (that.retries < 5) {
// setTimeout(function () {
// that.getSize();
// },0);
// }
// }
});
}
setDefaultAxisY() {
let that = this;
let maxY = 10000;
this.axisYLablePos = [];
[10000, 6000, 3000].forEach(item => {
let pos = that.axisY - (that.axisY - 10) * item / maxY;
that.axisYLablePos.push({
label: item,
pos: pos
});
});
}
calculate() {
let that = this;
this.axisY = this.canvasHeight - 20;
this.axisDrawWidth = this.canvasWidth - this.axisLabelX - this.drawPaddingLeft - this.barWidth - this.drawPaddingRight;
this.axisDayDistance = Math.floor(this.axisDrawWidth / 6);
if (this.daySteps.length === 0) {
this.pointInfo = [];
this.setDefaultAxisY();
} else {
let tempSteps = JSON.parse(JSON.stringify(this.daySteps));
tempSteps.sort((a, b) => {
return a.steps > b.steps;
});
// console.log('sort:', this.daySteps, tempSteps);
let maxValue = tempSteps[tempSteps.length - 1].steps;
if (maxValue <= 0) {
this.setDefaultAxisY();
this.pointInfo = [];
maxValue = 10000;
} else {
let roundValue = 1000;
if (maxValue < 1500) {
roundValue = 200;
}
maxValue = Math.ceil(maxValue * 1.0 / roundValue) * roundValue;
let delta = Math.ceil(maxValue / (3 * roundValue)) * roundValue;
that.axisYLablePos = [];
[maxValue, maxValue - delta, maxValue - delta * 2].forEach(item => {
let pos = that.axisY - (that.axisY - 10) * item / maxValue;
that.axisYLablePos.push({
label: item,
pos: pos
});
});
}
let pointInfo = [];
this.daySteps.forEach(item => {
let drawX = that.axisLabelX + that.drawPaddingLeft + (item.date - that.startDate) * that.axisDrawWidth / (that.endDate - that.startDate);
let drawY = that.axisY - (that.axisY - 10) * item.steps / maxValue;
pointInfo.push({
x: drawX,
y: drawY
});
});
this.pointInfo = pointInfo;
// console.log('point info:', this.pointInfo);
}
}
draw() {
const context = wx.createCanvasContext(this.canvasId);
// console.log('start draw:', this.canvasWidth, this.canvasHeight, this.startDate, this.endDate, this.axisDayDistance);
context.clearRect(0, 0, this.canvasWidth, this.canvasHeight);
this.drawAxis(context);
this.drawStepPointBar(context);
this.drawAxisX(context);
context.draw();
}
drawAxis(ctx) {
let that = this;
// draw axis y
ctx.save();
ctx.setFontSize(12);
ctx.setStrokeStyle('#E3E3E3');
ctx.setFillStyle('#9B9B9B');
ctx.setLineDash([2, 3], 1);
ctx.setLineWidth(1);
ctx.setTextAlign('right');
ctx.setTextBaseline('middle');
this.axisYLablePos.forEach(item => {
ctx.fillText(item.label, that.axisLabelX - 5, item.pos);
ctx.beginPath();
ctx.moveTo(that.axisLabelX, item.pos);
ctx.lineTo(that.axisLabelX + that.canvasWidth, item.pos);
ctx.stroke();
});
ctx.restore();
}
drawAxisX(ctx) {
// let that = this;
// draw x axis
ctx.save();
ctx.setStrokeStyle('#666666');
ctx.setLineWidth(1);
ctx.beginPath();
ctx.moveTo(0, this.axisY);
ctx.lineTo(this.canvasWidth, this.axisY);
ctx.stroke();
ctx.restore();
// draw x label
ctx.save();
let days = (this.endDate - this.startDate) / (3600 * 24);
let delta = Math.floor(days / 6);
// console.log('start draw days:', days, delta);
ctx.setFontSize(12);
ctx.setFillStyle('#666666');
ctx.setTextAlign('center');
ctx.setTextBaseline('top');
let y = this.axisY;
let x = this.axisLabelX + this.drawPaddingLeft;
let curTime = moment.unix(this.startDate);
for (let i = 0; i < 7; i++) {
let dateText = curTime.format('MM.DD');
if (curTime.unix() === this.today) {
dateText = '今天';
ctx.setFillStyle('#E3E3E3');
} else {
ctx.setFillStyle('#9B9B9B');
}
ctx.fillText(dateText, x, y);
if (i < 6) {
curTime.add(delta, 'days');
} else {
curTime = moment.unix(this.endDate);
}
x = x + this.axisDayDistance;
}
ctx.restore();
}
drawStepPoint(ctx) {
if (this.pointInfo.length === 0) {
return;
}
ctx.save();
ctx.beginPath();
ctx.setStrokeStyle('#8CC152');
ctx.setLineWidth(2);
ctx.moveTo(this.pointInfo[0].x, this.pointInfo[0].y);
let i;
for (i = 1; i < this.pointInfo.length; i++) {
let xm = (this.pointInfo[i - 1].x + this.pointInfo[i].x) / 2;
let cx1 = xm;
let cy1 = this.pointInfo[i - 1].y;
let cx2 = xm;
let cy2 = this.pointInfo[i].y;
ctx.bezierCurveTo(cx1, cy1, cx2, cy2, this.pointInfo[i].x, this.pointInfo[i].y);
}
ctx.stroke();
ctx.restore();
ctx.save();
// console.log('draw:', this.daySteps.length, this.daySteps);
ctx.setStrokeStyle('#8CC152');
ctx.setLineWidth(1);
ctx.setFillStyle('#ED5565');
this.pointInfo.forEach(item => {
ctx.beginPath();
ctx.arc(item.x, item.y, 4, 0, 2 * Math.PI);
ctx.fill();
});
ctx.restore();
}
drawStepPointBar(ctx) {
if (this.pointInfo.length === 0) {
return;
}
let lineWidth = 6;
let radiusCap = lineWidth / 2;
ctx.save();
ctx.setStrokeStyle('#8CC152');
ctx.setLineWidth(lineWidth);
ctx.setLineCap('round');
ctx.moveTo(this.pointInfo[0].x, this.pointInfo[0].y);
this.pointInfo.forEach(point => {
let grd = ctx.createLinearGradient(point.x, this.axisY, point.x, point.y);
grd.addColorStop(0, '#48CFAD');
grd.addColorStop(1, '#A0D486');
ctx.setStrokeStyle(grd);
ctx.save();
ctx.rect(point.x - radiusCap, point.y, lineWidth, this.axisY - point.y);
ctx.clip();
ctx.beginPath();
ctx.moveTo(point.x, this.axisY);
ctx.lineTo(point.x, point.y + radiusCap);
ctx.stroke();
ctx.restore();
});
ctx.restore();
}
}
</script>

16
src/config.js

@ -0,0 +1,16 @@ @@ -0,0 +1,16 @@
export default {
apiHost: __API_HOST__,
getApiHost() {
var platForm = wx.getStorageSync('plat_form');
console.log(platForm);
if (platForm.indexOf('STORE') !== -1) {
return __PRO__
? 'https://education.diabetes.com.cn/api'
: 'https://nn-dp.chinacloudsites.cn/api';
}
return __PRO__
? 'https://app.diabetes.hbraas.com'
: 'https://app.diabetes.hbraas.com';
}
};

BIN
src/images/activity_202110/activity_index_icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

BIN
src/images/activity_202110/activity_index_popup_img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 219 KiB

BIN
src/images/activity_202110/assist_no_rank.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.2 KiB

BIN
src/images/activity_202110/assist_rank1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
src/images/activity_202110/assist_rank2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
src/images/activity_202110/assist_rank3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

BIN
src/images/activity_202110/assist_rule_font.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.8 KiB

BIN
src/images/activity_202110/assist_top_img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

BIN
src/images/activity_202110/award1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
src/images/activity_202110/award2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
src/images/activity_202110/award4_small.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
src/images/activity_202110/award_get_font.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

BIN
src/images/activity_202110/award_not_get_font.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
src/images/activity_202110/award_prizes.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

BIN
src/images/activity_202110/award_rule_font.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

BIN
src/images/activity_202110/award_times_font.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
src/images/activity_202110/bottom_img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
src/images/activity_202110/close.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
src/images/activity_202110/date_font.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

BIN
src/images/activity_202110/index_bottom_img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
src/images/activity_202110/index_entry1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
src/images/activity_202110/index_entry2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

BIN
src/images/activity_202110/index_entry3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
src/images/activity_202110/index_top_img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

BIN
src/images/activity_202110/lottery_btn.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

BIN
src/images/activity_202110/not_bind_font.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

BIN
src/images/activity_202110/not_bind_img1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
src/images/activity_202110/not_bind_img2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

BIN
src/images/activity_202110/num1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 197 B

BIN
src/images/activity_202110/num2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 334 B

BIN
src/images/activity_202110/num3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 301 B

BIN
src/images/activity_202110/num4.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 529 B

BIN
src/images/activity_202110/num5.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 326 B

BIN
src/images/activity_202110/prize_no_list.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

BIN
src/images/activity_202110/rank_rule_font.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

BIN
src/images/activity_202110/rule_bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
src/images/activity_202110/rule_font1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.7 KiB

BIN
src/images/activity_202110/rule_font2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.2 KiB

BIN
src/images/activity_202110/rule_font3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.8 KiB

BIN
src/images/activity_202110/steps_font.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
src/images/activity_202110/steps_no_rank.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.6 KiB

BIN
src/images/activity_202110/steps_rank1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
src/images/activity_202110/steps_rank2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
src/images/activity_202110/steps_rank3.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

BIN
src/images/activity_202110/steps_top_img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

BIN
src/images/activity_202201/fail.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
src/images/activity_202201/success.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
src/images/activity_award/address.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/images/activity_award/edit.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
src/images/activity_award/mobile.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 371 B

BIN
src/images/activity_award/tips.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 726 B

BIN
src/images/activity_award/user.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

BIN
src/images/activity_award/user/1.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
src/images/activity_award/user/10.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/images/activity_award/user/11.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

BIN
src/images/activity_award/user/12.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

BIN
src/images/activity_award/user/13.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
src/images/activity_award/user/2.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
src/images/activity_award/user/3.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

BIN
src/images/activity_award/user/4.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.5 KiB

BIN
src/images/activity_award/user/5.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

BIN
src/images/activity_award/user/6.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.6 KiB

BIN
src/images/activity_award/user/7.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
src/images/activity_award/user/8.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.4 KiB

BIN
src/images/activity_award/user/9.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.3 KiB

BIN
src/images/activity_rank/close_rule.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

BIN
src/images/activity_rank/default_img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
src/images/back.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.1 KiB

BIN
src/images/close.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

BIN
src/images/collect.jpg

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
src/images/detail_read.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 432 B

BIN
src/images/fact.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

BIN
src/images/gugong-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

BIN
src/images/header.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

BIN
src/images/home-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

BIN
src/images/icon-add.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 387 B

BIN
src/images/icon-calories-blue.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 695 B

BIN
src/images/icon-calories.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 764 B

BIN
src/images/icon-calories2.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save