Browse Source

修改页面

lex-xin 4 years ago
parent
commit
33eebe7e72

BIN
src/assets/images/downLoad/bg.png


+ 1 - 1
src/components/MEmpty.vue

@@ -28,7 +28,7 @@ export default {
     background-size: contain;
     background-size: contain;
 }
 }
 .msg {
 .msg {
-    color: @sFontColor;
+    color: @--font-main-color;
     font-size: .16rem;
     font-size: .16rem;
     text-align: center;
     text-align: center;
     line-height: .22rem;
     line-height: .22rem;

+ 2 - 2
src/main.js

@@ -7,7 +7,7 @@ import "@babel/polyfill"
 import Es6Promise from 'es6-promise'
 import Es6Promise from 'es6-promise'
 Es6Promise.polyfill()
 Es6Promise.polyfill()
 import './utils/filters'
 import './utils/filters'
-import { Button, Icon, Tag, Popup, Picker, Form,
+import { Button, Icon, Tag, Popup, Picker, Form, Empty,
     Search, PullRefresh, Toast, List, Collapse, CollapseItem,
     Search, PullRefresh, Toast, List, Collapse, CollapseItem,
     Tab, Tabs, Row, Col, Cell, CellGroup, NavBar,
     Tab, Tabs, Row, Col, Cell, CellGroup, NavBar,
     Field, DatetimePicker, Image, Loading, Overlay,
     Field, DatetimePicker, Image, Loading, Overlay,
@@ -15,7 +15,7 @@ import { Button, Icon, Tag, Popup, Picker, Form,
     CountDown, Panel, Dialog, Divider, Rate, Uploader } from 'vant'
     CountDown, Panel, Dialog, Divider, Rate, Uploader } from 'vant'
 Vue.use(Button).use(Icon).use(Tag).use(NavBar)
 Vue.use(Button).use(Icon).use(Tag).use(NavBar)
    .use(Popup).use(Picker).use(Search).use(Collapse).use(CollapseItem)
    .use(Popup).use(Picker).use(Search).use(Collapse).use(CollapseItem)
-   .use(PullRefresh).use(Toast).use(List).use(Form)
+   .use(PullRefresh).use(Toast).use(List).use(Form).use(Empty)
    .use(Tab).use(Tabs).use(Row).use(Col).use(Cell).use(CellGroup)
    .use(Tab).use(Tabs).use(Row).use(Col).use(Cell).use(CellGroup)
    .use(Field).use(DatetimePicker).use(Image).use(Loading).use(Overlay)
    .use(Field).use(DatetimePicker).use(Image).use(Loading).use(Overlay)
    .use(ActionSheet).use(RadioGroup).use(Radio).use(CheckboxGroup).use(Checkbox)
    .use(ActionSheet).use(RadioGroup).use(Radio).use(CheckboxGroup).use(Checkbox)

+ 9 - 0
src/router/appRouter.js

@@ -26,6 +26,15 @@ let appRouter = [{
 		weight: 3 // 页面权重
 		weight: 3 // 页面权重
 	}
 	}
 }, {
 }, {
+	path: "/lookVideo",
+	name: "lookVideo",
+	component: () =>
+		import( /* webpackChunkName: "LookVideo" */ "@/views/app/LookVideo"),
+	meta: {
+		description: "考试回看",
+		weight: 3 // 页面权重
+	}
+}, {
 	path: "/test",
 	path: "/test",
 	name: "test",
 	name: "test",
 	component: () =>
 	component: () =>

+ 52 - 42
src/router/index.js

@@ -7,59 +7,69 @@ import AppRouter from './appRouter'
 
 
 Vue.use(Router)
 Vue.use(Router)
 
 
-let defaultRouter = [
-  {
-    path: '/',
-    redirect: {
-      name: 'signUp'
-    }
-  }, {
-    path: "/levelMusic",
-    name: "levelMusic",
-    component: () =>
-      import( /* webpackChunkName: "LevelMusic" */ "@/views/LevelMusic"),
-    meta: {
-      description: "音乐考级",
-      weight: 1 // 页面权重
-    }
-  }, {
-    path: "/paymentResult",
-    name: "paymentResult",
-    component: () =>
-      import( /* webpackChunkName: "PaymentResult" */ "@/views/PaymentResult"),
-    meta: {
-      description: "支付结果",
-      weight: 2 // 页面权重
-    }
-  }
-]
+let defaultRouter = [{
+	path: '/',
+	redirect: {
+		name: 'signUp'
+	}
+}, {
+	path: "/levelMusic",
+	name: "levelMusic",
+	component: () =>
+		import( /* webpackChunkName: "LevelMusic" */ "@/views/LevelMusic"),
+	meta: {
+		description: "音乐考级",
+		weight: 1 // 页面权重
+	}
+}, {
+	path: "/paymentResult",
+	name: "paymentResult",
+	component: () =>
+		import( /* webpackChunkName: "PaymentResult" */ "@/views/PaymentResult"),
+	meta: {
+		description: "支付结果",
+		weight: 2 // 页面权重
+	}
+}, {
+	path: "/downLoad",
+	name: "downLoad",
+	component: () =>
+		import( /* webpackChunkName: "DownLoad" */ "@/views/DownLoad"),
+	meta: {
+		description: "支付结果",
+		weight: 2 // 页面权重
+	}
+}]
 
 
 defaultRouter = defaultRouter.concat(LevelRouter)
 defaultRouter = defaultRouter.concat(LevelRouter)
-                .concat(ApplyRouter)
-                .concat(AdapayRouter)
-                .concat(AppRouter)
+	.concat(ApplyRouter)
+	.concat(AdapayRouter)
+	.concat(AppRouter)
 
 
 const router = new Router({
 const router = new Router({
-  // mode: 'history',
-  // base: process.env.BASE_URL,
-  routes: defaultRouter,
-  scrollBehavior () {
-    return { x: 0, y: 0 }
-  }
+	// mode: 'history',
+	// base: process.env.BASE_URL,
+	routes: defaultRouter,
+	scrollBehavior() {
+		return {
+			x: 0,
+			y: 0
+		}
+	}
 })
 })
 
 
 router.onError((error) => {
 router.onError((error) => {
-  const pattern = /Loading chunk (\d)+ failed/g;
-  const isChunkLoadFailed = error.message.match(pattern);
-  const targetPath = router.history.pending.fullPath;
-  if (isChunkLoadFailed) {
-    router.replace(targetPath);
-  }
+	const pattern = /Loading chunk (\d)+ failed/g;
+	const isChunkLoadFailed = error.message.match(pattern);
+	const targetPath = router.history.pending.fullPath;
+	if (isChunkLoadFailed) {
+		router.replace(targetPath);
+	}
 })
 })
 
 
 const originalPush = Router.prototype.push
 const originalPush = Router.prototype.push
 Router.prototype.push = function(location) {
 Router.prototype.push = function(location) {
-  return originalPush.call(this, location).catch(err => err)
+	return originalPush.call(this, location).catch(err => err)
 }
 }
 
 
 export default router
 export default router

+ 41 - 40
src/utils/common.js

@@ -1,21 +1,21 @@
 const browser = () => {
 const browser = () => {
-  var u = navigator.userAgent
-  //   app = navigator.appVersion;
-  return {
-    trident: u.indexOf('Trident') > -1, //IE内核
-    presto: u.indexOf('Presto') > -1, //opera内核
-    webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
-    gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
-    mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
-    ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
-    // ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
-    android: u.indexOf('DAYAAPPA') > -1 || u.indexOf('Adr') > -1, //android终端
-    iPhone: u.indexOf('DAYAAPPI') > -1, //是否为iPhone或者QQHD浏览器
-    iPad: u.indexOf('iPad') > -1, //是否iPad
-    webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
-    weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
-    qq: u.match(/\sQQ/i) == " qq" //是否QQ
-  }
+	var u = navigator.userAgent
+	//   app = navigator.appVersion;
+	return {
+		trident: u.indexOf('Trident') > -1, //IE内核
+		presto: u.indexOf('Presto') > -1, //opera内核
+		webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核
+		gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核
+		mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端
+		ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
+		// ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios终端
+		android: u.indexOf('DAYAAPPA') > -1 || u.indexOf('Adr') > -1, //android终端
+		iPhone: u.indexOf('DAYAAPPI') > -1, //是否为iPhone或者QQHD浏览器
+		iPad: u.indexOf('iPad') > -1, //是否iPad
+		webApp: u.indexOf('Safari') == -1, //是否web应该程序,没有头部与底部
+		weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)
+		qq: u.match(/\sQQ/i) == " qq" //是否QQ
+	}
 }
 }
 
 
 /**
 /**
@@ -23,8 +23,8 @@ const browser = () => {
  * @param {周几的索引值} index
  * @param {周几的索引值} index
  */
  */
 const getWeekString = (index) => {
 const getWeekString = (index) => {
-  let weekText = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
-  return weekText[index]
+	let weekText = ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六']
+	return weekText[index]
 }
 }
 
 
 /**
 /**
@@ -33,32 +33,33 @@ const getWeekString = (index) => {
  * @returns 强制保留2位小数的金额
  * @returns 强制保留2位小数的金额
  */
  */
 const changeTwoDecimal = (amt) => {
 const changeTwoDecimal = (amt) => {
-  let f_x = parseFloat(amt);
-  if (isNaN(f_x)) {
-    return "0.00";
-  }
-  f_x = Math.round(f_x * 100) / 100;
-  let s_x = f_x.toString();
-  let pos_decimal = s_x.indexOf('.');
-  if (pos_decimal < 0) {
-    pos_decimal = s_x.length;
-    s_x += '.';
-  }
-  while (s_x.length <= pos_decimal + 2) {
-    s_x += '0';
-  }
-  return s_x;
+	let f_x = parseFloat(amt);
+	if (isNaN(f_x)) {
+		return "0.00";
+	}
+	f_x = Math.round(f_x * 100) / 100;
+	let s_x = f_x.toString();
+	let pos_decimal = s_x.indexOf('.');
+	if (pos_decimal < 0) {
+		pos_decimal = s_x.length;
+		s_x += '.';
+	}
+	while (s_x.length <= pos_decimal + 2) {
+		s_x += '0';
+	}
+	return s_x;
 }
 }
 
 
 // 获取授权的code码
 // 获取授权的code码
 /* eslint-disable */
 /* eslint-disable */
 const getUrlCode = (name) => {
 const getUrlCode = (name) => {
-  return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1].replace(/\+/g, '%20')) || null
+	return decodeURIComponent((new RegExp('[?|&]' + name + '=' + '([^&;]+?)(&|#|;|$)').exec(location.href) || [, ''])[1].replace(
+		/\+/g, '%20')) || null
 }
 }
 
 
 export {
 export {
-  browser,
-  getWeekString,
-  changeTwoDecimal,
-  getUrlCode
-}
+	browser,
+	getWeekString,
+	changeTwoDecimal,
+	getUrlCode
+}

+ 54 - 15
src/utils/filters.js

@@ -1,18 +1,57 @@
-import Vue from 'vue'
+import Vue from "vue"
 
 
 // 乐团状态
 // 乐团状态
-Vue.filter('formatLevel', value => {
-    const seriesItems = {
-        1: '一级',
-        2: '二级',
-        3: '三级',
-        4: '四级',
-        5: '五级',
-        6: '六级',
-        7: '七级',
-        8: '八级',
-        9: '九级',
-        10: '十级',
-      }
-    return seriesItems[value]
+Vue.filter("formatLevel", value => {
+  const seriesItems = {
+    0: "免考",
+    1: "一级",
+    2: "二级",
+    3: "三级",
+    4: "四级",
+    5: "五级",
+    6: "六级",
+    7: "七级",
+    8: "八级",
+    9: "九级",
+    10: "十级",
+  }
+  return seriesItems[value]
+})
+
+// 考试状态
+Vue.filter("examStatus", value => {
+  let templateStatus = {
+    SETTING: "设置中",
+    NOT_START: "未开始报名",
+    APPLYING: "报名中",
+    APPLIED: "报名结束",
+    EXAM_ING: "考试中",
+    EXAM_END: "考试结束",
+    RESULT_CONFIRM: "确认考试结果",
+    CLOSE: "关闭"
+  }
+  return templateStatus[value]
+})
+
+// 考试结果
+Vue.filter("resultType", value => {
+  const resultType = {
+    EXCELLENT: '优秀',
+    WELL: '良好',
+    PASS: '及格',
+    FAIL: '不及格',
+  }
+  return resultType[value]
+})
+
+// 支付状态
+Vue.filter("studentPayStatus", value => {
+  const template = {
+    PAY_WAIT: '等待缴费',
+    AUDIT_WAIT: '等待审核',
+    AUDIT_PASS: '通过',
+    AUDIT_REJECT: '拒绝',
+    REFUNDED: '已退款'
+  }
+  return template[value]
 })
 })

+ 52 - 14
src/views/app/AppDetail.vue

@@ -2,11 +2,15 @@
     <div class="appDetail">
     <div class="appDetail">
         <m-header />
         <m-header />
 		<van-cell-group>
 		<van-cell-group>
-            <van-field v-model="form.name" disabled label="订单编号" />
-            <van-field v-model="form.name" disabled label="考级名称" />
-            <van-field v-model="form.transStatusTxt" :class="[form.transStatus === 'SUCCESS' ? 'pass' : null]" disabled label="缴费状态" />
-            <van-field v-model="form.name" disabled label="考试日期" />
-            <van-field v-model="form.name" disabled label="专业等级" />
+            <!-- <van-field v-model="form.paymentOrderNo" disabled label="订单编号" /> -->
+            <van-field v-model="form.examBaseName" disabled label="考级名称" />
+            <van-cell disabled title="缴费状态">
+                {{ form.status | studentPayStatus }}
+            </van-cell>
+            <van-field v-model="form.examStartTime" disabled label="考试日期" />
+            <van-cell title="专业等级" >
+                {{ form.subjectName }}({{ form.level | formatLevel }})
+            </van-cell>
             <van-field v-model="form.name" disabled label="练习曲" @click="onOpen" is-link />
             <van-field v-model="form.name" disabled label="练习曲" @click="onOpen" is-link />
             <van-field v-model="form.name" disabled label="练习曲" is-link />
             <van-field v-model="form.name" disabled label="练习曲" is-link />
             <van-field v-model="form.name" disabled label="演奏曲" is-link />
             <van-field v-model="form.name" disabled label="演奏曲" is-link />
@@ -24,7 +28,9 @@
                         :max-count="1" />
                         :max-count="1" />
                 </template>
                 </template>
             </van-field>
             </van-field>
-            <van-field v-model="form.name" disabled label="乐理等级" />
+            <van-cell disabled title="乐理等级" >
+                {{ form.lastMusicTheoryLevel | formatLevel }}
+            </van-cell>
             <van-field v-model="form.name" disabled label="乐理证书" >
             <van-field v-model="form.name" disabled label="乐理证书" >
                 <template #input>
                 <template #input>
                     <van-uploader
                     <van-uploader
@@ -41,8 +47,12 @@
         </van-cell-group>
         </van-cell-group>
 
 
         <van-cell-group style="margin-top: 20px">
         <van-cell-group style="margin-top: 20px">
-            <van-field v-model="form.statusTxt" :class="[form.status === 'pass' ? 'pass' : null]" disabled label="报名审核" />
-            <van-field v-model="form.memo" disabled label="备注" />
+            <van-cell disabled title="报名审核" >
+                {{ form.status | studentPayStatus }}
+            </van-cell>
+            <van-cell title="备注" >
+                {{ form.memo }}
+            </van-cell>
         </van-cell-group>
         </van-cell-group>
         <van-button type="primary" round block>重新提交</van-button>
         <van-button type="primary" round block>重新提交</van-button>
 
 
@@ -75,19 +85,29 @@
 <script>
 <script>
 import MHeader from '@/components/MHeader'
 import MHeader from '@/components/MHeader'
 // import { browser } from '@/common/common'
 // import { browser } from '@/common/common'
+import dayjs from 'dayjs'
 import { uploadFile } from '../signup/SignUpApi'
 import { uploadFile } from '../signup/SignUpApi'
 export default {
 export default {
     name: 'appDetail',
     name: 'appDetail',
 	components: { MHeader },
 	components: { MHeader },
     data () {
     data () {
+        const recordDetail = localStorage.getItem('recordDetail') ? JSON.parse(localStorage.getItem('recordDetail')) : null
+        if(!recordDetail) {
+            this.$router.replace('/appRecord')
+        }
         return {
         return {
+            recordDetail: recordDetail,
             form: {
             form: {
-                name: '测试测试测试',
-                transStatus: "SUCCESS",
-                transStatusTxt: "已缴费",
-                status: "pass",
-                statusTxt: "已通过",
-                memo: "这里是备注"
+                paymentOrderNo: null,
+                examBaseName: null,
+                subjectName: null,
+                level: null,
+                status: null,
+                examStartTime: null,
+                lastExamCertificateUrl: null,
+                lastMusicTheoryLevel: null,
+                lastMusicTheoryCertificateUrl: null,
+                memo: null
             },
             },
             uploadCertificate: [],
             uploadCertificate: [],
             uploadCertificate2: [],
             uploadCertificate2: [],
@@ -114,6 +134,21 @@ export default {
         //     localStorage.setItem('Authorization', decodeURI(params.Authorization))
         //     localStorage.setItem('Authorization', decodeURI(params.Authorization))
         // }
         // }
         document.title = "报考详情"
         document.title = "报考详情"
+
+        console.log(this.recordDetail)
+        const detail = this.recordDetail
+        this.form = {
+            paymentOrderNo: detail.paymentOrderNo,
+            examBaseName: detail.examBaseName,
+            subjectName: detail.subjectName,
+            level: detail.level,
+            status: detail.status,
+            examStartTime: detail.examStartTime,
+            lastExamCertificateUrl: detail.lastExamCertificateUrl,
+            lastMusicTheoryLevel: detail.lastMusicTheoryLevel,
+            lastMusicTheoryCertificateUrl: detail.lastMusicTheoryCertificateUrl,
+            memo: detail.memo
+        }
     },
     },
     methods: {
     methods: {
         onOpen() {
         onOpen() {
@@ -185,6 +220,9 @@ export default {
     padding: 14px 16px;
     padding: 14px 16px;
     font-size: 16px;
     font-size: 16px;
     // color: @--font-main-color;
     // color: @--font-main-color;
+    .van-cell__title {
+        margin-right: 12px;
+    }
     .van-cell__value {
     .van-cell__value {
         width: 40%;
         width: 40%;
         text-align: left;
         text-align: left;

+ 210 - 119
src/views/app/AppRecord.vue

@@ -1,124 +1,215 @@
 <template>
 <template>
-    <div class="appRecord">
-        <m-header />
-		<van-tabs sticky title-active-color="@--main-color" color="@--main-color" line-width="50">
-            <van-tab title="已缴费">
-                <van-cell-group class="section" v-for="(item, index) in payList" :key="index">
-                    <van-cell :value="item.examBaseName" title="考级名称" />
-                    <van-cell :value="item.paymentOrderNo" title="订单编号" />
-                    <van-cell title="专业等级">
-                        <template #default>
-                            {{ item.level | formatLevel }}
-                        </template>
-                    </van-cell>
-                    <van-cell :value="item.examStartTime" title="考试日期" />
-                    <van-button type="default" @click="onDetail" block>查看资料</van-button>
-                </van-cell-group>
-            </van-tab>
-            <van-tab title="未缴费">
-                <van-cell-group class="section" v-for="(item, index) in notPayList" :key="index">
-                    <van-cell :value="item.name" title="考级名称" />
-                    <van-cell value-class="payTime" :value="item.payTime" title="缴费截止时间" />
-                    <van-cell :value="item.level | formatLevel" title="专业等级" />
-                    <van-cell :value="item.examTime" title="考试日期" />
-                </van-cell-group>
-                <van-button type="primary" @click="onDetail" round block>查看报名</van-button>
-            </van-tab>
-        </van-tabs>
-    </div>
+	<div class="appRecord">
+		<m-header />
+		<!-- sticky -->
+		<van-tabs sticky title-active-color="#2DC7AA" color="#2DC7AA" line-width="50">
+			<van-tab title="已缴费">
+				<div v-if="dataShow" key="data">
+					<van-list v-model="loading" :finished="finished" finished-text=" " @load="getList">
+						<van-cell-group class="section" v-for="(item, index) in dataList" :key="index">
+							<van-cell :value="item.examBaseName" title="考级名称" />
+							<!-- <van-cell :value="item.paymentOrderNo" title="订单编号" /> -->
+							<van-cell title="专业等级">
+								<template #default>
+									{{ item.subjectName }}({{ item.level | formatLevel }})
+								</template>
+							</van-cell>
+							<van-cell :value="item.examTime" title="考试日期" />
+							<van-button type="default" @click="onDetail(item)" block>查看资料</van-button>
+						</van-cell-group>
+					</van-list>
+				</div>
+				<van-empty v-else key="data" description="暂无已缴费记录"></van-empty>
+			</van-tab>
+			<van-tab title="未缴费">
+				<div v-if="dataShow2" key="data">
+					<van-list v-model="loading2" :finished="finished2" finished-text=" " @load="getList2">
+						<van-cell-group class="section" v-for="(item, index) in dataList2" :key="index">
+							<van-cell :value="item.examBaseName" title="考级名称" />
+							<van-cell value-class="payTime" :value="item.payTime" title="缴费截止时间" />
+							<van-cell title="专业等级" >
+								<template #default>
+									{{ item.subjectName }}({{ item.level | formatLevel }})
+								</template>
+							</van-cell>
+							<van-cell :value="item.examTime" title="考试日期" />
+							<van-button type="default" @click="onDetail(item)" block>查看报名</van-button>
+						</van-cell-group>
+					</van-list>
+				</div>
+				<van-empty v-else key="data" description="暂无未缴费记录"></van-empty>
+			</van-tab>
+		</van-tabs>
+	</div>
 </template>
 </template>
 <script>
 <script>
-import MHeader from '@/components/MHeader'
-// import { browser } from '@/common/common'
-import { applyList, examList } from './appApi'
-import setLoading from '@/utils/loading'
-export default {
-    name: 'appRecord',
-	components: { MHeader },
-    data () {
-        return {
-            payList: [], // 已缴费
-            notPayList: [{
-                name: "大白来了大白来了大白",
-                payTime: "2020-05-20",
-                level: 1,
-                examTime: "2020-05-20~2020-05-30"
-            }], // 未缴费
-        }
-    },
-    mounted() {
-        // 插入token
-        // let params = this.$route.query
-        // if(params.Authorization) {
-        //     localStorage.setItem('Authorization', decodeURI(params.Authorization))
-        // }
-        document.title = "报考记录"
-
-        this.__init()
-    },
-    methods: {
-        async __init() {
-            setLoading(true)
-            try {
-                const res = await examList()
-                setLoading(false)
-                const result = res.data
-                if(result.code == 200) {
-                    this.payList = result.data.rows
-                } else {
-                    this.$toast(result.msg)
-                }
-            } catch(err) {
-                setLoading(false)
-            }
-            
-        },
-        onDetail() {
-            this.$router.push({
-                path: '/appDetail'
-            })
-        }
-    }
-}
+	import MHeader from '@/components/MHeader'
+	// import { browser } from '@/common/common'
+	import dayjs from 'dayjs'
+	import {
+		applyList
+	} from './appApi'
+	export default {
+		name: 'appRecord',
+		components: {
+			MHeader
+		},
+		data() {
+			return {
+				dataShow: true, // 是否有数据
+				loading: false,
+				finished: false,
+				dataList: [],
+				params: {
+					paymentStatus: 1,
+					page: 1,
+					rows: 20
+				},
+				notPayList: [{
+					name: "大白来了大白来了大白",
+					payTime: "2020-05-20",
+					level: 1,
+					examTime: "2020-05-20~2020-05-30"
+				}], // 未缴费
+				dataShow2: true, // 是否有数据
+				loading2: false,
+				finished2: false,
+				dataList2: [],
+				params2: {
+					paymentStatus: 0,
+					page: 1,
+					rows: 20
+				},
+			}
+		},
+		mounted() {
+			// 插入token
+			// let params = this.$route.query
+			// if(params.Authorization) {
+			//     localStorage.setItem('Authorization', decodeURI(params.Authorization))
+			// }
+			document.title = "报考记录"
+		},
+		methods: {
+			async getList() {
+				// this.finished = true
+				let params = this.params;
+				await applyList(params).then(res => {
+					let result = res.data;
+					this.loading = false;
+					if (result.code == 200) {
+						let pageInfo = result.data
+						params.page = pageInfo.pageNo
+						pageInfo.rows.forEach(item => {
+							item.isShow = false
+							item.examTime = dayjs(item.examStartTime).format("YYYY-MM-DD") + '~' + dayjs(item.examEndTime).format("YYYY-MM-DD")
+						})
+						this.dataList = this.dataList.concat(pageInfo.rows)
+						if (params.page >= pageInfo.totalPage) {
+							this.finished = true;
+						}
+						this.params.page++;
+					} else {
+						this.finished = true;
+					}
+					// 判断是否有数据
+					if (this.dataList.length <= 0) {
+						this.dataShow = false;
+					}
+				}).catch(() => {
+					this.finished = true
+					this.dataShow = false
+				})
+			},
+			async getList2() {
+				// this.finished = true
+				let params = this.params2;
+				await applyList(params).then(res => {
+					let result = res.data;
+					this.loading2 = false;
+					if (result.code == 200) {
+						let pageInfo = result.data
+						params.page = pageInfo.pageNo
+						pageInfo.rows.forEach(item => {
+							item.isShow = false
+							item.examTime = dayjs(item.examStartTime).format("YYYY-MM-DD") + '~' + dayjs(item.examEndTime).format("YYYY-MM-DD")
+						})
+						this.dataList2 = this.dataList.concat(pageInfo.rows)
+						if (params.page >= pageInfo.totalPage) {
+							this.finished2 = true;
+						}
+						this.params.page++;
+					} else {
+						this.finished2 = true;
+					}
+					// 判断是否有数据
+					if (this.dataList.length <= 0) {
+						this.dataShow2 = false;
+					}
+				}).catch(() => {
+					this.finished2 = true
+					this.dataShow2 = false
+				})
+			},
+			onDetail(item) {
+				localStorage.setItem("recordDetail", JSON.stringify(item))
+				this.$router.push({
+					path: '/appDetail'
+				})
+			}
+		}
+	}
 </script>
 </script>
 <style lang="less" scoped>
 <style lang="less" scoped>
-@import url("../../assets/commonLess/variable");
-.appRecord {
-    min-height: 100vh;
-}
-/deep/.van-cell {
-    padding: 14px 16px;
-    font-size: 16px;
-    color: @--font-main-color;
-    .van-cell__value {
-        width: 40%;
-        text-align: left;
-        flex: auto;
-        color: @--font-second-color;
-    }
-    .payTime {
-        color: @--red-color;
-    }
-}
-.section {
-    margin-top: 10px;
-}
-.van-button--default {
-    border: 0;
-    color: @--main-color;
-    font-size: 15px;
-    height: .5rem;
-    line-height: .52rem;
-}
-.van-button--primary {
-    margin: .35rem 0 .1rem;
-    background-color: @--main-color;
-    border: 1px solid @--main-color;
-    color: #FFFFFF;
-    font-size: .18rem;
-    height: .5rem;
-    line-height: .52rem;
-    width: 90%;
-    margin-left: 5%;
-}
-</style>
+	@import url("../../assets/commonLess/variable");
+
+	.appRecord {
+		height: 100vh;
+		overflow-y: auto;
+  		overflow-x: hidden;
+	}
+
+	/deep/.van-cell {
+		padding: 14px 16px;
+		font-size: 16px;
+		color: @--font-main-color;
+
+		.van-cell__value {
+			width: 40%;
+			text-align: left;
+			flex: auto;
+			color: @--font-second-color;
+		}
+
+		.payTime {
+			color: @--red-color;
+		}
+	}
+
+	.section {
+		margin-top: 10px;
+	}
+
+	.van-button--default {
+		border: 0;
+		color: @--main-color;
+		font-size: 15px;
+		height: .5rem;
+		line-height: .52rem;
+	}
+
+	.van-button--primary {
+		margin: .35rem 0 .1rem;
+		background-color: @--main-color;
+		border: 1px solid @--main-color;
+		color: #FFFFFF;
+		font-size: .18rem;
+		height: .5rem;
+		line-height: .52rem;
+		width: 90%;
+		margin-left: 5%;
+	}
+	/deep/.van-tabs__content {
+		background-color: @--main-bg-color;
+	}
+</style>

+ 42 - 23
src/views/app/ExamRecord.vue

@@ -3,31 +3,42 @@
 		<m-header />
 		<m-header />
 		<div class="container">
 		<div class="container">
 			<div v-if="dataShow" key="data">
 			<div v-if="dataShow" key="data">
-				<van-list v-model="loading" :finished="finished" finished-text=" " @load="getList">
+				<van-list v-model="loading" :finished="finished" finished-text="没有更多数据了~" @load="getList">
 					<van-cell-group class="section" v-for="(item, index) in dataList" :key="index">
 					<van-cell-group class="section" v-for="(item, index) in dataList" :key="index">
-						<van-cell :value="item.examStartTime" title="考试日期" />
+						<van-cell :value="item.actualExamStartTime" title="考试日期" />
 						<van-cell title="专业等级" >
 						<van-cell title="专业等级" >
 							<template #default>
 							<template #default>
 								{{ item.subjectName }}({{ item.level | formatLevel }})
 								{{ item.subjectName }}({{ item.level | formatLevel }})
 							</template>
 							</template>
 						</van-cell>
 						</van-cell>
 						<!-- <transition name="fade"> -->
 						<!-- <transition name="fade"> -->
-						<div v-if="item.isShow">
+						<div v-if="item.isShow" class="van-hairline--bottom">
 							<van-cell :value="item.cardNo" title="准考证号" />
 							<van-cell :value="item.cardNo" title="准考证号" />
 							<!-- <van-cell :value="item.orderNo" title="专业等级" /> -->
 							<!-- <van-cell :value="item.orderNo" title="专业等级" /> -->
-							<van-cell :value="item.examTime" title="乐理等级" >
-								<template #default>
-									{{ examMusicTheoryLevel |  }}
-								</template>
+							<van-cell :value="item.examMusicTheoryLevel | formatLevel" title="乐理等级" >
+							</van-cell>
+							<van-cell :value="item.level" title="考试地点" >
+								<span v-if="item.examAddress">
+									{{ item.examAddress }}
+								</span>
+								<span v-else>
+									线上网络教室
+								</span>
 							</van-cell>
 							</van-cell>
-							<van-cell :value="item.level | formatLevel" title="考试地点" />
 						</div>
 						</div>
 						<!-- </transition> -->
 						<!-- </transition> -->
-						<van-cell :value="item.name" title="考试状态" />
-						<van-cell :value="item.orderNo" title="考试结果" :border="!item.isShow" />
+						<van-cell title="考试状态" >
+							<template #default>
+								<span class="error" v-if="item.isFinishedExam == 0">未参与</span>
+								<span class="success" v-if="item.isFinishedExam == 1">参与</span>
+							</template>
+						</van-cell>
+						<van-cell title="考试结果" :border="!item.isShow" >
+							<span :class="item.result == 'FAIL' ? 'error' : 'success'">{{ item.result | resultType }}</span>
+						</van-cell>
 						<!-- <transition name="fade"> -->
 						<!-- <transition name="fade"> -->
-						<div v-if="item.isShow">
-							<van-button type="default" class="van-hairline--top-bottom" block>考级回看</van-button>
+						<div v-if="item.isShow && item.videoUrl">
+							<van-button type="default" @click="onVideoLook(item.videoUrl)" class="van-hairline--top-bottom" block>考级回看</van-button>
 						</div>
 						</div>
 						<!-- </transition> -->
 						<!-- </transition> -->
 						<van-button type="default" v-if="item.isShow" @click="onDetail(item)" block>
 						<van-button type="default" v-if="item.isShow" @click="onDetail(item)" block>
@@ -49,9 +60,8 @@
 	import MHeader from "@/components/MHeader";
 	import MHeader from "@/components/MHeader";
     // import { browser } from '@/common/common'
     // import { browser } from '@/common/common'
 	import {
 	import {
-		applyList
+		examList
 	} from "./appApi";
 	} from "./appApi";
-	import setLoading from "@/utils/loading";
 	export default {
 	export default {
 		name: "appRecord",
 		name: "appRecord",
 		components: {
 		components: {
@@ -82,12 +92,11 @@
 			getList() {
 			getList() {
 				// this.finished = true
 				// this.finished = true
 				let params = this.params;
 				let params = this.params;
-				applyList(params).then(res => {
+				examList(params).then(res => {
 					let result = res.data;
 					let result = res.data;
 					this.loading = false;
 					this.loading = false;
 					if (result.code == 200) {
 					if (result.code == 200) {
 						let pageInfo = result.data
 						let pageInfo = result.data
-						console.log(pageInfo)
 						params.page = pageInfo.pageNo
 						params.page = pageInfo.pageNo
 						pageInfo.rows.forEach(item => {
 						pageInfo.rows.forEach(item => {
 							item.isShow = false
 							item.isShow = false
@@ -109,6 +118,14 @@
                     this.dataShow = false
                     this.dataShow = false
 				})
 				})
 			},
 			},
+			onVideoLook(videoUrl) { // 查看视频
+				this.$router.push({
+					path: '/lookVideo',
+					query: {
+						url: encodeURIComponent(videoUrl)
+					}
+				})
+			},
 			onDetail(item) {
 			onDetail(item) {
 				item.isShow = !item.isShow;
 				item.isShow = !item.isShow;
 			}
 			}
@@ -116,12 +133,11 @@
 	};
 	};
 </script>
 </script>
 <style lang="less" scoped>
 <style lang="less" scoped>
+	@import url("../../assets/commonLess/variable");
 	.appRecord {
 	.appRecord {
 		height: 100vh;
 		height: 100vh;
 		overflow-y: auto;
 		overflow-y: auto;
 		overflow-x: hidden;
 		overflow-x: hidden;
-		// background-color: #f3f4f8;
-
 		.container {
 		.container {
 			margin-bottom: 20px;
 			margin-bottom: 20px;
 		}
 		}
@@ -130,17 +146,20 @@
 	/deep/.van-cell {
 	/deep/.van-cell {
 		padding: 14px 16px;
 		padding: 14px 16px;
 		font-size: 16px;
 		font-size: 16px;
-		color: var(--font-main-color);
+		color: @--font-main-color;
 
 
 		.van-cell__value {
 		.van-cell__value {
 			width: 40%;
 			width: 40%;
 			text-align: left;
 			text-align: left;
 			flex: auto;
 			flex: auto;
-			color: var(--font-second-color);
+			color: @--font-second-color;
 		}
 		}
 
 
-		.payTime {
-			color: var(--red-color);
+		.error {
+			color: @--red-color;
+		}
+		.success {
+			color: @--main-color;
 		}
 		}
 	}
 	}
 
 
@@ -150,7 +169,7 @@
 
 
 	.van-button--default {
 	.van-button--default {
 		border: 0;
 		border: 0;
-		color: var(--main-color);
+		color: @--main-color;
 		font-size: 15px;
 		font-size: 15px;
 		height: 0.5rem;
 		height: 0.5rem;
 		line-height: 0.52rem;
 		line-height: 0.52rem;

+ 37 - 0
src/views/app/LookVideo.vue

@@ -0,0 +1,37 @@
+<template>
+	<div class="lookVideo">
+		<m-header />
+		<video class="video" controls="controls" type="video/mp4" preload="auto" :src="videoUrl"></video>
+	</div>
+</template>
+<script>
+	import MHeader from "@/components/MHeader";
+	export default {
+		name: "lookVideo",
+		components: {
+            MHeader
+		},
+		data() {
+            let query = this.$route.query
+			return {
+                videoUrl: decodeURIComponent(query.url)
+			};
+		},
+		mounted() {
+			document.title = "考级回看";
+		}
+	};
+</script>
+<style lang="less" scoped>
+	@import url("../../assets/commonLess/variable");
+	.lookVideo {
+        min-height: 100vh;
+        background-color: #fff;
+        overflow-x: hidden;
+        overflow-y: auto;
+	}
+    .video {
+        width: 100%;
+        height: 2rem;
+    }
+</style>

+ 2 - 2
src/views/app/appApi.js

@@ -13,7 +13,7 @@ export function applyList(data) {
 export function examList(data) {
 export function examList(data) {
     return axios({
     return axios({
         url: '/api-user/examRegistration/examList',
         url: '/api-user/examRegistration/examList',
-        method: 'post',
-        data: data
+        method: 'get',
+        params: data
     })
     })
 }
 }

+ 108 - 123
src/views/downLoad.vue

@@ -1,129 +1,114 @@
 <template>
 <template>
-  <div class="studentDownLoad" :class="[wxStatus ? 'wxContainer' : '']">
-    <div class="container">
-      <div class="logo_bg"></div>
-      <div class="banner"></div>
-      <!-- <a :href="src" ></a> -->
-      <div class="btn" @click="downloadClick">点击下载APP</div>
-    </div>
-    <div class="wxpopup" v-if="wxStatus" @click="wxStatus = false">
-      <img src="../assets/images/wx_bg.png" alt />
-    </div>
-  </div>
+	<div class="studentDownLoad" :class="[wxStatus ? 'wxContainer' : '']">
+		<div class="container">
+			<p class="tips">正在打开酷乐秀~</p>
+			<p class="ps" v-if="isWx">ps:若无法自动跳转,请在本地浏览器中打开。</p>
+		</div>
+		<div class="wxpopup" v-if="wxStatus" @click="wxStatus = false">
+			<img src="../assets/images/wx_bg.png" alt />
+		</div>
+	</div>
 </template>
 </template>
 <script>
 <script>
-import { browser } from "@/common/common";
-export default {
-  data() {
-    return {
-      isAndroid: false,
-      isiOS: false,
-      wxStatus: false,
-      msg: "此浏览器不支持自动转发,请更换浏览器尝试",
-      src: ""
-    };
-  },
-  created() {
-  },
-  mounted() {
-    this.downloadApp();
-    // let u = navigator.userAgent;
-    // this.isAndroid = u.indexOf("Android") > -1 || u.indexOf("Adr") > -1; //android终端
-    // this.isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端
-  },
-  methods: {
-    downloadApp() {
-      let str = "";
-      let params = this.$route.query
-      if(params.url && params.hash) {
-        str = params.url + '/#/' + params.hash
-      }
-      // memo:1?http://mkjtest.dayaedu.com/#/appDetail?id=xxx
-      // http://mkjtest.dayaedu.com/#/downLoad?url=http://mkjtest.dayaedu.com&hash=appDetail&id=xxx&memo=1
-      //http://192.168.1.34:9001&hash=reportDetail&classGroupId=13905
-      if(params.classGroupId){
-         str+='?classGroupId='+params.classGroupId
-      }
-      str = encodeURIComponent(str);
-      // console.log(str)
-      if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
-        window.location.href = `StudentsDaya://linkUrl=${str}`;
-      } else if (/(Android)/i.test(navigator.userAgent)) {
-        window.location.href = `studentdaya://html:8888/SplashActivity?url=${str}`;
-      } else {
-        this.$toast("请用手机或移动设备打开");
-      }
-    },
-    downloadClick() {
-      if (browser().weixin) {
-        this.wxStatus = true;
-        return;
-      }
-
-      if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
-          window.location.href =
-            "https://apps.apple.com/cn/app/%E7%AE%A1%E4%B9%90%E8%BF%B7/id1487054260";
-        // this.src = "https://apps.apple.com/cn/app/管乐迷/id1487054260";
-      } else if (/(Android)/i.test(navigator.userAgent)) {
-         window.location = "https://sj.qq.com/myapp/detail.htm?apkName=com.daya.studaya_android"; //如果超时就跳转到app下载页
-      } else {
-        this.$toast("请用手机或移动设备打开");
-      }
-    }
-  }
-};
+	import {
+		browser
+	} from "@/utils/common";
+	export default {
+		data() {
+			return {
+				isWx: browser().weixin,
+				wxStatus: false,
+				msg: "此浏览器不支持自动转发,请更换浏览器尝试",
+				src: ""
+			};
+		},
+		mounted() {
+			this.downloadApp();
+		},
+		methods: {
+			downloadApp() {
+				let url = null;
+				let params = this.$route.query
+				if (params.url && params.hash) {
+					url = params.url + '/#/' + params.hash
+				}
+				// http://mkjtest.dayaedu.com/#/downLoad?memo=2
+				// http://mkjtest.dayaedu.com/#/downLoad?url=http://mkjtest.dayaedu.com&hash=appDetail&id=xxx&memo=1
+				if (params.id) {
+					url += '?id=' + params.id
+				}
+				if(params.memo == 1) {
+					url += `&memo=1`
+				} else if(params.memo == 2) { // 准考证页
+					url = `memo=2`
+				}
+				url = encodeURIComponent(url);
+				// console.log(url)
+				if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
+					window.location.href = `StudentsDaya://linkUrl=${url}`;
+				} else if (/(Android)/i.test(navigator.userAgent)) {
+					window.location.href = `studentdaya://html:8888/SplashActivity?url=${url}`;
+				} else {
+					this.$toast("请用手机或移动设备打开");
+				}
+			},
+			downloadClick() {
+				if (browser().weixin) {
+					this.wxStatus = true;
+					return;
+				}
+				if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) {
+					window.location.href =
+						"https://apps.apple.com/cn/app/%E7%AE%A1%E4%B9%90%E8%BF%B7/id1487054260";
+					// this.src = "https://apps.apple.com/cn/app/管乐迷/id1487054260";
+				} else if (/(Android)/i.test(navigator.userAgent)) {
+					window.location = "https://sj.qq.com/myapp/detail.htm?apkName=com.daya.studaya_android"; //如果超时就跳转到app下载页
+				} else {
+					this.$toast("请用手机或移动设备打开");
+				}
+			}
+		}
+	};
 </script>
 </script>
 <style lang="less" scoped>
 <style lang="less" scoped>
-@import url("../assets/commonLess/variable");
-.container {
-  overflow: hidden;
-  background: url("../assets/images/download/bg.png") top center no-repeat #fff;
-  background-size: contain;
-  min-height: 100vh;
-}
-.logo_bg {
-  background: url("../assets/images/download/logo.png") center center no-repeat;
-  background-size: contain;
-  width: 2.21rem;
-  height: 1.38rem;
-  margin: 0.43rem auto 0;
-}
-.banner {
-  background: url("../assets/images/download/banner.png") center center
-    no-repeat;
-  background-size: contain;
-  width: 2.13rem;
-  height: 3.04rem;
-  margin: 0.24rem auto 0;
-}
-.btn {
-  font-size: 0.18rem;
-  background: #14928a;
-  padding: 0.12rem 0.24rem;
-  border-radius: 0.5rem;
-  display: table;
-  color: #fff;
-  margin: 0.5rem auto 0;
-  cursor: pointer;
-  &.disabled {
-    background: #ccc;
-  }
-}
+	@import url("../assets/commonLess/variable");
+	.studentDownLoad {
+		// min-height: 100vh;
+	}
+	.container {
+		overflow: hidden;
+		background: url("../assets/images/downLoad/bg.png") top center no-repeat #fff;
+		background-size: contain;
+		min-height: calc(100vh - .9rem);
+		margin-top: .9rem;
+		text-align: center;
+		.tips {
+			font-size: 18px;
+			color: @--font-main-color;
+			margin-top: 2.6rem;
+		}
+		.ps {
+			font-size: 12px;
+			color: @--red-color;
+		}
+	}
+
+	.wxContainer {
+		overflow: hidden;
+		height: 100vh;
+	}
+
+	.wxpopup {
+		width: 100%;
+		height: 100vh;
+		position: absolute;
+		top: 0;
+		left: 0;
+		background: rgba(0, 0, 0, 0.5);
 
 
-.wxContainer {
-  overflow: hidden;
-  height: 100vh;
-}
-.wxpopup {
-  width: 100%;
-  height: 100vh;
-  position: absolute;
-  top: 0;
-  left: 0;
-  background: rgba(0, 0, 0, 0.5);
-  img {
-    width: 88%;
-    margin: 0 6%;
-  }
-}
-</style>
+		img {
+			width: 88%;
+			margin: 0 6%;
+		}
+	}
+</style>

+ 142 - 114
src/views/signup/SmallProtocol.vue

@@ -2,123 +2,151 @@
   <div class="privacy">
   <div class="privacy">
     <m-header />
     <m-header />
     <div class="container">
     <div class="container">
-      <h1>用户隐私协议</h1>
-      <strong>发布日期:2019-11-22</strong>
-      <br />
-      <strong>最新更新日期:2019-11-22</strong>
-      <br />深圳大雅乐盟网络教育股份有限公司(下称“大雅乐盟”或“本公司”)尤其重视儿童(即指未满14周岁的未成年人,下称“儿童用户”)的隐私和个人信息保护。《大雅乐盟儿童个人信息保护规则》(下称“本政策”)旨在向儿童用户及其监护人说明本公司如何收集、使用、处理、存储儿童个人信息以及为儿童用户或其监护人提供访问、删除、更正等处理事宜。在使用本公司提供的软件及相关服务前,请您务必仔细阅读并充分理解本政策,尤其是以加粗、下划线等标识的条款。
-      <br />
-
-      <strong class="line">向儿童用户监护人特别提示:</strong>
-      <strong
-        class="line"
-      >我们希望与您共同保护儿童用户的个人信息,教育和引导儿童提高个人信息保护意识和能力,教育儿童未经监护人的明确同意,不向任何网络服务方提供任何个人信息(包括儿童自身的个人信息以及监护人的个人信息)。请您务必与您的孩子共同仔细阅读后选择是否同意本政策,并保证您的孩子在您的同意和指导下使用本公司提供的软件及相关服务,以及提交个人信息。您点击同意本政策,或者您的孩子使用本公司提供的软件及相关服务,或提交个人信息的,即表示您同意并授权本公司按照本政策收集、使用、分享、转让、披露和存储您的孩子的个人信息;如果您不同意本政策的任何条款或内容的,请您立即要求您的孩子停止使用本公司提供的软件及相关服务。</strong>
+      <h1>酷乐秀用户注册服务协议</h1>
+      <!-- <strong>发布日期:2019-11-22</strong> -->
+      <!-- <strong>最新更新日期:2019-11-22</strong> -->
+      <br />欢迎用户使用景明云乐【酷乐秀】应用软件(下称“本软件”),请用户在使用本软件前仔细阅读本协议。如用户不同意本协议任何条款,请勿在本软件注册账号或使用景明云乐基于本软件提供的服务(下称“本服务”)。用户在“注册”或“登录”时点击“同意”等按钮,即表示用户已审慎阅读、充分理解并完全接受本协议的全部内容,本协议即构成景明云乐与用户之间具有约束力的法律文件;如果用户不同意或不接受本协议任何条款,用户应立即停止注册、登录本软件或使用本服务。
       <br />
       <br />
 
 
-      <strong class="line">向儿童用户的特别提示:</strong>
-      <br />
-      <strong
-        class="line"
-      >如果您是未满14周岁的未成年人,请通知您的监护人并与监护人共同阅读本政策,请务必征得监护人的同意、授权及指导后,使用本公司提供的软件及服务或者提交信息。您点击同意本政策、或者使用本公司提供的软件及相关服务,或者提交个人信息的,即表示您已获得监护人的同意和授权,您的监护人同意本公司按照本政策收集、使用、分享、转让、披露和存储您的个人信息;如果您的监护人不同意本政策的任何条款或内容的,请您立即停止使用本公司提供的软件及相关服务。</strong>
-      <br />本公司收集、使用、共享和保护用户的个人信息,是在遵守国家法律法规规定的前提下,仅出于本政策所述的以下目的,遵循正当必要、知情同意、目的明确、安全保障、依法利用的原则收集、存储、使用、转移、披露儿童个人信息。
-      <br />如果您对本政策有任何疑问的,请通过本政策中公布的联系方式与本公司联系。
-      <br />
-      <!-- 本公司联系方式:【】联系人:【】<br /> -->
-
-      <h2>一、本公司收集和使用儿童用户个人信息</h2>个人信息是指以电子或者其他方式记录的能够单独或者与其他信息结合识别特定自然人身份或者反映特定自然人活动情况的各种信息。
-      <br />1. 用户账户信息:
-      <br />儿童用户使用本公司提供的软件及相关服务前,需要在本公司提供的软件注册账户,此时我们需要您主动填写和提供注册信息,包括姓名、性别、出生日期、所在学校、所在班级、手机号码、家庭住址、创建的用户名(ID)等信息,这些信息是本公司为儿童用户提供考勤、教学、排课、陪练、打分等服务所必要的,如果您不提供给本公司,您可能无法使用本公司提供的软件或相关服务。
-      <br />2. 用户使用本公司提供的软件及相关服务信息:
-      <br />儿童用户通过电脑、平板电脑或手机等智能设备访问本公司提供的软件及其相关服务时,服务器会自动记录儿童用户的登录IP地址、网络服务商、接入网络的方式、类型及状态、网络质量数据、使用的语言、设备类别、设备型号、设备识别码、操作系统、分辨率、访问日期及时间长度等信息,以及儿童用户登录和使用本公司提供的软件及相关服务时,儿童用户使用的设备所在的地理位置信息。
-      <br />儿童用户使用本公司提供的软件及相关服务参加直播教学、录播教学等课程时,我们会收集儿童用户提交的信息以及系统自动记录和存储的信息,包括但不限于视频、录像、音频、照片、截图以及这些信息产生时对应的日期、时间、地点等。
-      <br />3. 交易信息和付款信息:
-      <br />儿童用户使用本公司提供的软件及相关服务的过程中,购买课程或其他服务需要向本公司进行支付,
-      <strong
-        class="line"
-      >本公司建议由儿童用户的监护人完成支付交易的整个过程,如果支付交易是由儿童用户进行,则应当在向本公司提供支付信息之前,获得其监护人的同意、授权和指导。</strong>本公司会收集支付交易时使用的支付工具、支付账户、银行卡号、开户银行、支付状态信息,支付日期等信息。
-      <strong
-        class="line"
-      >如果您进行支付交易时直接跳转至第三方支付页面的,该第三方将会直接收集您的支付信息,此时您的支付信息的收集、使用、存储等规则将遵循该第三方的隐私政策,请您注意事先仔细查阅。</strong>如果您符合本公司相关服务协议里约定的退费情形,并要求退费时,本公司需要您提供姓名、银行卡号、开户银行等信息。
-      <br />4. 儿童用户因请假、打卡签到或其他原因通过电话、电子邮件或其他线上或线下渠道与本公司取得联系时,本公司会收集和处理该儿童用户向本公司提供或者反馈的信息,儿童用户的姓名、联系方式,以及本公司为了处理该儿童用户的请求而必须向其确认的事项,并可能会保留与儿童用户的通话、通信记录,以便本公司及时与该儿童用户或其监护人联系和沟通并处理。
-      <br />5. 本公司还可能为了改进本公司服务,提高教学和服务质量等需要,儿童用户或其监护人联系和沟通,并在此过程中收集沟通时提供的相关信息。
-      <br />6. 本公司在教学和服务过程中必要时向儿童发出与教学或服务有关的通知或推送。
-      <br />7. 检测和防止欺诈和IT安全威胁所需的信息:本公司收集检测,调查和预防欺诈,作弊、IT安全威胁、网络漏洞、黑客攻击、计算机病毒和其他违反用户协议和适用法律的行为所需的某些信息。此数据仅用于检测,调查,预防以及在适用的情况下对此类行为进行处理,并且仅在此目的所需的最短时间内存储。如果披露信息会影响本公司检测、调查、防止此类行为的机制,则可能无法向您披露为此目的而存储的特定信息。
-      <br />8. 如本公司要向儿童用户的个人信息用于本政策未载明的其他用途时,将事先获得儿童用户监护人的同意;如本公司将基于特定目的而收集的儿童用户个人信息用于其他目的时,将事先获得儿童用户监护人的同意。
-      <br />
+      <h2>一、提示</h2>
+      1. 用户在使用本软件或本服务前,应当认真阅读本协议。请用户务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款、法律适用和争议解决条款。免除或者限制责任的条款将以粗体、下划线标识,用户应审慎阅读并充分理解后,自行选择接受或不接受。如用户对本协议有任何疑问,可联系景明云乐。<br />
+      2. 景明云乐可以随时更新本协议的各项条款,包括但不限于增加新的服务类型或功能,更新后的协议条款一经景明云乐在本软件公布或更新即生效并取代原协议条款,该公布行为视为景明云乐已经向用户进行通知,景明云乐也可以弹窗等方式另行通知用户,此时用户点击“同意”按钮即表示用户已审慎阅读、充分理解并完全接受本协议的最新更新版本的全部内容;用户不接受本协议最新更新版本的,应立即停止使用本软件或本服务;用户继续使用本软件或本服务的,即视为用户接受本协议的最新更新版本。<br />
+      3. 特别提醒:未满18周岁的用户应在法定监护人的陪同下阅读,并且应在法定监护人的同意和指导下注册和/或使用本软件及本服务。
+
+      <h2 class="line">二、关于本软件及本服务的重要提示</h2>
+      <strong class="line">1. 用户使用本服务需要下载本软件的客户端版本,本软件的客户端版本提供包括但不限于 iOS、安卓等多个应用版本,用户必须选择与所安装终端设备相匹配的软件版本。 用户可以直接从景明云乐的网站上获取本软件,也可以从得到景明云乐授权的第三方获取。如果用户从未经景明云乐授权的第三方获取本软件或与本软件名称相同的安装程序,景明云乐无法保证该软件能够正常使用,并对因此给用户造成的损失不予负责。下载安装程序后,用户需要按照该程序提示的步骤正确安装。</strong><br />
+      <strong class="line">2. 为了改善用户体验、完善服务内容,景明云乐将不断努力开发新的服务,并为用户不时提供软件更新(这些更新可能会采取软件替换、修改、功能强化、版本升级等形式)。景明云乐有权不经向用户特别通知而对本软件进行更新,或者对本软件的部分功能效果进行改变或限制。新版本发布后,旧版本的软件可能无法使用。景明云乐无法保证旧版本软件继续可用及相应的用户服务,请用户随时核对并下载最新版本。</strong><br />
+      <strong class="line">3. 用户理解并同意:为了向用户提供有效的服务,本软件会利用用户终端设备的处理器和带宽等资源,用户使用本软件时,需要接入互联网、移动互联网,此时可能产生数据流量的费用,用户需自行向运营商了解相关资费信息,并自行承担接入互联网、移动互联网所需的费用(包括但不限于上网费、通讯费)以及使用本软件及本服务必需的设备(包括但不限于电脑、手机等移动终端设备)。</strong><br />
+      <strong class="line">4. 景明云乐给予用户一项个人的、不可转让及非排他性的许可,以使用本软件。用户可以为非商业目的在单一台终端设备上安装、使用、显示、运行本软件。用户不得为商业运营目的安装、使用、运行本软件,不可以对该软件或者该软件运行过程中释放到任何计算机终端内存中的数据及该软件运行过程中客户端与服务器端的交互数据进行复制、更改、修改、挂接运行或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经授权的第三方工具/服务接入本软件和相关系统。</strong><br />
+      <strong class="line">5. 景明云乐将在用户注册本软件、使用本服务的过程中,以电话、电子邮件、微信等形式进一步联系用户进行必要的确认及/或指导,用户注册本软件的行为即视为用户同意接受景明云乐以电话、电子邮件、微信等形式进行的确认及/或指导服务。</strong><br />
+      <strong class="line">6. 用户同意并接受,景明云乐在提供本软件或本服务的过程中,可以短信、电子邮件、应用软件内弹窗、推送等各种形式向用户投放商业性广告或向用户进行商业推广。</strong><br />
+      <strong class="line">7. 本协议其他条款未明示授权的其他一切权利仍由景明云乐保留,用户在行使这些权利时须另外取得景明云乐的书面许可。景明云乐如果未行使前述任何权利,并不构成对该权利的放弃。</strong><br />
+
+      <h2>三、服务内容</h2>
+      1. 本服务是基于互联网及移动互联网,通过本软件向用户提供【直播教学、录播教学、学员管理】等功能服务。具体内容及具体规则还可参照景明云乐及/或本软件公示的内容。<br />
+      2. 本软件规则包括但不限于景明云乐通过官网、本软件等途径发布的全部规则、细则、解读、说明公告、弹窗、推送等,这些内容均与本协议具有同等法律效力。<br />
+      3. 服务费用<br />
+      用户使用本软件或本服务需要向景明云乐支付费用,具体费用以景明云乐向用户明确提示并与用户与景明云乐之间达成的约定为准;如果用户不向景明云乐支付费用,用户无法使用本软件或本服务的付费服务。<br />
+
+      <h2>四、帐号名称和密码</h2>
+      1. 用户阅读并同意本协议,成功完成注册后,即成为酷乐秀应用软件的注册用户,取得酷乐秀应用软件用户帐号(以下称“酷乐秀应用软件帐号”)。酷乐秀应用软件帐号名称在注册之后不可变更,而帐号对应的密码则可以通过酷乐秀应用软件提供的客户服务进行修改。<br />
+      2. 用户对于酷乐秀应用软件帐号及密码的保管以及使用该帐号和密码所进行的一切行为负有完全的责任。禁止将酷乐秀应用软件帐号或密码销售、转让或出借、共享给他人使用。因为用户的保管疏忽或任何第三方行为,导致用户的酷乐秀应用软件帐号或密码遭他人非法使用,以及因此而产生的任何后果,酷乐秀应用软件方均不承担任何责任。<br />
+      3. 用户发现其酷乐秀应用软件帐号或密码被他人非法使用或有使用异常情况的,应及时根据酷乐秀应用软件不时公布的处理方式通知酷乐秀应用软件,并有权请求酷乐秀应用软件采取措施暂停该帐号的登录和使用。酷乐秀应用软件根据用户身份核对结果,决定是否暂停乙方帐号的登录和使用。<br />
+
+      <h2>五、帐号注册信息</h2>
+      1. 提供注册信息<br />
+      (1)在申请酷乐秀应用软件帐号时(或注册后补充信息时),用户应当向酷乐秀应用软件提供最新、详细及真实准确的个人注册信息。前述个人注册信息包括:用户的酷乐秀应用软件帐号名称、密码及注册酷乐秀应用软件帐号(或补充、更新帐号信息时)输入的所有信息。用户在此承诺:用户以其真实身份注册成为酷乐秀应用软件的用户,并保证所提供的个人身份资料信息真实、完整、有效,依据法律规定和必备条款约定对所提供的信息承担相应的法律责任。<br />
+      (2)所有由用户提供的个人注册信息将可能被酷乐秀应用软件用来作为认定酷乐秀应用软件帐号的关联性以及辨别用户身份的依据。用户同意应酷乐秀应用软件的要求,随时提供该等信息的证明材料,以便酷乐秀应用软件核实用户身份。<br />
+      (3)如果用户提供给酷乐秀应用软件的信息不准确,或不真实,或不合法有效,或已变更而未及时更新,或有任何误导之嫌,酷乐秀应用软件有权中止或终止该用户使用酷乐秀应用软件的任何服务。酷乐秀应用软件有权审查乙方注册所提供的身份信息是否真实、有效,并应积极地采取技术与管理等合理措施保障用户帐号的安全、有效;用户有义务妥善保管其帐号及密码,并正确、安全地使用其帐号及密码。任何一方未尽上述义务导致帐号密码遗失、帐号被盗等情形而给对方或他人的权利造成损害的,应当承担由此产生的法律责任。<br />
+      2. 修改注册信息<br />
+      用户可以在任何时间,通过酷乐秀应用软件官方网站在该时点提供的服务或酷乐秀应用软件公布的在该时点可用的其他途径,更新或修改用户申请注册时所提供的信息。但是,用户在注册酷乐秀应用软件帐号时(或注册后补充信息时)填写的真实姓名、证件号码,以及酷乐秀应用软件帐号名称本身,在帐号注册成功后(或补充信息后)无法进行修改,请用户慎重填写各类注册信息。<br />
+      3. 用户同意,与其酷乐秀应用软件帐号相关的一切资料、数据和记录(包括但不限于登录记录、登录后行为记录、点卡信息等)均以酷乐秀应用软件系统记录的数据为准。<br />
+
+      <h2>六、信息披露与保护</h2>
+      1. 本协议第三条所描述的注册信息,以及用户在使用产品和服务时存储在酷乐秀应用软件控制范围内的非公开信息(以下合称“用户信息”),应按照本条约定进行披露及保护。<br />
+      2. 为了向用户提供更好的产品和服务,在用户自愿选择使用酷乐秀应用软件的产品和服务的情况下,或者明示同意提供信息的情况下,酷乐秀应用软件可能会收集用户信息,并可能对这些信息进行分析和整合。在用户使用酷乐秀应用软件的产品和服务时,服务器可能会自动记录部分用户信息,这些信息都将成为酷乐秀应用软件商业秘密的一部分。<br />
+      3. 保护用户(特别是未成年人用户)的隐私是酷乐秀应用软件的一项基本原则。酷乐秀应用软件一贯积极地采取技术与管理等方面的合理措施保障用户信息的安全、保密。<br />
+      4.酷乐秀应用软件保证不对外公开或向第三方披露、提供用户信息。但下列情况除外:<br />
+      (1)用户(或者用户的监护人)要求或同意酷乐秀应用软件披露用户信息;<br />
+      (2)有关法律法规、监管机构规章或自律组织规则要求酷乐秀应用软件披露用户信息;<br />
+      (3)司法机关或行政机关基于法定程序要求酷乐秀应用软件披露用户信息;<br />
+      (4)为保护酷乐秀应用软件的知识产权和其他权益,需要披露用户信息;<br />
+      (5)在紧急情况下为保护其他用户和社会公众的利益,需要披露用户信息;<br />
+      5. 在不透露单个用户隐私资料的前提下,酷乐秀应用软件有权对整个用户信息数据库进行技术分析并对已进行分析、整理后的用户数据库进行商业上的利用。<br />
+
+      <h2>七、用户的基本权利</h2>
+      1. 用户可以根据本协议以及酷乐秀应用软件不时公布和变更的其他规则使用酷乐秀应用软件提供的产品和服务。<br />
+      2. 用户可以自愿选择通过手机绑定酷乐秀应用软件提供的页面,从而在第一时间获得酷乐秀应用软件提供的服务内容。<br />
+      3. 用户有权在使用酷乐秀应用软件提供的产品和服务期间监督酷乐秀应用软件及酷乐秀应用软件的工作人员是否按照酷乐秀应用软件所公布的标准向用户提供产品和服务,也可以随时向酷乐秀应用软件提出与产品和服务有关的意见和建议。<br />
+      4. 如果用户不同意本协议条款,或对酷乐秀应用软件后来修改、更新的条款有异议,或对酷乐秀应用软件所提供的产品和服务不满意,用户可以随时选择停止使用酷乐秀应用软件的产品和服务。如果用户选择停止使用酷乐秀应用软件的产品和服务,酷乐秀应用软件不再对用户承担任何义务和责任。<br />
+
+      <h2>八、用户服务使用规则</h2>
+      1. 用户使用本软件或本服务时,不得实施下列行为:<br />
+      1.1 破坏宪法所确定的基本原则的;<br />
+      1.2 危害国家安全、泄露国家秘密、颠覆国家政权、破坏国家统一的;<br />
+      1.3 损害国家荣誉和利益的;<br />
+      1.4 煽动民族仇恨、民族歧视,破坏民族团结的;<br />
+      1.5 破坏国家宗教政策,宣扬邪教和封建迷信的;<br />
+      1.6 散布谣言,扰乱社会秩序,破坏社会稳定的;<br />
+      1.7 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;<br />
+      1.8 发布、传送、传播、储存侵害他人合法权益(包括但不限于隐私权、名誉权、肖像权、知识产权、商业秘密等)的内容;<br />
+      1.9 发布、传送、传播虚假、骚扰、营销、广告、诱导分享等相关的内容;<br />
+      1.10 违反法律法规或干扰、破坏景明云乐、本软件的正常运营的其他内容。<br />
+      2. 未经景明云乐事先书面同意,用户使用本软件时不得有下列行为:<br />
+      2.1 以创建相同、类似或竞争服务为目的或其他非法目的访问本软件或使用本服务;<br />
+      2.2 删除、遮掩、修改本软件及其副本上关于著作权的声明;<br />
+      2.3 对本软件或本服务(包括但不限于服务或其内容中的广告、推广或赞助内容)进行任何形式的许可、出售、租赁、转让、发行或做其他商业用途或以其他任何方式侵犯景明云乐的合法权益;<br />
+      2.4 通过修改或伪造软件运行中的指令、数据,或者增加、删减、变动软件的功能或运行效果,或者将用于上述用途的软件、方法进行运营或向公众传播,无论是否基于商业目的;<br />
+      2.5 通过非景明云乐开发、授权的第三方软件、插件、外挂、系统,登录或使用本软件或本服务;<br />
+      2.6 自行或者授权他人、第三方软件对本软件及其组件、模块、数据进行干扰,或在本软件或利用本服务上传或发布病毒、蠕虫、恶意代码、故意破坏或改变系统或数据的软件;<br />
+      2.7 其他未经景明云乐明示授权的行为。<br />
+      3. 用户内容是指用户上传、提供信息和资料或以其他方式使用本软件与本服务时产生的所有内容(包括但不限于用户信息、资料、图片、音视频或其他内容),用户是用户内容的唯一的责任人,应当承担因用户内容披露而导致的用户或任何第三方被识别的风险。<br />
+      4. 用户充分了解并同意,用户必须为自己注册账号下的一切行为和结果负责,包括但不限于用户所发表的任何内容以及由此产生的任何后果。用户应对本服务中的内容自行加以判断,并承担因使用内容而引起的所有风险,包括因对内容的正确性、完整性或实用性的依赖而产生的风险。景明云乐无法且不会对因前述风险而导致的任何损失或损害承担责任。<br />
+
+      <h2>九、第三方链接及资费服务</h2>
+      1. 本软件或本服务可能保留有第三方网站或网址的链接,访问这些链接将由用户自己做出决定,景明云乐并不就这些链接上所提供的任何信息、数据、观点、图片、陈述或建议的准确性、完整性、充分性和可靠性提供承诺或保证。景明云乐没有审查过任何第三方网站,对这些网站及其内容不进行控制,也不负任何责任。如果用户决定访问任何与本站链接的第三方网站,其可能带来的结果和风险全部由用户自己承担。<br />
+      2. 用户在使用本软件中第三方提供的产品或服务时,除遵守本协议约定外,还应遵守该第三方的用户协议。景明云乐和第三方对可能出现的纠纷在法律规定和约定的范围内各自承担责任。因用户使用本软件或要求景明云乐提供特定服务时,本软件可能会调用第三方系统或者通过第三方支持用户的使用或访问,使用或访问的结果由该第三方提供(包括但不限于第三方通过公众账号提供的服务,或通过开放平台接入的内容等),景明云乐不保证通过第三方提供服务及内容的安全性、准确性、有效性及其他不确定的风险,由此若引发的任何争议及损害,与景明云乐无关,景明云乐不承担任何责任。<br />
+      3. 用户已知晓并同意景明云乐提供本服务(无论是免费服务还是付费服务)还可能基于第三方如合作单位(包括但不限于电信运营商)提供的技术支持等服务获得。如果因第三方提供的服务给用户增加任何成本或造成任何损失的,景明云乐会协助用户与第三方进行沟通和处理,如因此发生维修、更换等费用的,应由用户自行承担,景明云乐不对此承担任何法律责任和赔偿责任。<br />
+      4. 用户在使用本软件过程中,基于本软件为第三方提供的技术服务要求代为收取的各项费用与本软件无关,用户也不得要求本软件返还,但是酷乐秀会依据第三方的要求将有关产品和服务的收费信息以及与该产品和服务有关的资费标准、收费方式、购买方式或其他有关资费政策的信息放置在该产品和服务相关网页的显著位置。<br />
+
+      <h2>十、知识产权的保护以及保密</h2>
+      1. 景明云乐的商标、商号、Logo、图形及其组合,以及景明云乐的其他标识、产品和服务名称均为景明云乐或景明云乐关联公司所有,未经景明云乐书面授权,任何人不得以任何方式展示、使用或作其他处理,也不得向任何第三方表明或让其误认为用户或第三方有权展示、使用或作其他处理。<br />
+      2. 景明云乐向用户提供的培训、课程相关的全部内容(包括但不限于任何文本、图片、音视频、培训课程设置、培训课件、教材等)的知识产权均归景明云乐单独和完整所有。用户应当保护景明云乐的知识产权,只能用于自身学习之目的,未经景明云乐事先书面同意,不得擅自将培训课程相关的任何内容进行复制、复印、影音、拍摄或进行摘要、改编、汇编等措施后以发布、转让、出售、赠与或其他任何形式提供给任何第三方,或擅自以非自用目的使用,否则景明云乐有权追究其法律责任。<br />
+      3. 未经景明云乐事先同意,用户不得对授课内容录音、录像、直播或者组织多人同时观看,不得将景明云乐提供的任何资料进行复制、销售、出租或授权给任何第三方。如景明云乐发现用户存在上述行为的,有权暂停向用户提供本服务,并有权追究相关法律责任。<br />
+      4. 景明云乐为提供服务而使用的任何软件(包括但不限于软件中所含的任何图象、照片、动画、录像、录音、音乐、文字和附加程序、随附的帮助材料)的一切权利均属于该软件的著作权人,未经该软件的著作权人许可,用户不得对该软件进行反向工程(reverse engineer)、反向编译(decompile)或反汇编(disassemble)。<br />
+      5. 用户已经了解并同意:在景明云乐提供的所有服务器上的数据(包括但不限于虚拟物品等)全部归景明云乐所有。在不影响用户正常接收服务的情况下,景明云乐有权决定保留或不保留服务器上的全部或部分数据。<br />
+      6. 用户已经了解并同意:景明云乐有权将本协议项下景明云乐所有的知识产权授权第三方使用,在变更本软件或本服务运营商时,景明云乐可以将其运营的产品或服务以及与该在产品或服务相关的归景明云乐所有的知识产权转让给新的产品运营商。<br />
+      7. 用户使用景明云乐提供的本软件或本服务期间获取的文件、资料、表格等信息,包括但不限于有关合作资料、营销资料等,无论是口头、书面的或是电子文件形式的,均属景明云乐的商业秘密,用户必须对这些商业秘密严格遵守保密义务,不得向外透露,也不得使用这些商业秘密为自己或他人谋取利益。<br />
+      8. 对于用户上传至本软件的任何内容(包括但不限于资料、音视频),用户同意授权景明云乐在全世界范围内永久性、免费且不可撤销的非独家的许可,景明云乐有权对这些内容的全部或部分进行使用、复制、发行、展览展示、表演、放映、广播、修改或改编、翻译、汇编以及通过信息网络传播等。<br />
+      9. 为保证准确及避免争议,本协议涉及到的有关技术方面的数据、信息,用户同意以酷乐秀服务器所储存的数据作为判断标准。酷乐秀保证该数据的真实性。<br />
+
+      <h2>十一、违约条款</h2>
+      1. 用户违反本协议约定时即构成违约情形,景明云乐有权要求用户采取及时的补救措施,消除违约后果,并有权终止本协议。如用户的违约行为使景明云乐及/或关联公司遭受损失(包括自身的直接经济损失、商誉损失及对外支付的赔偿金、和解款、律师费、诉讼费等间接经济损失)的,用户应赔偿景明云乐及/或关联公司的上述全部损失。<br />
+      2. 用户理解并同意,如用户的行为导致第三方向景明云乐及/或关联公司主张权利或任何索赔、要求或损失的,景明云乐及/或关联公司在对第三人承担赔偿义务后可向用户追偿与此相关的全部损失。<br />
+
+      <h2>十二、协议变更、解除或终止</h2>
+      1. 景明云乐有权随时变更、暂停或终止部分或全部服务,此时若变更、暂停或终止的服务为付费服务的,景明云乐将提前在应用软件以公告通知、推送、弹窗等方式通知用户;如变更、暂停或终止的服务为免费服务的,景明云乐将不会另行通知用户,也不会对用户或第三方承担任何责任。<br />
+      2. 用户有权通过以下任一方式终止本协议:<br />
+      2.1 用户自行注销用户的账户的;<br />
+      2.2 变更事项生效或服务协议更新时,用户停止使用或以不点击“同意”按钮等方式明示不愿接受变更事项或更新后的服务协议的;<br />
+      2.3 用户明确表示不愿继续使用本软件或本服务(包括但不限于拒绝付费、续费等),且符合本协议终止条件的。<br />
+      3. 出现以下情况时,景明云乐可以终止本协议:<br />
+      3.1 用户违反本协议约定的(包括但不限于提供虚假资料、违反用户使用规则等),景明云乐依据违约条款终止本协议;<br />
+      3.2 用户的账户被景明云乐依据本协议进行注销等处理的;<br />
+      3.3 用户在使用本软件或本服务时存在侵犯他人合法权益或其他严重违法违规行为的;<br />
+      3.4 根据相关法律法规规定景明云乐应当终止服务或景明云乐认为需终止服务的其他情形。<br />
+      4. 因不可抗力(指双方不可预见、或可以预见但不能避免并或克服的客观情况,该事件妨碍、影响或延误任何一方根据合同履行其全部或部分义务。该事件包括但不限于政府行为、法律或规定的发布或修订,自然灾害、战争、网络堵塞或中断、黑客袭击或任何其他类似事件)导致本协议不能履行的情形持续30天以上时,景明云乐与用户协商一致后,可以解除本协议。<br />
+      5. 协议终止后的处理<br />
+      本协议终止后,除法律有明确规定外,景明云乐无义务向用户或用户指定的第三方披露用户账户中的任何信息。<br />
+      6. 本协议的任何条款部分或全部无效的,不影响其它条款的效力。<br />
+
+      <h2>十三、免责声明</h2>
+      <strong class="line">1. 用户使用本软件或本服务的风险应由用户自行承担,景明云乐对本软件不作任何类型的担保,不论是明示的、默示的保证和条件,包括但不限于本软件的适销性、适用性、无病毒、无疏忽或无技术瑕疵问题、所有权和无侵权的明示或默示担保和条件,对在任何情况下因使用或不能使用本软件所产生的直接、间接、偶然、特殊及后续的损害及风险,景明云乐不承担任何责任。</strong><br />
+      <strong class="line">2. 景明云乐不担保本软件或本服务一定能满足用户的要求,也不对本服务的及时性、安全性、准确性作出任何保证。</strong><br />
+      <strong class="line">3. 用户明确理解和同意,景明云乐不对因下述任一情况而导致的损害赔偿承担责任,包括但不限于利润、商誉、使用、数据等方面的损失或其它无形损失的损害赔偿:</strong><br />
+      <strong class="line">3.1 景明云乐向用户免费提供的任何产品或者服务;</strong><br />
+      <strong class="line">3.2 景明云乐向用户赠送的任何产品或者服务;</strong><br />
+      <strong class="line">3.3 对于用户使用本软件上可能涉及由第三方所有、控制或者运营的网站或平台提供的服务及其导致的风险;</strong><br />
+      <strong class="line">3.4 因用户的过错导致的任何损失,该过错包括但不限于:决策失误、操作不当、遗忘或泄露密码、密码被他人破解、用户使用的计算机系统被第三方侵入、用户向景明云乐发送的指令信息不明确或存在歧义、用户下载非法或不明程序、用户委托他人代理交易时他人恶意或不当操作而造成的损失;</strong><br />
+      <strong class="line">3.5 信息网络设备连接故障,电脑、通讯或其他系统出现故障,不能进行数据传输、保存的;</strong><br />
+      <strong class="line">3.6 本软件或其服务器或设备停机检修维护期间,无论是定期还是不定期的;</strong><br />
+      <strong class="line">3.7 不可抗力因素导致的任何损失;</strong><br />
+      <strong class="line">3.8 景明云乐依据本协议约定终止协议时。</strong><br />
+      <strong class="line">4. 用户理解并同意,因景明云乐过错导致用户不能享受相应服务,景明云乐承担相应责任的最高限额不超过用户实际支付的当次服务费用总额。</strong><br />
+
+      <h2>十四、隐私权保护政策</h2>
+      景明云乐非常重视用户的隐私,用户及用户的监护人同意,景明云乐向用户提供本服务时,会收集、使用必要的用户个人信息,并将收集到的信息用于提供本服务必需的目的和场景。景明云乐不会收集与提供本服务无关的用户个人信息,具体隐私权保护政策详见景明云乐或本软件公示的《隐私政策》。
+
+      <h2>十五、争议解决及适用法律</h2>
+      1. 本协议及其修订的有效性、履行、解释及争议解决,均适用中华人民共和国大陆地区法律。
+      2. 用户与景明云乐之间就本协议发生的任何纠纷或争议,首先应友好协商解决,协商不成的,任何一方均有权向景明云乐所在地有管辖权的法院提起诉讼。
+
+      <h2>十六、其他</h2>
+      1. 景明云乐在本协议项下对用户的通知可通过应用软件内弹窗、推送、电子邮件、短信或邮寄等方式进行,通过应用软件内弹窗、推送方式的,用户打开应用软件并首次遇到该弹窗、推送时视为送达完毕;以电子邮件、短信方式的,发送成功即视为送达完毕;以邮寄方式的,寄出后3个工作日后即视为送达完毕。<br />
+      2. 如本协议中的任何条款无论因何种原因导致全部或部分无效或不具有执行力的,则该条款应视为自始不存在且不影响本协议其他条款的效力,此时该条款可被新的条款所取代,以保证最大限度地接近双方意图、确保本协议要求的经济目的,以及实现原有条款的意图。<br />
+      3. 本协议中的标题仅为方便而设,本身并无实际涵义,不能作为本协议涵义解释的依据。<br />
+      4. 如用户对本软件、本服务或本协议内容有任何疑问、意见或建议,用户可联系景明云乐,联系电话:【】,邮寄地址:【】景明云乐将及时回复用户的请求。
 
 
-      <strong
-        class="line"
-      >本公司收集儿童用户的个人信息后,可能会通过技术手段对已经收集的儿童用户个人信息进行匿名化处理,使得儿童用户个人信息主体无法被识别,且处理后的信息不能被复原,此时经过匿名化处理后的个人信息不再属于用户个人信息。本公司可能会将匿名化处理信息用于测试本公司的IT系统,研究,数据分析,改进服务,以及开发新服务、新产品和功能,以及向第三方分享、转让、披露,此时无需另行获得儿童用户监护人的授权同意。</strong>
-      <br />
-
-      <h2>二、本公司共享、转让、披露儿童用户个人信息</h2>1. 共享:
-      <br />1.1在获取儿童用户监护人的明确同意或授权的情况共享;
-      <br />1.2根据法律法规规定,或者按照政府主管部门的强制性要求;
-      <br />1.3为了向儿童用户提供教学或服务,本公司可能会与关联方分享,但是本公司只会分享必要的个人信息,且此时受用户服务协议或本隐私政策中所声明的收集和使用之目的的约束,本公司的关联方如要改变个人信息的处理目的,将再次征求儿童用户监护人的授权同意;
-      <br />1.4本公司还可以与提供与本公司提供的软件及相关服务相关的必要功能和支持服务的第三方(例如,提供或处理支付业务、网络定位服务、推送通知、电子邮件服务、税务和会计服务、分析服务)共享儿童用户的个人信息数据,此时本公司仅会处于合法、正当、必要、特定、明确的目的共享儿童用户的个人信息,并且只会共享提供服务所必要的信息,且此时本公司会与这些第三方主体签订保密协议,要求这些第三方主体按照相关法律法规规定、本政策及其他任何相关的保密和安全措施保护儿童用户的个人信息。
-      <br />2. 转让:
-      <br />2.1在获取儿童用户监护人的明确同意的情况下转让;
-      <br />2.2本公司发生合并、收购、资产转让或类似交易或者破产清算时,用户信息(包括儿童用户的个人信息)可能会被转让给相关方,此时本公司会要求这些受让方继续遵守本政策的约束,如果这些受让方变更用户信息的使用目的时,应重新获得儿童用户监护人的同意和授权;
-      <br />本公司向第三方转让儿童用户个人信息时,将自行或委托第三方机构进行安全评估。
-      <br />3. 披露:
-      <br />3.1在获取儿童用户监护人的要求或明确同意的情况下披露;
-      <br />3.2根据法律法规规定、法院或政府主管部门的强制性要求时;
-      <br />3.3本公司发生资本市场活动(例如IPO等)时,可能需要接受其他主体的尽职调查,此时本公司可能会根据尽职调查的需要将儿童用户的个人信息提供给必要的主体,但本公司会与实施调查的主体签订保密协议,要求这些第三方主体按照相关法律法规规定、本政策及其他任何相关的保密和安全措施来保护儿童用户的个人信息。
-      <br />4. 本公司在下列情形时,无需获得儿童用户监护人的授权同意,即可分享、转让、披露儿童用户的信息:
-      <br />4.1与国家安全、国防安全相关的;
-      <br />4.2与公共安全、公共卫生、重大公共利益相关的;
-      <br />4.3与犯罪侦查、起诉、审判和判决执行等司法或行政执法相关的;
-      <br />4.4为了维护儿童或其他个人的生命和财产等重大合法权利但又很难得到监护人同意的情况下;
-      <br />4.5儿童用户的监护人自行向社会公开的信息;
-      <br />4.6从合法公开渠道获得的信息,如新闻报道、政府信息公开等渠道。
-      <br />
-
-      <h2>三、儿童用户个人信息的保护、存储、跨境传输</h2>1. 本公司会努力采取各种符合业界标准的物理、电子和管理方面的安全措施来保护儿童用户的个人信息,防止儿童用户的个人信息遭到未经授权访问、公开披露、使用、修改、损坏或丢失。本公司会采取一切合理可行的措施,保护儿童用户的个人信息。
-      <br />2. 本公司会采取加密等措施存储儿童用户的个人信息,确保信息安全,并以最小授权为原则对本公司工作人员严格设置信息访问权限,控制儿童用户个人信息知悉范围。工作人员需要访问儿童个人信息的,应当经过本公司儿童个人信息保护负责人或者其授权的管理人员审批,并且记录访问情况,采取技术措施,避免违法复制、下载儿童个人信息。
-      <br />3. 本公司将会采取一切合理可行的措施,确保未收集无关的儿童用户个人信息,并只会在达成本政策所述目的所需的期限内存储和保留儿童用户的个人信息,不会超过本政策所述目的所必需的期限,除非需要延长保留期或受到法律的允许。
-      <br />4. 互联网并非绝对安全的环境,而且电子邮件、即时通讯、社交软件或其他服务软件等与其他用户交流的方式无法确定是否完全加密,因此本公司建议监护人教育和指导儿童使用此类工具时注意保护信息安全,并使用复杂密码,协助本公司保证儿童用户的账户安全。
-      <br />5. 互联网环境并非百分之白安全,本公司将尽力确保或担保用户发送给本公司的任何信息的安全性。如果本公司的物理、技术,或管理防护设施遭到破坏,导致信息被非授权访问、公开披露、篡改,或破坏,导致您的合法权益受损,本公司将承担相应的法律责任。
-      <br />6. 本公司发现儿童用户个人信息发生或可能发生泄露、毁损、灭失的,本公司将将立即启动应急预案,采取补救措施;造成或者可能造成严重后果的,会立即向有关主管部门报告,并将事件相关情况以邮件、信函、电话、推送通知等方式告知受影响的儿童用户及其监护人,难以逐一告知的,将会采取合理、有效的方式发布相关警示信息。包括但不限于安全事件的基本情况和可能的影响、本公司已采取或将要采取的处置措施、用户可自主防范和降低风险的建议、对用户的补救措施等。同时,本公司还将按照监管部门要求,主动上报个人信息安全事件的处置情况。
-      <br />7. 本公司将儿童用户的个人信息存储于中华人民共和国境内。如需跨境传输,本公司将依法征得儿童用户监护人的授权同意。
-      <br />8. 儿童用户提供的上述信息,将在该儿童用户使用本服务期间持续授权本公司使用。本公司停止运营软件或服务的,将会立即停止收集儿童用户个人信息,并删除持有的儿童用户个人信息,并将停止运营的通知及时通知儿童用户的监护人;当该儿童用户注销账号时,本公司将停止使用并删除上述信息。
-      <br />
-
-      <h2>四、用户的权利及其实现的途径和方法</h2>1. 更正
-      <br />儿童用户或其监护人一旦发现本公司收集、存储、使用、披露的儿童个人信息有错误的,有权要求本公司予以更正,本公司将会及时采取措施予以更正。
-      <br />2. 删除
-      <br />儿童用户或者其监护人要求本公司删除其收集、存储、使用、披露的儿童用户个人信息时,本公司将会及时采取措施予以删除,包括但不限于以下情形:
-      <br />2.1本公司违反法律、行政法规的规定或者双方的约定收集、存储、使用、转移、披露儿童个人信息的;
-      <br />2.2本公司超出目的范围或者必要期限收集、存储、使用、转移、披露儿童个人信息的;
-      <br />2.3儿童用户监护人撤回授权同意的;
-      <br />2.4儿童或者其监护人通过注销等方式终止使用本公司提供的软件及其相关服务的。
-      <br />3. 访问
-      <br />儿童用户及其监护人有权访问该儿童用户的个人信息,法律法规规定的例外情况除外。如果儿童用户及其简化人希望访问、编辑、更改该儿童用户的账户中的个人资料信息、更改密码、或关闭用户的账户等,均可以通过访问本公司提供的软件执行此类操作。如果儿童用户及其监护人无法通过本公司提供的软件访问这些个人信息,可以随时联系本公司。
-      <br />4. 在响应儿童用户及其监护人的上述请求时,为了保障安全,本公司可能要求提供书面请求,或以其他方式证明身份,本公司会验证用户身份后再处理该请求,并在30日内作出答复。在下列情形时,本公司无法响应儿童用户及其监护人的请求:
-      <br />4.1与国家安全、国防安全直接相关的;
-      <br />4.2与公共安全、公共卫生、重大公共利益直接相关的;
-      <br />4.3与犯罪侦查、起诉、审判、执行等直接相关的;
-      <br />4.4有充分的证据表明用户存在主观恶意或滥用权利的;
-      <br />4.5响应用户的请求可能导致用户或者其他个人、组织的合法权益受到严重损害的;
-      <br />4.6涉及商业秘密的。
-      <br />
-
-      <h2>五、关于Cookie及同类技术</h2>为了确保本公司提供的软件及相关服务的正常运转,本公司会在用户的电脑或移动设备上存储名为Cookie的小数据文件。Cookie通常包含标识符、站点名称以及一些号码和字符。本公司不会将Cookie用于本政策所述目的之外的任何用途,用户可根据自己的偏好管理或删除Cookie,有关详情请参见AboutCookies.org。用户可以通过更改设置清除电脑或移动设备上保存的所有Cookie。
-      <br />
-
-      <h2>六、第三方链接及服务</h2>
-      <strong
-        class="line"
-      >本政策仅适用于本公司收集的儿童用户个人信息,本政策不适用于儿童用户通过本公司提供的软件或服务而接入到第三方链接或服务时,该第三方收集和使用儿童用户个人信息的行为及其结果,此时应适用该第三方链接或服务的隐私政策。</strong>
-      <br />
-
-      <h2>七、本政策的更新</h2>本公司可能会根据软件及其服务或教学的需要或者根据法律法规的规定修改本政策的全部或部分。如该等更新造成监护人及儿童用户在本政策下权利的实质减少或重大变更的,本公司将在更新生效前通过网站公告、推送通知、弹窗提示或其他方式进行通知。监护人如果不同意该等更新或变更的,可以选择停止使用本公司的软件及相关服务;如果儿童用户或其监护人继续使用本公司的软件及相关服务的,即表示监护人已充分阅读、理解并同意受该等更新或变更后的本政策的约束。
-      <br />
-
-      <h2>八、本公司的联系方式</h2>儿童用户或其监护人如有任何问题、意见或者建议,除本政策页首所述的联系方式以外,还可以通过以下方式与本公司联系。
-      <br />电子邮箱:dyme2002@dayaedu.com
-      <br />邮寄地址:武汉市武昌区汉街总部国际B座33A03
-      <br />联系电话:027-87718176
-      <br />
     </div>
     </div>
   </div>
   </div>
 </template>
 </template>