基于廊坊系统为基础,国防科技大学系统演示Demo
surprise
2024-04-28 c310c155e3e91e6b285b3fb3519a3ef7c6690d66
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
<!-- 切换主题色  -->
<template>
  <div>
    <el-switch
      v-show="false"
      v-model="switchColor"
      active-color="#13ce66"
      inactive-color="#ff4949"
      @change="setSwitchColor"
    >
    </el-switch>
    <el-color-picker
      v-show="false"
      @change="colorChange"
      v-model="colors.primary"
    ></el-color-picker>
  </div>
</template>
<script>
import generateColors from '../../utils/color';
import objectAssign from 'object-assign';
export default {
  name: 'App',
  data() {
    return {
      switchColor: true,
      originalStylesheetCount: -1, //记录当前已引入style数量
      originalStyle: '', //获取拿到的.css的字符串
      colors: {
        //颜色选择器默认颜色值,这个值要和element-variables一样
        primary: '#303030',
      },
      // primaryColor: "", //提交成功后设置默认颜色
      cssUrl: [
        '//unpkg.com/element-ui/lib/theme-chalk/index.css',
        './static/css/index.css',
      ],
    };
  },
  methods: {
    setSwitchColor() {
      if (this.switchColor == false) {
        let val = '#409EFF';
        this.colorChange(val);
        this.colors.primary = val;
      } else if (this.switchColor == true) {
        let val = '#303030';
        this.colorChange(val);
        this.colors.primary = val;
      }
    },
    colorChange(e) {
      if (!e) return;
 
      localStorage.setItem('color', e);
      this.primaryColor = this.colors.primary;
      this.colors = objectAssign(
        {},
        this.colors,
        generateColors(this.colors.primary)
      );
      this.writeNewStyle();
    },
    writeNewStyle() {
      let cssText = this.originalStyle;
      Object.keys(this.colors).forEach((key) => {
        cssText = cssText.replace(
          new RegExp('(:|\\s+)' + key, 'g'),
          '$1' + this.colors[key]
        );
      });
      if (this.originalStylesheetCount === document.styleSheets.length) {
        // 如果之前没有插入就插入
        const style = document.createElement('style');
        style.innerText =
          '.primaryColor{background-color:' +
          this.colors.primary +
          '}' +
          cssText;
        document.head.appendChild(style);
      } else {
        // 如果之前没有插入就修改
        document.head.lastChild.innerText =
          '.primaryColor{background-color:' +
          this.colors.primary +
          '} ' +
          cssText;
      }
    },
    getIndexStyle(url) {
      let that = this;
      var request = new XMLHttpRequest();
      request.open('GET', url);
      request.onreadystatechange = function () {
        if (
          request.readyState === 4 &&
          (request.status == 200 || request.status == 304)
        ) {
          // 调用本地的如果拿不到会得到html,html是不行的
          if (request.response && !/DOCTYPE/gi.test(request.response)) {
            that.originalStyle = that.getStyleTemplate(request.response);
            that.writeNewStyle();
          } else {
            that.originalStyle = '';
          }
        } else {
          that.originalStyle = '';
        }
      };
      request.send(null);
    },
    getStyleTemplate(data) {
      const colorMap = {
        '#3a8ee6': 'shade-1',
        '#409eff': 'primary',
        '#53a8ff': 'light-1',
        '#66b1ff': 'light-2',
        '#79bbff': 'light-3',
        '#8cc5ff': 'light-4',
        '#a0cfff': 'light-5',
        '#b3d8ff': 'light-6',
        '#c6e2ff': 'light-7',
        '#d9ecff': 'light-8',
        '#ecf5ff': 'light-9',
      };
      Object.keys(colorMap).forEach((key) => {
        const value = colorMap[key];
        data = data.replace(new RegExp(key, 'ig'), value);
      });
      return data;
    },
  },
  mounted() {
    // 默认从线上官方拉取最新css,2秒钟后做一个检查没有拉到就从本地在拉下
    let that = this;
    // 如果是记住用户的状态就需要,在主题切换的时候记录颜色值,在下次打开的时候从新赋值
    this.colors.primary = localStorage.getItem('color') || this.colors.primary; //例如
    this.getIndexStyle(this.cssUrl[0]);
 
    setTimeout(function () {
      if (that.originalStyle) {
        return;
      } else {
        that.getIndexStyle(that.cssUrl[1]);
      }
    }, 2000);
    this.$nextTick(() => {
      // 获取页面一共引入了多少个style 文件
      this.originalStylesheetCount = document.styleSheets.length;
      this.setSwitchColor();
    });
  },
};
</script>
<style></style>