作者 韩昌

g

... ... @@ -3,6 +3,7 @@ import { genTestUserSig, aegisID } from './debug/index.js'
import { TIM, TIMUploadPlugin, Aegis } from './debug/tim.js'
import UseSetCidHandler from '@/hooks/useSetCidHandler'
import { getLocationHandler } from './utils/getLocation'
import { getDeviceType } from './utils/getDeviceType'
const aegis = new Aegis({
id: aegisID, // 项目key
reportApiSpeed: true // 接口测速
... ... @@ -33,6 +34,7 @@ uni.$TUICallKit = TUICallKit // 全局引入
// #endif
export default {
onLaunch: function () {
getDeviceType()
// this.bindTIMEvent()
// this.login()
// #ifdef APP-PLUS
... ...
... ... @@ -9,7 +9,7 @@
"backToExit" : "false",
"second" : {
"title" : "确认提示",
"message" : "  进入应用前,你需先同意<a href='https://doctor.apple02.brofirst.cn/serviceText/'>《服务协议》</a>和<a href='https://doctor.apple02.brofirst.cn/userPrivacy/'>《隐私政策》</a>,否则将退出应用。",
"message" : "  进入应用前,你需先同意<a href=\"https://doctor.apple02.brofirst.cn/serviceText/\">《用户服务协议》</a>和<a href=\"https://doctor.apple02.brofirst.cn/userPrivacy/\">《用户隐私协议》</a>,否则将退出应用。",
"buttonAccept" : "同意并继续",
"buttonRefuse" : "退出应用"
},
... ...
... ... @@ -55,6 +55,7 @@ export const updateChange_phone = (data: EditPhoneType) => request({ url: '/vete
export const updateChange_invite_paper = (data: RecordsInvitePaper) => request({ url: '/veterinary/invite_paper', method: 'POST', data }) // 记录用户分享海报
export const updateChange_pwd = (data: ChangePwdType) => request({ url: '/veterinary/change_pwd', method: 'POST', data }) // 修改密码
export const fetchDelUser = () => request({ url: '/veterinary/delUser', method: 'GET' }) // 注销账号
export const getCustomerServicePhone = () => request({ url: '/veterinary/getCustomerServicePhone', method: 'GET' }) // 注销账号
// 消息
export const getMsg_count = () => request({ url: '/veterinary/msg_count', method: 'GET' }) // 未读消息数量
... ...
... ... @@ -2,8 +2,8 @@
"name" : "宠研兽医",
"appid" : "__UNI__AB7B27B",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
"versionName" : "1.0.1",
"versionCode" : 1010,
"transformPx" : false,
"extensions" : {
"uni-cloud-verify" : {} // 启用一键登录扩展,值为空对象即可
... ... @@ -49,6 +49,10 @@
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
],
"permissionExternalStorage" : {
"request" : "none",
"prompt" : "应用保存运行状态等信息,需要获取读写手机储存(系统提示为访问设备上的图片,媒体内容和文件)权限,请允许"
},
"minSdkVersion" : 21,
"targetSdkVersion" : 30
},
... ... @@ -61,6 +65,11 @@
"applinks:static-mp-8ab296ea-35dc-49cc-92d3-9a750639c63d.next.bspapp.com"
]
}
},
"privacyDescription" : {
"NSPhotoLibraryUsageDescription" : "上传资质信息、更改头像信息等模块手动选择上传相册内的照片需要读取相册内容,是否允许读取相册内容",
"NSPhotoLibraryAddUsageDescription" : "下载图片需要保存到相册,是否允许保存照片到相册",
"NSCameraUsageDescription" : "上传资质信息、更改头像信息等模块拍照上传照片需要使用摄像头,是否允许使用摄像头"
}
},
/* SDK配置 */
... ... @@ -109,19 +118,34 @@
},
"icons" : {
"android" : {
"xxxhdpi" : "static/images/logo.png"
"xxxhdpi" : "unpackage/res/icons/192x192.png",
"hdpi" : "unpackage/res/icons/72x72.png",
"xhdpi" : "unpackage/res/icons/96x96.png",
"xxhdpi" : "unpackage/res/icons/144x144.png"
},
"ios" : {
"iphone" : {
"app@2x" : "static/logo/logo120.png",
"spotlight@3x" : "static/logo/logo120.png"
"app@2x" : "unpackage/res/icons/120x120.png",
"spotlight@3x" : "unpackage/res/icons/120x120.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"app@3x" : "unpackage/res/icons/180x180.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"
},
"ipad" : {
"app" : "static/logo/logo76.png",
"app@2x" : "static/logo/logo152.png",
"proapp@2x" : "static/logo/logo167.png"
"app" : "unpackage/res/icons/76x76.png",
"app@2x" : "unpackage/res/icons/152x152.png",
"proapp@2x" : "unpackage/res/icons/167x167.png",
"spotlight" : "unpackage/res/icons/40x40.png",
"notification@2x" : "unpackage/res/icons/40x40.png",
"notification" : "unpackage/res/icons/20x20.png",
"settings" : "unpackage/res/icons/29x29.png",
"settings@2x" : "unpackage/res/icons/58x58.png",
"spotlight@2x" : "unpackage/res/icons/80x80.png"
},
"appstore" : "static/images/logo.png"
"appstore" : "unpackage/res/icons/1024x1024.png"
}
}
},
... ...
... ... @@ -11,7 +11,7 @@
<image src="/static/images/mAvatar.png" class="mine-avatar" mode="aspectFill" @click.stop="proxy.$h.previewImage('/static/images/mAvatar.png')" />
</view>
<view>
<view class="flexA" style="margin-bottom: 10rpx;flex-wrap: wrap;">
<view class="flexA" style="margin-bottom: 10rpx; flex-wrap: wrap">
<view class="mine-username">{{ UserInfo?.nickname ?? '去登录' }}</view>
<view class="mine-toptag flexC" v-if="![null, undefined, ''].includes(UserInfo?.hospitalName)">{{ UserInfo?.hospitalName ?? '去登录' }}</view>
</view>
... ... @@ -93,7 +93,7 @@ import { onLoad, onShow, onPageScroll } from '@dcloudio/uni-app'
import Tabbar from '@/components/Tabbar'
import NavBar from '@/components/NavBar'
import TurnDown from '@/components/TurnDown'
import { getMy, getCareer, getDepartment, getIndex, getMsg_count } from '@/api'
import { getMy, getCareer, getDepartment, getIndex, getMsg_count, getCustomerServicePhone } from '@/api'
import type { Result, UserInfoType, IndexListType, IndexType, MineJumpListType, MessageCountType } from '../../types'
const { proxy } = getCurrentInstance() as { proxy: ComponentPublicInstance }
... ... @@ -118,7 +118,8 @@ const jumpList: MineJumpListType[] = [
{ title: '问诊记录', iconUrl: '/static/images/mineicon2.png', url: `/pages2/order/index?orderState=0&subOrderState=3&isRecords=success`, requiredAuth: 'err' },
// { title: '问诊价格', iconUrl: '/static/images/mineicon3.png', requiredAuth: 'err' },
{ title: '邀请分享', iconUrl: '/static/images/mineicon4.png', url: `/pages2/mineinfo/qrcode`, requiredAuth: 'success' },
{ title: '账户设置', iconUrl: '/static/images/accountsetting.png', url: `/pages2/money/account`, requiredAuth: 'err' }
{ title: '账户设置', iconUrl: '/static/images/accountsetting.png', url: `/pages2/money/account`, requiredAuth: 'err' },
{ title: '联系客服', iconUrl: '/static/images/kefu.png', url: `/pages2/money/account`, requiredAuth: 'err', type: 'showModal' }
]
const UserInfo = ref<UserInfoType>()
... ... @@ -141,9 +142,22 @@ const getIndexDataHandler = async () => {
IndexData.value = result
}
const jumpHandler = (_: MineJumpListType) => {
const jumpHandler = async (_: MineJumpListType) => {
if (_.requiredAuth === 'success' && ![20, '20'].includes(IndexData.value?.examineState)) return uni.$u.toast('请先完成认证')
if (_.type === 'showModal') {
const { result } = await getCustomerServicePhone()
return uni.showModal({
content: result,
showCancel: true,
confirmText: '复制',
success: ({ confirm }) => {
if (confirm) proxy.$h.copyText(result)
}
})
}
proxy.$h.jumpUrl(_.url)
}
... ...
... ... @@ -91,7 +91,7 @@ const settingList1 = ref<SettingItemType[]>([
const settingList2 = ref<SettingItemType[]>([
{ title: '设置问诊价格', text: '', type: 'jump', url: '/pages2/order/consultationFee' },
{ title: '意见反馈', text: '', type: 'jump', url: '/pages/mine/feedback' },
{ title: '关于我们', text: '', value: 'xxx', type: 'input' }
{ title: '关于我们', text: '', value: '', type: 'jump', url:'/pages/login/agreement?title=关于我们&type=1' }
])
const settingList3 = ref<SettingItemType[]>([{ title: '退出登录', text: '', type: 'SignOUT' }])
... ...
... ... @@ -629,6 +629,7 @@ export interface MineJumpListType {
iconUrl?: string
url?: string
requiredAuth?: string
[property: string]: any;
}
export interface GetUserCardType {
... ...
interface DeviceInfo {
platform: 'android' | 'ios' | 'unknown';
}
export const getDeviceType = (): Promise<string> => {
return new Promise((resolve, reject) => {
let deviceType = uni.getStorageSync('deviceType');
if (deviceType) {
resolve(deviceType);
} else {
uni.getSystemInfo({
success: function(res: DeviceInfo) {
if (res.platform === 'android') {
uni.setStorageSync('deviceType', 'android');
resolve('android');
} else if (res.platform === 'ios') {
uni.setStorageSync('deviceType', 'ios');
resolve('ios');
} else {
uni.setStorageSync('deviceType', '未知');
reject(new Error('无法识别当前设备类型'));
}
},
fail: function(err: any) {
reject(err);
}
});
}
});
}
// 调用工具函数获取当前设备类型
// getDeviceType().then(deviceType => {
// console.log('当前设备类型是:', deviceType);
// }).catch(err => {
// console.error('获取设备类型失败:', err);
// });
... ...
// export const baseURL = 'http://192.168.10.63:8080/jeecg-boot' // 本地
// export const baseURL = 'http://t5qnpc.natappfree.cc/jeecg-boot' // 本地
export const baseURL = 'https://doctor.apple02.brofirst.cn/jeecg-boot' // 本地
// export const baseURL = 'http://114.115.178.175:8799/jeecg-boot' // 测试
// export const baseURL = 'http://192.168.10.167:8080/jeecg-boot'
// export const baseURL = 'http://t5qnpc.natappfree.cc/jeecg-boot'
export const baseURL = 'https://doctor.apple02.brofirst.cn/jeecg-boot'
// export const baseURL = 'http://114.115.178.175:8799/jeecg-boot'
// export const baseURL = 'http://127.0.0.1:4523/m1/3332971-0-default/jeecg-boot' // mock
interface optionsType {
... ...
import { baseURL } from './http'
import { permision } from './permission'
// immuneStatus: { 1:'',2:'',3: '',4: '' }
const GlobalData = {
... ... @@ -36,7 +37,17 @@ export default {
return GlobalData[object][key] || GlobalData[object][err]
},
// 上传图片
upload(url: string, callBack: (e: any) => void) {
async upload(url: string, callBack: (e: any) => void) {
// #ifdef APP-PLUS
if(uni.getStorageSync('deviceType') === 'android') {
const result = await permision.premissionCheck("EXTERNAL_STORAGE")
if (result != 1) {
console.log('拒绝')
return
}
}
// #endif
let arr = {}
uni.chooseImage({
count: 3,
... ... @@ -156,7 +167,7 @@ export default {
}
})
},
copyText(text: string) {
copyText(text: string | number) {
//#ifndef H5
uni.setClipboardData({
data: String(text),
... ...
var isIos
// #ifdef APP-PLUS
isIos = (plus.os.name == "iOS")
// #endif
// 判断推送权限是否开启
function judgeIosPermissionPush() {
var result = false;
var UIApplication = plus.ios.import("UIApplication");
var app = UIApplication.sharedApplication();
var enabledTypes = 0;
if (app.currentUserNotificationSettings) {
var settings = app.currentUserNotificationSettings();
enabledTypes = settings.plusGetAttribute("types");
console.log("enabledTypes1:" + enabledTypes);
if (enabledTypes == 0) {
console.log("推送权限没有开启");
} else {
result = true;
console.log("已经开启推送功能!")
}
plus.ios.deleteObject(settings);
} else {
enabledTypes = app.enabledRemoteNotificationTypes();
if (enabledTypes == 0) {
console.log("推送权限没有开启!");
} else {
result = true;
console.log("已经开启推送功能!")
}
console.log("enabledTypes2:" + enabledTypes);
}
plus.ios.deleteObject(app);
plus.ios.deleteObject(UIApplication);
return result;
}
// 判断定位权限是否开启
function judgeIosPermissionLocation() {
var result = false;
var cllocationManger = plus.ios.import("CLLocationManager");
var status = cllocationManger.authorizationStatus();
result = (status != 2)
console.log("定位权限开启:" + result);
// 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
/* var enable = cllocationManger.locationServicesEnabled();
var status = cllocationManger.authorizationStatus();
console.log("enable:" + enable);
console.log("status:" + status);
if (enable && status != 2) {
result = true;
console.log("手机定位服务已开启且已授予定位权限");
} else {
console.log("手机系统的定位没有打开或未给予定位权限");
} */
plus.ios.deleteObject(cllocationManger);
return result;
}
// 判断麦克风权限是否开启
function judgeIosPermissionRecord() {
var result = false;
var avaudiosession = plus.ios.import("AVAudioSession");
var avaudio = avaudiosession.sharedInstance();
var permissionStatus = avaudio.recordPermission();
console.log("permissionStatus:" + permissionStatus);
if (permissionStatus == 1684369017 || permissionStatus == 1970168948) {
console.log("麦克风权限没有开启");
} else {
result = true;
console.log("麦克风权限已经开启");
}
plus.ios.deleteObject(avaudiosession);
return result;
}
// 判断相机权限是否开启
function judgeIosPermissionCamera() {
var result = false;
var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
console.log("authStatus:" + authStatus);
if (authStatus == 3) {
result = true;
console.log("相机权限已经开启");
} else {
console.log("相机权限没有开启");
}
plus.ios.deleteObject(AVCaptureDevice);
return result;
}
// 判断相册权限是否开启
function judgeIosPermissionPhotoLibrary() {
var result = false;
var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
var authStatus = PHPhotoLibrary.authorizationStatus();
console.log("authStatus:" + authStatus);
if (authStatus == 3) {
result = true;
console.log("相册权限已经开启");
} else {
console.log("相册权限没有开启");
}
plus.ios.deleteObject(PHPhotoLibrary);
return result;
}
// 判断通讯录权限是否开启
function judgeIosPermissionContact() {
var result = false;
var CNContactStore = plus.ios.import("CNContactStore");
var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
if (cnAuthStatus == 3) {
result = true;
console.log("通讯录权限已经开启");
} else {
console.log("通讯录权限没有开启");
}
plus.ios.deleteObject(CNContactStore);
return result;
}
// 判断日历权限是否开启
function judgeIosPermissionCalendar() {
var result = false;
var EKEventStore = plus.ios.import("EKEventStore");
var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
if (ekAuthStatus == 3) {
result = true;
console.log("日历权限已经开启");
} else {
console.log("日历权限没有开启");
}
plus.ios.deleteObject(EKEventStore);
return result;
}
// 判断备忘录权限是否开启
function judgeIosPermissionMemo() {
var result = false;
var EKEventStore = plus.ios.import("EKEventStore");
var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
if (ekAuthStatus == 3) {
result = true;
console.log("备忘录权限已经开启");
} else {
console.log("备忘录权限没有开启");
}
plus.ios.deleteObject(EKEventStore);
return result;
}
// Android权限查询
function requestAndroidPermission(permissionID) {
return new Promise((resolve, reject) => {
plus.android.requestPermissions(
permissionID.split(","),
// [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
function(resultObj) {
var result = 0;
for (var i = 0; i < resultObj.granted.length; i++) {
var grantedPermission = resultObj.granted[i];
console.log('已获取的权限:' + grantedPermission);
result = 1
}
for (var i = 0; i < resultObj.deniedPresent.length; i++) {
var deniedPresentPermission = resultObj.deniedPresent[i];
console.log('拒绝本次申请的权限:' + deniedPresentPermission);
result = 0
}
for (var i = 0; i < resultObj.deniedAlways.length; i++) {
var deniedAlwaysPermission = resultObj.deniedAlways[i];
console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
result = -1
}
resolve(result);
// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
// if (result != 1) {
// gotoAppPermissionSetting()
// }
},
function(error) {
console.log('申请权限错误:' + error.code + " = " + error.message);
resolve({
code: error.code,
message: error.message
});
}
);
});
}
// 使用一个方法,根据参数判断权限
function judgeIosPermission(permissionID) {
if (permissionID == "location") {
return judgeIosPermissionLocation()
} else if (permissionID == "camera") {
return judgeIosPermissionCamera()
} else if (permissionID == "photoLibrary") {
return judgeIosPermissionPhotoLibrary()
} else if (permissionID == "record") {
return judgeIosPermissionRecord()
} else if (permissionID == "push") {
return judgeIosPermissionPush()
} else if (permissionID == "contact") {
return judgeIosPermissionContact()
} else if (permissionID == "calendar") {
return judgeIosPermissionCalendar()
} else if (permissionID == "memo") {
return judgeIosPermissionMemo()
}
return false;
}
// 跳转到**应用**的权限页面
function gotoAppPermissionSetting() {
if (isIos) {
var UIApplication = plus.ios.import("UIApplication");
var application2 = UIApplication.sharedApplication();
var NSURL2 = plus.ios.import("NSURL");
// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");
var setting2 = NSURL2.URLWithString("app-settings:");
application2.openURL(setting2);
plus.ios.deleteObject(setting2);
plus.ios.deleteObject(NSURL2);
plus.ios.deleteObject(application2);
} else {
// console.log(plus.device.vendor);
var Intent = plus.android.importClass("android.content.Intent");
var Settings = plus.android.importClass("android.provider.Settings");
var Uri = plus.android.importClass("android.net.Uri");
var mainActivity = plus.android.runtimeMainActivity();
var intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
// 检查系统的设备服务是否开启
// var checkSystemEnableLocation = async function () {
function checkSystemEnableLocation() {
if (isIos) {
var result = false;
var cllocationManger = plus.ios.import("CLLocationManager");
var result = cllocationManger.locationServicesEnabled();
console.log("系统定位开启:" + result);
plus.ios.deleteObject(cllocationManger);
return result;
} else {
var context = plus.android.importClass("android.content.Context");
var locationManager = plus.android.importClass("android.location.LocationManager");
var main = plus.android.runtimeMainActivity();
var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
console.log("系统定位开启:" + result);
return result
}
}
let permissionMap = {
"android": {
"CAMERA_EXTERNAL_STORAGE": {
"name": "android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE,android.permission.CAMERA",
"title": "相机/相册权限说明",
"content": "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、与客服沟通等场景中读取和写入相册和文件内容"
},
"CAMERA": {
"name": "android.permission.CAMERA",
"title": "相机权限说明",
"content": "便于您使用该功能上传图片,用于与客服沟通等场景中发送拍摄图片"
},
"EXTERNAL_STORAGE": {
"name": "android.permission.READ_EXTERNAL_STORAGE,android.permission.WRITE_EXTERNAL_STORAGE",
"title": "相册权限说明",
"content": "便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、与客服沟通等场景中读取和写入相册和文件内容"
}
},
"ios": {}
}
let view = null;
function showViewDesc(permission) {
let plat = isIos ? "ios" : "android";
view = new plus.nativeObj.View('per-modal', {
top: '0px',
left: '0px',
width: '100%',
backgroundColor: 'rgba(0,0,0,0.2)',
//opacity: '.9'
})
view.drawRect({
color: '#fff',
radius: '5px'
}, {
top: '30px',
left: '5%',
width: '90%',
height: "100px",
})
view.drawText(permissionMap[plat][permission]["title"], {
top: '40px',
left: "8%",
height: "30px"
}, {
align: "left",
color: "#000",
}, {
onClick: function(e) {
console.log(e);
}
})
view.drawText(permissionMap[plat][permission]["content"], {
top: '65px',
height: "60px",
left: "8%",
width: "84%"
}, {
whiteSpace: 'normal',
size: "14px",
align: "left",
color: "#656563"
})
view.show()
}
function premissionCheck(permission) {
return new Promise(async (resolve, reject) => {
let plat = isIos ? "ios" : "android";
if (isIos) { // ios
// const camera = permission.judgeIosPermission("camera");//判断ios是否给予摄像头权限
// //ios相册没权限,系统会自动弹出授权框
// //let photoLibrary = permission.judgeIosPermission("photoLibrary");//判断ios是否给予相册权限
// if(camera){
// resolve();
// }else{
// reject('需要开启相机使用权限');
// }
resolve(1)
} else { // android
let permission_arr = permissionMap[plat][permission]["name"].split(",");
let flag = true;
for(let i = 0;i<permission_arr.length;i++) {
let status = plus.navigator.checkPermission(permission_arr[i]);
if(status == "undetermined") {
flag = false;
}
}
console.log("flag", flag)
if (flag == false) { // 未完全授权
showViewDesc(permission);
requestAndroidPermission(permissionMap[plat][permission]["name"]).then((res) => {
view.close();
if (res == -1) {
uni.showModal({
title: '提示',
content: '操作权限已被拒绝,请手动前往设置',
confirmText: "立即设置",
success: (res) => {
if (res.confirm) {
gotoAppPermissionSetting()
}
}
})
}
resolve(res)
})
} else {
resolve(1)
}
}
})
}
// module.exports = {
// judgeIosPermission: judgeIosPermission,
// requestAndroidPermission: requestAndroidPermission,
// checkSystemEnableLocation: checkSystemEnableLocation,
// gotoAppPermissionSetting: gotoAppPermissionSetting,
// premissionCheck: premissionCheck
// }
export const permision = {
judgeIosPermission: judgeIosPermission,
requestAndroidPermission: requestAndroidPermission,
checkSystemEnableLocation: checkSystemEnableLocation,
gotoAppPermissionSetting: gotoAppPermissionSetting,
premissionCheck: premissionCheck
}
\ No newline at end of file
... ...