Compare commits
No commits in common. "afbbb12ec77320de8aec83f5674ab621b1d46668" and "ec27449eab4b07731ac9595114a6660b6928e87b" have entirely different histories.
afbbb12ec7
...
ec27449eab
@ -1,6 +1,6 @@
|
|||||||
<template>
|
<template>
|
||||||
<view>
|
<view>
|
||||||
<image class="block mx-auto" :style="style" src="/static/empty.svg"></image>
|
<image class="mx-auto" :style="style" src="/static/empty.svg"></image>
|
||||||
<view v-if="showText" class="mt-10 text-base text-center text-gray">{{ text }}</view>
|
<view v-if="showText" class="mt-10 text-base text-center text-gray">{{ text }}</view>
|
||||||
</view>
|
</view>
|
||||||
</template>
|
</template>
|
||||||
@ -23,8 +23,3 @@ const props = defineProps({
|
|||||||
|
|
||||||
const style = computed(() => `width: ${props.size}rpx;height:${props.size}rpx`)
|
const style = computed(() => `width: ${props.size}rpx;height:${props.size}rpx`)
|
||||||
</script>
|
</script>
|
||||||
<style>
|
|
||||||
.block {
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@ -1,19 +0,0 @@
|
|||||||
import { storeToRefs } from 'pinia';
|
|
||||||
import useAccountStore from "@/store/account.js";
|
|
||||||
import { confirm } from '@/utils/widget';
|
|
||||||
|
|
||||||
export default function useInfoCheck() {
|
|
||||||
|
|
||||||
const { doctorInfo } = storeToRefs(useAccountStore());
|
|
||||||
|
|
||||||
function withInfo(fn) {
|
|
||||||
return async (...args) => {
|
|
||||||
if (!doctorInfo.value || !doctorInfo.value.anotherName) {
|
|
||||||
await confirm('请先完善您的个人信息,方可使用该功能!', { cancelText: '再等等', confirmText: '去完善' })
|
|
||||||
return uni.navigateTo({ url: '/pages/work/profile' });
|
|
||||||
}
|
|
||||||
return fn(...args);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return { withInfo }
|
|
||||||
}
|
|
||||||
40
pages.json
40
pages.json
@ -6,6 +6,13 @@
|
|||||||
"navigationBarTitleText": "消息"
|
"navigationBarTitleText": "消息"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"path": "pages/message/index",
|
||||||
|
"style": {
|
||||||
|
"navigationBarTitleText": "聊天",
|
||||||
|
"enablePullDownRefresh": false
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"path": "pages/message/common-phrases",
|
"path": "pages/message/common-phrases",
|
||||||
"style": {
|
"style": {
|
||||||
@ -21,7 +28,7 @@
|
|||||||
{
|
{
|
||||||
"path": "pages/message/article-detail",
|
"path": "pages/message/article-detail",
|
||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "宣教文章"
|
"navigationBarTitleText": "文章详情"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -36,13 +43,6 @@
|
|||||||
"navigationBarTitleText": "预览"
|
"navigationBarTitleText": "预览"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"path": "pages/message/index",
|
|
||||||
"style": {
|
|
||||||
"navigationBarTitleText": "聊天",
|
|
||||||
"enablePullDownRefresh": false
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"path": "pages/work/work",
|
"path": "pages/work/work",
|
||||||
"style": {
|
"style": {
|
||||||
@ -84,30 +84,6 @@
|
|||||||
"style": {
|
"style": {
|
||||||
"navigationBarTitleText": "授权登录"
|
"navigationBarTitleText": "授权登录"
|
||||||
}
|
}
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "pages/work/team/invite/invite-patient",
|
|
||||||
"style": {
|
|
||||||
"navigationBarTitleText": "邀请患者"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "pages/work/team/invite/invite-teammate",
|
|
||||||
"style": {
|
|
||||||
"navigationBarTitleText": "邀请成员"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "pages/work/team/list/team-list",
|
|
||||||
"style": {
|
|
||||||
"navigationBarTitleText": "我的团队"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"path": "pages/work/service/contact-service",
|
|
||||||
"style": {
|
|
||||||
"navigationBarTitleText": "联系企微客服"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"globalStyle": {
|
"globalStyle": {
|
||||||
|
|||||||
@ -5,12 +5,12 @@
|
|||||||
<view class="mt-12 text-base text-dark">生命全周期健康管理伙伴</view>
|
<view class="mt-12 text-base text-dark">生命全周期健康管理伙伴</view>
|
||||||
</view>
|
</view>
|
||||||
<view class="login-btn-wrap">
|
<view class="login-btn-wrap">
|
||||||
<!-- <button v-if="checked" class="login-btn" type="primary" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">
|
<button v-if="checked" class="login-btn" type="primary" open-type="getPhoneNumber" @getphonenumber="getPhoneNumber">
|
||||||
手机号快捷登录
|
|
||||||
</button> -->
|
|
||||||
<button v-if="checked" class="login-btn" type="primary" @click="getPhoneNumber()">
|
|
||||||
手机号快捷登录
|
手机号快捷登录
|
||||||
</button>
|
</button>
|
||||||
|
<!-- <button v-if="checked" class="login-btn" type="primary" @click="getPhoneNumber()">
|
||||||
|
手机号快捷登录
|
||||||
|
</button> -->
|
||||||
<button v-else class="login-btn" type="primary" @click="remind()">
|
<button v-else class="login-btn" type="primary" @click="remind()">
|
||||||
手机号快捷登录
|
手机号快捷登录
|
||||||
</button>
|
</button>
|
||||||
@ -69,9 +69,8 @@ function toHome() {
|
|||||||
|
|
||||||
async function getPhoneNumber(e) {
|
async function getPhoneNumber(e) {
|
||||||
const phoneCode = e && e.detail && e.detail.code;
|
const phoneCode = e && e.detail && e.detail.code;
|
||||||
// if (e && !phoneCode) return;
|
if (e && !phoneCode) return;
|
||||||
const res = await login(phoneCode);
|
const res = await login(phoneCode);
|
||||||
|
|
||||||
if (res && redirectUrl.value) {
|
if (res && redirectUrl.value) {
|
||||||
await attempToPage(redirectUrl.value);
|
await attempToPage(redirectUrl.value);
|
||||||
} else if (res && !(doctorInfo.value && doctorInfo.value.anotherName)) {
|
} else if (res && !(doctorInfo.value && doctorInfo.value.anotherName)) {
|
||||||
|
|||||||
@ -365,36 +365,36 @@ onLoad(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// 页面显示
|
// 页面显示
|
||||||
// onShow(async () => {
|
onShow(async () => {
|
||||||
// try {
|
try {
|
||||||
// // 初始化IM
|
// 初始化IM
|
||||||
// const imReady = await initIM();
|
const imReady = await initIM();
|
||||||
// if (!imReady) {
|
if (!imReady) {
|
||||||
// console.error("IM初始化失败");
|
console.error("IM初始化失败");
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
|
|
||||||
// // 先加载初始会话列表
|
// 先加载初始会话列表
|
||||||
// await loadConversationList();
|
await loadConversationList();
|
||||||
|
|
||||||
// // 再设置监听器,后续通过事件更新列表
|
// 再设置监听器,后续通过事件更新列表
|
||||||
// setupConversationListener();
|
setupConversationListener();
|
||||||
// } catch (error) {
|
} catch (error) {
|
||||||
// console.error("页面初始化失败:", error);
|
console.error("页面初始化失败:", error);
|
||||||
// uni.showToast({
|
uni.showToast({
|
||||||
// title: "初始化失败,请重试",
|
title: "初始化失败,请重试",
|
||||||
// icon: "none",
|
icon: "none",
|
||||||
// });
|
});
|
||||||
// }
|
}
|
||||||
// });
|
});
|
||||||
|
|
||||||
// 页面隐藏
|
// 页面隐藏
|
||||||
onHide(() => {
|
onHide(() => {
|
||||||
// 移除消息监听
|
// 移除消息监听
|
||||||
// if (globalTimChatManager) {
|
if (globalTimChatManager) {
|
||||||
// globalTimChatManager.setCallback("onConversationListUpdated", null);
|
globalTimChatManager.setCallback("onConversationListUpdated", null);
|
||||||
// globalTimChatManager.setCallback("onMessageReceived", null);
|
globalTimChatManager.setCallback("onMessageReceived", null);
|
||||||
// }
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@ -1,25 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="flex flex-col justify-center h-full bg-white">
|
|
||||||
<view>
|
|
||||||
<view class="mb-10 text-dark text-lg font-semibold text-center mb-10">
|
|
||||||
柚康企微客服
|
|
||||||
</view>
|
|
||||||
<view class="flex justify-center overflow-hidden">
|
|
||||||
<uqrcode :canvas-id="`qrcode-${idx}`" value="https://uqrcode.cn/doc" :options="options"></uqrcode>
|
|
||||||
</view>
|
|
||||||
<view class="mt-10 px-15 text-base text-dark leading-normal text-center">
|
|
||||||
扫码或长按添加柚康企微客服
|
|
||||||
</view>
|
|
||||||
<view class="mt-10 px-15 text-base text-dark leading-normal text-center">
|
|
||||||
我们将为您提供软件使用咨询服务,并支持补充病历、宣教、问卷、回访等多种工作模板。
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
<script setup>
|
|
||||||
import { ref } from "vue";
|
|
||||||
|
|
||||||
const options = { margin: 10 }
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<style></style>
|
|
||||||
@ -1,152 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view class="flex flex-col justify-center h-full bg-white">
|
|
||||||
<view v-if="list.length === 0" class="w-full">
|
|
||||||
<empty-data text="暂无团队" />
|
|
||||||
<view class="mt-10 mx-auto w-100 text-base text-primary border-auto leading-normal py-5 text-center rounded">
|
|
||||||
创建团队
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view v-else>
|
|
||||||
<view class="flex items-center">
|
|
||||||
<view class="flex-shrink-0 p-15 flex items-center" :class="list.length > 1 ? '' : 'opacity-0'"
|
|
||||||
@click="toggle(-1)">
|
|
||||||
<uni-icons type="left" size="32" :color="indicator.prev ? '#0074ff' : '#999'"></uni-icons>
|
|
||||||
</view>
|
|
||||||
<view class="w-0 flex-grow text-white overflow-hidden">
|
|
||||||
<view v-if="list.length > 1" class="py-5 text-center text-lg font-semibold text-dark">
|
|
||||||
({{ current + 1 }} / {{ list.length }})
|
|
||||||
</view>
|
|
||||||
<swiper class="swiper" :current="current">
|
|
||||||
<swiper-item v-for="(i, idx) in list" :key="i.teamId">
|
|
||||||
<view class="flex items-center justify-center h-30 mb-10">
|
|
||||||
<view class="mr-5 text-dark text-lg font-semibold truncate">{{ i.name }}</view>
|
|
||||||
<view class="edit-sub flex-shrink-0 flex items-center justify-center rounded-full bg-primary"
|
|
||||||
@click="visible = true">
|
|
||||||
<image class="edit-icon" src="/static/work/pen.svg" mode="aspectFill" />
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view v-if="i.qrcode" class="flex justify-center overflow-hidden">
|
|
||||||
<uqrcode ref="qrcodes" :canvas-id="`qrcode-${idx}`" :value="i.qrcode" :options="options">
|
|
||||||
</uqrcode>
|
|
||||||
</view>
|
|
||||||
</swiper-item>
|
|
||||||
</swiper>
|
|
||||||
</view>
|
|
||||||
<view class="flex-shrink-0 p-15 flex items-center" :class="list.length > 1 ? '' : 'opacity-0'"
|
|
||||||
@click="toggle(1)">
|
|
||||||
<uni-icons type="right" size="32" :color="indicator.next ? '#0074ff' : '#999'"></uni-icons>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view class="mt-10 px-15 text-base text-gray leading-normal text-center">
|
|
||||||
微信扫一扫上面的二维码
|
|
||||||
</view>
|
|
||||||
<view class="px-15 text-base text-gray leading-normal text-center">进入团队首页,即可发起线上咨询、建档授权等服务</view>
|
|
||||||
<view class="mt-10 flex px-15">
|
|
||||||
<view class="mr-10 border-auto rounded py-10 text-base text-primary text-center flex-grow">保存图片</view>
|
|
||||||
<view class="bg-primary rounded py-10 text-base text-white text-center flex-grow">分享微信</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<rename-popup :team="team" :visible="visible" @close="visible = false" @change="change" />
|
|
||||||
</template>
|
|
||||||
<script setup>
|
|
||||||
import { computed, ref } from "vue";
|
|
||||||
import { storeToRefs } from "pinia";
|
|
||||||
import { onLoad } from "@dcloudio/uni-app";
|
|
||||||
import useAccountStore from "@/store/account.js";
|
|
||||||
import useGuard from '@/hooks/useGuard';
|
|
||||||
import api from "@/utils/api.js";
|
|
||||||
|
|
||||||
import emptyData from "@/components/empty-data.vue";
|
|
||||||
import renamePopup from "./rename-popup.vue";
|
|
||||||
import { toast } from "../../../../utils/widget";
|
|
||||||
|
|
||||||
const options = { margin: 10 }
|
|
||||||
|
|
||||||
const { useShow } = useGuard();
|
|
||||||
const { doctorInfo, account } = storeToRefs(useAccountStore());
|
|
||||||
const current = ref(0);
|
|
||||||
const list = ref([]);
|
|
||||||
const visible = ref(false);
|
|
||||||
const teamId = ref('')
|
|
||||||
const indicator = computed(() => ({
|
|
||||||
prev: current.value > 0,
|
|
||||||
next: current.value < list.value.length - 1
|
|
||||||
}))
|
|
||||||
const team = computed(() => list.value[current.value] || null);
|
|
||||||
|
|
||||||
function toggle(val) {
|
|
||||||
const num = current.value + val;
|
|
||||||
if (num > 0) {
|
|
||||||
current.value = Math.min(num, list.value.length - 1);
|
|
||||||
} else {
|
|
||||||
current.value = Math.max(num, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getTeams() {
|
|
||||||
const res = await api('getJoinedTeams', { corpId: account.value?.corpId, mateId: doctorInfo.value?.userid });
|
|
||||||
const arr = res && Array.isArray(res.data) ? res.data.map(i => ({
|
|
||||||
id: i._id,
|
|
||||||
teamId: i.teamId,
|
|
||||||
name: i.name,
|
|
||||||
qrcode: i.qrcodes && i.qrcodes[0] && i.qrcodes[0].qrcode ? i.qrcodes[0].qrcode : ''
|
|
||||||
})) : [];
|
|
||||||
if (teamId.value) {
|
|
||||||
const idx = arr.findIndex(i => i.teamId === teamId.value);
|
|
||||||
if (idx > -1) {
|
|
||||||
current.value = idx
|
|
||||||
}
|
|
||||||
teamId.value = '';
|
|
||||||
}
|
|
||||||
list.value = arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function change(name) {
|
|
||||||
const res = await api('updateTeamInfo', { teamId: team.value.teamId, name, corpId: account.value.corpId, id: team.value.id });
|
|
||||||
if (res && res.success) {
|
|
||||||
await toast('保存成功');
|
|
||||||
list.value[current.value].name = name;
|
|
||||||
visible.value = false
|
|
||||||
} else {
|
|
||||||
toast('保存失败');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onLoad(opts => {
|
|
||||||
teamId.value = opts.teamId || '';
|
|
||||||
})
|
|
||||||
|
|
||||||
useShow(() => {
|
|
||||||
getTeams()
|
|
||||||
})
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<style>
|
|
||||||
.w-100 {
|
|
||||||
width: 200rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.opacity-0 {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
.swiper {
|
|
||||||
height: 500rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.edit-sub {
|
|
||||||
|
|
||||||
width: 36rpx;
|
|
||||||
height: 36rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.edit-icon {
|
|
||||||
width: 16rpx;
|
|
||||||
height: 16rpx;
|
|
||||||
}
|
|
||||||
|
|
||||||
.h-30 {
|
|
||||||
height: 60rpx;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
<template>
|
|
||||||
<view>邀请成员</view>
|
|
||||||
</template>
|
|
||||||
@ -1,62 +0,0 @@
|
|||||||
<template>
|
|
||||||
<uni-popup ref="popup" type="center" :mask-click="false">
|
|
||||||
<view class="bg-white rounded overflow-hidden" style="width: 690rpx;">
|
|
||||||
<view class="px-15 py-12 text-center text-lg font-semibold text-dark">
|
|
||||||
修改患者邀请码名称
|
|
||||||
</view>
|
|
||||||
<view class="mt-10 px-15">
|
|
||||||
<view class="p-10 border rounded-sm">
|
|
||||||
<input v-model="name" class="w-full" placeholder="请输入名称" />
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<button-footer hideden-shadow confirmText="保存" @confirm="confirm()" @cancel="close()" />
|
|
||||||
</view>
|
|
||||||
</uni-popup>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup>
|
|
||||||
import { ref, watch } from 'vue';
|
|
||||||
import { toast } from '@/utils/widget';
|
|
||||||
|
|
||||||
import ButtonFooter from '@/components/button-footer.vue';
|
|
||||||
|
|
||||||
const emits = defineEmits(['close', 'change'])
|
|
||||||
const props = defineProps({
|
|
||||||
team: {
|
|
||||||
type: Object,
|
|
||||||
default: () => ({})
|
|
||||||
},
|
|
||||||
visible: {
|
|
||||||
type: Boolean,
|
|
||||||
default: false
|
|
||||||
}
|
|
||||||
})
|
|
||||||
const popup = ref();
|
|
||||||
const name = ref('');
|
|
||||||
|
|
||||||
function close() {
|
|
||||||
emits('close')
|
|
||||||
}
|
|
||||||
|
|
||||||
async function confirm() {
|
|
||||||
if (name.value.trim() === '') {
|
|
||||||
return toast('请输入名称')
|
|
||||||
}
|
|
||||||
emits('change', name.value.trim())
|
|
||||||
}
|
|
||||||
|
|
||||||
watch(() => props.visible, n => {
|
|
||||||
if (n) {
|
|
||||||
name.value = props.team && typeof props.team.name === 'string' ? props.team.name.trim() : '';
|
|
||||||
popup.value && popup.value.open()
|
|
||||||
} else {
|
|
||||||
popup.value && popup.value.close()
|
|
||||||
}
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<style lang="scss" scoped>
|
|
||||||
.pb-50 {
|
|
||||||
padding-bottom: 100rpx;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@ -1,76 +0,0 @@
|
|||||||
<template>
|
|
||||||
<full-page :customScroll="list.length === 0">
|
|
||||||
<view v-if="list.length === 0" class="w-full h-full flex flex-col justify-center items-center">
|
|
||||||
<empty-data text="暂无团队" />
|
|
||||||
</view>
|
|
||||||
<view v-for="(i, idx) in list" :key="idx" class="p-15 mb-10 flex items-center bg-white shadow-lg">
|
|
||||||
<view class="mr-10 w-0 flex-grow">
|
|
||||||
<view class="flex items-center">
|
|
||||||
<view class="team-name text-lg font-semibold truncate mr-5">
|
|
||||||
133****2365服务团队133****2365服务团队133****2365服务团队133****2365服务团队133****2365服务团队133****2365服务团队133****2365服务团队
|
|
||||||
</view>
|
|
||||||
<view v-if="doctorInfo && i.creator === doctorInfo.userid"
|
|
||||||
class="px-10 leading-normal text-sm border-auto text-primary rounded-full">创建</view>
|
|
||||||
<view v-else class="px-10 leading-normal text-sm border-auto text-warning rounded-full">加入</view>
|
|
||||||
</view>
|
|
||||||
<view class="mt-10 flex">
|
|
||||||
<view class="text-base text-dark">成员: 20</view>
|
|
||||||
<view class="text-base text-dark">患者: 200</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<view class="flex-shrink-0 flex flex-col items-center justify-center" @click="invitePatient(i)">
|
|
||||||
<image class="mb-5 qrcode" src="/static/work/qrcode.svg" />
|
|
||||||
<view class="w-full text-sm text-dark text-center">邀请患者</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
<template #footer>
|
|
||||||
<button-footer confirmText="创建团队" :showCancel="false" @confirm="save()" />
|
|
||||||
</template>
|
|
||||||
</full-page>
|
|
||||||
</template>
|
|
||||||
<script setup>
|
|
||||||
import { computed, ref } from "vue";
|
|
||||||
import { storeToRefs } from "pinia";
|
|
||||||
import useGuard from "@/hooks/useGuard.js";
|
|
||||||
import useAccountStore from "@/store/account.js";
|
|
||||||
import api from "@/utils/api.js";
|
|
||||||
|
|
||||||
import buttonFooter from '@/components/button-footer.vue';
|
|
||||||
import emptyData from "@/components/empty-data.vue";
|
|
||||||
import fullPage from '@/components/full-page.vue';
|
|
||||||
|
|
||||||
const { useShow } = useGuard();
|
|
||||||
const { doctorInfo } = storeToRefs(useAccountStore());
|
|
||||||
const list = ref([]);
|
|
||||||
|
|
||||||
function invitePatient(team) {
|
|
||||||
uni.navigateTo({ url: `/pages/work/team/invite/invite-patient?teamId=${team.teamId || ''}` })
|
|
||||||
}
|
|
||||||
|
|
||||||
async function getTeams() {
|
|
||||||
const res = await api('getJoinedTeams', { corpId: account.value?.corpId, mateId: doctorInfo.value?.userid });
|
|
||||||
const arr = res && Array.isArray(res.data) ? res.data.map(i => ({
|
|
||||||
id: i._id,
|
|
||||||
teamId: i.teamId,
|
|
||||||
name: i.name,
|
|
||||||
qrcode: i.qrcodes && i.qrcodes[0] && i.qrcodes[0].qrcode ? i.qrcodes[0].qrcode : ''
|
|
||||||
})) : [];
|
|
||||||
list.value = arr;
|
|
||||||
}
|
|
||||||
|
|
||||||
useShow(() => {
|
|
||||||
console.log(111111)
|
|
||||||
getTeams();
|
|
||||||
})
|
|
||||||
|
|
||||||
</script>
|
|
||||||
<style>
|
|
||||||
.team-name {
|
|
||||||
max-width: 60%;
|
|
||||||
}
|
|
||||||
|
|
||||||
.qrcode {
|
|
||||||
width: 60rpx;
|
|
||||||
height: 60rpx;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@ -2,9 +2,9 @@
|
|||||||
<full-page :showSafeArea="false" :customScroll="true">
|
<full-page :showSafeArea="false" :customScroll="true">
|
||||||
<template #header>
|
<template #header>
|
||||||
<view class="user-header bg-white px-15 py-15">
|
<view class="user-header bg-white px-15 py-15">
|
||||||
<view class="flex items-center justify-between">
|
<view class="flex items-center justify-between" @click="editProfile()">
|
||||||
<view class="flex items-center flex-grow">
|
<view class="flex items-center flex-grow">
|
||||||
<view class="relative user-avatar mr-10" @click="editProfile()">
|
<view class="relative user-avatar mr-10">
|
||||||
<image v-if="doctorInfo && doctorInfo.avatar" class="avatar-img rounded-full overflow-hidden"
|
<image v-if="doctorInfo && doctorInfo.avatar" class="avatar-img rounded-full overflow-hidden"
|
||||||
:src="doctorInfo.avatar" mode="aspectFill" />
|
:src="doctorInfo.avatar" mode="aspectFill" />
|
||||||
<image v-else class="avatar-img rounded-full overflow-hidden" src="/static/default-avatar.png"
|
<image v-else class="avatar-img rounded-full overflow-hidden" src="/static/default-avatar.png"
|
||||||
@ -17,7 +17,7 @@
|
|||||||
<text v-if="doctorInfo && doctorInfo.anotherName" class="user-name text-dark text-lg font-semibold">
|
<text v-if="doctorInfo && doctorInfo.anotherName" class="user-name text-dark text-lg font-semibold">
|
||||||
{{ doctorInfo.anotherName }}
|
{{ doctorInfo.anotherName }}
|
||||||
</text>
|
</text>
|
||||||
<text v-else class="user-name text-black text-lg font-semibold" @click="editProfile()">请完善信息</text>
|
<text v-else class="user-name text-black text-lg font-semibold">请完善信息</text>
|
||||||
<view class="flex items-center mt-5">
|
<view class="flex items-center mt-5">
|
||||||
<view v-if="!doctorInfo || !doctorInfo.anotherName" class="status-tag tag-orange mr-10">
|
<view v-if="!doctorInfo || !doctorInfo.anotherName" class="status-tag tag-orange mr-10">
|
||||||
<text class="tag-text text-white">信息待完善</text>
|
<text class="tag-text text-white">信息待完善</text>
|
||||||
@ -32,7 +32,7 @@
|
|||||||
|
|
||||||
<!-- 右侧:操作按钮 -->
|
<!-- 右侧:操作按钮 -->
|
||||||
<view class="flex items-center">
|
<view class="flex items-center">
|
||||||
<view class="action-btn flex-col items-center mr-10" @click="invitePatient()">
|
<view class="action-btn flex-col items-center mr-10" @click="handleInvitePatient">
|
||||||
<image class="mb-5 qrcode-icon" src="/static/work/qrcode.svg" />
|
<image class="mb-5 qrcode-icon" src="/static/work/qrcode.svg" />
|
||||||
<text class="action-text text-dark text-sm">邀请</text>
|
<text class="action-text text-dark text-sm">邀请</text>
|
||||||
</view>
|
</view>
|
||||||
@ -68,7 +68,6 @@
|
|||||||
import { computed, ref } from 'vue';
|
import { computed, ref } from 'vue';
|
||||||
import { storeToRefs } from "pinia";
|
import { storeToRefs } from "pinia";
|
||||||
import useGuard from "@/hooks/useGuard.js";
|
import useGuard from "@/hooks/useGuard.js";
|
||||||
import useInfoCheck from '@/hooks/useInfoCheck';
|
|
||||||
import useAccountStore from "@/store/account.js";
|
import useAccountStore from "@/store/account.js";
|
||||||
|
|
||||||
import certPopup from "./components/cert-popup.vue";
|
import certPopup from "./components/cert-popup.vue";
|
||||||
@ -85,8 +84,7 @@ const certConfig = {
|
|||||||
|
|
||||||
const { useLoad, useShow } = useGuard();
|
const { useLoad, useShow } = useGuard();
|
||||||
const { getDoctorInfo } = useAccountStore();
|
const { getDoctorInfo } = useAccountStore();
|
||||||
const { doctorInfo } = storeToRefs(useAccountStore());
|
const { account, doctorInfo } = storeToRefs(useAccountStore());
|
||||||
const { withInfo } = useInfoCheck();
|
|
||||||
const list = ref([1]);
|
const list = ref([1]);
|
||||||
const visible = ref(false);
|
const visible = ref(false);
|
||||||
|
|
||||||
@ -101,7 +99,12 @@ const handleVerify = () => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 邀请患者
|
// 邀请患者
|
||||||
const invitePatient = withInfo(() => uni.navigateTo({ url: '/pages/work/team/invite/invite-patient' }));
|
const handleInvitePatient = () => {
|
||||||
|
uni.showToast({
|
||||||
|
title: "邀请患者",
|
||||||
|
icon: "none",
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
// 更多操作
|
// 更多操作
|
||||||
const handleMore = () => {
|
const handleMore = () => {
|
||||||
|
|||||||
@ -3,26 +3,6 @@ export default [
|
|||||||
path: 'pages/message/message',
|
path: 'pages/message/message',
|
||||||
meta: { title: '消息' }
|
meta: { title: '消息' }
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: 'pages/message/common-phrases',
|
|
||||||
meta: { title: '常用语' }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: 'pages/message/article-list',
|
|
||||||
meta: { title: '宣教文章' }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: 'pages/message/article-detail',
|
|
||||||
meta: { title: '宣教文章' }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: 'pages/message/survey-list',
|
|
||||||
meta: { title: '问卷列表' }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: 'pages/webview/webview',
|
|
||||||
meta: { title: '预览' }
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
path: 'pages/message/index',
|
path: 'pages/message/index',
|
||||||
meta: { title: '聊天' },
|
meta: { title: '聊天' },
|
||||||
@ -56,21 +36,5 @@ export default [
|
|||||||
path: 'pages/login/login',
|
path: 'pages/login/login',
|
||||||
meta: { title: '授权登录' }
|
meta: { title: '授权登录' }
|
||||||
},
|
},
|
||||||
{
|
|
||||||
path: 'pages/work/team/invite/invite-patient',
|
|
||||||
meta: { title: '邀请患者' }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: 'pages/work/team/invite/invite-teammate',
|
|
||||||
meta: { title: '邀请成员' }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: 'pages/work/team/list/team-list',
|
|
||||||
meta: { title: '我的团队' }
|
|
||||||
},
|
|
||||||
{
|
|
||||||
path: 'pages/work/service/contact-service',
|
|
||||||
meta: { title: '联系企微客服' }
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|||||||
@ -52,15 +52,15 @@ export default defineStore("accountStore", () => {
|
|||||||
account.value = res.data;
|
account.value = res.data;
|
||||||
openid.value = res.data.openid;
|
openid.value = res.data.openid;
|
||||||
// 登录成功后初始化腾讯IM
|
// 登录成功后初始化腾讯IM
|
||||||
try {
|
// try {
|
||||||
console.log('开始初始化腾讯IM,userID:', res.data.openid);
|
// console.log('开始初始化腾讯IM,userID:', res.data.openid);
|
||||||
await initGlobalTIM(res.data.openid);
|
// await initGlobalTIM(res.data.openid);
|
||||||
isIMInitialized.value = true;
|
// isIMInitialized.value = true;
|
||||||
console.log('腾讯IM初始化成功');
|
// console.log('腾讯IM初始化成功');
|
||||||
} catch (imError) {
|
// } catch (imError) {
|
||||||
console.error('腾讯IM初始化失败:', imError);
|
// console.error('腾讯IM初始化失败:', imError);
|
||||||
// IM初始化失败不影响登录流程
|
// // IM初始化失败不影响登录流程
|
||||||
}
|
// }
|
||||||
await getDoctorInfo(openid.value);
|
await getDoctorInfo(openid.value);
|
||||||
return res.data
|
return res.data
|
||||||
}
|
}
|
||||||
@ -78,7 +78,9 @@ export default defineStore("accountStore", () => {
|
|||||||
const res = await api('getCorpMemberData', {
|
const res = await api('getCorpMemberData', {
|
||||||
weChatOpenId: account.value.openid,
|
weChatOpenId: account.value.openid,
|
||||||
});
|
});
|
||||||
doctorInfo.value = res?.data || null;
|
if (res.success && res.data) {
|
||||||
|
doctorInfo.value = res.data;
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('获取医生信息失败:', e);
|
console.error('获取医生信息失败:', e);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,201 +0,0 @@
|
|||||||
Apache License
|
|
||||||
Version 2.0, January 2004
|
|
||||||
http://www.apache.org/licenses/
|
|
||||||
|
|
||||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
|
||||||
|
|
||||||
1. Definitions.
|
|
||||||
|
|
||||||
"License" shall mean the terms and conditions for use, reproduction,
|
|
||||||
and distribution as defined by Sections 1 through 9 of this document.
|
|
||||||
|
|
||||||
"Licensor" shall mean the copyright owner or entity authorized by
|
|
||||||
the copyright owner that is granting the License.
|
|
||||||
|
|
||||||
"Legal Entity" shall mean the union of the acting entity and all
|
|
||||||
other entities that control, are controlled by, or are under common
|
|
||||||
control with that entity. For the purposes of this definition,
|
|
||||||
"control" means (i) the power, direct or indirect, to cause the
|
|
||||||
direction or management of such entity, whether by contract or
|
|
||||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
|
||||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
|
||||||
|
|
||||||
"You" (or "Your") shall mean an individual or Legal Entity
|
|
||||||
exercising permissions granted by this License.
|
|
||||||
|
|
||||||
"Source" form shall mean the preferred form for making modifications,
|
|
||||||
including but not limited to software source code, documentation
|
|
||||||
source, and configuration files.
|
|
||||||
|
|
||||||
"Object" form shall mean any form resulting from mechanical
|
|
||||||
transformation or translation of a Source form, including but
|
|
||||||
not limited to compiled object code, generated documentation,
|
|
||||||
and conversions to other media types.
|
|
||||||
|
|
||||||
"Work" shall mean the work of authorship, whether in Source or
|
|
||||||
Object form, made available under the License, as indicated by a
|
|
||||||
copyright notice that is included in or attached to the work
|
|
||||||
(an example is provided in the Appendix below).
|
|
||||||
|
|
||||||
"Derivative Works" shall mean any work, whether in Source or Object
|
|
||||||
form, that is based on (or derived from) the Work and for which the
|
|
||||||
editorial revisions, annotations, elaborations, or other modifications
|
|
||||||
represent, as a whole, an original work of authorship. For the purposes
|
|
||||||
of this License, Derivative Works shall not include works that remain
|
|
||||||
separable from, or merely link (or bind by name) to the interfaces of,
|
|
||||||
the Work and Derivative Works thereof.
|
|
||||||
|
|
||||||
"Contribution" shall mean any work of authorship, including
|
|
||||||
the original version of the Work and any modifications or additions
|
|
||||||
to that Work or Derivative Works thereof, that is intentionally
|
|
||||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
|
||||||
or by an individual or Legal Entity authorized to submit on behalf of
|
|
||||||
the copyright owner. For the purposes of this definition, "submitted"
|
|
||||||
means any form of electronic, verbal, or written communication sent
|
|
||||||
to the Licensor or its representatives, including but not limited to
|
|
||||||
communication on electronic mailing lists, source code control systems,
|
|
||||||
and issue tracking systems that are managed by, or on behalf of, the
|
|
||||||
Licensor for the purpose of discussing and improving the Work, but
|
|
||||||
excluding communication that is conspicuously marked or otherwise
|
|
||||||
designated in writing by the copyright owner as "Not a Contribution."
|
|
||||||
|
|
||||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
|
||||||
on behalf of whom a Contribution has been received by Licensor and
|
|
||||||
subsequently incorporated within the Work.
|
|
||||||
|
|
||||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
copyright license to reproduce, prepare Derivative Works of,
|
|
||||||
publicly display, publicly perform, sublicense, and distribute the
|
|
||||||
Work and such Derivative Works in Source or Object form.
|
|
||||||
|
|
||||||
3. Grant of Patent License. Subject to the terms and conditions of
|
|
||||||
this License, each Contributor hereby grants to You a perpetual,
|
|
||||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
|
||||||
(except as stated in this section) patent license to make, have made,
|
|
||||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
|
||||||
where such license applies only to those patent claims licensable
|
|
||||||
by such Contributor that are necessarily infringed by their
|
|
||||||
Contribution(s) alone or by combination of their Contribution(s)
|
|
||||||
with the Work to which such Contribution(s) was submitted. If You
|
|
||||||
institute patent litigation against any entity (including a
|
|
||||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
|
||||||
or a Contribution incorporated within the Work constitutes direct
|
|
||||||
or contributory patent infringement, then any patent licenses
|
|
||||||
granted to You under this License for that Work shall terminate
|
|
||||||
as of the date such litigation is filed.
|
|
||||||
|
|
||||||
4. Redistribution. You may reproduce and distribute copies of the
|
|
||||||
Work or Derivative Works thereof in any medium, with or without
|
|
||||||
modifications, and in Source or Object form, provided that You
|
|
||||||
meet the following conditions:
|
|
||||||
|
|
||||||
(a) You must give any other recipients of the Work or
|
|
||||||
Derivative Works a copy of this License; and
|
|
||||||
|
|
||||||
(b) You must cause any modified files to carry prominent notices
|
|
||||||
stating that You changed the files; and
|
|
||||||
|
|
||||||
(c) You must retain, in the Source form of any Derivative Works
|
|
||||||
that You distribute, all copyright, patent, trademark, and
|
|
||||||
attribution notices from the Source form of the Work,
|
|
||||||
excluding those notices that do not pertain to any part of
|
|
||||||
the Derivative Works; and
|
|
||||||
|
|
||||||
(d) If the Work includes a "NOTICE" text file as part of its
|
|
||||||
distribution, then any Derivative Works that You distribute must
|
|
||||||
include a readable copy of the attribution notices contained
|
|
||||||
within such NOTICE file, excluding those notices that do not
|
|
||||||
pertain to any part of the Derivative Works, in at least one
|
|
||||||
of the following places: within a NOTICE text file distributed
|
|
||||||
as part of the Derivative Works; within the Source form or
|
|
||||||
documentation, if provided along with the Derivative Works; or,
|
|
||||||
within a display generated by the Derivative Works, if and
|
|
||||||
wherever such third-party notices normally appear. The contents
|
|
||||||
of the NOTICE file are for informational purposes only and
|
|
||||||
do not modify the License. You may add Your own attribution
|
|
||||||
notices within Derivative Works that You distribute, alongside
|
|
||||||
or as an addendum to the NOTICE text from the Work, provided
|
|
||||||
that such additional attribution notices cannot be construed
|
|
||||||
as modifying the License.
|
|
||||||
|
|
||||||
You may add Your own copyright statement to Your modifications and
|
|
||||||
may provide additional or different license terms and conditions
|
|
||||||
for use, reproduction, or distribution of Your modifications, or
|
|
||||||
for any such Derivative Works as a whole, provided Your use,
|
|
||||||
reproduction, and distribution of the Work otherwise complies with
|
|
||||||
the conditions stated in this License.
|
|
||||||
|
|
||||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
|
||||||
any Contribution intentionally submitted for inclusion in the Work
|
|
||||||
by You to the Licensor shall be under the terms and conditions of
|
|
||||||
this License, without any additional terms or conditions.
|
|
||||||
Notwithstanding the above, nothing herein shall supersede or modify
|
|
||||||
the terms of any separate license agreement you may have executed
|
|
||||||
with Licensor regarding such Contributions.
|
|
||||||
|
|
||||||
6. Trademarks. This License does not grant permission to use the trade
|
|
||||||
names, trademarks, service marks, or product names of the Licensor,
|
|
||||||
except as required for reasonable and customary use in describing the
|
|
||||||
origin of the Work and reproducing the content of the NOTICE file.
|
|
||||||
|
|
||||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
|
||||||
agreed to in writing, Licensor provides the Work (and each
|
|
||||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
|
||||||
implied, including, without limitation, any warranties or conditions
|
|
||||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
|
||||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
|
||||||
appropriateness of using or redistributing the Work and assume any
|
|
||||||
risks associated with Your exercise of permissions under this License.
|
|
||||||
|
|
||||||
8. Limitation of Liability. In no event and under no legal theory,
|
|
||||||
whether in tort (including negligence), contract, or otherwise,
|
|
||||||
unless required by applicable law (such as deliberate and grossly
|
|
||||||
negligent acts) or agreed to in writing, shall any Contributor be
|
|
||||||
liable to You for damages, including any direct, indirect, special,
|
|
||||||
incidental, or consequential damages of any character arising as a
|
|
||||||
result of this License or out of the use or inability to use the
|
|
||||||
Work (including but not limited to damages for loss of goodwill,
|
|
||||||
work stoppage, computer failure or malfunction, or any and all
|
|
||||||
other commercial damages or losses), even if such Contributor
|
|
||||||
has been advised of the possibility of such damages.
|
|
||||||
|
|
||||||
9. Accepting Warranty or Additional Liability. While redistributing
|
|
||||||
the Work or Derivative Works thereof, You may choose to offer,
|
|
||||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
|
||||||
or other liability obligations and/or rights consistent with this
|
|
||||||
License. However, in accepting such obligations, You may act only
|
|
||||||
on Your own behalf and on Your sole responsibility, not on behalf
|
|
||||||
of any other Contributor, and only if You agree to indemnify,
|
|
||||||
defend, and hold each Contributor harmless for any liability
|
|
||||||
incurred by, or claims asserted against, such Contributor by reason
|
|
||||||
of your accepting any such warranty or additional liability.
|
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
|
||||||
|
|
||||||
APPENDIX: How to apply the Apache License to your work.
|
|
||||||
|
|
||||||
To apply the Apache License to your work, attach the following
|
|
||||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
|
||||||
replaced with your own identifying information. (Don't include
|
|
||||||
the brackets!) The text should be enclosed in the appropriate
|
|
||||||
comment syntax for the file format. We also recommend that a
|
|
||||||
file or class name and description of purpose be included on the
|
|
||||||
same "printed page" as the copyright notice for easier
|
|
||||||
identification within third-party archives.
|
|
||||||
|
|
||||||
Copyright [yyyy] [name of copyright owner]
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
@ -1,392 +0,0 @@
|
|||||||
# 介绍
|
|
||||||
|
|
||||||
`uQRCode`是一款基于`Javascript`环境开发的二维码生成插件,适用所有`Javascript`运行环境的前端应用和`Node.js`应用。
|
|
||||||
|
|
||||||
`uQRCode`可扩展性高,它支持自定义渲染二维码,可通过`uQRCode API`得到二维码绘制关键信息后,使用`canvas`、`svg`或`js`操作`dom`的方式绘制二维码图案。还可自定义二维码样式,如随机颜色、圆点、方块、块与块之间的间距等。
|
|
||||||
|
|
||||||
欢迎加入群聊【uQRCode交流群】:[695070434](https://jq.qq.com/?_wv=1027&k=JRjzDqiw)。
|
|
||||||
|
|
||||||
# 设计器
|
|
||||||
|
|
||||||
uQRCode发布了配套的可视化设计器,可根据自己喜好在设计器中设计二维码样式,一键生成配置代码复制到项目中,详情请在微信小程序搜索“柚子二维码”,或扫描下方小程序码体验。
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
## 设计器模板示例
|
|
||||||
|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||

|
|
||||||
|
|
||||||
# 快速上手
|
|
||||||
|
|
||||||
> 在`uni-app`中,我们更推荐使用组件方式来生成二维码,组件方式大大提高了页面的可读性以及避开了一些平台容易出问题的地方,当组件无法满足需求的时候,再考虑切换成原生方式。
|
|
||||||
|
|
||||||
官方文档:[https://uqrcode.cn/doc](https://uqrcode.cn/doc)。
|
|
||||||
|
|
||||||
github地址:[https://github.com/Sansnn/uQRCode](https://github.com/Sansnn/uQRCode)。
|
|
||||||
|
|
||||||
npm地址:[https://www.npmjs.com/package/uqrcodejs](https://www.npmjs.com/package/uqrcodejs)。
|
|
||||||
|
|
||||||
uni-app插件市场地址:[https://ext.dcloud.net.cn/plugin?id=1287](https://ext.dcloud.net.cn/plugin?id=1287)。
|
|
||||||
|
|
||||||
## 原生方式
|
|
||||||
|
|
||||||
原生方式仅需要获取`uqrcode.js`文件便可使用。详细配置请移步到:文档 > [原生](https://uqrcode.cn/doc/document/native.html)。
|
|
||||||
|
|
||||||
### 安装
|
|
||||||
|
|
||||||
1. 通过`npm`安装,成功后即可使用`import`或`require`进行引用。
|
|
||||||
``` bash
|
|
||||||
# npm安装
|
|
||||||
npm install uqrcodejs
|
|
||||||
# 或者
|
|
||||||
npm install @uqrcode/js
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 通过项目开源地址获取`uqrcode.js`,下载`uqrcode.js`后,将其复制到您项目指定目录,在页面中引入`uqrcode.js`文件即可开始使用。
|
|
||||||
|
|
||||||
### 引入
|
|
||||||
|
|
||||||
- 通过`import`引入。
|
|
||||||
``` javascript
|
|
||||||
// npm安装
|
|
||||||
import UQRCode from 'uqrcodejs'; // npm install uqrcodejs
|
|
||||||
// 或者
|
|
||||||
import UQRCode from '@uqrcode/js'; // npm install @uqrcode/js
|
|
||||||
```
|
|
||||||
|
|
||||||
- `Node.js`通过`require`引入。
|
|
||||||
``` javascript
|
|
||||||
// npm安装
|
|
||||||
const UQRCode = require('uqrcodejs'); // npm install uqrcodejs
|
|
||||||
// 或者
|
|
||||||
const UQRCode = require('@uqrcode/js'); // npm install @uqrcode/js
|
|
||||||
```
|
|
||||||
|
|
||||||
- 原生浏览器环境,在js脚本加载时添加到`window`。
|
|
||||||
``` html
|
|
||||||
<script type="text/javascript" src="uqrcode.js"></script>
|
|
||||||
<script>
|
|
||||||
var UQRCode = window.UQRCode;
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
### 简单用法
|
|
||||||
|
|
||||||
`uQRCode`基于`Canvas API`封装了一套方法,建议开发者使用`canvas`生成,一键调用,非常方便。以下是示例:
|
|
||||||
|
|
||||||
- HTML示例
|
|
||||||
- DOM部分
|
|
||||||
``` html
|
|
||||||
<canvas id="qrcode" width="200" height="200"></canvas>
|
|
||||||
```
|
|
||||||
|
|
||||||
- JS部分
|
|
||||||
``` javascript
|
|
||||||
// 获取uQRCode实例
|
|
||||||
var qr = new UQRCode();
|
|
||||||
// 设置二维码内容
|
|
||||||
qr.data = "https://uqrcode.cn/doc";
|
|
||||||
// 设置二维码大小,必须与canvas设置的宽高一致
|
|
||||||
qr.size = 200;
|
|
||||||
// 调用制作二维码方法
|
|
||||||
qr.make();
|
|
||||||
// 获取canvas元素
|
|
||||||
var canvas = document.getElementById("qrcode");
|
|
||||||
// 获取canvas上下文
|
|
||||||
var canvasContext = canvas.getContext("2d");
|
|
||||||
// 设置uQRCode实例的canvas上下文
|
|
||||||
qr.canvasContext = canvasContext;
|
|
||||||
// 调用绘制方法将二维码图案绘制到canvas上
|
|
||||||
qr.drawCanvas();
|
|
||||||
```
|
|
||||||
|
|
||||||
- uni-app示例
|
|
||||||
- Template部分
|
|
||||||
``` html
|
|
||||||
<canvas id="qrcode" canvas-id="qrcode" style="width: 200px;height: 200px;"></canvas>
|
|
||||||
```
|
|
||||||
|
|
||||||
- JS部分
|
|
||||||
``` javascript
|
|
||||||
onReady() {
|
|
||||||
// 获取uQRCode实例
|
|
||||||
var qr = new UQRCode();
|
|
||||||
// 设置二维码内容
|
|
||||||
qr.data = "https://uqrcode.cn/doc";
|
|
||||||
// 设置二维码大小,必须与canvas设置的宽高一致
|
|
||||||
qr.size = 200;
|
|
||||||
// 调用制作二维码方法
|
|
||||||
qr.make();
|
|
||||||
// 获取canvas上下文
|
|
||||||
var canvasContext = uni.createCanvasContext('qrcode', this); // 如果是组件,this必须传入
|
|
||||||
// 设置uQRCode实例的canvas上下文
|
|
||||||
qr.canvasContext = canvasContext;
|
|
||||||
// 调用绘制方法将二维码图案绘制到canvas上
|
|
||||||
qr.drawCanvas();
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
- 微信小程序,推荐使用Canvas 2D,关于Canvas 2D的使用请参考微信开放文档。
|
|
||||||
|
|
||||||
### 高级用法
|
|
||||||
|
|
||||||
考虑到部分平台可能不支持`canvas`,所以`uQRCode`并没有强制要求和`canvas`一起使用,您还可以选择其他方式来生成二维码,例如使用`js`操作`dom`进行绘制或是使用`svg`绘制等。以下是示例:
|
|
||||||
|
|
||||||
- uni-app v-for+view
|
|
||||||
|
|
||||||
```html
|
|
||||||
<template>
|
|
||||||
<view>
|
|
||||||
<view class="qrcode">
|
|
||||||
<view v-for="(row, rowI) in modules" :key="rowI" style="display: flex;flex-direction: row;">
|
|
||||||
<view v-for="(col, colI) in row" :key="colI">
|
|
||||||
<view v-if="col.isBlack" style="width: 10px;height: 10px;background-color: black;">
|
|
||||||
<!-- 黑色码点 -->
|
|
||||||
</view>
|
|
||||||
<view v-else style="width: 10px;height: 10px;background-color: white;">
|
|
||||||
<!-- 白色码点 -->
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</view>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
import UQRCode from '../../uni_modules/Sansnn-uQRCode/js_sdk/uqrcode/uqrcode.js';
|
|
||||||
|
|
||||||
export default {
|
|
||||||
data() {
|
|
||||||
return {
|
|
||||||
modules: []
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onLoad() {
|
|
||||||
const qr = new UQRCode();
|
|
||||||
qr.data = 'uQRCode';
|
|
||||||
qr.make();
|
|
||||||
this.modules = qr.modules;
|
|
||||||
},
|
|
||||||
methods: {
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
- js操作dom
|
|
||||||
|
|
||||||
``` html
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>uQRCode二维码生成</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="qrcode" style="position: relative;"></div>
|
|
||||||
<script type="text/javascript" src="uqrcode.js"></script>
|
|
||||||
<script>
|
|
||||||
// 引入uQRCode
|
|
||||||
var UQRCode = window.UQRCode;
|
|
||||||
// 获取uQRCode实例
|
|
||||||
var qr = new UQRCode();
|
|
||||||
// 设置二维码内容
|
|
||||||
qr.data = "https://uqrcode.cn/doc";
|
|
||||||
// 设置二维码大小,必须与canvas设置的宽高一致
|
|
||||||
qr.size = 200;
|
|
||||||
// 设置二维码前景图,可以是路径
|
|
||||||
qr.foregroundImageSrc =
|
|
||||||
'data:image/png;base64,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';
|
|
||||||
// 调用制作二维码方法
|
|
||||||
qr.make();
|
|
||||||
|
|
||||||
var drawModules = qr.getDrawModules();
|
|
||||||
// 遍历drawModules创建dom元素
|
|
||||||
var qrHtml = '';
|
|
||||||
for (var i = 0; i < drawModules.length; i++) {
|
|
||||||
var drawModule = drawModules[i];
|
|
||||||
switch (drawModule.type) {
|
|
||||||
case 'tile':
|
|
||||||
/* 绘制小块 */
|
|
||||||
qrHtml += `<div style="position: absolute;left: ${drawModule.x}px;top: ${drawModule.y}px;width: ${drawModule.width}px;height: ${drawModule.height}px;background: ${drawModule.color};"></div>`;
|
|
||||||
break;
|
|
||||||
case 'image':
|
|
||||||
/* 绘制图像 */
|
|
||||||
qrHtml += `<img style="position: absolute;left: ${drawModule.x}px;top: ${drawModule.y}px;width: ${drawModule.width}px;height: ${drawModule.height}px;" src="${drawModule.imageSrc}" />`;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
document.getElementById('qrcode').innerHTML = qrHtml;
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
|
|
||||||
- svg
|
|
||||||
``` html
|
|
||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<title>uQRCode二维码生成</title>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<svg id="qrcode" width="200" height="200" xmlns="http://www.w3.org/2000/svg" version="1.1"></svg>
|
|
||||||
<script type="text/javascript" src="uqrcode.js"></script>
|
|
||||||
<script>
|
|
||||||
// 引入uQRCode
|
|
||||||
var UQRCode = window.UQRCode;
|
|
||||||
// 获取uQRCode实例
|
|
||||||
var qr = new UQRCode();
|
|
||||||
// 设置二维码内容
|
|
||||||
qr.data = "https://uqrcode.cn/doc";
|
|
||||||
// 设置二维码大小,必须与canvas设置的宽高一致
|
|
||||||
qr.size = 200;
|
|
||||||
// 设置二维码前景图,可以是路径
|
|
||||||
qr.foregroundImageSrc =
|
|
||||||
'data:image/png;base64,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';
|
|
||||||
// 调用制作二维码方法
|
|
||||||
qr.make();
|
|
||||||
|
|
||||||
var drawModules = qr.getDrawModules();
|
|
||||||
// 遍历drawModules创建svg元素
|
|
||||||
var qrHtml = '';
|
|
||||||
for (var i = 0; i < drawModules.length; i++) {
|
|
||||||
var drawModule = drawModules[i];
|
|
||||||
switch (drawModule.type) {
|
|
||||||
case 'tile':
|
|
||||||
/* 绘制小块 */
|
|
||||||
qrHtml += `<rect x="${drawModule.x}" y="${drawModule.y}" width="${drawModule.width}" height="${drawModule.height}" style="fill: ${drawModule.color};" />`;
|
|
||||||
break;
|
|
||||||
case 'image':
|
|
||||||
/* 绘制图像 */
|
|
||||||
qrHtml += `<image href="${drawModule.imageSrc}" x="${drawModule.x}" y="${drawModule.y}" width="${drawModule.width}" height="${drawModule.height}" />`;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
document.getElementById('qrcode').innerHTML = qrHtml;
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
|
|
||||||
> 更多用法大家自行探索咯,期待分享哟~
|
|
||||||
|
|
||||||
### 导出临时文件路径
|
|
||||||
|
|
||||||
原生方式基于`Canvas`的,请自行参阅各平台`Canvas`的导出方式。以下是部分示例:
|
|
||||||
|
|
||||||
- uni-app
|
|
||||||
```javascript
|
|
||||||
// 通过uni.createCanvasContext方式创建绘制上下文的,对应导出API为uni.canvasToTempFilePath
|
|
||||||
// 调用完ctx.draw()方法后不能第一时间导出,否则会异常,需要有一定的延时
|
|
||||||
setTimeout(() => {
|
|
||||||
uni.canvasToTempFilePath(
|
|
||||||
{
|
|
||||||
canvasId: this.canvasId,
|
|
||||||
fileType: this.fileType,
|
|
||||||
width: this.canvasWidth,
|
|
||||||
height: this.canvasHeight,
|
|
||||||
success: res => {
|
|
||||||
console.log(res);
|
|
||||||
},
|
|
||||||
fail: err => {
|
|
||||||
console.log(err);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
// this // 组件内使用必传当前实例
|
|
||||||
);
|
|
||||||
}, 300);
|
|
||||||
```
|
|
||||||
|
|
||||||
- Canvas2D
|
|
||||||
```javascript
|
|
||||||
// 得到base64
|
|
||||||
console.log(canvas.toDataURL());
|
|
||||||
// 得到buffer
|
|
||||||
console.log(canvas.toBuffer());
|
|
||||||
```
|
|
||||||
|
|
||||||
### 保存二维码到本地相册
|
|
||||||
|
|
||||||
必须在导出临时文件路径成功后再执行保存。uni-app通用保存方式(H5除外):
|
|
||||||
```javascript
|
|
||||||
uni.saveImageToPhotosAlbum({
|
|
||||||
filePath: tempFilePath,
|
|
||||||
success: res => {
|
|
||||||
console.log(res);
|
|
||||||
},
|
|
||||||
fail: err => {
|
|
||||||
console.log(err);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
H5可以通过设置`<a>`标签`href`属性的方式进行保存:
|
|
||||||
```javascript
|
|
||||||
const aEle = document.createElement('a');
|
|
||||||
aEle.download = 'uQRCode'; // 设置下载的文件名,默认是'下载'
|
|
||||||
aEle.href = tempFilePath;
|
|
||||||
document.body.appendChild(aEle);
|
|
||||||
aEle.click();
|
|
||||||
aEle.remove(); // 下载之后把创建的元素删除
|
|
||||||
```
|
|
||||||
经过测试,PC端浏览器可以下载,部分安卓自带或第三方浏览器可以下载,安卓微信浏览器不适用,移动端iOS所有浏览器均不适用,差异较大,还是推荐各位导出文件给图片组件显示,然后提示用户通过长按图片进行保存这种方式。
|
|
||||||
|
|
||||||
## uni-app组件方式
|
|
||||||
|
|
||||||
### 安装
|
|
||||||
|
|
||||||
通过uni-app插件市场地址安装:[https://ext.dcloud.net.cn/plugin?id=1287](https://ext.dcloud.net.cn/plugin?id=1287)。详细配置请移步到:文档 > [uni-app组件](https://uqrcode.cn/doc/document/uni-app.html)。
|
|
||||||
|
|
||||||
### 引入
|
|
||||||
|
|
||||||
uni-app默认为easycom模式,可直接键入`<uqrcode>`标签。
|
|
||||||
|
|
||||||
### 简单用法
|
|
||||||
|
|
||||||
安装`uqrcode`组件后,在`template`中键入`<uqrcode/>`。设置`ref`属性可使用组件内部方法,`canvas-id`属性为组件内部的canvas组件标识,`value`属性为二维码生成对应内容,`options`为配置选项,可配置二维码样式,绘制Logo等,详见:[options](https://uqrcode.cn/doc/document/uni-app.html#options) 。
|
|
||||||
|
|
||||||
``` html
|
|
||||||
<uqrcode ref="uqrcode" canvas-id="qrcode" value="https://uqrcode.cn/doc" :options="{ margin: 10 }"></uqrcode>
|
|
||||||
```
|
|
||||||
|
|
||||||
### 导出临时文件路径
|
|
||||||
|
|
||||||
为了保证方法调用成功,请在 [complete](https://uqrcode.cn/doc/document/uni-app.html#complete) 事件返回`success=true`后调用。
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// uqrcode为组件的ref名称
|
|
||||||
this.$refs.uqrcode.toTempFilePath({
|
|
||||||
success: res => {
|
|
||||||
console.log(res);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
### 保存二维码到本地相册
|
|
||||||
|
|
||||||
为了保证方法调用成功,请在 [complete](https://uqrcode.cn/doc/document/uni-app.html#complete) 事件返回`success=true`后调用。
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
// uqrcode为组件的ref名称
|
|
||||||
this.$refs.uqrcode.save({
|
|
||||||
success: () => {
|
|
||||||
uni.showToast({
|
|
||||||
icon: 'success',
|
|
||||||
title: '保存成功'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## 更多使用说明请前往官方文档查看:[https://uqrcode.cn/doc](https://uqrcode.cn/doc)。
|
|
||||||
@ -1,12 +0,0 @@
|
|||||||
## 4.0.6(2022-12-12)
|
|
||||||
修复`getDrawModules`,第一次获取结果正常,后续获取`tile`模块不存在的问题;
|
|
||||||
修复安卓type:normal因Canvas API使用了小数或为0的参数导致生成异常的问题(注:安卓非2d Canvas部分API参数不支持携带小数,部分API参数必须大于0)。
|
|
||||||
## 4.0.1(2022-11-28)
|
|
||||||
优化组件loading属性的表现;
|
|
||||||
新增组件type选项normal,以便于在某些条件编译初始为type=2d时还可以选择使用非2d组件类型;
|
|
||||||
修复组件条件编译在其他编辑器语法提示报错;
|
|
||||||
修复原生对es5的支持。
|
|
||||||
## 4.0.0(2022-11-21)
|
|
||||||
v4版本源代码全面开放,开源地址:[https://github.com/Sansnn/uQRCode](https://github.com/Sansnn/uQRCode);
|
|
||||||
|
|
||||||
升级说明:v4为大版本更新,虽然已尽可能兼容上一代版本,但不可避免的还是存在一些细节差异,若更新后出现问题,请参考对照[v3 文档](https://uqrcode.cn/doc/v3),[v4 文档](https://uqrcode.cn/doc)进行修改。
|
|
||||||
@ -1 +0,0 @@
|
|||||||
export const cacheImageList = [];
|
|
||||||
@ -1,41 +0,0 @@
|
|||||||
function Queue() {
|
|
||||||
let waitingQueue = this.waitingQueue = [];
|
|
||||||
let isRunning = this.isRunning = false; // 记录是否有未完成的任务
|
|
||||||
|
|
||||||
function execute(task, resolve, reject) {
|
|
||||||
task()
|
|
||||||
.then((data) => {
|
|
||||||
resolve(data);
|
|
||||||
})
|
|
||||||
.catch((e) => {
|
|
||||||
reject(e);
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
// 等待任务队列中如果有任务,则触发它;否则设置isRunning = false,表示无任务状态
|
|
||||||
if (waitingQueue.length) {
|
|
||||||
const next = waitingQueue.shift();
|
|
||||||
execute(next.task, next.resolve, next.reject);
|
|
||||||
} else {
|
|
||||||
isRunning = false;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
this.exec = function(task) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
if (isRunning) {
|
|
||||||
waitingQueue.push({
|
|
||||||
task,
|
|
||||||
resolve,
|
|
||||||
reject
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
isRunning = true;
|
|
||||||
execute(task, resolve, reject);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* 队列实例,某些平台一起使用多个组件时需要通过队列逐一绘制,否则部分绘制方法异常,nvue端的iOS gcanvas尤其明显,在不通过队列绘制时会出现图片丢失的情况 */
|
|
||||||
export const queueDraw = new Queue();
|
|
||||||
export const queueLoadImage = new Queue();
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
declare module '*/common/cache' {
|
|
||||||
export const cacheImageList: Array;
|
|
||||||
}
|
|
||||||
@ -1,4 +0,0 @@
|
|||||||
declare module '*/common/queue' {
|
|
||||||
export const queueDraw: any;
|
|
||||||
export const queueLoadImage: any;
|
|
||||||
}
|
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -1,241 +0,0 @@
|
|||||||
const isWeex = typeof WXEnvironment !== 'undefined';
|
|
||||||
const isWeexIOS = isWeex && /ios/i.test(WXEnvironment.platform);
|
|
||||||
const isWeexAndroid = isWeex && !isWeexIOS;
|
|
||||||
|
|
||||||
import GLmethod from '../context-webgl/GLmethod';
|
|
||||||
|
|
||||||
const GCanvasModule =
|
|
||||||
(typeof weex !== 'undefined' && weex.requireModule) ? (weex.requireModule('gcanvas')) :
|
|
||||||
(typeof __weex_require__ !== 'undefined') ? (__weex_require__('@weex-module/gcanvas')) : {};
|
|
||||||
|
|
||||||
let isDebugging = false;
|
|
||||||
|
|
||||||
let isComboDisabled = false;
|
|
||||||
|
|
||||||
const logCommand = (function () {
|
|
||||||
const methodQuery = [];
|
|
||||||
Object.keys(GLmethod).forEach(key => {
|
|
||||||
methodQuery[GLmethod[key]] = key;
|
|
||||||
})
|
|
||||||
const queryMethod = (id) => {
|
|
||||||
return methodQuery[parseInt(id)] || 'NotFoundMethod';
|
|
||||||
}
|
|
||||||
const logCommand = (id, cmds) => {
|
|
||||||
const mId = cmds.split(',')[0];
|
|
||||||
const mName = queryMethod(mId);
|
|
||||||
console.log(`=== callNative - componentId:${id}; method: ${mName}; cmds: ${cmds}`);
|
|
||||||
}
|
|
||||||
return logCommand;
|
|
||||||
})();
|
|
||||||
|
|
||||||
function joinArray(arr, sep) {
|
|
||||||
let res = '';
|
|
||||||
for (let i = 0; i < arr.length; i++) {
|
|
||||||
if (i !== 0) {
|
|
||||||
res += sep;
|
|
||||||
}
|
|
||||||
res += arr[i];
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
const commandsCache = {}
|
|
||||||
|
|
||||||
const GBridge = {
|
|
||||||
|
|
||||||
callEnable: (ref, configArray) => {
|
|
||||||
|
|
||||||
commandsCache[ref] = [];
|
|
||||||
|
|
||||||
return GCanvasModule.enable({
|
|
||||||
componentId: ref,
|
|
||||||
config: configArray
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
callEnableDebug: () => {
|
|
||||||
isDebugging = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
callEnableDisableCombo: () => {
|
|
||||||
isComboDisabled = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
callSetContextType: function (componentId, context_type) {
|
|
||||||
GCanvasModule.setContextType(context_type, componentId);
|
|
||||||
},
|
|
||||||
|
|
||||||
callReset: function(id){
|
|
||||||
GCanvasModule.resetComponent && canvasModule.resetComponent(componentId);
|
|
||||||
},
|
|
||||||
|
|
||||||
render: isWeexIOS ? function (componentId) {
|
|
||||||
return GCanvasModule.extendCallNative({
|
|
||||||
contextId: componentId,
|
|
||||||
type: 0x60000001
|
|
||||||
});
|
|
||||||
} : function (componentId) {
|
|
||||||
return callGCanvasLinkNative(componentId, 0x60000001, 'render');
|
|
||||||
},
|
|
||||||
|
|
||||||
render2d: isWeexIOS ? function (componentId, commands, callback) {
|
|
||||||
|
|
||||||
if (isDebugging) {
|
|
||||||
console.log('>>> >>> render2d ===');
|
|
||||||
console.log('>>> commands: ' + commands);
|
|
||||||
}
|
|
||||||
|
|
||||||
GCanvasModule.render([commands, callback?true:false], componentId, callback);
|
|
||||||
|
|
||||||
} : function (componentId, commands,callback) {
|
|
||||||
|
|
||||||
if (isDebugging) {
|
|
||||||
console.log('>>> >>> render2d ===');
|
|
||||||
console.log('>>> commands: ' + commands);
|
|
||||||
}
|
|
||||||
|
|
||||||
callGCanvasLinkNative(componentId, 0x20000001, commands);
|
|
||||||
if(callback){
|
|
||||||
callback();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
callExtendCallNative: isWeexIOS ? function (componentId, cmdArgs) {
|
|
||||||
|
|
||||||
throw 'should not be here anymore ' + cmdArgs;
|
|
||||||
|
|
||||||
} : function (componentId, cmdArgs) {
|
|
||||||
|
|
||||||
throw 'should not be here anymore ' + cmdArgs;
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
|
|
||||||
flushNative: isWeexIOS ? function (componentId) {
|
|
||||||
|
|
||||||
const cmdArgs = joinArray(commandsCache[componentId], ';');
|
|
||||||
commandsCache[componentId] = [];
|
|
||||||
|
|
||||||
if (isDebugging) {
|
|
||||||
console.log('>>> >>> flush native ===');
|
|
||||||
console.log('>>> commands: ' + cmdArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
const result = GCanvasModule.extendCallNative({
|
|
||||||
"contextId": componentId,
|
|
||||||
"type": 0x60000000,
|
|
||||||
"args": cmdArgs
|
|
||||||
});
|
|
||||||
|
|
||||||
const res = result && result.result;
|
|
||||||
|
|
||||||
if (isDebugging) {
|
|
||||||
console.log('>>> result: ' + res);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
|
|
||||||
} : function (componentId) {
|
|
||||||
|
|
||||||
const cmdArgs = joinArray(commandsCache[componentId], ';');
|
|
||||||
commandsCache[componentId] = [];
|
|
||||||
|
|
||||||
if (isDebugging) {
|
|
||||||
console.log('>>> >>> flush native ===');
|
|
||||||
console.log('>>> commands: ' + cmdArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
const result = callGCanvasLinkNative(componentId, 0x60000000, cmdArgs);
|
|
||||||
|
|
||||||
if (isDebugging) {
|
|
||||||
console.log('>>> result: ' + result);
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
},
|
|
||||||
|
|
||||||
callNative: function (componentId, cmdArgs, cache) {
|
|
||||||
|
|
||||||
if (isDebugging) {
|
|
||||||
logCommand(componentId, cmdArgs);
|
|
||||||
}
|
|
||||||
|
|
||||||
commandsCache[componentId].push(cmdArgs);
|
|
||||||
|
|
||||||
if (!cache || isComboDisabled) {
|
|
||||||
return GBridge.flushNative(componentId);
|
|
||||||
} else {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
texImage2D(componentId, ...args) {
|
|
||||||
if (isWeexIOS) {
|
|
||||||
if (args.length === 6) {
|
|
||||||
const [target, level, internalformat, format, type, image] = args;
|
|
||||||
GBridge.callNative(
|
|
||||||
componentId,
|
|
||||||
GLmethod.texImage2D + ',' + 6 + ',' + target + ',' + level + ',' + internalformat + ',' + format + ',' + type + ',' + image.src
|
|
||||||
)
|
|
||||||
} else if (args.length === 9) {
|
|
||||||
const [target, level, internalformat, width, height, border, format, type, image] = args;
|
|
||||||
GBridge.callNative(
|
|
||||||
componentId,
|
|
||||||
GLmethod.texImage2D + ',' + 9 + ',' + target + ',' + level + ',' + internalformat + ',' + width + ',' + height + ',' + border + ',' +
|
|
||||||
+ format + ',' + type + ',' + (image ? image.src : 0)
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} else if (isWeexAndroid) {
|
|
||||||
if (args.length === 6) {
|
|
||||||
const [target, level, internalformat, format, type, image] = args;
|
|
||||||
GCanvasModule.texImage2D(componentId, target, level, internalformat, format, type, image.src);
|
|
||||||
} else if (args.length === 9) {
|
|
||||||
const [target, level, internalformat, width, height, border, format, type, image] = args;
|
|
||||||
GCanvasModule.texImage2D(componentId, target, level, internalformat, width, height, border, format, type, (image ? image.src : 0));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image) {
|
|
||||||
if (isWeexIOS) {
|
|
||||||
if (arguments.length === 8) {
|
|
||||||
GBridge.callNative(
|
|
||||||
componentId,
|
|
||||||
GLmethod.texSubImage2D + ',' + 6 + ',' + target + ',' + level + ',' + xoffset + ',' + yoffset, + ',' + format + ',' + type + ',' + image.src
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} else if (isWeexAndroid) {
|
|
||||||
GCanvasModule.texSubImage2D(componentId, target, level, xoffset, yoffset, format, type, image.src);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
bindImageTexture(componentId, src, imageId) {
|
|
||||||
GCanvasModule.bindImageTexture([src, imageId], componentId);
|
|
||||||
},
|
|
||||||
|
|
||||||
perloadImage([url, id], callback) {
|
|
||||||
GCanvasModule.preLoadImage([url, id], function (image) {
|
|
||||||
image.url = url;
|
|
||||||
image.id = id;
|
|
||||||
callback(image);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
measureText(text, fontStyle, componentId) {
|
|
||||||
return GCanvasModule.measureText([text, fontStyle], componentId);
|
|
||||||
},
|
|
||||||
|
|
||||||
getImageData (componentId, x, y, w, h, callback) {
|
|
||||||
GCanvasModule.getImageData([x, y,w,h],componentId,callback);
|
|
||||||
},
|
|
||||||
|
|
||||||
putImageData (componentId, data, x, y, w, h, callback) {
|
|
||||||
GCanvasModule.putImageData([x, y,w,h,data],componentId,callback);
|
|
||||||
},
|
|
||||||
|
|
||||||
toTempFilePath(componentId, x, y, width, height, destWidth, destHeight, fileType, quality, callback){
|
|
||||||
GCanvasModule.toTempFilePath([x, y, width,height, destWidth, destHeight, fileType, quality], componentId, callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default GBridge;
|
|
||||||
@ -1,18 +0,0 @@
|
|||||||
class FillStyleLinearGradient {
|
|
||||||
|
|
||||||
constructor(x0, y0, x1, y1) {
|
|
||||||
this._start_pos = { _x: x0, _y: y0 };
|
|
||||||
this._end_pos = { _x: x1, _y: y1 };
|
|
||||||
this._stop_count = 0;
|
|
||||||
this._stops = [0, 0, 0, 0, 0];
|
|
||||||
}
|
|
||||||
|
|
||||||
addColorStop = function (pos, color) {
|
|
||||||
if (this._stop_count < 5 && 0.0 <= pos && pos <= 1.0) {
|
|
||||||
this._stops[this._stop_count] = { _pos: pos, _color: color };
|
|
||||||
this._stop_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default FillStyleLinearGradient;
|
|
||||||
@ -1,8 +0,0 @@
|
|||||||
class FillStylePattern {
|
|
||||||
constructor(img, pattern) {
|
|
||||||
this._style = pattern;
|
|
||||||
this._img = img;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default FillStylePattern;
|
|
||||||
@ -1,17 +0,0 @@
|
|||||||
class FillStyleRadialGradient {
|
|
||||||
constructor(x0, y0, r0, x1, y1, r1) {
|
|
||||||
this._start_pos = { _x: x0, _y: y0, _r: r0 };
|
|
||||||
this._end_pos = { _x: x1, _y: y1, _r: r1 };
|
|
||||||
this._stop_count = 0;
|
|
||||||
this._stops = [0, 0, 0, 0, 0];
|
|
||||||
}
|
|
||||||
|
|
||||||
addColorStop(pos, color) {
|
|
||||||
if (this._stop_count < 5 && 0.0 <= pos && pos <= 1.0) {
|
|
||||||
this._stops[this._stop_count] = { _pos: pos, _color: color };
|
|
||||||
this._stop_count++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default FillStyleRadialGradient;
|
|
||||||
@ -1,666 +0,0 @@
|
|||||||
import FillStylePattern from './FillStylePattern';
|
|
||||||
import FillStyleLinearGradient from './FillStyleLinearGradient';
|
|
||||||
import FillStyleRadialGradient from './FillStyleRadialGradient';
|
|
||||||
import GImage from '../env/image.js';
|
|
||||||
import {
|
|
||||||
ArrayBufferToBase64,
|
|
||||||
Base64ToUint8ClampedArray
|
|
||||||
} from '../env/tool.js';
|
|
||||||
|
|
||||||
export default class CanvasRenderingContext2D {
|
|
||||||
|
|
||||||
_drawCommands = '';
|
|
||||||
|
|
||||||
_globalAlpha = 1.0;
|
|
||||||
|
|
||||||
_fillStyle = 'rgb(0,0,0)';
|
|
||||||
_strokeStyle = 'rgb(0,0,0)';
|
|
||||||
|
|
||||||
_lineWidth = 1;
|
|
||||||
_lineCap = 'butt';
|
|
||||||
_lineJoin = 'miter';
|
|
||||||
|
|
||||||
_miterLimit = 10;
|
|
||||||
|
|
||||||
_globalCompositeOperation = 'source-over';
|
|
||||||
|
|
||||||
_textAlign = 'start';
|
|
||||||
_textBaseline = 'alphabetic';
|
|
||||||
|
|
||||||
_font = '10px sans-serif';
|
|
||||||
|
|
||||||
_savedGlobalAlpha = [];
|
|
||||||
|
|
||||||
timer = null;
|
|
||||||
componentId = null;
|
|
||||||
|
|
||||||
_notCommitDrawImageCache = [];
|
|
||||||
_needRedrawImageCache = [];
|
|
||||||
_redrawCommands = '';
|
|
||||||
_autoSaveContext = true;
|
|
||||||
// _imageMap = new GHashMap();
|
|
||||||
// _textureMap = new GHashMap();
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
this.className = 'CanvasRenderingContext2D';
|
|
||||||
//this.save()
|
|
||||||
}
|
|
||||||
|
|
||||||
setFillStyle(value) {
|
|
||||||
this.fillStyle = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
set fillStyle(value) {
|
|
||||||
this._fillStyle = value;
|
|
||||||
|
|
||||||
if (typeof(value) == 'string') {
|
|
||||||
this._drawCommands = this._drawCommands.concat("F" + value + ";");
|
|
||||||
} else if (value instanceof FillStylePattern) {
|
|
||||||
const image = value._img;
|
|
||||||
if (!image.complete) {
|
|
||||||
image.onload = () => {
|
|
||||||
var index = this._needRedrawImageCache.indexOf(image);
|
|
||||||
if (index > -1) {
|
|
||||||
this._needRedrawImageCache.splice(index, 1);
|
|
||||||
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
|
||||||
this._redrawflush(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._notCommitDrawImageCache.push(image);
|
|
||||||
} else {
|
|
||||||
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
|
||||||
}
|
|
||||||
|
|
||||||
//CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
|
||||||
this._drawCommands = this._drawCommands.concat("G" + image._id + "," + value._style + ";");
|
|
||||||
} else if (value instanceof FillStyleLinearGradient) {
|
|
||||||
var command = "D" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," +
|
|
||||||
value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," +
|
|
||||||
value._stop_count;
|
|
||||||
for (var i = 0; i < value._stop_count; ++i) {
|
|
||||||
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
|
|
||||||
}
|
|
||||||
this._drawCommands = this._drawCommands.concat(command + ";");
|
|
||||||
} else if (value instanceof FillStyleRadialGradient) {
|
|
||||||
var command = "H" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + value._start_pos._r
|
|
||||||
.toFixed(2) + "," +
|
|
||||||
value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," + value._end_pos._r.toFixed(2) + "," +
|
|
||||||
value._stop_count;
|
|
||||||
for (var i = 0; i < value._stop_count; ++i) {
|
|
||||||
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
|
|
||||||
}
|
|
||||||
this._drawCommands = this._drawCommands.concat(command + ";");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get fillStyle() {
|
|
||||||
return this._fillStyle;
|
|
||||||
}
|
|
||||||
|
|
||||||
get globalAlpha() {
|
|
||||||
return this._globalAlpha;
|
|
||||||
}
|
|
||||||
|
|
||||||
setGlobalAlpha(value) {
|
|
||||||
this.globalAlpha = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
set globalAlpha(value) {
|
|
||||||
this._globalAlpha = value;
|
|
||||||
this._drawCommands = this._drawCommands.concat("a" + value.toFixed(2) + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
get strokeStyle() {
|
|
||||||
return this._strokeStyle;
|
|
||||||
}
|
|
||||||
|
|
||||||
setStrokeStyle(value) {
|
|
||||||
this.strokeStyle = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
set strokeStyle(value) {
|
|
||||||
|
|
||||||
this._strokeStyle = value;
|
|
||||||
|
|
||||||
if (typeof(value) == 'string') {
|
|
||||||
this._drawCommands = this._drawCommands.concat("S" + value + ";");
|
|
||||||
} else if (value instanceof FillStylePattern) {
|
|
||||||
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
|
||||||
this._drawCommands = this._drawCommands.concat("G" + image._id + "," + value._style + ";");
|
|
||||||
} else if (value instanceof FillStyleLinearGradient) {
|
|
||||||
var command = "D" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," +
|
|
||||||
value._end_pos._x.toFixed(2) + "," + value._end_pos._y.toFixed(2) + "," +
|
|
||||||
value._stop_count;
|
|
||||||
|
|
||||||
for (var i = 0; i < value._stop_count; ++i) {
|
|
||||||
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
|
|
||||||
}
|
|
||||||
this._drawCommands = this._drawCommands.concat(command + ";");
|
|
||||||
} else if (value instanceof FillStyleRadialGradient) {
|
|
||||||
var command = "H" + value._start_pos._x.toFixed(2) + "," + value._start_pos._y.toFixed(2) + "," + value._start_pos._r
|
|
||||||
.toFixed(2) + "," +
|
|
||||||
value._end_pos._x.toFixed(2) + "," + value._end_pos._y + ",".toFixed(2) + value._end_pos._r.toFixed(2) + "," +
|
|
||||||
value._stop_count;
|
|
||||||
|
|
||||||
for (var i = 0; i < value._stop_count; ++i) {
|
|
||||||
command += ("," + value._stops[i]._pos + "," + value._stops[i]._color);
|
|
||||||
}
|
|
||||||
this._drawCommands = this._drawCommands.concat(command + ";");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get lineWidth() {
|
|
||||||
return this._lineWidth;
|
|
||||||
}
|
|
||||||
|
|
||||||
setLineWidth(value) {
|
|
||||||
this.lineWidth = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
set lineWidth(value) {
|
|
||||||
this._lineWidth = value;
|
|
||||||
this._drawCommands = this._drawCommands.concat("W" + value + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
get lineCap() {
|
|
||||||
return this._lineCap;
|
|
||||||
}
|
|
||||||
|
|
||||||
setLineCap(value) {
|
|
||||||
this.lineCap = value;
|
|
||||||
}
|
|
||||||
|
|
||||||
set lineCap(value) {
|
|
||||||
this._lineCap = value;
|
|
||||||
this._drawCommands = this._drawCommands.concat("C" + value + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
get lineJoin() {
|
|
||||||
return this._lineJoin;
|
|
||||||
}
|
|
||||||
|
|
||||||
setLineJoin(value) {
|
|
||||||
this.lineJoin = value
|
|
||||||
}
|
|
||||||
|
|
||||||
set lineJoin(value) {
|
|
||||||
this._lineJoin = value;
|
|
||||||
this._drawCommands = this._drawCommands.concat("J" + value + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
get miterLimit() {
|
|
||||||
return this._miterLimit;
|
|
||||||
}
|
|
||||||
|
|
||||||
setMiterLimit(value) {
|
|
||||||
this.miterLimit = value
|
|
||||||
}
|
|
||||||
|
|
||||||
set miterLimit(value) {
|
|
||||||
this._miterLimit = value;
|
|
||||||
this._drawCommands = this._drawCommands.concat("M" + value + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
get globalCompositeOperation() {
|
|
||||||
return this._globalCompositeOperation;
|
|
||||||
}
|
|
||||||
|
|
||||||
set globalCompositeOperation(value) {
|
|
||||||
|
|
||||||
this._globalCompositeOperation = value;
|
|
||||||
let mode = 0;
|
|
||||||
switch (value) {
|
|
||||||
case "source-over":
|
|
||||||
mode = 0;
|
|
||||||
break;
|
|
||||||
case "source-atop":
|
|
||||||
mode = 5;
|
|
||||||
break;
|
|
||||||
case "source-in":
|
|
||||||
mode = 0;
|
|
||||||
break;
|
|
||||||
case "source-out":
|
|
||||||
mode = 2;
|
|
||||||
break;
|
|
||||||
case "destination-over":
|
|
||||||
mode = 4;
|
|
||||||
break;
|
|
||||||
case "destination-atop":
|
|
||||||
mode = 4;
|
|
||||||
break;
|
|
||||||
case "destination-in":
|
|
||||||
mode = 4;
|
|
||||||
break;
|
|
||||||
case "destination-out":
|
|
||||||
mode = 3;
|
|
||||||
break;
|
|
||||||
case "lighter":
|
|
||||||
mode = 1;
|
|
||||||
break;
|
|
||||||
case "copy":
|
|
||||||
mode = 2;
|
|
||||||
break;
|
|
||||||
case "xor":
|
|
||||||
mode = 6;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mode = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._drawCommands = this._drawCommands.concat("B" + mode + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
get textAlign() {
|
|
||||||
return this._textAlign;
|
|
||||||
}
|
|
||||||
|
|
||||||
setTextAlign(value) {
|
|
||||||
this.textAlign = value
|
|
||||||
}
|
|
||||||
|
|
||||||
set textAlign(value) {
|
|
||||||
|
|
||||||
this._textAlign = value;
|
|
||||||
let Align = 0;
|
|
||||||
switch (value) {
|
|
||||||
case "start":
|
|
||||||
Align = 0;
|
|
||||||
break;
|
|
||||||
case "end":
|
|
||||||
Align = 1;
|
|
||||||
break;
|
|
||||||
case "left":
|
|
||||||
Align = 2;
|
|
||||||
break;
|
|
||||||
case "center":
|
|
||||||
Align = 3;
|
|
||||||
break;
|
|
||||||
case "right":
|
|
||||||
Align = 4;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
Align = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._drawCommands = this._drawCommands.concat("A" + Align + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
get textBaseline() {
|
|
||||||
return this._textBaseline;
|
|
||||||
}
|
|
||||||
|
|
||||||
setTextBaseline(value) {
|
|
||||||
this.textBaseline = value
|
|
||||||
}
|
|
||||||
|
|
||||||
set textBaseline(value) {
|
|
||||||
this._textBaseline = value;
|
|
||||||
let baseline = 0;
|
|
||||||
switch (value) {
|
|
||||||
case "alphabetic":
|
|
||||||
baseline = 0;
|
|
||||||
break;
|
|
||||||
case "middle":
|
|
||||||
baseline = 1;
|
|
||||||
break;
|
|
||||||
case "top":
|
|
||||||
baseline = 2;
|
|
||||||
break;
|
|
||||||
case "hanging":
|
|
||||||
baseline = 3;
|
|
||||||
break;
|
|
||||||
case "bottom":
|
|
||||||
baseline = 4;
|
|
||||||
break;
|
|
||||||
case "ideographic":
|
|
||||||
baseline = 5;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
baseline = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._drawCommands = this._drawCommands.concat("E" + baseline + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
get font() {
|
|
||||||
return this._font;
|
|
||||||
}
|
|
||||||
|
|
||||||
setFontSize(size) {
|
|
||||||
var str = this._font;
|
|
||||||
var strs = str.trim().split(/\s+/);
|
|
||||||
for (var i = 0; i < strs.length; i++) {
|
|
||||||
var values = ["normal", "italic", "oblique", "normal", "small-caps", "normal", "bold",
|
|
||||||
"bolder", "lighter", "100", "200", "300", "400", "500", "600", "700", "800", "900",
|
|
||||||
"normal", "ultra-condensed", "extra-condensed", "condensed", "semi-condensed",
|
|
||||||
"semi-expanded", "expanded", "extra-expanded", "ultra-expanded"
|
|
||||||
];
|
|
||||||
|
|
||||||
if (-1 == values.indexOf(strs[i].trim())) {
|
|
||||||
if (typeof size === 'string') {
|
|
||||||
strs[i] = size;
|
|
||||||
} else if (typeof size === 'number') {
|
|
||||||
strs[i] = String(size) + 'px';
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.font = strs.join(" ");
|
|
||||||
}
|
|
||||||
|
|
||||||
set font(value) {
|
|
||||||
this._font = value;
|
|
||||||
this._drawCommands = this._drawCommands.concat("j" + value + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
setTransform(a, b, c, d, tx, ty) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("t" +
|
|
||||||
(a === 1 ? "1" : a.toFixed(2)) + "," +
|
|
||||||
(b === 0 ? "0" : b.toFixed(2)) + "," +
|
|
||||||
(c === 0 ? "0" : c.toFixed(2)) + "," +
|
|
||||||
(d === 1 ? "1" : d.toFixed(2)) + "," + tx.toFixed(2) + "," + ty.toFixed(2) + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
transform(a, b, c, d, tx, ty) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("f" +
|
|
||||||
(a === 1 ? "1" : a.toFixed(2)) + "," +
|
|
||||||
(b === 0 ? "0" : b.toFixed(2)) + "," +
|
|
||||||
(c === 0 ? "0" : c.toFixed(2)) + "," +
|
|
||||||
(d === 1 ? "1" : d.toFixed(2)) + "," + tx + "," + ty + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
resetTransform() {
|
|
||||||
this._drawCommands = this._drawCommands.concat("m;");
|
|
||||||
}
|
|
||||||
|
|
||||||
scale(a, d) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("k" + a.toFixed(2) + "," +
|
|
||||||
d.toFixed(2) + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
rotate(angle) {
|
|
||||||
this._drawCommands = this._drawCommands
|
|
||||||
.concat("r" + angle.toFixed(6) + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
translate(tx, ty) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("l" + tx.toFixed(2) + "," + ty.toFixed(2) + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
save() {
|
|
||||||
this._savedGlobalAlpha.push(this._globalAlpha);
|
|
||||||
this._drawCommands = this._drawCommands.concat("v;");
|
|
||||||
}
|
|
||||||
|
|
||||||
restore() {
|
|
||||||
this._drawCommands = this._drawCommands.concat("e;");
|
|
||||||
this._globalAlpha = this._savedGlobalAlpha.pop();
|
|
||||||
}
|
|
||||||
|
|
||||||
createPattern(img, pattern) {
|
|
||||||
if (typeof img === 'string') {
|
|
||||||
var imgObj = new GImage();
|
|
||||||
imgObj.src = img;
|
|
||||||
img = imgObj;
|
|
||||||
}
|
|
||||||
return new FillStylePattern(img, pattern);
|
|
||||||
}
|
|
||||||
|
|
||||||
createLinearGradient(x0, y0, x1, y1) {
|
|
||||||
return new FillStyleLinearGradient(x0, y0, x1, y1);
|
|
||||||
}
|
|
||||||
|
|
||||||
createRadialGradient = function(x0, y0, r0, x1, y1, r1) {
|
|
||||||
return new FillStyleRadialGradient(x0, y0, r0, x1, y1, r1);
|
|
||||||
};
|
|
||||||
|
|
||||||
createCircularGradient = function(x0, y0, r0) {
|
|
||||||
return new FillStyleRadialGradient(x0, y0, 0, x0, y0, r0);
|
|
||||||
};
|
|
||||||
|
|
||||||
strokeRect(x, y, w, h) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("s" + x + "," + y + "," + w + "," + h + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
clearRect(x, y, w, h) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("c" + x + "," + y + "," + w +
|
|
||||||
"," + h + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
clip() {
|
|
||||||
this._drawCommands = this._drawCommands.concat("p;");
|
|
||||||
}
|
|
||||||
|
|
||||||
resetClip() {
|
|
||||||
this._drawCommands = this._drawCommands.concat("q;");
|
|
||||||
}
|
|
||||||
|
|
||||||
closePath() {
|
|
||||||
this._drawCommands = this._drawCommands.concat("o;");
|
|
||||||
}
|
|
||||||
|
|
||||||
moveTo(x, y) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("g" + x.toFixed(2) + "," + y.toFixed(2) + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
lineTo(x, y) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("i" + x.toFixed(2) + "," + y.toFixed(2) + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
quadraticCurveTo = function(cpx, cpy, x, y) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("u" + cpx + "," + cpy + "," + x + "," + y + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y, ) {
|
|
||||||
this._drawCommands = this._drawCommands.concat(
|
|
||||||
"z" + cp1x.toFixed(2) + "," + cp1y.toFixed(2) + "," + cp2x.toFixed(2) + "," + cp2y.toFixed(2) + "," +
|
|
||||||
x.toFixed(2) + "," + y.toFixed(2) + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
arcTo(x1, y1, x2, y2, radius) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("h" + x1 + "," + y1 + "," + x2 + "," + y2 + "," + radius + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
beginPath() {
|
|
||||||
this._drawCommands = this._drawCommands.concat("b;");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fillRect(x, y, w, h) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("n" + x + "," + y + "," + w +
|
|
||||||
"," + h + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
rect(x, y, w, h) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("w" + x + "," + y + "," + w + "," + h + ";");
|
|
||||||
}
|
|
||||||
|
|
||||||
fill() {
|
|
||||||
this._drawCommands = this._drawCommands.concat("L;");
|
|
||||||
}
|
|
||||||
|
|
||||||
stroke(path) {
|
|
||||||
this._drawCommands = this._drawCommands.concat("x;");
|
|
||||||
}
|
|
||||||
|
|
||||||
arc(x, y, radius, startAngle, endAngle, anticlockwise) {
|
|
||||||
|
|
||||||
let ianticlockwise = 0;
|
|
||||||
if (anticlockwise) {
|
|
||||||
ianticlockwise = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._drawCommands = this._drawCommands.concat(
|
|
||||||
"y" + x.toFixed(2) + "," + y.toFixed(2) + "," +
|
|
||||||
radius.toFixed(2) + "," + startAngle + "," + endAngle + "," + ianticlockwise +
|
|
||||||
";"
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
fillText(text, x, y) {
|
|
||||||
let tmptext = text.replace(/!/g, "!!");
|
|
||||||
tmptext = tmptext.replace(/,/g, "!,");
|
|
||||||
tmptext = tmptext.replace(/;/g, "!;");
|
|
||||||
this._drawCommands = this._drawCommands.concat("T" + tmptext + "," + x + "," + y + ",0.0;");
|
|
||||||
}
|
|
||||||
|
|
||||||
strokeText = function(text, x, y) {
|
|
||||||
let tmptext = text.replace(/!/g, "!!");
|
|
||||||
tmptext = tmptext.replace(/,/g, "!,");
|
|
||||||
tmptext = tmptext.replace(/;/g, "!;");
|
|
||||||
this._drawCommands = this._drawCommands.concat("U" + tmptext + "," + x + "," + y + ",0.0;");
|
|
||||||
}
|
|
||||||
|
|
||||||
measureText(text) {
|
|
||||||
return CanvasRenderingContext2D.GBridge.measureText(text, this.font, this.componentId);
|
|
||||||
}
|
|
||||||
|
|
||||||
isPointInPath = function(x, y) {
|
|
||||||
throw new Error('GCanvas not supported yet');
|
|
||||||
}
|
|
||||||
|
|
||||||
drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {
|
|
||||||
if (typeof image === 'string') {
|
|
||||||
var imgObj = new GImage();
|
|
||||||
imgObj.src = image;
|
|
||||||
image = imgObj;
|
|
||||||
}
|
|
||||||
if (image instanceof GImage) {
|
|
||||||
if (!image.complete) {
|
|
||||||
imgObj.onload = () => {
|
|
||||||
var index = this._needRedrawImageCache.indexOf(image);
|
|
||||||
if (index > -1) {
|
|
||||||
this._needRedrawImageCache.splice(index, 1);
|
|
||||||
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
|
||||||
this._redrawflush(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._notCommitDrawImageCache.push(image);
|
|
||||||
} else {
|
|
||||||
CanvasRenderingContext2D.GBridge.bindImageTexture(this.componentId, image.src, image._id);
|
|
||||||
}
|
|
||||||
var srcArgs = [image, sx, sy, sw, sh, dx, dy, dw, dh];
|
|
||||||
var args = [];
|
|
||||||
for (var arg in srcArgs) {
|
|
||||||
if (typeof(srcArgs[arg]) != 'undefined') {
|
|
||||||
args.push(srcArgs[arg]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.__drawImage.apply(this, args);
|
|
||||||
//this.__drawImage(image,sx, sy, sw, sh, dx, dy, dw, dh);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
__drawImage(image, sx, sy, sw, sh, dx, dy, dw, dh) {
|
|
||||||
const numArgs = arguments.length;
|
|
||||||
|
|
||||||
function drawImageCommands() {
|
|
||||||
|
|
||||||
if (numArgs === 3) {
|
|
||||||
const x = parseFloat(sx) || 0.0;
|
|
||||||
const y = parseFloat(sy) || 0.0;
|
|
||||||
|
|
||||||
return ("d" + image._id + ",0,0," +
|
|
||||||
image.width + "," + image.height + "," +
|
|
||||||
x + "," + y + "," + image.width + "," + image.height + ";");
|
|
||||||
} else if (numArgs === 5) {
|
|
||||||
const x = parseFloat(sx) || 0.0;
|
|
||||||
const y = parseFloat(sy) || 0.0;
|
|
||||||
const width = parseInt(sw) || image.width;
|
|
||||||
const height = parseInt(sh) || image.height;
|
|
||||||
|
|
||||||
return ("d" + image._id + ",0,0," +
|
|
||||||
image.width + "," + image.height + "," +
|
|
||||||
x + "," + y + "," + width + "," + height + ";");
|
|
||||||
} else if (numArgs === 9) {
|
|
||||||
sx = parseFloat(sx) || 0.0;
|
|
||||||
sy = parseFloat(sy) || 0.0;
|
|
||||||
sw = parseInt(sw) || image.width;
|
|
||||||
sh = parseInt(sh) || image.height;
|
|
||||||
dx = parseFloat(dx) || 0.0;
|
|
||||||
dy = parseFloat(dy) || 0.0;
|
|
||||||
dw = parseInt(dw) || image.width;
|
|
||||||
dh = parseInt(dh) || image.height;
|
|
||||||
|
|
||||||
return ("d" + image._id + "," +
|
|
||||||
sx + "," + sy + "," + sw + "," + sh + "," +
|
|
||||||
dx + "," + dy + "," + dw + "," + dh + ";");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._drawCommands += drawImageCommands();
|
|
||||||
}
|
|
||||||
|
|
||||||
_flush(reserve, callback) {
|
|
||||||
const commands = this._drawCommands;
|
|
||||||
this._drawCommands = '';
|
|
||||||
CanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback);
|
|
||||||
this._needRender = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
_redrawflush(reserve, callback) {
|
|
||||||
const commands = this._redrawCommands;
|
|
||||||
CanvasRenderingContext2D.GBridge.render2d(this.componentId, commands, callback);
|
|
||||||
if (this._needRedrawImageCache.length == 0) {
|
|
||||||
this._redrawCommands = '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
draw(reserve, callback) {
|
|
||||||
if (!reserve) {
|
|
||||||
this._globalAlpha = this._savedGlobalAlpha.pop();
|
|
||||||
this._savedGlobalAlpha.push(this._globalAlpha);
|
|
||||||
this._redrawCommands = this._drawCommands;
|
|
||||||
this._needRedrawImageCache = this._notCommitDrawImageCache;
|
|
||||||
if (this._autoSaveContext) {
|
|
||||||
this._drawCommands = ("v;" + this._drawCommands);
|
|
||||||
this._autoSaveContext = false;
|
|
||||||
} else {
|
|
||||||
this._drawCommands = ("e;X;v;" + this._drawCommands);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
this._needRedrawImageCache = this._needRedrawImageCache.concat(this._notCommitDrawImageCache);
|
|
||||||
this._redrawCommands += this._drawCommands;
|
|
||||||
if (this._autoSaveContext) {
|
|
||||||
this._drawCommands = ("v;" + this._drawCommands);
|
|
||||||
this._autoSaveContext = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this._notCommitDrawImageCache = [];
|
|
||||||
if (this._flush) {
|
|
||||||
this._flush(reserve, callback);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getImageData(x, y, w, h, callback) {
|
|
||||||
CanvasRenderingContext2D.GBridge.getImageData(this.componentId, x, y, w, h, function(res) {
|
|
||||||
res.data = Base64ToUint8ClampedArray(res.data);
|
|
||||||
if (typeof(callback) == 'function') {
|
|
||||||
callback(res);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
putImageData(data, x, y, w, h, callback) {
|
|
||||||
if (data instanceof Uint8ClampedArray) {
|
|
||||||
data = ArrayBufferToBase64(data);
|
|
||||||
CanvasRenderingContext2D.GBridge.putImageData(this.componentId, data, x, y, w, h, function(res) {
|
|
||||||
if (typeof(callback) == 'function') {
|
|
||||||
callback(res);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
toTempFilePath(x, y, width, height, destWidth, destHeight, fileType, quality, callback) {
|
|
||||||
CanvasRenderingContext2D.GBridge.toTempFilePath(this.componentId, x, y, width, height, destWidth, destHeight,
|
|
||||||
fileType, quality,
|
|
||||||
function(res) {
|
|
||||||
if (typeof(callback) == 'function') {
|
|
||||||
callback(res);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
export default class WebGLActiveInfo {
|
|
||||||
className = 'WebGLActiveInfo';
|
|
||||||
|
|
||||||
constructor({
|
|
||||||
type, name, size
|
|
||||||
}) {
|
|
||||||
this.type = type;
|
|
||||||
this.name = name;
|
|
||||||
this.size = size;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
import {getTransferedObjectUUID} from './classUtils';
|
|
||||||
|
|
||||||
const name = 'WebGLBuffer';
|
|
||||||
|
|
||||||
function uuid(id) {
|
|
||||||
return getTransferedObjectUUID(name, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class WebGLBuffer {
|
|
||||||
className = name;
|
|
||||||
|
|
||||||
constructor(id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uuid = uuid;
|
|
||||||
|
|
||||||
uuid() {
|
|
||||||
return uuid(this.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
import {getTransferedObjectUUID} from './classUtils';
|
|
||||||
|
|
||||||
const name = 'WebGLFrameBuffer';
|
|
||||||
|
|
||||||
function uuid(id) {
|
|
||||||
return getTransferedObjectUUID(name, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class WebGLFramebuffer {
|
|
||||||
className = name;
|
|
||||||
|
|
||||||
constructor(id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uuid = uuid;
|
|
||||||
|
|
||||||
uuid() {
|
|
||||||
return uuid(this.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,298 +0,0 @@
|
|||||||
export default {
|
|
||||||
"DEPTH_BUFFER_BIT": 256,
|
|
||||||
"STENCIL_BUFFER_BIT": 1024,
|
|
||||||
"COLOR_BUFFER_BIT": 16384,
|
|
||||||
"POINTS": 0,
|
|
||||||
"LINES": 1,
|
|
||||||
"LINE_LOOP": 2,
|
|
||||||
"LINE_STRIP": 3,
|
|
||||||
"TRIANGLES": 4,
|
|
||||||
"TRIANGLE_STRIP": 5,
|
|
||||||
"TRIANGLE_FAN": 6,
|
|
||||||
"ZERO": 0,
|
|
||||||
"ONE": 1,
|
|
||||||
"SRC_COLOR": 768,
|
|
||||||
"ONE_MINUS_SRC_COLOR": 769,
|
|
||||||
"SRC_ALPHA": 770,
|
|
||||||
"ONE_MINUS_SRC_ALPHA": 771,
|
|
||||||
"DST_ALPHA": 772,
|
|
||||||
"ONE_MINUS_DST_ALPHA": 773,
|
|
||||||
"DST_COLOR": 774,
|
|
||||||
"ONE_MINUS_DST_COLOR": 775,
|
|
||||||
"SRC_ALPHA_SATURATE": 776,
|
|
||||||
"FUNC_ADD": 32774,
|
|
||||||
"BLEND_EQUATION": 32777,
|
|
||||||
"BLEND_EQUATION_RGB": 32777,
|
|
||||||
"BLEND_EQUATION_ALPHA": 34877,
|
|
||||||
"FUNC_SUBTRACT": 32778,
|
|
||||||
"FUNC_REVERSE_SUBTRACT": 32779,
|
|
||||||
"BLEND_DST_RGB": 32968,
|
|
||||||
"BLEND_SRC_RGB": 32969,
|
|
||||||
"BLEND_DST_ALPHA": 32970,
|
|
||||||
"BLEND_SRC_ALPHA": 32971,
|
|
||||||
"CONSTANT_COLOR": 32769,
|
|
||||||
"ONE_MINUS_CONSTANT_COLOR": 32770,
|
|
||||||
"CONSTANT_ALPHA": 32771,
|
|
||||||
"ONE_MINUS_CONSTANT_ALPHA": 32772,
|
|
||||||
"BLEND_COLOR": 32773,
|
|
||||||
"ARRAY_BUFFER": 34962,
|
|
||||||
"ELEMENT_ARRAY_BUFFER": 34963,
|
|
||||||
"ARRAY_BUFFER_BINDING": 34964,
|
|
||||||
"ELEMENT_ARRAY_BUFFER_BINDING": 34965,
|
|
||||||
"STREAM_DRAW": 35040,
|
|
||||||
"STATIC_DRAW": 35044,
|
|
||||||
"DYNAMIC_DRAW": 35048,
|
|
||||||
"BUFFER_SIZE": 34660,
|
|
||||||
"BUFFER_USAGE": 34661,
|
|
||||||
"CURRENT_VERTEX_ATTRIB": 34342,
|
|
||||||
"FRONT": 1028,
|
|
||||||
"BACK": 1029,
|
|
||||||
"FRONT_AND_BACK": 1032,
|
|
||||||
"TEXTURE_2D": 3553,
|
|
||||||
"CULL_FACE": 2884,
|
|
||||||
"BLEND": 3042,
|
|
||||||
"DITHER": 3024,
|
|
||||||
"STENCIL_TEST": 2960,
|
|
||||||
"DEPTH_TEST": 2929,
|
|
||||||
"SCISSOR_TEST": 3089,
|
|
||||||
"POLYGON_OFFSET_FILL": 32823,
|
|
||||||
"SAMPLE_ALPHA_TO_COVERAGE": 32926,
|
|
||||||
"SAMPLE_COVERAGE": 32928,
|
|
||||||
"NO_ERROR": 0,
|
|
||||||
"INVALID_ENUM": 1280,
|
|
||||||
"INVALID_VALUE": 1281,
|
|
||||||
"INVALID_OPERATION": 1282,
|
|
||||||
"OUT_OF_MEMORY": 1285,
|
|
||||||
"CW": 2304,
|
|
||||||
"CCW": 2305,
|
|
||||||
"LINE_WIDTH": 2849,
|
|
||||||
"ALIASED_POINT_SIZE_RANGE": 33901,
|
|
||||||
"ALIASED_LINE_WIDTH_RANGE": 33902,
|
|
||||||
"CULL_FACE_MODE": 2885,
|
|
||||||
"FRONT_FACE": 2886,
|
|
||||||
"DEPTH_RANGE": 2928,
|
|
||||||
"DEPTH_WRITEMASK": 2930,
|
|
||||||
"DEPTH_CLEAR_VALUE": 2931,
|
|
||||||
"DEPTH_FUNC": 2932,
|
|
||||||
"STENCIL_CLEAR_VALUE": 2961,
|
|
||||||
"STENCIL_FUNC": 2962,
|
|
||||||
"STENCIL_FAIL": 2964,
|
|
||||||
"STENCIL_PASS_DEPTH_FAIL": 2965,
|
|
||||||
"STENCIL_PASS_DEPTH_PASS": 2966,
|
|
||||||
"STENCIL_REF": 2967,
|
|
||||||
"STENCIL_VALUE_MASK": 2963,
|
|
||||||
"STENCIL_WRITEMASK": 2968,
|
|
||||||
"STENCIL_BACK_FUNC": 34816,
|
|
||||||
"STENCIL_BACK_FAIL": 34817,
|
|
||||||
"STENCIL_BACK_PASS_DEPTH_FAIL": 34818,
|
|
||||||
"STENCIL_BACK_PASS_DEPTH_PASS": 34819,
|
|
||||||
"STENCIL_BACK_REF": 36003,
|
|
||||||
"STENCIL_BACK_VALUE_MASK": 36004,
|
|
||||||
"STENCIL_BACK_WRITEMASK": 36005,
|
|
||||||
"VIEWPORT": 2978,
|
|
||||||
"SCISSOR_BOX": 3088,
|
|
||||||
"COLOR_CLEAR_VALUE": 3106,
|
|
||||||
"COLOR_WRITEMASK": 3107,
|
|
||||||
"UNPACK_ALIGNMENT": 3317,
|
|
||||||
"PACK_ALIGNMENT": 3333,
|
|
||||||
"MAX_TEXTURE_SIZE": 3379,
|
|
||||||
"MAX_VIEWPORT_DIMS": 3386,
|
|
||||||
"SUBPIXEL_BITS": 3408,
|
|
||||||
"RED_BITS": 3410,
|
|
||||||
"GREEN_BITS": 3411,
|
|
||||||
"BLUE_BITS": 3412,
|
|
||||||
"ALPHA_BITS": 3413,
|
|
||||||
"DEPTH_BITS": 3414,
|
|
||||||
"STENCIL_BITS": 3415,
|
|
||||||
"POLYGON_OFFSET_UNITS": 10752,
|
|
||||||
"POLYGON_OFFSET_FACTOR": 32824,
|
|
||||||
"TEXTURE_BINDING_2D": 32873,
|
|
||||||
"SAMPLE_BUFFERS": 32936,
|
|
||||||
"SAMPLES": 32937,
|
|
||||||
"SAMPLE_COVERAGE_VALUE": 32938,
|
|
||||||
"SAMPLE_COVERAGE_INVERT": 32939,
|
|
||||||
"COMPRESSED_TEXTURE_FORMATS": 34467,
|
|
||||||
"DONT_CARE": 4352,
|
|
||||||
"FASTEST": 4353,
|
|
||||||
"NICEST": 4354,
|
|
||||||
"GENERATE_MIPMAP_HINT": 33170,
|
|
||||||
"BYTE": 5120,
|
|
||||||
"UNSIGNED_BYTE": 5121,
|
|
||||||
"SHORT": 5122,
|
|
||||||
"UNSIGNED_SHORT": 5123,
|
|
||||||
"INT": 5124,
|
|
||||||
"UNSIGNED_INT": 5125,
|
|
||||||
"FLOAT": 5126,
|
|
||||||
"DEPTH_COMPONENT": 6402,
|
|
||||||
"ALPHA": 6406,
|
|
||||||
"RGB": 6407,
|
|
||||||
"RGBA": 6408,
|
|
||||||
"LUMINANCE": 6409,
|
|
||||||
"LUMINANCE_ALPHA": 6410,
|
|
||||||
"UNSIGNED_SHORT_4_4_4_4": 32819,
|
|
||||||
"UNSIGNED_SHORT_5_5_5_1": 32820,
|
|
||||||
"UNSIGNED_SHORT_5_6_5": 33635,
|
|
||||||
"FRAGMENT_SHADER": 35632,
|
|
||||||
"VERTEX_SHADER": 35633,
|
|
||||||
"MAX_VERTEX_ATTRIBS": 34921,
|
|
||||||
"MAX_VERTEX_UNIFORM_VECTORS": 36347,
|
|
||||||
"MAX_VARYING_VECTORS": 36348,
|
|
||||||
"MAX_COMBINED_TEXTURE_IMAGE_UNITS": 35661,
|
|
||||||
"MAX_VERTEX_TEXTURE_IMAGE_UNITS": 35660,
|
|
||||||
"MAX_TEXTURE_IMAGE_UNITS": 34930,
|
|
||||||
"MAX_FRAGMENT_UNIFORM_VECTORS": 36349,
|
|
||||||
"SHADER_TYPE": 35663,
|
|
||||||
"DELETE_STATUS": 35712,
|
|
||||||
"LINK_STATUS": 35714,
|
|
||||||
"VALIDATE_STATUS": 35715,
|
|
||||||
"ATTACHED_SHADERS": 35717,
|
|
||||||
"ACTIVE_UNIFORMS": 35718,
|
|
||||||
"ACTIVE_ATTRIBUTES": 35721,
|
|
||||||
"SHADING_LANGUAGE_VERSION": 35724,
|
|
||||||
"CURRENT_PROGRAM": 35725,
|
|
||||||
"NEVER": 512,
|
|
||||||
"LESS": 513,
|
|
||||||
"EQUAL": 514,
|
|
||||||
"LEQUAL": 515,
|
|
||||||
"GREATER": 516,
|
|
||||||
"NOTEQUAL": 517,
|
|
||||||
"GEQUAL": 518,
|
|
||||||
"ALWAYS": 519,
|
|
||||||
"KEEP": 7680,
|
|
||||||
"REPLACE": 7681,
|
|
||||||
"INCR": 7682,
|
|
||||||
"DECR": 7683,
|
|
||||||
"INVERT": 5386,
|
|
||||||
"INCR_WRAP": 34055,
|
|
||||||
"DECR_WRAP": 34056,
|
|
||||||
"VENDOR": 7936,
|
|
||||||
"RENDERER": 7937,
|
|
||||||
"VERSION": 7938,
|
|
||||||
"NEAREST": 9728,
|
|
||||||
"LINEAR": 9729,
|
|
||||||
"NEAREST_MIPMAP_NEAREST": 9984,
|
|
||||||
"LINEAR_MIPMAP_NEAREST": 9985,
|
|
||||||
"NEAREST_MIPMAP_LINEAR": 9986,
|
|
||||||
"LINEAR_MIPMAP_LINEAR": 9987,
|
|
||||||
"TEXTURE_MAG_FILTER": 10240,
|
|
||||||
"TEXTURE_MIN_FILTER": 10241,
|
|
||||||
"TEXTURE_WRAP_S": 10242,
|
|
||||||
"TEXTURE_WRAP_T": 10243,
|
|
||||||
"TEXTURE": 5890,
|
|
||||||
"TEXTURE_CUBE_MAP": 34067,
|
|
||||||
"TEXTURE_BINDING_CUBE_MAP": 34068,
|
|
||||||
"TEXTURE_CUBE_MAP_POSITIVE_X": 34069,
|
|
||||||
"TEXTURE_CUBE_MAP_NEGATIVE_X": 34070,
|
|
||||||
"TEXTURE_CUBE_MAP_POSITIVE_Y": 34071,
|
|
||||||
"TEXTURE_CUBE_MAP_NEGATIVE_Y": 34072,
|
|
||||||
"TEXTURE_CUBE_MAP_POSITIVE_Z": 34073,
|
|
||||||
"TEXTURE_CUBE_MAP_NEGATIVE_Z": 34074,
|
|
||||||
"MAX_CUBE_MAP_TEXTURE_SIZE": 34076,
|
|
||||||
"TEXTURE0": 33984,
|
|
||||||
"TEXTURE1": 33985,
|
|
||||||
"TEXTURE2": 33986,
|
|
||||||
"TEXTURE3": 33987,
|
|
||||||
"TEXTURE4": 33988,
|
|
||||||
"TEXTURE5": 33989,
|
|
||||||
"TEXTURE6": 33990,
|
|
||||||
"TEXTURE7": 33991,
|
|
||||||
"TEXTURE8": 33992,
|
|
||||||
"TEXTURE9": 33993,
|
|
||||||
"TEXTURE10": 33994,
|
|
||||||
"TEXTURE11": 33995,
|
|
||||||
"TEXTURE12": 33996,
|
|
||||||
"TEXTURE13": 33997,
|
|
||||||
"TEXTURE14": 33998,
|
|
||||||
"TEXTURE15": 33999,
|
|
||||||
"TEXTURE16": 34000,
|
|
||||||
"TEXTURE17": 34001,
|
|
||||||
"TEXTURE18": 34002,
|
|
||||||
"TEXTURE19": 34003,
|
|
||||||
"TEXTURE20": 34004,
|
|
||||||
"TEXTURE21": 34005,
|
|
||||||
"TEXTURE22": 34006,
|
|
||||||
"TEXTURE23": 34007,
|
|
||||||
"TEXTURE24": 34008,
|
|
||||||
"TEXTURE25": 34009,
|
|
||||||
"TEXTURE26": 34010,
|
|
||||||
"TEXTURE27": 34011,
|
|
||||||
"TEXTURE28": 34012,
|
|
||||||
"TEXTURE29": 34013,
|
|
||||||
"TEXTURE30": 34014,
|
|
||||||
"TEXTURE31": 34015,
|
|
||||||
"ACTIVE_TEXTURE": 34016,
|
|
||||||
"REPEAT": 10497,
|
|
||||||
"CLAMP_TO_EDGE": 33071,
|
|
||||||
"MIRRORED_REPEAT": 33648,
|
|
||||||
"FLOAT_VEC2": 35664,
|
|
||||||
"FLOAT_VEC3": 35665,
|
|
||||||
"FLOAT_VEC4": 35666,
|
|
||||||
"INT_VEC2": 35667,
|
|
||||||
"INT_VEC3": 35668,
|
|
||||||
"INT_VEC4": 35669,
|
|
||||||
"BOOL": 35670,
|
|
||||||
"BOOL_VEC2": 35671,
|
|
||||||
"BOOL_VEC3": 35672,
|
|
||||||
"BOOL_VEC4": 35673,
|
|
||||||
"FLOAT_MAT2": 35674,
|
|
||||||
"FLOAT_MAT3": 35675,
|
|
||||||
"FLOAT_MAT4": 35676,
|
|
||||||
"SAMPLER_2D": 35678,
|
|
||||||
"SAMPLER_CUBE": 35680,
|
|
||||||
"VERTEX_ATTRIB_ARRAY_ENABLED": 34338,
|
|
||||||
"VERTEX_ATTRIB_ARRAY_SIZE": 34339,
|
|
||||||
"VERTEX_ATTRIB_ARRAY_STRIDE": 34340,
|
|
||||||
"VERTEX_ATTRIB_ARRAY_TYPE": 34341,
|
|
||||||
"VERTEX_ATTRIB_ARRAY_NORMALIZED": 34922,
|
|
||||||
"VERTEX_ATTRIB_ARRAY_POINTER": 34373,
|
|
||||||
"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING": 34975,
|
|
||||||
"IMPLEMENTATION_COLOR_READ_TYPE": 35738,
|
|
||||||
"IMPLEMENTATION_COLOR_READ_FORMAT": 35739,
|
|
||||||
"COMPILE_STATUS": 35713,
|
|
||||||
"LOW_FLOAT": 36336,
|
|
||||||
"MEDIUM_FLOAT": 36337,
|
|
||||||
"HIGH_FLOAT": 36338,
|
|
||||||
"LOW_INT": 36339,
|
|
||||||
"MEDIUM_INT": 36340,
|
|
||||||
"HIGH_INT": 36341,
|
|
||||||
"FRAMEBUFFER": 36160,
|
|
||||||
"RENDERBUFFER": 36161,
|
|
||||||
"RGBA4": 32854,
|
|
||||||
"RGB5_A1": 32855,
|
|
||||||
"RGB565": 36194,
|
|
||||||
"DEPTH_COMPONENT16": 33189,
|
|
||||||
"STENCIL_INDEX8": 36168,
|
|
||||||
"DEPTH_STENCIL": 34041,
|
|
||||||
"RENDERBUFFER_WIDTH": 36162,
|
|
||||||
"RENDERBUFFER_HEIGHT": 36163,
|
|
||||||
"RENDERBUFFER_INTERNAL_FORMAT": 36164,
|
|
||||||
"RENDERBUFFER_RED_SIZE": 36176,
|
|
||||||
"RENDERBUFFER_GREEN_SIZE": 36177,
|
|
||||||
"RENDERBUFFER_BLUE_SIZE": 36178,
|
|
||||||
"RENDERBUFFER_ALPHA_SIZE": 36179,
|
|
||||||
"RENDERBUFFER_DEPTH_SIZE": 36180,
|
|
||||||
"RENDERBUFFER_STENCIL_SIZE": 36181,
|
|
||||||
"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE": 36048,
|
|
||||||
"FRAMEBUFFER_ATTACHMENT_OBJECT_NAME": 36049,
|
|
||||||
"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL": 36050,
|
|
||||||
"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE": 36051,
|
|
||||||
"COLOR_ATTACHMENT0": 36064,
|
|
||||||
"DEPTH_ATTACHMENT": 36096,
|
|
||||||
"STENCIL_ATTACHMENT": 36128,
|
|
||||||
"DEPTH_STENCIL_ATTACHMENT": 33306,
|
|
||||||
"NONE": 0,
|
|
||||||
"FRAMEBUFFER_COMPLETE": 36053,
|
|
||||||
"FRAMEBUFFER_INCOMPLETE_ATTACHMENT": 36054,
|
|
||||||
"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT": 36055,
|
|
||||||
"FRAMEBUFFER_INCOMPLETE_DIMENSIONS": 36057,
|
|
||||||
"FRAMEBUFFER_UNSUPPORTED": 36061,
|
|
||||||
"FRAMEBUFFER_BINDING": 36006,
|
|
||||||
"RENDERBUFFER_BINDING": 36007,
|
|
||||||
"MAX_RENDERBUFFER_SIZE": 34024,
|
|
||||||
"INVALID_FRAMEBUFFER_OPERATION": 1286,
|
|
||||||
"UNPACK_FLIP_Y_WEBGL": 37440,
|
|
||||||
"UNPACK_PREMULTIPLY_ALPHA_WEBGL": 37441,
|
|
||||||
"CONTEXT_LOST_WEBGL": 37442,
|
|
||||||
"UNPACK_COLORSPACE_CONVERSION_WEBGL": 37443,
|
|
||||||
"BROWSER_DEFAULT_WEBGL": 37444
|
|
||||||
};
|
|
||||||
@ -1,142 +0,0 @@
|
|||||||
let i = 1;
|
|
||||||
|
|
||||||
const GLmethod = {};
|
|
||||||
|
|
||||||
GLmethod.activeTexture = i++; //1
|
|
||||||
GLmethod.attachShader = i++;
|
|
||||||
GLmethod.bindAttribLocation = i++;
|
|
||||||
GLmethod.bindBuffer = i++;
|
|
||||||
GLmethod.bindFramebuffer = i++;
|
|
||||||
GLmethod.bindRenderbuffer = i++;
|
|
||||||
GLmethod.bindTexture = i++;
|
|
||||||
GLmethod.blendColor = i++;
|
|
||||||
GLmethod.blendEquation = i++;
|
|
||||||
GLmethod.blendEquationSeparate = i++; //10
|
|
||||||
GLmethod.blendFunc = i++;
|
|
||||||
GLmethod.blendFuncSeparate = i++;
|
|
||||||
GLmethod.bufferData = i++;
|
|
||||||
GLmethod.bufferSubData = i++;
|
|
||||||
GLmethod.checkFramebufferStatus = i++;
|
|
||||||
GLmethod.clear = i++;
|
|
||||||
GLmethod.clearColor = i++;
|
|
||||||
GLmethod.clearDepth = i++;
|
|
||||||
GLmethod.clearStencil = i++;
|
|
||||||
GLmethod.colorMask = i++; //20
|
|
||||||
GLmethod.compileShader = i++;
|
|
||||||
GLmethod.compressedTexImage2D = i++;
|
|
||||||
GLmethod.compressedTexSubImage2D = i++;
|
|
||||||
GLmethod.copyTexImage2D = i++;
|
|
||||||
GLmethod.copyTexSubImage2D = i++;
|
|
||||||
GLmethod.createBuffer = i++;
|
|
||||||
GLmethod.createFramebuffer = i++;
|
|
||||||
GLmethod.createProgram = i++;
|
|
||||||
GLmethod.createRenderbuffer = i++;
|
|
||||||
GLmethod.createShader = i++; //30
|
|
||||||
GLmethod.createTexture = i++;
|
|
||||||
GLmethod.cullFace = i++;
|
|
||||||
GLmethod.deleteBuffer = i++;
|
|
||||||
GLmethod.deleteFramebuffer = i++;
|
|
||||||
GLmethod.deleteProgram = i++;
|
|
||||||
GLmethod.deleteRenderbuffer = i++;
|
|
||||||
GLmethod.deleteShader = i++;
|
|
||||||
GLmethod.deleteTexture = i++;
|
|
||||||
GLmethod.depthFunc = i++;
|
|
||||||
GLmethod.depthMask = i++; //40
|
|
||||||
GLmethod.depthRange = i++;
|
|
||||||
GLmethod.detachShader = i++;
|
|
||||||
GLmethod.disable = i++;
|
|
||||||
GLmethod.disableVertexAttribArray = i++;
|
|
||||||
GLmethod.drawArrays = i++;
|
|
||||||
GLmethod.drawArraysInstancedANGLE = i++;
|
|
||||||
GLmethod.drawElements = i++;
|
|
||||||
GLmethod.drawElementsInstancedANGLE = i++;
|
|
||||||
GLmethod.enable = i++;
|
|
||||||
GLmethod.enableVertexAttribArray = i++; //50
|
|
||||||
GLmethod.flush = i++;
|
|
||||||
GLmethod.framebufferRenderbuffer = i++;
|
|
||||||
GLmethod.framebufferTexture2D = i++;
|
|
||||||
GLmethod.frontFace = i++;
|
|
||||||
GLmethod.generateMipmap = i++;
|
|
||||||
GLmethod.getActiveAttrib = i++;
|
|
||||||
GLmethod.getActiveUniform = i++;
|
|
||||||
GLmethod.getAttachedShaders = i++;
|
|
||||||
GLmethod.getAttribLocation = i++;
|
|
||||||
GLmethod.getBufferParameter = i++; //60
|
|
||||||
GLmethod.getContextAttributes = i++;
|
|
||||||
GLmethod.getError = i++;
|
|
||||||
GLmethod.getExtension = i++;
|
|
||||||
GLmethod.getFramebufferAttachmentParameter = i++;
|
|
||||||
GLmethod.getParameter = i++;
|
|
||||||
GLmethod.getProgramInfoLog = i++;
|
|
||||||
GLmethod.getProgramParameter = i++;
|
|
||||||
GLmethod.getRenderbufferParameter = i++;
|
|
||||||
GLmethod.getShaderInfoLog = i++;
|
|
||||||
GLmethod.getShaderParameter = i++; //70
|
|
||||||
GLmethod.getShaderPrecisionFormat = i++;
|
|
||||||
GLmethod.getShaderSource = i++;
|
|
||||||
GLmethod.getSupportedExtensions = i++;
|
|
||||||
GLmethod.getTexParameter = i++;
|
|
||||||
GLmethod.getUniform = i++;
|
|
||||||
GLmethod.getUniformLocation = i++;
|
|
||||||
GLmethod.getVertexAttrib = i++;
|
|
||||||
GLmethod.getVertexAttribOffset = i++;
|
|
||||||
GLmethod.isBuffer = i++;
|
|
||||||
GLmethod.isContextLost = i++; //80
|
|
||||||
GLmethod.isEnabled = i++;
|
|
||||||
GLmethod.isFramebuffer = i++;
|
|
||||||
GLmethod.isProgram = i++;
|
|
||||||
GLmethod.isRenderbuffer = i++;
|
|
||||||
GLmethod.isShader = i++;
|
|
||||||
GLmethod.isTexture = i++;
|
|
||||||
GLmethod.lineWidth = i++;
|
|
||||||
GLmethod.linkProgram = i++;
|
|
||||||
GLmethod.pixelStorei = i++;
|
|
||||||
GLmethod.polygonOffset = i++; //90
|
|
||||||
GLmethod.readPixels = i++;
|
|
||||||
GLmethod.renderbufferStorage = i++;
|
|
||||||
GLmethod.sampleCoverage = i++;
|
|
||||||
GLmethod.scissor = i++;
|
|
||||||
GLmethod.shaderSource = i++;
|
|
||||||
GLmethod.stencilFunc = i++;
|
|
||||||
GLmethod.stencilFuncSeparate = i++;
|
|
||||||
GLmethod.stencilMask = i++;
|
|
||||||
GLmethod.stencilMaskSeparate = i++;
|
|
||||||
GLmethod.stencilOp = i++; //100
|
|
||||||
GLmethod.stencilOpSeparate = i++;
|
|
||||||
GLmethod.texImage2D = i++;
|
|
||||||
GLmethod.texParameterf = i++;
|
|
||||||
GLmethod.texParameteri = i++;
|
|
||||||
GLmethod.texSubImage2D = i++;
|
|
||||||
GLmethod.uniform1f = i++;
|
|
||||||
GLmethod.uniform1fv = i++;
|
|
||||||
GLmethod.uniform1i = i++;
|
|
||||||
GLmethod.uniform1iv = i++;
|
|
||||||
GLmethod.uniform2f = i++; //110
|
|
||||||
GLmethod.uniform2fv = i++;
|
|
||||||
GLmethod.uniform2i = i++;
|
|
||||||
GLmethod.uniform2iv = i++;
|
|
||||||
GLmethod.uniform3f = i++;
|
|
||||||
GLmethod.uniform3fv = i++;
|
|
||||||
GLmethod.uniform3i = i++;
|
|
||||||
GLmethod.uniform3iv = i++;
|
|
||||||
GLmethod.uniform4f = i++;
|
|
||||||
GLmethod.uniform4fv = i++;
|
|
||||||
GLmethod.uniform4i = i++; //120
|
|
||||||
GLmethod.uniform4iv = i++;
|
|
||||||
GLmethod.uniformMatrix2fv = i++;
|
|
||||||
GLmethod.uniformMatrix3fv = i++;
|
|
||||||
GLmethod.uniformMatrix4fv = i++;
|
|
||||||
GLmethod.useProgram = i++;
|
|
||||||
GLmethod.validateProgram = i++;
|
|
||||||
GLmethod.vertexAttrib1f = i++; //new
|
|
||||||
GLmethod.vertexAttrib2f = i++; //new
|
|
||||||
GLmethod.vertexAttrib3f = i++; //new
|
|
||||||
GLmethod.vertexAttrib4f = i++; //new //130
|
|
||||||
GLmethod.vertexAttrib1fv = i++; //new
|
|
||||||
GLmethod.vertexAttrib2fv = i++; //new
|
|
||||||
GLmethod.vertexAttrib3fv = i++; //new
|
|
||||||
GLmethod.vertexAttrib4fv = i++; //new
|
|
||||||
GLmethod.vertexAttribPointer = i++;
|
|
||||||
GLmethod.viewport = i++;
|
|
||||||
|
|
||||||
export default GLmethod;
|
|
||||||
@ -1,23 +0,0 @@
|
|||||||
const GLtype = {};
|
|
||||||
|
|
||||||
[
|
|
||||||
"GLbitfield",
|
|
||||||
"GLboolean",
|
|
||||||
"GLbyte",
|
|
||||||
"GLclampf",
|
|
||||||
"GLenum",
|
|
||||||
"GLfloat",
|
|
||||||
"GLint",
|
|
||||||
"GLintptr",
|
|
||||||
"GLsizei",
|
|
||||||
"GLsizeiptr",
|
|
||||||
"GLshort",
|
|
||||||
"GLubyte",
|
|
||||||
"GLuint",
|
|
||||||
"GLushort"
|
|
||||||
].sort().map((typeName, i) => GLtype[typeName] = 1 >> (i + 1));
|
|
||||||
|
|
||||||
export default GLtype;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
import {getTransferedObjectUUID} from './classUtils';
|
|
||||||
|
|
||||||
const name = 'WebGLProgram';
|
|
||||||
|
|
||||||
function uuid(id) {
|
|
||||||
return getTransferedObjectUUID(name, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class WebGLProgram {
|
|
||||||
className = name;
|
|
||||||
|
|
||||||
constructor(id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uuid = uuid;
|
|
||||||
|
|
||||||
uuid() {
|
|
||||||
return uuid(this.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,21 +0,0 @@
|
|||||||
import {getTransferedObjectUUID} from './classUtils';
|
|
||||||
|
|
||||||
const name = 'WebGLRenderBuffer';
|
|
||||||
|
|
||||||
function uuid(id) {
|
|
||||||
return getTransferedObjectUUID(name, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class WebGLRenderbuffer {
|
|
||||||
className = name;
|
|
||||||
|
|
||||||
constructor(id) {
|
|
||||||
this.id = id;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uuid = uuid;
|
|
||||||
|
|
||||||
uuid() {
|
|
||||||
return uuid(this.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,22 +0,0 @@
|
|||||||
import {getTransferedObjectUUID} from './classUtils';
|
|
||||||
|
|
||||||
const name = 'WebGLShader';
|
|
||||||
|
|
||||||
function uuid(id) {
|
|
||||||
return getTransferedObjectUUID(name, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class WebGLShader {
|
|
||||||
className = name;
|
|
||||||
|
|
||||||
constructor(id, type) {
|
|
||||||
this.id = id;
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uuid = uuid;
|
|
||||||
|
|
||||||
uuid() {
|
|
||||||
return uuid(this.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,11 +0,0 @@
|
|||||||
export default class WebGLShaderPrecisionFormat {
|
|
||||||
className = 'WebGLShaderPrecisionFormat';
|
|
||||||
|
|
||||||
constructor({
|
|
||||||
rangeMin, rangeMax, precision
|
|
||||||
}) {
|
|
||||||
this.rangeMin = rangeMin;
|
|
||||||
this.rangeMax = rangeMax;
|
|
||||||
this.precision = precision;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
import {getTransferedObjectUUID} from './classUtils';
|
|
||||||
|
|
||||||
const name = 'WebGLTexture';
|
|
||||||
|
|
||||||
function uuid(id) {
|
|
||||||
return getTransferedObjectUUID(name, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class WebGLTexture {
|
|
||||||
className = name;
|
|
||||||
|
|
||||||
constructor(id, type) {
|
|
||||||
this.id = id;
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uuid = uuid;
|
|
||||||
|
|
||||||
uuid() {
|
|
||||||
return uuid(this.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,22 +0,0 @@
|
|||||||
import {getTransferedObjectUUID} from './classUtils';
|
|
||||||
|
|
||||||
const name = 'WebGLUniformLocation';
|
|
||||||
|
|
||||||
function uuid(id) {
|
|
||||||
return getTransferedObjectUUID(name, id);
|
|
||||||
}
|
|
||||||
|
|
||||||
export default class WebGLUniformLocation {
|
|
||||||
className = name;
|
|
||||||
|
|
||||||
constructor(id, type) {
|
|
||||||
this.id = id;
|
|
||||||
this.type = type;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uuid = uuid;
|
|
||||||
|
|
||||||
uuid() {
|
|
||||||
return uuid(this.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -1,3 +0,0 @@
|
|||||||
export function getTransferedObjectUUID(name, id) {
|
|
||||||
return `${name.toLowerCase()}-${id}`;
|
|
||||||
}
|
|
||||||
@ -1,74 +0,0 @@
|
|||||||
import GContext2D from '../context-2d/RenderingContext';
|
|
||||||
import GContextWebGL from '../context-webgl/RenderingContext';
|
|
||||||
|
|
||||||
export default class GCanvas {
|
|
||||||
|
|
||||||
// static GBridge = null;
|
|
||||||
|
|
||||||
id = null;
|
|
||||||
|
|
||||||
_needRender = true;
|
|
||||||
|
|
||||||
constructor(id, { disableAutoSwap }) {
|
|
||||||
this.id = id;
|
|
||||||
|
|
||||||
this._disableAutoSwap = disableAutoSwap;
|
|
||||||
if (disableAutoSwap) {
|
|
||||||
this._swapBuffers = () => {
|
|
||||||
GCanvas.GBridge.render(this.id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
getContext(type) {
|
|
||||||
|
|
||||||
let context = null;
|
|
||||||
|
|
||||||
if (type.match(/webgl/i)) {
|
|
||||||
context = new GContextWebGL(this);
|
|
||||||
|
|
||||||
context.componentId = this.id;
|
|
||||||
|
|
||||||
if (!this._disableAutoSwap) {
|
|
||||||
const render = () => {
|
|
||||||
if (this._needRender) {
|
|
||||||
GCanvas.GBridge.render(this.id);
|
|
||||||
this._needRender = false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
setInterval(render, 16);
|
|
||||||
}
|
|
||||||
|
|
||||||
GCanvas.GBridge.callSetContextType(this.id, 1); // 0 for 2d; 1 for webgl
|
|
||||||
} else if (type.match(/2d/i)) {
|
|
||||||
context = new GContext2D(this);
|
|
||||||
|
|
||||||
context.componentId = this.id;
|
|
||||||
|
|
||||||
// const render = ( callback ) => {
|
|
||||||
//
|
|
||||||
// const commands = context._drawCommands;
|
|
||||||
// context._drawCommands = '';
|
|
||||||
//
|
|
||||||
// GCanvas.GBridge.render2d(this.id, commands, callback);
|
|
||||||
// this._needRender = false;
|
|
||||||
// }
|
|
||||||
// //draw方法触发
|
|
||||||
// context._flush = render;
|
|
||||||
// //setInterval(render, 16);
|
|
||||||
|
|
||||||
GCanvas.GBridge.callSetContextType(this.id, 0);
|
|
||||||
} else {
|
|
||||||
throw new Error('not supported context ' + type);
|
|
||||||
}
|
|
||||||
|
|
||||||
return context;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
reset() {
|
|
||||||
GCanvas.GBridge.callReset(this.id);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@ -1,96 +0,0 @@
|
|||||||
let incId = 1;
|
|
||||||
|
|
||||||
const noop = function () { };
|
|
||||||
|
|
||||||
class GImage {
|
|
||||||
|
|
||||||
static GBridge = null;
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
this._id = incId++;
|
|
||||||
this._width = 0;
|
|
||||||
this._height = 0;
|
|
||||||
this._src = undefined;
|
|
||||||
this._onload = noop;
|
|
||||||
this._onerror = noop;
|
|
||||||
this.complete = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
get width() {
|
|
||||||
return this._width;
|
|
||||||
}
|
|
||||||
set width(v) {
|
|
||||||
this._width = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
get height() {
|
|
||||||
return this._height;
|
|
||||||
}
|
|
||||||
|
|
||||||
set height(v) {
|
|
||||||
this._height = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
get src() {
|
|
||||||
return this._src;
|
|
||||||
}
|
|
||||||
|
|
||||||
set src(v) {
|
|
||||||
|
|
||||||
if (v.startsWith('//')) {
|
|
||||||
v = 'http:' + v;
|
|
||||||
}
|
|
||||||
|
|
||||||
this._src = v;
|
|
||||||
|
|
||||||
GImage.GBridge.perloadImage([this._src, this._id], (data) => {
|
|
||||||
if (typeof data === 'string') {
|
|
||||||
data = JSON.parse(data);
|
|
||||||
}
|
|
||||||
if (data.error) {
|
|
||||||
var evt = { type: 'error', target: this };
|
|
||||||
this.onerror(evt);
|
|
||||||
} else {
|
|
||||||
this.complete = true;
|
|
||||||
this.width = typeof data.width === 'number' ? data.width : 0;
|
|
||||||
this.height = typeof data.height === 'number' ? data.height : 0;
|
|
||||||
var evt = { type: 'load', target: this };
|
|
||||||
this.onload(evt);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
addEventListener(name, listener) {
|
|
||||||
if (name === 'load') {
|
|
||||||
this.onload = listener;
|
|
||||||
} else if (name === 'error') {
|
|
||||||
this.onerror = listener;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
removeEventListener(name, listener) {
|
|
||||||
if (name === 'load') {
|
|
||||||
this.onload = noop;
|
|
||||||
} else if (name === 'error') {
|
|
||||||
this.onerror = noop;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
get onload() {
|
|
||||||
return this._onload;
|
|
||||||
}
|
|
||||||
|
|
||||||
set onload(v) {
|
|
||||||
this._onload = v;
|
|
||||||
}
|
|
||||||
|
|
||||||
get onerror() {
|
|
||||||
return this._onerror;
|
|
||||||
}
|
|
||||||
|
|
||||||
set onerror(v) {
|
|
||||||
this._onerror = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export default GImage;
|
|
||||||
@ -1,24 +0,0 @@
|
|||||||
|
|
||||||
export function ArrayBufferToBase64 (buffer) {
|
|
||||||
var binary = '';
|
|
||||||
var bytes = new Uint8ClampedArray(buffer);
|
|
||||||
for (var len = bytes.byteLength, i = 0; i < len; i++) {
|
|
||||||
binary += String.fromCharCode(bytes[i]);
|
|
||||||
}
|
|
||||||
return btoa(binary);
|
|
||||||
}
|
|
||||||
|
|
||||||
export function Base64ToUint8ClampedArray(base64String) {
|
|
||||||
const padding = '='.repeat((4 - base64String.length % 4) % 4);
|
|
||||||
const base64 = (base64String + padding)
|
|
||||||
.replace(/\-/g, '+')
|
|
||||||
.replace(/_/g, '/');
|
|
||||||
|
|
||||||
const rawData = atob(base64);
|
|
||||||
const outputArray = new Uint8ClampedArray(rawData.length);
|
|
||||||
|
|
||||||
for (let i = 0; i < rawData.length; ++i) {
|
|
||||||
outputArray[i] = rawData.charCodeAt(i);
|
|
||||||
}
|
|
||||||
return outputArray;
|
|
||||||
}
|
|
||||||
@ -1,39 +0,0 @@
|
|||||||
import GCanvas from './env/canvas';
|
|
||||||
import GImage from './env/image';
|
|
||||||
|
|
||||||
import GWebGLRenderingContext from './context-webgl/RenderingContext';
|
|
||||||
import GContext2D from './context-2d/RenderingContext';
|
|
||||||
|
|
||||||
import GBridgeWeex from './bridge/bridge-weex';
|
|
||||||
|
|
||||||
export let Image = GImage;
|
|
||||||
|
|
||||||
export let WeexBridge = GBridgeWeex;
|
|
||||||
|
|
||||||
export function enable(el, { bridge, debug, disableAutoSwap, disableComboCommands } = {}) {
|
|
||||||
|
|
||||||
const GBridge = GImage.GBridge = GCanvas.GBridge = GWebGLRenderingContext.GBridge = GContext2D.GBridge = bridge;
|
|
||||||
|
|
||||||
GBridge.callEnable(el.ref, [
|
|
||||||
0, // renderMode: 0--RENDERMODE_WHEN_DIRTY, 1--RENDERMODE_CONTINUOUSLY
|
|
||||||
-1, // hybridLayerType: 0--LAYER_TYPE_NONE 1--LAYER_TYPE_SOFTWARE 2--LAYER_TYPE_HARDWARE
|
|
||||||
false, // supportScroll
|
|
||||||
false, // newCanvasMode
|
|
||||||
1, // compatible
|
|
||||||
'white',// clearColor
|
|
||||||
false // sameLevel: newCanvasMode = true && true => GCanvasView and Webview is same level
|
|
||||||
]);
|
|
||||||
|
|
||||||
if (debug === true) {
|
|
||||||
GBridge.callEnableDebug();
|
|
||||||
}
|
|
||||||
if (disableComboCommands) {
|
|
||||||
GBridge.callEnableDisableCombo();
|
|
||||||
}
|
|
||||||
|
|
||||||
var canvas = new GCanvas(el.ref, { disableAutoSwap });
|
|
||||||
canvas.width = el.style.width;
|
|
||||||
canvas.height = el.style.height;
|
|
||||||
|
|
||||||
return canvas;
|
|
||||||
};
|
|
||||||
File diff suppressed because one or more lines are too long
@ -1,79 +0,0 @@
|
|||||||
{
|
|
||||||
"id": "Sansnn-uQRCode",
|
|
||||||
"displayName": "uQRCode 全端二维码生成插件 支持nvue 支持nodejs服务端",
|
|
||||||
"version": "4.0.6",
|
|
||||||
"description": "uQRCode是一款基于Javascript环境开发的二维码生成插件,适用所有Javascript运行环境的前端应用和Node.js。",
|
|
||||||
"keywords": [
|
|
||||||
"二维码",
|
|
||||||
"uQRCode",
|
|
||||||
"qrcode",
|
|
||||||
"qr"
|
|
||||||
],
|
|
||||||
"repository": "https://github.com/Sansnn/uQRCode",
|
|
||||||
"engines": {
|
|
||||||
},
|
|
||||||
"dcloudext": {
|
|
||||||
"sale": {
|
|
||||||
"regular": {
|
|
||||||
"price": "0.00"
|
|
||||||
},
|
|
||||||
"sourcecode": {
|
|
||||||
"price": "0.00"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"contact": {
|
|
||||||
"qq": ""
|
|
||||||
},
|
|
||||||
"declaration": {
|
|
||||||
"ads": "无",
|
|
||||||
"data": "无",
|
|
||||||
"permissions": "无"
|
|
||||||
},
|
|
||||||
"npmurl": "https://www.npmjs.com/package/uqrcodejs",
|
|
||||||
"type": "sdk-js"
|
|
||||||
},
|
|
||||||
"uni_modules": {
|
|
||||||
"dependencies": [],
|
|
||||||
"encrypt": [],
|
|
||||||
"platforms": {
|
|
||||||
"cloud": {
|
|
||||||
"tcb": "y",
|
|
||||||
"aliyun": "y"
|
|
||||||
},
|
|
||||||
"client": {
|
|
||||||
"App": {
|
|
||||||
"app-vue": "y",
|
|
||||||
"app-nvue": "y"
|
|
||||||
},
|
|
||||||
"H5-mobile": {
|
|
||||||
"Safari": "y",
|
|
||||||
"Android Browser": "y",
|
|
||||||
"微信浏览器(Android)": "y",
|
|
||||||
"QQ浏览器(Android)": "y"
|
|
||||||
},
|
|
||||||
"H5-pc": {
|
|
||||||
"Chrome": "y",
|
|
||||||
"IE": "y",
|
|
||||||
"Edge": "y",
|
|
||||||
"Firefox": "y",
|
|
||||||
"Safari": "y"
|
|
||||||
},
|
|
||||||
"小程序": {
|
|
||||||
"微信": "y",
|
|
||||||
"阿里": "y",
|
|
||||||
"百度": "y",
|
|
||||||
"字节跳动": "y",
|
|
||||||
"QQ": "y"
|
|
||||||
},
|
|
||||||
"快应用": {
|
|
||||||
"华为": "y",
|
|
||||||
"联盟": "y"
|
|
||||||
},
|
|
||||||
"Vue": {
|
|
||||||
"vue2": "y",
|
|
||||||
"vue3": "y"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@ -15,9 +15,7 @@ const urlsConfig = {
|
|||||||
addCorpMemberFromWxapp: "addCorpMemberFromWxapp",
|
addCorpMemberFromWxapp: "addCorpMemberFromWxapp",
|
||||||
updateCorpMemberFromWxapp: "updateCorpMemberFromWxapp",
|
updateCorpMemberFromWxapp: "updateCorpMemberFromWxapp",
|
||||||
submitCertProfile: 'submitCertProfile',
|
submitCertProfile: 'submitCertProfile',
|
||||||
getMemberVerifyStatus: "getMemberVerifyStatus",
|
getMemberVerifyStatus: "getMemberVerifyStatus"
|
||||||
getJoinedTeams: "getJoinedTeams",
|
|
||||||
updateTeamInfo: "updateTeamInfo"
|
|
||||||
},
|
},
|
||||||
|
|
||||||
knowledgeBase: {
|
knowledgeBase: {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user