More
7
.gitignore
vendored
@@ -21,3 +21,10 @@
|
||||
/.vscode
|
||||
/.idea
|
||||
*.iml
|
||||
|
||||
# HBuilder
|
||||
/h5pack/*.js
|
||||
/h5pack/*.css
|
||||
/h5pack/index.html
|
||||
/h5pack/favicon.ico
|
||||
/h5pack/static/
|
||||
|
||||
225
h5pack/manifest.json
Normal file
@@ -0,0 +1,225 @@
|
||||
{
|
||||
"@platforms" : [ "android", "iPhone" ],
|
||||
"id" : "H51E9A088", /*应用的标识*/
|
||||
"name" : "FIV", /*应用名称,程序桌面图标名称*/
|
||||
"version" : {
|
||||
"name" : "1.0", /*应用版本名称*/
|
||||
"code" : 1
|
||||
},
|
||||
"description" : "", /*应用描述信息*/
|
||||
"icons" : {
|
||||
"72" : "icon.png"
|
||||
},
|
||||
"launch_path" : "index.html", /*应用的入口页面,默认为根目录下的index.html;支持网络地址,必须以http://或https://开头*/
|
||||
"developer" : {
|
||||
"name" : "", /*开发者名称*/
|
||||
"email" : "", /*开发者邮箱地址*/
|
||||
"url" : "" /*开发者个人主页地址*/
|
||||
},
|
||||
"permissions" : {
|
||||
"Accelerometer" : {
|
||||
"description" : "访问加速度感应器"
|
||||
},
|
||||
"Audio" : {
|
||||
"description" : "访问麦克风"
|
||||
},
|
||||
"Cache" : {
|
||||
"description" : "管理应用缓存"
|
||||
},
|
||||
"Camera" : {
|
||||
"description" : "访问摄像头"
|
||||
},
|
||||
"Console" : {
|
||||
"description" : "跟踪调试输出日志"
|
||||
},
|
||||
"Device" : {
|
||||
"description" : "访问设备信息"
|
||||
},
|
||||
"Downloader" : {
|
||||
"description" : "文件下载管理"
|
||||
},
|
||||
"Events" : {
|
||||
"description" : "应用扩展事件"
|
||||
},
|
||||
"File" : {
|
||||
"description" : "访问本地文件系统"
|
||||
},
|
||||
"Gallery" : {
|
||||
"description" : "访问系统相册"
|
||||
},
|
||||
"Geolocation" : {
|
||||
"description" : "访问位置信息"
|
||||
},
|
||||
"Invocation" : {
|
||||
"description" : "使用Native.js能力"
|
||||
},
|
||||
"Orientation" : {
|
||||
"description" : "访问方向感应器"
|
||||
},
|
||||
"Proximity" : {
|
||||
"description" : "访问距离感应器"
|
||||
},
|
||||
"Share" : {
|
||||
"description" : "分享"
|
||||
},
|
||||
"Storage" : {
|
||||
"description" : "管理应用本地数据"
|
||||
},
|
||||
"Uploader" : {
|
||||
"description" : "管理文件上传任务"
|
||||
},
|
||||
"Runtime" : {
|
||||
"description" : "访问运行期环境"
|
||||
},
|
||||
"XMLHttpRequest" : {
|
||||
"description" : "跨域网络访问"
|
||||
},
|
||||
"Zip" : {
|
||||
"description" : "文件压缩与解压缩"
|
||||
},
|
||||
"Barcode" : {
|
||||
"description" : "管理二维码扫描插件"
|
||||
},
|
||||
"Webview" : {
|
||||
"description" : "窗口管理"
|
||||
},
|
||||
"NativeUI" : {
|
||||
"description" : "原生UI控件"
|
||||
},
|
||||
"Navigator" : {
|
||||
"description" : "浏览器信息"
|
||||
},
|
||||
"NativeObj" : {
|
||||
"description" : "原生对象"
|
||||
}
|
||||
},
|
||||
"plus" : {
|
||||
"splashscreen" : {
|
||||
"autoclose" : true, /*是否自动关闭程序启动界面,true表示应用加载应用入口页面后自动关闭;false则需调plus.navigator.closeSplashscreen()关闭*/
|
||||
"waiting" : true /*是否在程序启动界面显示等待雪花,true表示显示,false表示不显示。*/
|
||||
},
|
||||
"popGesture" : "close", /*设置应用默认侧滑返回关闭Webview窗口,"none"为无侧滑返回功能,"hide"为侧滑隐藏Webview窗口。参考http://ask.dcloud.net.cn/article/102*/
|
||||
"runmode" : "normal", /*应用的首次启动运行模式,可取liberate或normal,liberate模式在第一次启动时将解压应用资源(Android平台File API才可正常访问_www目录)*/
|
||||
"signature" : "Sk9JTiBVUyBtYWlsdG86aHIyMDEzQGRjbG91ZC5pbw==", /*可选,保留给应用签名,暂不使用*/
|
||||
"distribute" : {
|
||||
"apple" : {
|
||||
"appid" : "org.faronear.fiv", /*iOS应用标识,苹果开发网站申请的appid,如io.dcloud.HelloH5*/
|
||||
"mobileprovision" : "", /*iOS应用打包配置文件*/
|
||||
"password" : "", /*iOS应用打包个人证书导入密码*/
|
||||
"p12" : "", /*iOS应用打包个人证书,打包配置文件关联的个人证书*/
|
||||
"devices" : "iphone", /*iOS应用支持的设备类型,可取值iphone/ipad/universal*/
|
||||
"frameworks" : [] /*调用Native.js调用原生Objective-c API需要引用的FrameWork,如需调用GameCenter,则添加"GameKit.framework"*/
|
||||
},
|
||||
"google" : {
|
||||
"packagename" : "org.faronear.fiv", /*Android应用包名,如io.dcloud.HelloH5*/
|
||||
"keystore" : "unpackage/key/fiv.keystore", /*Android应用打包使用的密钥库文件*/
|
||||
"password" : "fivfiv", /*Android应用打包使用密钥库中证书的密码*/
|
||||
"aliasname" : "fiv", /*Android应用打包使用密钥库中证书的别名*/
|
||||
"permissions" : [
|
||||
"<uses-feature android:name=\"android.hardware.camera\"/>",
|
||||
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
|
||||
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
|
||||
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>"
|
||||
]
|
||||
},
|
||||
/*使用Native.js调用原生安卓API需要使用到的系统权限*/
|
||||
"orientation" : [ "portrait-primary" ], /*应用支持的方向,portrait-primary:竖屏正方向;portrait-secondary:竖屏反方向;landscape-primary:横屏正方向;landscape-secondary:横屏反方向*/
|
||||
"icons" : {
|
||||
"ios" : {
|
||||
"prerendered" : true, /*应用图标是否已经高亮处理,在iOS6及以下设备上有效*/
|
||||
"auto" : "", /*应用图标,分辨率:512x512,用于自动生成各种尺寸程序图标*/
|
||||
"iphone" : {
|
||||
"normal" : "", /*iPhone3/3GS程序图标,分辨率:57x57*/
|
||||
"retina" : "", /*iPhone4程序图标,分辨率:114x114*/
|
||||
"retina7" : "", /*iPhone4S/5/6程序图标,分辨率:120x120*/
|
||||
"retina8" : "", /*iPhone6 Plus程序图标,分辨率:180x180*/
|
||||
"spotlight-normal" : "", /*iPhone3/3GS Spotlight搜索程序图标,分辨率:29x29*/
|
||||
"spotlight-retina" : "", /*iPhone4 Spotlight搜索程序图标,分辨率:58x58*/
|
||||
"spotlight-retina7" : "", /*iPhone4S/5/6 Spotlight搜索程序图标,分辨率:80x80*/
|
||||
"settings-normal" : "", /*iPhone4设置页面程序图标,分辨率:29x29*/
|
||||
"settings-retina" : "", /*iPhone4S/5/6设置页面程序图标,分辨率:58x58*/
|
||||
"settings-retina8" : "", /*iPhone6Plus设置页面程序图标,分辨率:87x87*/
|
||||
"app@2x" : "unpackage/res/icons/120x120.png",
|
||||
"app@3x" : "unpackage/res/icons/180x180.png",
|
||||
"notification@2x" : "unpackage/res/icons/40x40.png",
|
||||
"notification@3x" : "unpackage/res/icons/60x60.png",
|
||||
"settings@2x" : "unpackage/res/icons/58x58.png",
|
||||
"settings@3x" : "unpackage/res/icons/87x87.png",
|
||||
"spotlight@2x" : "unpackage/res/icons/80x80.png",
|
||||
"spotlight@3x" : "unpackage/res/icons/120x120.png"
|
||||
},
|
||||
"ipad" : {
|
||||
"normal" : "", /*iPad普通屏幕程序图标,分辨率:72x72*/
|
||||
"retina" : "", /*iPad高分屏程序图标,分辨率:144x144*/
|
||||
"normal7" : "", /*iPad iOS7程序图标,分辨率:76x76*/
|
||||
"retina7" : "", /*iPad iOS7高分屏程序图标,分辨率:152x152*/
|
||||
"spotlight-normal" : "", /*iPad Spotlight搜索程序图标,分辨率:50x50*/
|
||||
"spotlight-retina" : "", /*iPad高分屏Spotlight搜索程序图标,分辨率:100x100*/
|
||||
"spotlight-normal7" : "", /*iPad iOS7 Spotlight搜索程序图标,分辨率:40x40*/
|
||||
"spotlight-retina7" : "", /*iPad iOS7高分屏Spotlight搜索程序图标,分辨率:80x80*/
|
||||
"settings-normal" : "", /*iPad设置页面程序图标,分辨率:29x29*/
|
||||
"settings-retina" : "", /*iPad高分屏设置页面程序图标,分辨率:58x58*/
|
||||
"app" : "unpackage/res/icons/76x76.png",
|
||||
"app@2x" : "unpackage/res/icons/152x152.png",
|
||||
"notification" : "unpackage/res/icons/20x20.png",
|
||||
"notification@2x" : "unpackage/res/icons/40x40.png",
|
||||
"proapp@2x" : "unpackage/res/icons/167x167.png",
|
||||
"settings" : "unpackage/res/icons/29x29.png",
|
||||
"settings@2x" : "unpackage/res/icons/58x58.png",
|
||||
"spotlight" : "unpackage/res/icons/40x40.png",
|
||||
"spotlight@2x" : "unpackage/res/icons/80x80.png"
|
||||
},
|
||||
"appstore" : "unpackage/res/icons/1024x1024.png"
|
||||
},
|
||||
"android" : {
|
||||
"mdpi" : "", /*普通屏程序图标,分辨率:48x48*/
|
||||
"ldpi" : "", /*大屏程序图标,分辨率:48x48*/
|
||||
"hdpi" : "unpackage/res/icons/72x72.png", /*高分屏程序图标,分辨率:72x72*/
|
||||
"xhdpi" : "unpackage/res/icons/96x96.png", /*720P高分屏程序图标,分辨率:96x96*/
|
||||
"xxhdpi" : "unpackage/res/icons/144x144.png", /*1080P 高分屏程序图标,分辨率:144x144*/
|
||||
"xxxhdpi" : "unpackage/res/icons/192x192.png"
|
||||
}
|
||||
},
|
||||
"splashscreen" : {
|
||||
"ios" : {
|
||||
"iphone" : {
|
||||
"default" : "", /*iPhone3启动图片选,分辨率:320x480*/
|
||||
"retina35" : "", /*3.5英寸设备(iPhone4)启动图片,分辨率:640x960*/
|
||||
"retina40" : "", /*4.0 英寸设备(iPhone5/iPhone5s)启动图片,分辨率:640x1136*/
|
||||
"retina47" : "", /*4.7 英寸设备(iPhone6)启动图片,分辨率:750x1334*/
|
||||
"retina55" : "", /*5.5 英寸设备(iPhone6 Plus)启动图片,分辨率:1242x2208*/
|
||||
"retina55l" : "" /*5.5 英寸设备(iPhone6 Plus)横屏启动图片,分辨率:2208x1242*/
|
||||
},
|
||||
"ipad" : {
|
||||
"portrait" : "", /*iPad竖屏启动图片,分辨率:768x1004*/
|
||||
"portrait-retina" : "", /*iPad高分屏竖屏图片,分辨率:1536x2008*/
|
||||
"landscape" : "", /*iPad横屏启动图片,分辨率:1024x748*/
|
||||
"landscape-retina" : "", /*iPad高分屏横屏启动图片,分辨率:2048x1496*/
|
||||
"portrait7" : "", /*iPad iOS7竖屏启动图片,分辨率:768x1024*/
|
||||
"portrait-retina7" : "", /*iPad iOS7高分屏竖屏图片,分辨率:1536x2048*/
|
||||
"landscape7" : "", /*iPad iOS7横屏启动图片,分辨率:1024x768*/
|
||||
"landscape-retina7" : "" /*iPad iOS7高分屏横屏启动图片,分辨率:2048x1536*/
|
||||
}
|
||||
},
|
||||
"android" : {
|
||||
"mdpi" : "", /*普通屏启动图片,分辨率:240x282*/
|
||||
"ldpi" : "", /*大屏启动图片,分辨率:320x442*/
|
||||
"hdpi" : "", /*高分屏启动图片,分辨率:480x762*/
|
||||
"xhdpi" : "", /*720P高分屏启动图片,分辨率:720x1242*/
|
||||
"xxhdpi" : "" /*1080P高分屏启动图片,分辨率:1080x1882*/
|
||||
}
|
||||
},
|
||||
"plugins" : {
|
||||
"speech" : {}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
BIN
h5pack/unpackage/key/fiv.keystore
Normal file
BIN
h5pack/unpackage/res/icons/1024x1024.png
Normal file
|
After Width: | Height: | Size: 248 KiB |
BIN
h5pack/unpackage/res/icons/120x120.png
Normal file
|
After Width: | Height: | Size: 11 KiB |
BIN
h5pack/unpackage/res/icons/144x144.png
Normal file
|
After Width: | Height: | Size: 14 KiB |
BIN
h5pack/unpackage/res/icons/152x152.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
BIN
h5pack/unpackage/res/icons/167x167.png
Normal file
|
After Width: | Height: | Size: 18 KiB |
BIN
h5pack/unpackage/res/icons/180x180.png
Normal file
|
After Width: | Height: | Size: 20 KiB |
BIN
h5pack/unpackage/res/icons/192x192.png
Normal file
|
After Width: | Height: | Size: 22 KiB |
BIN
h5pack/unpackage/res/icons/20x20.png
Normal file
|
After Width: | Height: | Size: 1003 B |
BIN
h5pack/unpackage/res/icons/29x29.png
Normal file
|
After Width: | Height: | Size: 1.6 KiB |
BIN
h5pack/unpackage/res/icons/40x40.png
Normal file
|
After Width: | Height: | Size: 2.4 KiB |
BIN
h5pack/unpackage/res/icons/58x58.png
Normal file
|
After Width: | Height: | Size: 3.9 KiB |
BIN
h5pack/unpackage/res/icons/60x60.png
Normal file
|
After Width: | Height: | Size: 4.1 KiB |
BIN
h5pack/unpackage/res/icons/72x72.png
Normal file
|
After Width: | Height: | Size: 5.3 KiB |
BIN
h5pack/unpackage/res/icons/76x76.png
Normal file
|
After Width: | Height: | Size: 5.7 KiB |
BIN
h5pack/unpackage/res/icons/80x80.png
Normal file
|
After Width: | Height: | Size: 6.1 KiB |
BIN
h5pack/unpackage/res/icons/87x87.png
Normal file
|
After Width: | Height: | Size: 6.8 KiB |
BIN
h5pack/unpackage/res/icons/96x96.png
Normal file
|
After Width: | Height: | Size: 7.8 KiB |
@@ -1,8 +1,10 @@
|
||||
import { Model } from 'dva';
|
||||
import { delay } from 'dva/saga';
|
||||
import _ from 'lodash';
|
||||
import { getLocale, setLocale } from 'umi-plugin-locale'
|
||||
import { loadUser, storeUser, clearUser, clearMineList, clearCoins, clearDrawCoins } from '@/utils/storage';
|
||||
import { User } from '@/types/common';
|
||||
import { isApp, restart } from '@/utils/h5plus';
|
||||
|
||||
const initState = () => {
|
||||
const user = loadUser();
|
||||
@@ -55,7 +57,7 @@ const model: Model = {
|
||||
},
|
||||
|
||||
*changeLang({ payload: lang }, { put }) {
|
||||
setLocale(lang);
|
||||
setLocale(lang, false);
|
||||
yield put({ type: 'onUpdateState', payload: { lang } });
|
||||
},
|
||||
},
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import React, { useEffect } from 'react';
|
||||
import { connect, DispatchProp, routerRedux } from 'dva';
|
||||
import { Spin, Icon } from 'antd';
|
||||
import _ from 'lodash';
|
||||
import { formatMessage } from 'umi-plugin-locale';
|
||||
import FittedImage from 'react-fitted-image';
|
||||
import { HomeCommunityModelState } from './model';
|
||||
@@ -10,6 +10,7 @@ import List from '@/components/List';
|
||||
import { dispatch } from '@/utils/utils';
|
||||
|
||||
import styles from './style.less';
|
||||
import { displayPhone } from '@/utils/transform';
|
||||
|
||||
const CommunityPage: React.FC<HomeCommunityModelState & DispatchProp> = ({
|
||||
dispatch,
|
||||
@@ -79,10 +80,10 @@ const CommunityPage: React.FC<HomeCommunityModelState & DispatchProp> = ({
|
||||
{it.avatar ? <FittedImage
|
||||
src={it.avatar}
|
||||
fit="cover"
|
||||
/> : <div className="fake">{(it.nickname && it.nickname[0]) || 'F'}</div>}
|
||||
/> : <div className="fake">{(it.nickname && it.nickname[0]) || _.last(it.phone) || 'F'}</div>}
|
||||
</div>
|
||||
<div className="line">
|
||||
<span>{it.nickname || it.phone}</span>
|
||||
<span>{it.nickname || displayPhone(it.phone)}</span>
|
||||
<span className="time">{formatMessage({ id: 'home.community.time' })}{it.createdAt}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import React from 'react';
|
||||
import FittedImage from 'react-fitted-image';
|
||||
import { connect, DispatchProp, routerRedux } from 'dva';
|
||||
import _ from 'lodash';
|
||||
import { UserModelState } from '@/models/user';
|
||||
import SettingItem from '@/components/SettingItem';
|
||||
import logoAccount from '@/assets/p_account.png';
|
||||
@@ -24,7 +25,7 @@ const ProfilePage: React.FC<UserModelState & DispatchProp> = ({
|
||||
<div className="avatar">
|
||||
{user.avatar ?
|
||||
<FittedImage src={user.avatar} fit="cover" /> :
|
||||
<span>{user.nickname ? user.nickname[0] : user.phone[0]}</span>
|
||||
<span>{user.nickname ? user.nickname[0] : _.last(user.phone)}</span>
|
||||
}
|
||||
</div>
|
||||
<span className="name">{user.nickname || user.phone}</span>
|
||||
|
||||
@@ -1,15 +1,17 @@
|
||||
import { dispatch, getState } from './utils';
|
||||
import { routerRedux } from 'dva';
|
||||
|
||||
const plus = window.plus;
|
||||
|
||||
const isApp = () => typeof plus !== 'undefined';
|
||||
const isApp = () => {
|
||||
const r = typeof window.plus !== 'undefined';
|
||||
// console.log(r);
|
||||
return r;
|
||||
};
|
||||
|
||||
const barcodeId = 'barcode'
|
||||
const scan = () => {
|
||||
if (!isApp()) return Promise.resolve('');
|
||||
return new Promise<string>(resolve => {
|
||||
const { barcode, webview } = plus;
|
||||
const { barcode, webview } = window.plus;
|
||||
const bc = barcode.create(barcodeId, [barcode.QR], {
|
||||
position: 'absolute',
|
||||
left: '0px',
|
||||
@@ -38,42 +40,48 @@ const firstPaths = [
|
||||
'/home/profile',
|
||||
];
|
||||
const backButtonHandler = () => {
|
||||
const barcode = plus.barcode.getBarcodeById(barcodeId);
|
||||
const barcode = window.plus.barcode.getBarcodeById(barcodeId);
|
||||
if (barcode) {
|
||||
barcode.close();
|
||||
return;
|
||||
}
|
||||
const { pathname } = getState().router.location;
|
||||
if (firstPaths.includes(pathname)) {
|
||||
plus.runtime.quit();
|
||||
window.plus.runtime.quit();
|
||||
} else {
|
||||
dispatch(routerRedux.goBack());
|
||||
}
|
||||
};
|
||||
const init = () => {
|
||||
if (!isApp()) return;
|
||||
plus.key.addEventListener('backbutton', backButtonHandler);
|
||||
window.plus.key.addEventListener('backbutton', backButtonHandler);
|
||||
};
|
||||
|
||||
const destory = () => {
|
||||
if (!isApp()) return;
|
||||
plus.key.removeEventListener('backbutton', backButtonHandler);
|
||||
window.plus.key.removeEventListener('backbutton', backButtonHandler);
|
||||
};
|
||||
|
||||
const share = (content: string) => {
|
||||
if (!isApp()) return;
|
||||
plus.share.sendWithSystem({
|
||||
window.plus.share.sendWithSystem({
|
||||
type: 'text',
|
||||
content,
|
||||
}, () => { });
|
||||
};
|
||||
|
||||
const restart = () => {
|
||||
if (!isApp()) return;
|
||||
window.plus.runtime.restart();
|
||||
}
|
||||
|
||||
export {
|
||||
init,
|
||||
isApp,
|
||||
scan,
|
||||
share,
|
||||
destory,
|
||||
restart,
|
||||
};
|
||||
|
||||
export default {
|
||||
@@ -82,4 +90,5 @@ export default {
|
||||
scan,
|
||||
share,
|
||||
destory,
|
||||
restart,
|
||||
};
|
||||
|
||||
@@ -46,3 +46,7 @@ export function fromLangToText(lang: string) {
|
||||
export function encryptPwd(pwd: string): string {
|
||||
return md5(pwd);
|
||||
}
|
||||
|
||||
export function displayPhone(phone: string): string {
|
||||
return `1******${_.takeRight(phone, 4).join('')}`;
|
||||
}
|
||||
|
||||