ThemeSetting.js 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. const template=`
  2. <div class="toolBar-icon font-size-icon hide-800" @click="drawerVisible=!drawerVisible">
  3. <i class="fa fa-gears"></i>
  4. </div>
  5. <el-drawer v-model="drawerVisible" title="布局设置" size="300px">
  6. <!-- 布局切换 -->
  7. <el-divider class="divider" content-position="center">
  8. 布局切换
  9. </el-divider>
  10. <div class="layout-box mb30">
  11. <el-tooltip effect="dark" content="纵向" placement="top" :show-after="200">
  12. <div @click="changeLayout('vertical');" :class="['layout-item layout-vertical', { 'is-active': elementUi.layout == 'vertical' }]">
  13. <div class="layout-light-top"></div>
  14. <div class="layout-container">
  15. <div class="layout-light"></div>
  16. <div class="layout-content"></div>
  17. </div>
  18. <i class="fa fa-check-circle" v-if="elementUi.layout == 'vertical'"></i>
  19. </div>
  20. </el-tooltip>
  21. <el-tooltip effect="dark" content="经典" placement="top" :show-after="200">
  22. <div @click="changeLayout('classic');" :class="['layout-item layout-classic', { 'is-active': elementUi.layout == 'classic' }]">
  23. <div class="layout-dark"></div>
  24. <div class="layout-container">
  25. <div class="layout-light"></div>
  26. <div class="layout-content"></div>
  27. </div>
  28. <i class="fa fa-check-circle" v-if="elementUi.layout == 'classic'"></i>
  29. </div>
  30. </el-tooltip>
  31. <el-tooltip effect="dark" content="横向" placement="top" :show-after="200">
  32. <div @click="changeLayout('transverse');" :class="['layout-item layout-transverse', { 'is-active': elementUi.layout == 'transverse' }]">
  33. <div class="layout-dark"></div>
  34. <div class="layout-content"></div>
  35. <i class="fa fa-check-circle" v-if="elementUi.layout == 'transverse'"></i>
  36. </div>
  37. </el-tooltip>
  38. <el-tooltip effect="dark" content="分栏" placement="top" :show-after="200">
  39. <div @click="changeLayout('columns');" :class="['layout-item layout-columns', { 'is-active': elementUi.layout == 'columns' }]">
  40. <div class="layout-dark"></div>
  41. <div class="layout-light"></div>
  42. <div class="layout-content"></div>
  43. <i class="fa fa-check-circle" v-if="elementUi.layout == 'columns'"></i>
  44. </div>
  45. </el-tooltip>
  46. </div>
  47. <!-- 全局主题 -->
  48. <el-divider class="divider" content-position="center">
  49. 全局主题
  50. </el-divider>
  51. <div class="theme-item">
  52. <span>暗黑模式</span>
  53. <el-switch v-model="elementUi.dark" @change="changeElementUi('dark')"></el-switch>
  54. </div>
  55. <div class="theme-item">
  56. <span>主题颜色</span>
  57. <el-color-picker v-model="elementUi.theme_color" :predefine="colorList" @change="changeThemeColor"></el-color-picker>
  58. </div>
  59. <div class="theme-item">
  60. <span>语言文字</span>
  61. <el-select v-model="elementUi.language" @change="changeElementUi('language')" style="width: 160px">
  62. <el-option v-for="(lan,key) in elementUi.language_list" :label="lan" :key="key" :value="key">{{lan}}</el-option>
  63. </el-select>
  64. </div>
  65. <!-- 界面设置 -->
  66. <el-divider class="divider" content-position="center" style="margin-top: 40px">
  67. 界面设置
  68. </el-divider>
  69. <template v-if="elementUi.layout!='transverse'">
  70. <div class="theme-item">
  71. <span>折叠菜单</span>
  72. <el-switch v-model="elementUi.is_menu_collapse" @change="changeElementUi('is_menu_collapse')"></el-switch>
  73. </div>
  74. <div class="theme-item">
  75. <span>面包屑</span>
  76. <el-switch v-model="elementUi.breadcrumb" @change="changeElementUi('breadcrumb')"></el-switch>
  77. </div>
  78. </template>
  79. <div class="theme-item">
  80. <span>标签栏</span>
  81. <el-switch v-model="elementUi.tabs" @change="changeElementUi('tabs')"></el-switch>
  82. </div>
  83. <div class="theme-item">
  84. <span>页脚</span>
  85. <el-switch v-model="elementUi.footer" @change="changeElementUi('footer')"></el-switch>
  86. </div>
  87. </el-drawer>
  88. `;
  89. export default {
  90. name: "ThemeSetting",
  91. data: function () {
  92. return {
  93. elementUi:'',
  94. drawerVisible:false,
  95. primary:'',
  96. colorList:[]
  97. }
  98. },
  99. created:function (){
  100. this.elementUi=Yunqi.getElementUi();
  101. this.colorList=[
  102. this.elementUi.theme_color,
  103. "#daa96e",
  104. "#0c819f",
  105. "#409eff",
  106. "#27ae60",
  107. "#ff5c93",
  108. "#e74c3c",
  109. "#fd726d",
  110. "#f39c12",
  111. "#9b59b6"
  112. ]
  113. },
  114. template:template,
  115. methods:{
  116. changeLayout:function (value){
  117. this.postData('layout',value,function(){
  118. location.reload();
  119. });
  120. },
  121. changeElementUi:function (key){
  122. let value=this.elementUi[key];
  123. let callback=false;
  124. if(key=='language'){
  125. callback=function (){
  126. location.reload();
  127. };
  128. }
  129. if(key=='dark'){
  130. let win=this.getAppsWindow();
  131. callback=function (){
  132. Yunqi.app.changeLogo();
  133. if(value){
  134. document.documentElement.classList.add('dark');
  135. for(let i=0;i<win.length;i++){
  136. win[i].document.documentElement.classList.add('dark');
  137. }
  138. }else{
  139. document.documentElement.classList.remove('dark');
  140. for(let i=0;i<win.length;i++){
  141. win[i].document.documentElement.classList.remove('dark');
  142. }
  143. }
  144. };
  145. }
  146. if(key=='footer' || key=='tabs'){
  147. callback=function (){
  148. Yunqi.app.setMainContentFrame();
  149. };
  150. }
  151. this.postData(key,value,callback);
  152. },
  153. changeThemeColor:function (value){
  154. let win=this.getAppsWindow();
  155. this.postData('theme_color',value,function(){
  156. Yunqi.setThemeColor();
  157. for(let i=0;i<win.length;i++){
  158. win[i].Yunqi.config.elementUi.theme_color=value;
  159. win[i].Yunqi.setThemeColor();
  160. }
  161. });
  162. },
  163. getAppsWindow:function (){
  164. let tab=Yunqi.app.tabList;
  165. let layer=Yunqi.app.layerList;
  166. let doc=[];
  167. for (let i=0;i<tab.length;i++){
  168. let id=tab[i].id;
  169. let _doc=document.querySelector('iframe[id="addtabs-'+id+'"]');
  170. if(_doc){
  171. doc.push(_doc.contentWindow);
  172. }
  173. }
  174. for (let i=0;i<layer.length;i++){
  175. let id=layer[i].id;
  176. let _doc=document.querySelector('iframe[id="layer-'+id+'"]');
  177. if(_doc){
  178. doc.push(_doc.contentWindow);
  179. }
  180. }
  181. return doc;
  182. },
  183. postData:function (key,value,callback){
  184. this.elementUi[key]=value;
  185. Yunqi.ajax.post(Yunqi.config.baseUrl+'change-theme', {key:key,value:value},false,false).then(res=>{
  186. if(callback){
  187. callback();
  188. }
  189. });
  190. }
  191. }
  192. };