master
commit
46547456e4
@ -0,0 +1,17 @@
|
||||
<script>
|
||||
export default {
|
||||
onLaunch: function() {
|
||||
console.log('App Launch')
|
||||
},
|
||||
onShow: function() {
|
||||
console.log('App Show')
|
||||
},
|
||||
onHide: function() {
|
||||
console.log('App Hide')
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
/*每个页面公共css */
|
||||
</style>
|
||||
@ -0,0 +1,161 @@
|
||||
<template>
|
||||
<!-- 音频播放器组件 -->
|
||||
<view v-if='url' class='flex justify-between align-center audio' >
|
||||
<view class='flex-1'>
|
||||
<slider @change='changeAudio'
|
||||
blockSize="18" :blockColor="activeColor" :activeColor='activeColor' :min='0' :max='duration.toFixed(0)' :value='currentTime.toFixed(0)' :step='0.8'></slider>
|
||||
</view>
|
||||
<view class='ml-3'>{{getTime(Math.round(currentTime))}}</view>
|
||||
<view class='mr-3' @click='start(audioId)'>
|
||||
<image :src='startPic' class='icon' v-show='!status'></image>
|
||||
<image :src='endPic' class='icon' v-show='status'></image>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
context: null,
|
||||
currentTime: 0,
|
||||
duration: 100,
|
||||
status: false
|
||||
}
|
||||
},
|
||||
props: {
|
||||
url: String,
|
||||
activeColor: {
|
||||
type: String,
|
||||
default: '#156e68'
|
||||
},
|
||||
startPic: String,
|
||||
endPic: String,
|
||||
audioId: [String,Number]
|
||||
},
|
||||
created() {
|
||||
this.context = uni.createInnerAudioContext();
|
||||
this.context.src = this.url;
|
||||
this.onTimeUpdate();
|
||||
this.onCanplay();
|
||||
this.onEnded();
|
||||
uni.$on('stop',(id)=> {
|
||||
if(id && id != this.audioId) {
|
||||
this.context.stop();
|
||||
this.status = false;
|
||||
} else if(!id){
|
||||
this.context.stop();
|
||||
this.status = false;
|
||||
}
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
start(id) { //点击播放
|
||||
let audioId = id;
|
||||
if(this.status) {
|
||||
this.context.pause();
|
||||
this.status = !this.status;
|
||||
}else {
|
||||
uni.$emit('stop',id)
|
||||
this.context.play()
|
||||
this.status = !this.status;
|
||||
}
|
||||
},
|
||||
onCanplay() { //进入可播放状态
|
||||
this.context.onCanplay(() => {
|
||||
this.context.duration;
|
||||
setTimeout(()=>{
|
||||
this.duration = this.context.duration;
|
||||
},1000)
|
||||
})
|
||||
},
|
||||
onTimeUpdate() { //音频播放进度
|
||||
this.context.onTimeUpdate(() => {
|
||||
if (!Number.isFinite( this.context.duration)) {
|
||||
this.duration = this.context.currentTime + 10;
|
||||
this.currentTime = this.context.currentTime;
|
||||
} else {
|
||||
this.duration = this.context.duration;
|
||||
this.currentTime = this.context.currentTime;
|
||||
}
|
||||
})
|
||||
},
|
||||
onEnded() { //播放结束
|
||||
this.context.onEnded(()=> {
|
||||
this.status = false;
|
||||
this.currentTime = 0;
|
||||
})
|
||||
},
|
||||
changeAudio(e) {
|
||||
let paused = this.context.paused;
|
||||
this.context.pause();
|
||||
this.context.seek(e.detail.value)
|
||||
if(!paused) {
|
||||
this.context.play();
|
||||
}
|
||||
},
|
||||
getTime(time) {
|
||||
let m = parseInt(time / 60);
|
||||
let s = time % 60;
|
||||
return this.towNum(m) + ':' + this.towNum(s);
|
||||
},
|
||||
towNum(num) {
|
||||
if(num >= 10) {
|
||||
return num;
|
||||
}else {
|
||||
return '0' + num;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.audio {
|
||||
/* background: #F4F4F4; */
|
||||
padding: 20rpx;
|
||||
padding-bottom:0;
|
||||
padding-right:10rpx;
|
||||
padding-left:30rpx;
|
||||
}
|
||||
|
||||
.icon {
|
||||
width: 77rpx;
|
||||
height: 77rpx;
|
||||
}
|
||||
|
||||
.flex {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.justify-between {
|
||||
justify-content: between;
|
||||
}
|
||||
|
||||
.align-center {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.flex-1 {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.ml-3 {
|
||||
margin-left: 30rpx;
|
||||
margin-right: 30rpx;
|
||||
color:#156e68;
|
||||
}
|
||||
|
||||
.mr-3 {
|
||||
/* margin-right: 30rpx; */
|
||||
}
|
||||
/deep/ uni-slider{
|
||||
margin-left:0rpx;
|
||||
margin-right:0;
|
||||
}
|
||||
/deep/ uni-slider .uni-slider-thumb{
|
||||
box-shadow: 0 0 4px 4px rgba(21, 110, 104,.3)!important;
|
||||
}
|
||||
|
||||
</style>
|
||||
@ -0,0 +1,147 @@
|
||||
const baseJson = [{
|
||||
name: '中共苏州独立支部旧址',
|
||||
url: '/storage/files/168776876364994ebb526d7.mp4',
|
||||
id: 1,
|
||||
file_id: 610,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '铁铃关',
|
||||
url: '/storage/files/168777692964996ea16f83c.mp4',
|
||||
id: 2,
|
||||
file_id: 708,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '上海战役指挥机关旧址',
|
||||
url: '/storage/files/shzy.mp4',
|
||||
id: 3,
|
||||
file_id: 4979,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '苏州革命博物馆',
|
||||
url: '/storage/files/1687765747649942f3586cd.mp4',
|
||||
id: 4,
|
||||
file_id: 4186,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '苏州烈士陵园',
|
||||
url: '/storage/files/1712040831660bab7f516d7.mp4',
|
||||
id: 5,
|
||||
file_id: 4307,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '苏州工业园区展示中心',
|
||||
url: '/storage/files/1687771296649958a0c21d9.mp4',
|
||||
id: 6,
|
||||
file_id: 614,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '江村文化园(费孝通江村纪念馆)',
|
||||
url: '/storage/files/171351758966223415434fb.mp4',
|
||||
id: 7,
|
||||
file_id: 4482,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '杨嘉墀故居',
|
||||
url: '/storage/files/yangjiachi2.mp4',
|
||||
id: 8,
|
||||
file_id: 4960,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '新四军太湖抗日游击支队纪念馆',
|
||||
url: '/storage/files/171135728166013d6163297.mp4',
|
||||
id: 9,
|
||||
file_id: 4201,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '阳澄湖江抗纪念馆',
|
||||
url: '/storage/files/yangchenghujiangkang2.mp4',
|
||||
id: 10,
|
||||
file_id: 4959,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '太仓革命烈士陵园',
|
||||
url: '/storage/files/17138573556627634b0462e.mp4',
|
||||
id: 11,
|
||||
file_id: 4610,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '吴健雄陈列馆',
|
||||
url: '/storage/files/wujianxiong2.mp4',
|
||||
id: 12,
|
||||
file_id: 4958,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '谢恺烈士故居',
|
||||
url: '/storage/files/17135049066622028ada78b.mp4',
|
||||
id: 13,
|
||||
file_id: 4459,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '沙家浜革命历史纪念馆',
|
||||
url: '/storage/files/171135292266012c5a6749c.mp4',
|
||||
id: 14,
|
||||
file_id: 4183,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '常熟党史馆暨李强革命历程展示馆',
|
||||
url: '/storage/files/1712045015660bbbd798110.mp4',
|
||||
id: 15,
|
||||
file_id: 4308,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '王淦昌故居',
|
||||
url: '/storage/files/1687836090649a55baddd2e.mp4',
|
||||
id: 16,
|
||||
file_id: 713,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '“与时俱进的昆山之路”成果展',
|
||||
url: '/storage/files/1687773674649961ea2a251.mp4',
|
||||
id: 17,
|
||||
file_id: 653,
|
||||
type: 'video'
|
||||
}, {
|
||||
name: '苏州五卅运动铺就一条红色道路',
|
||||
url: '/storage/files/18wsljnb.mp3',
|
||||
id: 18,
|
||||
file_id: 4989,
|
||||
type: 'audio',
|
||||
image: '/storage/files/18wsljnb.png',
|
||||
image_id: 4994
|
||||
}, {
|
||||
name: '汪伯乐',
|
||||
url: '/storage/files/19blzx.mp3',
|
||||
id: 19,
|
||||
file_id: 4990,
|
||||
type: 'audio',
|
||||
image: '/storage/files/19blzx.png',
|
||||
image_id: 4995
|
||||
}, {
|
||||
name: '夜袭浒墅关,传递苏州的抗战强音',
|
||||
url: '/storage/files/20yxxsg.mp3',
|
||||
id: 20,
|
||||
file_id: 4991,
|
||||
type: 'audio',
|
||||
image: '/storage/files/20yxxsg.png',
|
||||
image_id: 4996
|
||||
}, {
|
||||
name: '张应春',
|
||||
url: '/storage/files/21zycls.mp3',
|
||||
id: 21,
|
||||
file_id: 4992,
|
||||
type: 'audio',
|
||||
image: '/storage/files/21zycls.png',
|
||||
image_id: 4997
|
||||
}, {
|
||||
name: '双山岛战斗奏响解放苏州的序曲',
|
||||
url: '/storage/files/22ssddj.mp3',
|
||||
id: 22,
|
||||
file_id: 4993,
|
||||
type: 'audio',
|
||||
image: '/storage/files/22ssddj.png',
|
||||
image_id: 4998
|
||||
}]
|
||||
|
||||
export {
|
||||
baseJson
|
||||
}
|
||||
@ -0,0 +1,20 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<script>
|
||||
var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') ||
|
||||
CSS.supports('top: constant(a)'))
|
||||
document.write(
|
||||
'<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' +
|
||||
(coverSupport ? ', viewport-fit=cover' : '') + '" />')
|
||||
</script>
|
||||
<title></title>
|
||||
<!--preload-links-->
|
||||
<!--app-context-->
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"><!--app-html--></div>
|
||||
<script type="module" src="/main.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
@ -0,0 +1,22 @@
|
||||
import App from './App'
|
||||
|
||||
// #ifndef VUE3
|
||||
import Vue from 'vue'
|
||||
import './uni.promisify.adaptor'
|
||||
Vue.config.productionTip = false
|
||||
App.mpType = 'app'
|
||||
const app = new Vue({
|
||||
...App
|
||||
})
|
||||
app.$mount()
|
||||
// #endif
|
||||
|
||||
// #ifdef VUE3
|
||||
import { createSSRApp } from 'vue'
|
||||
export function createApp() {
|
||||
const app = createSSRApp(App)
|
||||
return {
|
||||
app
|
||||
}
|
||||
}
|
||||
// #endif
|
||||
@ -0,0 +1,77 @@
|
||||
{
|
||||
"name" : "xzhssz",
|
||||
"appid" : "__UNI__AF2F10F",
|
||||
"description" : "",
|
||||
"versionName" : "1.0.0",
|
||||
"versionCode" : "100",
|
||||
"transformPx" : false,
|
||||
/* 5+App特有相关 */
|
||||
"app-plus" : {
|
||||
"usingComponents" : true,
|
||||
"nvueStyleCompiler" : "uni-app",
|
||||
"compilerVersion" : 3,
|
||||
"splashscreen" : {
|
||||
"alwaysShowBeforeRender" : true,
|
||||
"waiting" : true,
|
||||
"autoclose" : true,
|
||||
"delay" : 0
|
||||
},
|
||||
/* 模块配置 */
|
||||
"modules" : {},
|
||||
/* 应用发布信息 */
|
||||
"distribute" : {
|
||||
/* android打包配置 */
|
||||
"android" : {
|
||||
"permissions" : [
|
||||
"<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
|
||||
"<uses-permission android:name=\"android.permission.VIBRATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
|
||||
"<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
|
||||
"<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.CAMERA\"/>",
|
||||
"<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
|
||||
"<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
|
||||
"<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
|
||||
"<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
|
||||
"<uses-feature android:name=\"android.hardware.camera\"/>",
|
||||
"<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
|
||||
]
|
||||
},
|
||||
/* ios打包配置 */
|
||||
"ios" : {},
|
||||
/* SDK配置 */
|
||||
"sdkConfigs" : {}
|
||||
}
|
||||
},
|
||||
/* 快应用特有相关 */
|
||||
"quickapp" : {},
|
||||
/* 小程序特有相关 */
|
||||
"mp-weixin" : {
|
||||
"appid" : "",
|
||||
"setting" : {
|
||||
"urlCheck" : false
|
||||
},
|
||||
"usingComponents" : true
|
||||
},
|
||||
"mp-alipay" : {
|
||||
"usingComponents" : true
|
||||
},
|
||||
"mp-baidu" : {
|
||||
"usingComponents" : true
|
||||
},
|
||||
"mp-toutiao" : {
|
||||
"usingComponents" : true
|
||||
},
|
||||
"uniStatistics" : {
|
||||
"enable" : false
|
||||
},
|
||||
"vueVersion" : "2",
|
||||
"h5" : {
|
||||
"router" : {
|
||||
"base" : "xzhssz"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,98 @@
|
||||
<template>
|
||||
<view class="content">
|
||||
<image class="bg" :src="require('@/static/qus-bg.jpg')" mode=""></image>
|
||||
<view class="playvideo">
|
||||
<view class="playvideowrap">
|
||||
|
||||
<view class="title">{{title}}</view>
|
||||
|
||||
<view v-if="type=='video'">
|
||||
<video style="width:100%" ref="videos" id="videos" :autoplay="true"
|
||||
@play="playFullScreen" :src="url?url:''" play-btn-position="center"></video>
|
||||
</view>
|
||||
<view v-if="type=='audio'" style="padding:20rpx;padding-top:0">
|
||||
<image :src="image" mode="heightFix" style="max-width:690rpx;height:500rpx;display:block;margin:20rpx auto;margin-top:0"></image>
|
||||
<free-audio startPic='../../static/detail-play.png'
|
||||
endPic='../../static/detail-stop.png' audioId='audio1' :url="url?url:''"></free-audio>
|
||||
</view>
|
||||
<!-- -->
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
baseJson
|
||||
} from "@/config/index.js"
|
||||
import freeAudio from '@/components/free-audio.vue'
|
||||
export default {
|
||||
components: {
|
||||
freeAudio
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
id: '',
|
||||
type: 'video',
|
||||
url: '',
|
||||
baseUrl: "http://h5.ali251.langye.net",
|
||||
title: '',
|
||||
image:''
|
||||
}
|
||||
},
|
||||
onLoad(options) {
|
||||
console.log("options", options)
|
||||
|
||||
this.id = options.id ? options.id : ''
|
||||
this.type = options.type ? options.type : 'video'
|
||||
if (this.id) {
|
||||
baseJson.map(item => {
|
||||
if (this.id == item.id) {
|
||||
this.url = this.baseUrl + item.url
|
||||
this.type = item.type
|
||||
this.title = item.name
|
||||
if(item.type==='audio'){
|
||||
this.image = this.baseUrl + item.image
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
console.log("baseJson", baseJson, this.id, this.url, this.title)
|
||||
},
|
||||
methods: {
|
||||
playFullScreen() {
|
||||
let videoContext = uni.createVideoContext('videos', this)
|
||||
videoContext.requestFullScreen()
|
||||
},
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.content {
|
||||
width: 100%;
|
||||
height: 100vh;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.bg {
|
||||
height: 100vh;
|
||||
width: 100vw;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.playvideo {
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
top: 40%;
|
||||
/* text-align: center; */
|
||||
transform: translate(0, -50%);
|
||||
}
|
||||
|
||||
.title {
|
||||
padding: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
</style>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 40 KiB |
@ -0,0 +1,13 @@
|
||||
uni.addInterceptor({
|
||||
returnValue (res) {
|
||||
if (!(!!res && (typeof res === "object" || typeof res === "function") && typeof res.then === "function")) {
|
||||
return res;
|
||||
}
|
||||
return new Promise((resolve, reject) => {
|
||||
res.then((res) => {
|
||||
if (!res) return resolve(res)
|
||||
return res[0] ? reject(res[0]) : resolve(res[1])
|
||||
});
|
||||
});
|
||||
},
|
||||
});
|
||||
@ -0,0 +1,2 @@
|
||||
<!DOCTYPE html><html lang=zh-CN><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><title>xzhssz</title><script>var coverSupport = 'CSS' in window && typeof CSS.supports === 'function' && (CSS.supports('top: env(a)') || CSS.supports('top: constant(a)'))
|
||||
document.write('<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0' + (coverSupport ? ', viewport-fit=cover' : '') + '" />')</script><link rel=stylesheet href=/xzhssz/static/index.2da1efab.css></head><body><noscript><strong>Please enable JavaScript to continue.</strong></noscript><div id=app></div><script src=/xzhssz/static/js/chunk-vendors.e755e799.js></script><script src=/xzhssz/static/js/index.4c036a4c.js></script></body></html>
|
||||
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 40 KiB |
Loading…
Reference in new issue