detail.vue 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. <template>
  2. <view class="wrap">
  3. <div class="preview-conatiner">
  4. <view class="title">{{viewData.taskTitle}}</view>
  5. </div>
  6. <view class="content">
  7. <view class="result">
  8. <view class="title">
  9. <text>内容</text>
  10. <button @click="read" class="submit-bt read">朗读</button>
  11. </view>
  12. <view class="result-conatiner">
  13. <uni-forms ref="form" :modelValue="formData" :label-width="90">
  14. <uni-forms-item :label="item.text" v-for="(item,key) in viewData.taskContent" :key="key" required >
  15. <uni-data-checkbox v-model="item.checked" :localdata="range"></uni-data-checkbox>
  16. </uni-forms-item>
  17. <uni-forms-item>
  18. <button @click="submitForm" class="submit-bt">提交</button>
  19. </uni-forms-item>
  20. </uni-forms>
  21. </view>
  22. </view>
  23. </view>
  24. </view>
  25. </template>
  26. <script>
  27. import {updateMemory} from '@/api/user.js'
  28. export default{
  29. data(){
  30. return{
  31. readSrc:"",
  32. viewData:{
  33. taskTitle:"",
  34. taskContent:[]
  35. },
  36. range: [{
  37. "value": 0,
  38. "text": "正确"
  39. },
  40. {
  41. "value": 1,
  42. "text": "错误"
  43. }
  44. ],
  45. formData:{}
  46. }
  47. },
  48. onShow() {
  49. let info=uni.getStorageSync('index-detail-info')
  50. this.viewData=info
  51. let taskContentNew=[]
  52. let items=info.taskContent.split(/[\s\n]/).filter(item=>item!=="");
  53. items=items.map((item,index)=>{
  54. return {
  55. text: item,
  56. value: index,
  57. checked:0
  58. }
  59. })
  60. if(!this.isEmpty(info.taskContentNew)){
  61. taskContentNew=info.taskContentNew.split(/[\s\n]/).filter(item=>item!=="");
  62. taskContentNew=taskContentNew.map((item,index)=>{
  63. return {
  64. text: item,
  65. value: index,
  66. checked:1
  67. }
  68. })
  69. }
  70. this.viewData.taskContent=items.concat(taskContentNew)
  71. },
  72. created() {
  73. this.getTTStoken()
  74. },
  75. onUnload() {
  76. uni.removeStorageSync('index-detail-info')
  77. },
  78. methods:{
  79. submitForm(){
  80. let right=this.viewData.taskContent
  81. .filter(item=>item.checked==0)
  82. .map(item=>item.text)
  83. .join(" ")
  84. let error=this.viewData.taskContent
  85. .filter(item=>item.checked==1)
  86. .map(item=>item.text)
  87. .join(" ")
  88. updateMemory({
  89. "taskId": this.viewData.taskId,
  90. "accountId": this.viewData.accountId,
  91. "taskTitle": this.viewData.taskTitle,
  92. "taskContent": right,
  93. "expectedFinishDate": this.viewData.expectedFinishDate,
  94. "taskPhase": this.viewData.taskPhase,
  95. "taskContentNew": error
  96. }).then(()=>{
  97. uni.showToast({
  98. title:"提交成功!",
  99. icon:"none"
  100. })
  101. setTimeout(()=>{
  102. uni.switchTab({
  103. url:'/pages/index/index'
  104. })
  105. },1000)
  106. })
  107. },
  108. async read(){
  109. let taskContent=this.viewData.taskContent
  110. let time=2;
  111. for(let i=0;i<taskContent.length;i++){
  112. await this.playAudio(this.getreadSrc(taskContent[i].text))
  113. await this.playAudio(this.getreadSrc(taskContent[i].text))
  114. await this.playAudio(this.getreadSrc(taskContent[i].text))
  115. }
  116. },
  117. getreadSrc(ttsText){
  118. let cuid="hyy-"+(new Date().getTime());
  119. let access_token=this.tts_token
  120. let readUrl=`https://tsn.baidu.com/text2audio?lan=zh&ctp=1&cuid=${cuid}&tok=${access_token}&vol=9&per=0&spd=5&pit=5&aue=3&tex=${ttsText}`;
  121. return readUrl;
  122. },
  123. playAudio(src,sleep=3000){
  124. return new Promise((resolve, reject)=>{
  125. var innerAudioContext = uni.createInnerAudioContext();
  126. innerAudioContext.autoplay = true;
  127. innerAudioContext.src = src;
  128. innerAudioContext.onPlay(() => {
  129. console.log('开始播放');
  130. });
  131. innerAudioContext.onError((res) => {
  132. uni.showToast({
  133. title:"播放异常!"
  134. })
  135. });
  136. innerAudioContext.onEnded(()=>{
  137. setTimeout(()=>{
  138. innerAudioContext=null
  139. resolve()
  140. },sleep)
  141. })
  142. })
  143. },
  144. async getTTStoken() {
  145. let tts_token=uni.getStorageSync('tts-token')
  146. if(this.isEmpty(tts_token)||tts_token&&this.detectionToken(tts_token.time)){
  147. var [err, res] = await uni.request({
  148. url: "http://back.haiyaya.club:8083/hyy/GetAccessToken",
  149. });
  150. uni.setStorageSync('tts-token',{
  151. token:res.data.refresh_token,
  152. time:new Date().getTime()
  153. })
  154. tts_token=res.data.refresh_token
  155. }else{
  156. tts_token=tts_token.token
  157. }
  158. this.tts_token=tts_token;
  159. },
  160. detectionToken(token){
  161. let now=new Date().getTime();
  162. return now-token.time>5*60*60*24*1000
  163. },
  164. isEmpty(val){
  165. if(val!=="undefined"&&val!==undefined&&val!==""&&val!==null){
  166. return false
  167. }
  168. return true
  169. }
  170. }
  171. }
  172. </script>
  173. <style lang="scss" scoped>
  174. *{
  175. padding: 0;
  176. margin: 0;
  177. }
  178. .wrap{
  179. padding:20rpx;
  180. .title{
  181. height: 40rpx;
  182. font-size: 28rpx;
  183. font-family: PingFang SC;
  184. font-weight: bold;
  185. line-height: 40rpx;
  186. color: #333333;
  187. opacity: 1;
  188. padding:0 0 36rpx 20rpx;
  189. position: relative;
  190. &::after{
  191. width: 12rpx;
  192. height: 28rpx;
  193. background:#2A83EF;
  194. opacity: 1;
  195. border-radius: 6px;
  196. content: "";
  197. display: block;
  198. position: absolute;
  199. left: 0;
  200. top: 8rpx;
  201. }
  202. }
  203. .content{
  204. padding: 10rpx;
  205. margin-top: 24rpx;
  206. ::v-deep .uni-forms-item__content{
  207. display: flex;
  208. align-items: center;
  209. flex-wrap: wrap;
  210. }
  211. .title{
  212. display: flex;
  213. justify-content: space-between;
  214. align-items: center;
  215. }
  216. }
  217. .submit-bt{
  218. width: 400rpx;
  219. height: 72rpx;
  220. line-height: 72rpx;
  221. text-align: center;
  222. background:#3D90F4;
  223. border-radius: 36rpx;
  224. font-size: 32rpx;
  225. font-family: PingFang SC;
  226. font-weight: 400;
  227. color: #FFFFFF;
  228. z-index: 999;
  229. margin-top: 50rpx;
  230. &.read{
  231. width: 140rpx;
  232. height: 60rpx;
  233. line-height: 60rpx;
  234. margin-top: 20rpx;
  235. }
  236. }
  237. }
  238. </style>