Commit 248418762fc8b5309d8ca341ab9229fc2b2d83ad
1 parent
8de956dc
add tts
Showing
6 changed files
with
212 additions
and
10 deletions
src/main/resources/static/real_control_v2/css/line_schedule.css
| @@ -190,6 +190,10 @@ | @@ -190,6 +190,10 @@ | ||
| 190 | font-weight: 600; | 190 | font-weight: 600; |
| 191 | } | 191 | } |
| 192 | 192 | ||
| 193 | +.schedule-body .ct_table dl._search_hide{ | ||
| 194 | + display: none !important; | ||
| 195 | +} | ||
| 196 | + | ||
| 193 | .context-menu-list.schedule-ct-menu { | 197 | .context-menu-list.schedule-ct-menu { |
| 194 | /*font-size: 13px;*/ | 198 | /*font-size: 13px;*/ |
| 195 | font-family: 微软雅黑; | 199 | font-family: 微软雅黑; |
| @@ -333,6 +337,12 @@ dd.tl-zzzx { | @@ -333,6 +337,12 @@ dd.tl-zzzx { | ||
| 333 | width: 100%; | 337 | width: 100%; |
| 334 | } | 338 | } |
| 335 | 339 | ||
| 340 | +.ct-form-modal span.uk-form-help-inline, | ||
| 341 | +.ct-form-modal p.uk-form-help-block{ | ||
| 342 | + color: #888888; | ||
| 343 | + font-size: 13px; | ||
| 344 | +} | ||
| 345 | + | ||
| 336 | 346 | ||
| 337 | /** 批量待发调整 */ | 347 | /** 批量待发调整 */ |
| 338 | 348 | ||
| @@ -721,8 +731,29 @@ input.i-cbox[type=checkbox]{ | @@ -721,8 +731,29 @@ input.i-cbox[type=checkbox]{ | ||
| 721 | transition: all .3s ease; | 731 | transition: all .3s ease; |
| 722 | } | 732 | } |
| 723 | 733 | ||
| 724 | -.search_sch_panel .uk-form input.active[type=text]{ | ||
| 725 | - width: 130px; | 734 | +.search_sch_panel .uk-form div.uk-form-icon.active input[type=text]{ |
| 735 | + width: 145px; | ||
| 736 | +} | ||
| 737 | + | ||
| 738 | +.search_sch_panel .uk-form div.uk-form-icon i.cancel{ | ||
| 739 | + position: absolute; | ||
| 740 | + right: 8px; | ||
| 741 | + font-size: 13px; | ||
| 742 | + color: #c3b9ba; | ||
| 743 | + cursor: pointer; | ||
| 744 | + display: none; | ||
| 745 | + padding: 0; | ||
| 746 | + pointer-events: auto; | ||
| 747 | + width: 18px; | ||
| 748 | + text-indent: 0; | ||
| 749 | +} | ||
| 750 | + | ||
| 751 | +/*.search_sch_panel .uk-form div.uk-form-icon i.cancel:before{*/ | ||
| 752 | + | ||
| 753 | +/*}*/ | ||
| 754 | + | ||
| 755 | +.search_sch_panel .uk-form div.uk-form-icon.active i.cancel{ | ||
| 756 | + display: block; | ||
| 726 | } | 757 | } |
| 727 | 758 | ||
| 728 | .search_sch_panel .uk-form input[type=text]::-webkit-input-placeholder{ | 759 | .search_sch_panel .uk-form input[type=text]::-webkit-input-placeholder{ |
src/main/resources/static/real_control_v2/css/sch_autocomp_result.css
| @@ -15,8 +15,9 @@ | @@ -15,8 +15,9 @@ | ||
| 15 | 15 | ||
| 16 | .sch-search-results small { | 16 | .sch-search-results small { |
| 17 | /*display: block;*/ | 17 | /*display: block;*/ |
| 18 | - color: #9b9797; | ||
| 19 | - margin-left: 9px; | 18 | + /*color: #9b9797; |
| 19 | + margin-left: 9px;*/ | ||
| 20 | + color: #009dd8; | ||
| 20 | } | 21 | } |
| 21 | 22 | ||
| 22 | .sch-search-results small.search-result-desc { | 23 | .sch-search-results small.search-result-desc { |
| @@ -25,6 +26,7 @@ | @@ -25,6 +26,7 @@ | ||
| 25 | display: block; | 26 | display: block; |
| 26 | text-overflow: ellipsis; | 27 | text-overflow: ellipsis; |
| 27 | margin-left: 0; | 28 | margin-left: 0; |
| 29 | + color: #9b9797; | ||
| 28 | } | 30 | } |
| 29 | 31 | ||
| 30 | 32 |
src/main/resources/static/real_control_v2/fragments/line_schedule/sch_table.html
| @@ -7,16 +7,17 @@ | @@ -7,16 +7,17 @@ | ||
| 7 | {{else}} | 7 | {{else}} |
| 8 | 下行/{{line.endStationName}} | 8 | 下行/{{line.endStationName}} |
| 9 | {{/if}} | 9 | {{/if}} |
| 10 | - <!-- <div class="search_sch_panel"> | ||
| 11 | - <form class="uk-form"> | 10 | + <div class="search_sch_panel"> |
| 11 | + <form class="uk-form" onsubmit="javascript:return false;"> | ||
| 12 | <div class="uk-autocomplete sch-search-autocom"> | 12 | <div class="uk-autocomplete sch-search-autocom"> |
| 13 | <div class="uk-form-icon"> | 13 | <div class="uk-form-icon"> |
| 14 | <i class="uk-icon-search"></i> | 14 | <i class="uk-icon-search"></i> |
| 15 | <input type="text" placeholder="search"> | 15 | <input type="text" placeholder="search"> |
| 16 | + <i class="cancel uk-icon-times-circle" data-uk-tooltip="{pos:'right'}" title="取消过滤"></i> | ||
| 16 | </div> | 17 | </div> |
| 17 | </div> | 18 | </div> |
| 18 | </form> | 19 | </form> |
| 19 | - </div> --> | 20 | + </div> |
| 20 | </h3> | 21 | </h3> |
| 21 | <div class="schedule-body"> | 22 | <div class="schedule-body"> |
| 22 | <div class="ct_table_wrap"> | 23 | <div class="ct_table_wrap"> |
src/main/resources/static/real_control_v2/fragments/line_schedule/sys_mailbox.html
| @@ -16,9 +16,9 @@ | @@ -16,9 +16,9 @@ | ||
| 16 | <div class="uk-width-medium-1-1 sys-note-42" id="{{domId}}"> | 16 | <div class="uk-width-medium-1-1 sys-note-42" id="{{domId}}"> |
| 17 | <div class="uk-panel uk-panel-box uk-panel-box-secondary"> | 17 | <div class="uk-panel uk-panel-box uk-panel-box-secondary"> |
| 18 | <h5 class="title"> | 18 | <h5 class="title"> |
| 19 | - {{t.fcsjActual}} {{t.clZbh}} 已由 {{t.qdzName}} 发出 | 19 | + {{t.fcsjActual}} {{t.clZbh}} 已由 {{t.qdzName}} 发出,执行班次 {{t.dfsj}} |
| 20 | </h5> | 20 | </h5> |
| 21 | - <code>{{dataStr}}</code> | 21 | + <code>{{t.fcsjActual}}</code> |
| 22 | <div class="uk-button-group"> | 22 | <div class="uk-button-group"> |
| 23 | <a class="uk-button uk-button-mini uk-button-primary" >确定</a> | 23 | <a class="uk-button uk-button-mini uk-button-primary" >确定</a> |
| 24 | </div> | 24 | </div> |
| @@ -36,7 +36,7 @@ | @@ -36,7 +36,7 @@ | ||
| 36 | 已完成当日所有班次。 | 36 | 已完成当日所有班次。 |
| 37 | {{/if}} | 37 | {{/if}} |
| 38 | </h5> | 38 | </h5> |
| 39 | - <code>{{dataStr}}</code> | 39 | + <code>{{t.zdsjActual}}</code> |
| 40 | <div class="uk-button-group"> | 40 | <div class="uk-button-group"> |
| 41 | <a class="uk-button uk-button-mini uk-button-primary" >确定</a> | 41 | <a class="uk-button uk-button-mini uk-button-primary" >确定</a> |
| 42 | </div> | 42 | </div> |
src/main/resources/static/real_control_v2/fragments/north/nav/tts_config.html
0 → 100644
| 1 | +<div class="uk-modal ct-form-modal" id="tts-config-modal"> | ||
| 2 | + <div class="uk-modal-dialog" style="width: 530px;"> | ||
| 3 | + <a href="" class="uk-modal-close uk-close"></a> | ||
| 4 | + <div class="uk-modal-header"> | ||
| 5 | + <h2>TTS 语音设置</h2></div> | ||
| 6 | + | ||
| 7 | + <p style="border-bottom: 1px solid #efefef;color: grey;padding-bottom: 9px;"> | ||
| 8 | + <small> | ||
| 9 | + <i class="uk-icon-question-circle"> </i> | ||
| 10 | + 设置项将会保存在本地客户端,清理缓存和更换电脑会重置.</small> | ||
| 11 | + </p> | ||
| 12 | + <form class="uk-form uk-form-horizontal"> | ||
| 13 | + <div class="uk-grid"> | ||
| 14 | + <div class="uk-width-2-3 uk-container-center"> | ||
| 15 | + <div class="uk-form-row"> | ||
| 16 | + <label class="uk-form-label">启用TTS</label> | ||
| 17 | + <div class="uk-form-controls"> | ||
| 18 | + <select name="enable"> | ||
| 19 | + <option value="1">启用</option> | ||
| 20 | + <option value="0">禁用</option> | ||
| 21 | + </select> | ||
| 22 | + </div> | ||
| 23 | + </div> | ||
| 24 | + </div> | ||
| 25 | + </div> | ||
| 26 | + <div class="uk-grid"> | ||
| 27 | + <div class="uk-width-2-3 uk-container-center"> | ||
| 28 | + <div class="uk-form-row"> | ||
| 29 | + <label class="uk-form-label">发音速度</label> | ||
| 30 | + <div class="uk-form-controls"> | ||
| 31 | + <input name="rate" max=10 data-fv-lessthan-inclusive="false" style="width: calc(100% - 80px);" /> | ||
| 32 | + <span class="uk-form-help-inline">1 ~ 10</span> | ||
| 33 | + </div> | ||
| 34 | + </div> | ||
| 35 | + </div> | ||
| 36 | + </div> | ||
| 37 | + | ||
| 38 | + <div class="uk-grid"> | ||
| 39 | + <div class="uk-width-2-3 uk-container-center"> | ||
| 40 | + <div class="uk-form-row"> | ||
| 41 | + <label class="uk-form-label">播放队列</label> | ||
| 42 | + <div class="uk-form-controls"> | ||
| 43 | + <select name="queueModel"> | ||
| 44 | + <option value="1">总是最新</option> | ||
| 45 | + <option value="-1">按顺序完整播报</option> | ||
| 46 | + </select> | ||
| 47 | + <p class="uk-form-help-block"></p> | ||
| 48 | + </div> | ||
| 49 | + </div> | ||
| 50 | + </div> | ||
| 51 | + </div> | ||
| 52 | + | ||
| 53 | + <div class="uk-grid"> | ||
| 54 | + <div class="uk-width-1-1" style="margin-top: 25px;"> | ||
| 55 | + <div class="uk-panel uk-panel-box" style="font-size: 12px;color: grey;"> | ||
| 56 | + 我能吞下玻璃而不伤身体 | ||
| 57 | + <button class="uk-button uk-button-success uk-button-mini" type="button" id="tts-audition-btn"> | ||
| 58 | + <i class="uk-icon-volume-down"> </i> 试听</button> | ||
| 59 | + </div> | ||
| 60 | + </div> | ||
| 61 | + </div> | ||
| 62 | + | ||
| 63 | + <div class="uk-modal-footer uk-text-right" style="margin-bottom: -20px;"> | ||
| 64 | + <button type="button" class="uk-button uk-modal-close">取消</button> | ||
| 65 | + <button type="submit" class="uk-button uk-button-primary"><i class="uk-icon-check"></i> 保存</button> | ||
| 66 | + </div> | ||
| 67 | + </form> | ||
| 68 | + </div> | ||
| 69 | + | ||
| 70 | + <script> | ||
| 71 | + (function() { | ||
| 72 | + var modal = '#tts-config-modal'; | ||
| 73 | + var f = $('form', modal); | ||
| 74 | + | ||
| 75 | + $(modal).on('init', function(e, data) { | ||
| 76 | + var config=gb_tts.defaultConfig(); | ||
| 77 | + for(var name in config) | ||
| 78 | + $('[name='+name+']', f).val(config[name]).trigger('change'); | ||
| 79 | + | ||
| 80 | + }); | ||
| 81 | + | ||
| 82 | + $('select[name=queueModel]', f).on('change', function(){ | ||
| 83 | + var val=$(this).val() | ||
| 84 | + ,$help=$(this).next('.uk-form-help-block'); | ||
| 85 | + | ||
| 86 | + if(val == 1) | ||
| 87 | + $help.text('有新的语音,强制中断未结束的语音'); | ||
| 88 | + else | ||
| 89 | + $help.text('按照队列顺序依次完整播报'); | ||
| 90 | + }); | ||
| 91 | + | ||
| 92 | + $('#tts-audition-btn', f).on('click', function(){ | ||
| 93 | + var msg='我能吞下玻璃而不伤身体' | ||
| 94 | + ,rate=$('[name=rate]',f).val(); | ||
| 95 | + gb_tts.audition(msg, rate); | ||
| 96 | + }); | ||
| 97 | + | ||
| 98 | + f.formValidation(gb_form_validation_opts); | ||
| 99 | + f.on('success.form.fv', function(e) { | ||
| 100 | + e.preventDefault(); | ||
| 101 | + var data = $(this).serializeJSON(); | ||
| 102 | + gb_tts.writeConfig(data); | ||
| 103 | + UIkit.modal(modal).hide(); | ||
| 104 | + notify_succ('TTS配置修改成功!'); | ||
| 105 | + }); | ||
| 106 | + | ||
| 107 | + })(); | ||
| 108 | + </script> | ||
| 109 | +</div> |
src/main/resources/static/real_control_v2/js/utils/tts.js
0 → 100644
| 1 | +var gb_tts = (function() { | ||
| 2 | + | ||
| 3 | + var storage = window.localStorage; | ||
| 4 | + var defaultConfig = { | ||
| 5 | + //发音速度 1 ~ 10 | ||
| 6 | + rate: 1.2, | ||
| 7 | + //播放队列 1:覆盖式(总是播放最新) -1:完整的按顺序播报 | ||
| 8 | + queueModel: 1, | ||
| 9 | + enable: 1 | ||
| 10 | + }; | ||
| 11 | + | ||
| 12 | + var readLocal = function() { | ||
| 13 | + //从本地客户端读取配置信息 | ||
| 14 | + var cofig = storage.getItem('tts_cofig'); | ||
| 15 | + if (cofig) { | ||
| 16 | + cofig = JSON.parse(cofig); | ||
| 17 | + defaultConfig = cofig; | ||
| 18 | + } | ||
| 19 | + } | ||
| 20 | + | ||
| 21 | + var writeConfig = function(newConfig) { | ||
| 22 | + storage.setItem('tts_cofig', JSON.stringify(newConfig)); | ||
| 23 | + defaultConfig = newConfig; | ||
| 24 | + } | ||
| 25 | + | ||
| 26 | + var synth = window.speechSynthesis; | ||
| 27 | + readLocal(); | ||
| 28 | + | ||
| 29 | + var speak = function(t, lineCode) { | ||
| 30 | + if (defaultConfig.enable != 1) | ||
| 31 | + return; | ||
| 32 | + if (defaultConfig.queueModel == 1) | ||
| 33 | + synth.cancel(); | ||
| 34 | + | ||
| 35 | + t = gb_data_basic.codeToLine[lineCode].name + t; | ||
| 36 | + //延迟100毫秒,防止中断旧语音时 将新的语音也中断 | ||
| 37 | + setTimeout(function() { | ||
| 38 | + var msg = new SpeechSynthesisUtterance(t); | ||
| 39 | + msg.rate = defaultConfig.rate; | ||
| 40 | + synth.speak(msg); | ||
| 41 | + }, 100); | ||
| 42 | + } | ||
| 43 | + | ||
| 44 | + var audition = function(t, rate) { | ||
| 45 | + var msg = new SpeechSynthesisUtterance(t); | ||
| 46 | + msg.rate = rate; | ||
| 47 | + synth.speak(msg); | ||
| 48 | + } | ||
| 49 | + | ||
| 50 | + return { | ||
| 51 | + readLocal: readLocal, | ||
| 52 | + writeConfig: writeConfig, | ||
| 53 | + defaultConfig: function() { | ||
| 54 | + return defaultConfig | ||
| 55 | + }, | ||
| 56 | + speak: speak, | ||
| 57 | + audition: audition | ||
| 58 | + }; | ||
| 59 | +})(); |