yh-pub 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.MD +19 -0
  2. package/layout/admin/adminIndex.vue +104 -0
  3. package/layout/admin/api/loginApi.js +24 -0
  4. package/layout/admin/api/routers.js +93 -0
  5. package/layout/admin/api/tenantApi.js +123 -0
  6. package/layout/admin/home/homeIndex.vue +25 -0
  7. package/layout/admin/login/login.vue +161 -0
  8. package/layout/admin/menu/MenuIndex.vue +648 -0
  9. package/layout/admin/menu/icon.vue +108 -0
  10. package/layout/admin/menu/iconList.js +934 -0
  11. package/layout/admin/saTenant/saTenant.js +0 -0
  12. package/layout/admin/saTenant/saTenant.vue +173 -0
  13. package/layout/admin/saTenant/saTenantForm.js +80 -0
  14. package/layout/admin/saTenant/saTenantForm.vue +61 -0
  15. package/layout/admin/saTenant/saTenantRoleManage.js +417 -0
  16. package/layout/admin/saTenant/saTenantRoleManage.vue +99 -0
  17. package/layout/admin/user/saUser.less +6 -0
  18. package/layout/admin/user/saUser.vue +72 -0
  19. package/layout/main/components/console/console.vue +205 -0
  20. package/layout/main/components/error-store/error-store.vue +72 -0
  21. package/layout/main/components/error-store/index.js +2 -0
  22. package/layout/main/components/fullscreen/fullscreen.vue +57 -0
  23. package/layout/main/components/fullscreen/index.js +2 -0
  24. package/layout/main/components/language/language.vue +71 -0
  25. package/layout/main/components/side-menu/side-menu.less +74 -0
  26. package/layout/main/components/side-menu/side-menu.vue +75 -0
  27. package/layout/main/components/tags-nav/tags-nav.less +45 -0
  28. package/layout/main/components/tags-nav/tags-nav.vue +144 -0
  29. package/layout/main/components/user/user.less +12 -0
  30. package/layout/main/components/user/user.vue +185 -0
  31. package/layout/main/home/home.vue +480 -0
  32. package/layout/main/home/index.js +2 -0
  33. package/layout/main/home/toDoList.vue +32 -0
  34. package/layout/main/login/login.less +93 -0
  35. package/layout/main/login/login.vue +151 -0
  36. package/layout/main/main.less +81 -0
  37. package/layout/main/main.vue +202 -0
  38. package/layout/main/system/dict.vue +64 -0
  39. package/layout/main/system/orgManage.vue +473 -0
  40. package/layout/main/system/roleManage.js +755 -0
  41. package/layout/main/system/roleManage.vue +399 -0
  42. package/package.json +12 -0
  43. package/view/basic/error-logger.vue +74 -0
  44. package/view/basic/error-page/401.vue +22 -0
  45. package/view/basic/error-page/404.vue +22 -0
  46. package/view/basic/error-page/500.vue +22 -0
  47. package/view/basic/error-page/back-btn-group.vue +48 -0
  48. package/view/basic/error-page/error-content.vue +28 -0
  49. package/view/basic/error-page/error.less +46 -0
  50. package/view/config/component/confFormItem.vue +49 -0
  51. package/view/config/config.scss +45 -0
  52. package/view/config/configIndex.vue +150 -0
  53. package/view/config/subPage/router-config.vue +5 -0
  54. package/view/config/subPage/sys-config.vue +249 -0
  55. package/view/window/IframeFReportView.vue +28 -0
  56. package/view/window/windowIndex.vue +22 -0
@@ -0,0 +1,205 @@
1
+ <template>
2
+ <div
3
+ class="console"
4
+ ref="tongs_console">
5
+ <el-tabs :model-value="activeIndex">
6
+ <el-tab-pane
7
+ name="1"
8
+ label="AGV日志">
9
+ <div class="console_cell">
10
+ <div
11
+ class="panel"
12
+ ref="agvLogs">
13
+ <div
14
+ v-for="info in agvLogs"
15
+ class="info">
16
+ [{{ info.time }}] - {{ info.msg }}
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </el-tab-pane>
21
+ <el-tab-pane
22
+ name="2"
23
+ label="RGV日志">
24
+ <div class="console_cell">
25
+ <div
26
+ class="panel"
27
+ ref="rgvLogs">
28
+ <div
29
+ v-for="info in rgvLogs"
30
+ class="info">
31
+ [{{ info.time }}] - {{ info.msg }}
32
+ </div>
33
+ </div>
34
+ </div>
35
+ </el-tab-pane>
36
+ <el-tab-pane
37
+ name="3"
38
+ label="堆垛机日志">
39
+ <div class="console_cell">
40
+ <div
41
+ class="panel"
42
+ ref="stackerLogs">
43
+ <div
44
+ v-for="info in stackerLogs"
45
+ class="info">
46
+ [{{ info.time }}] - {{ info.msg }}
47
+ </div>
48
+ </div>
49
+ </div>
50
+ </el-tab-pane>
51
+ <el-tab-pane
52
+ name="4"
53
+ label="控制台日志">
54
+ <div class="console_cell">
55
+ <div
56
+ class="panel"
57
+ ref="consoles">
58
+ <div
59
+ v-for="info in consoles"
60
+ class="info">
61
+ [{{ info.time }}] - {{ info.msg }}
62
+ </div>
63
+ </div>
64
+ </div>
65
+ </el-tab-pane>
66
+ </el-tabs>
67
+ </div>
68
+ </template>
69
+
70
+ <script>
71
+ import config from "@/config";
72
+ import { getToken } from "@/libs/util";
73
+ import LogConsole from "./console.vue";
74
+
75
+ const baseUrl = process.env.NODE_ENV === "development" ? config.baseUrl.dev : config.baseUrl.pro;
76
+
77
+ export default {
78
+ name: "console",
79
+ components: {},
80
+ props: {
81
+ code: String,
82
+ desc: String,
83
+ src: String,
84
+ },
85
+ data() {
86
+ return {
87
+ activeIndex: "1",
88
+ websocketPath: baseUrl.replace("http", "ws") + "/consoleSocket",
89
+ websocket: "",
90
+ agvLogs: [],
91
+ rgvLogs: [],
92
+ stackerLogs: [],
93
+ consoles: [],
94
+ pageDestroyed: false,
95
+ };
96
+ },
97
+ methods: {
98
+ initWebsocket() {
99
+ let token = getToken();
100
+ if (typeof WebSocket === "undefined") {
101
+ this.$message.info("您的浏览器不支持WebSocket");
102
+ } else if (token) {
103
+ let self = this;
104
+ if (!window.websocket) {
105
+ window.agvLogs = [];
106
+ let websocketPath = this.websocketPath + "?$_TOKEN=" + token;
107
+
108
+ window.initWebSocket = function () {
109
+ // 实例化websocket
110
+ window.websocket = new WebSocket(websocketPath);
111
+ // 监听websocket的连接
112
+ window.websocket.onopen = () => {
113
+ console.log("(" + this.websocketPath + ") websocket连接成功");
114
+ };
115
+ // 监听websocket的错误信息
116
+ window.websocket.onerror = () => {
117
+ console.log("(" + this.websocketPath + ") websocket连接错误");
118
+ };
119
+ // 监听websocket的消息
120
+ window.websocket.onmessage = (res) => {
121
+ console.info("接收到消息", res);
122
+ let data = {};
123
+ eval("data=" + res.data);
124
+ if (data) {
125
+ data.time = data.time ? data.time.substring(11) : "";
126
+
127
+ if (data.type == "3" || data.type == "4") {
128
+ window.agvLogs.push(data);
129
+ } else if (data.type == "5") {
130
+ window.rgvLogs.push(data);
131
+ } else if (data.type == "7") {
132
+ window.stackerLogs.push(data);
133
+ } else {
134
+ window.consoles.push(data);
135
+ }
136
+ }
137
+
138
+ self.scrollTop();
139
+ };
140
+ // 监听websocket关闭
141
+ window.websocket.onclose = () => {
142
+ console.log("websocket关闭,尝试重新连接websocket");
143
+ window.setTimeout(() => {
144
+ window.initWebSocket();
145
+ }, 5000);
146
+ };
147
+ };
148
+ window.initWebSocket();
149
+ }
150
+ }
151
+
152
+ this.agvLogs = window.agvLogs;
153
+ this.rgvLogs = window.rgvLogs;
154
+ this.stackerLogs = window.stackerLogs;
155
+ this.consoles = window.consoles;
156
+ },
157
+ scrollTop() {
158
+ this.$nextTick(() => {
159
+ let div = this.$refs["agvLogs"];
160
+ if (div) div.scrollTop = div.scrollHeight;
161
+ div = this.$refs["rgvLogs"];
162
+ if (div) div.scrollTop = div.scrollHeight;
163
+ div = this.$refs["stackerLogs"];
164
+ if (div) div.scrollTop = div.scrollHeight;
165
+ div = this.$refs["consoles"];
166
+ if (div) div.scrollTop = div.scrollHeight;
167
+ });
168
+ },
169
+ },
170
+ mounted() {
171
+ this.initWebsocket();
172
+ },
173
+ beforeDestroy() {
174
+ if (window.websocket) {
175
+ console.info("关闭了websocket");
176
+ window.websocket.close();
177
+ }
178
+ },
179
+ };
180
+ </script>
181
+ <style>
182
+ .console {
183
+ color: #ffffff;
184
+ width: 100%;
185
+ height: 100%;
186
+ min-height: 800px;
187
+ }
188
+ .console .console_cell {
189
+ border-right: 1px #ffffff solid;
190
+ height: calc(100% - 5px);
191
+ background-color: #303030;
192
+ }
193
+ .console .panel {
194
+ min-height: 500px;
195
+ height: calc(100% - 55px);
196
+ padding: 10px;
197
+ overflow: auto;
198
+ }
199
+ .console .info {
200
+ font-size: 13px;
201
+ line-height: 18px;
202
+ color: #ffffff;
203
+ }
204
+ </style>
205
+ @/libs/util
@@ -0,0 +1,72 @@
1
+ <template>
2
+ <el-badge
3
+ class="error-store"
4
+ :value="countComputed"
5
+ @click="openErrorLoggerPage">
6
+ <i class="iconfont icon-error"></i>
7
+ </el-badge>
8
+ </template>
9
+
10
+ <script>
11
+ export default {
12
+ name: "ErrorStore",
13
+ props: {
14
+ count: {
15
+ type: Number,
16
+ default: 0,
17
+ },
18
+ hasRead: {
19
+ type: Boolean,
20
+ default: false,
21
+ },
22
+ },
23
+ data() {
24
+ return {
25
+ startDebug: false,
26
+ };
27
+ },
28
+ computed: {
29
+ countComputed() {
30
+ return this.hasRead ? 0 : this.count;
31
+ },
32
+ },
33
+ methods: {
34
+ openErrorLoggerPage() {
35
+ let url = "system/startDebug";
36
+ if (!this.startDebug) {
37
+ this.startDebug = true;
38
+ } else {
39
+ url = "system/stopDebug";
40
+ this.startDebug = false;
41
+ }
42
+ this.axios
43
+ .request({
44
+ url: url,
45
+ params: {},
46
+ method: "post",
47
+ })
48
+ .then((res) => {
49
+ this.$message.info(res.data.msg);
50
+ })
51
+ .catch((res) => {
52
+ // this.$message.error(res.data.msg);
53
+ });
54
+ },
55
+ },
56
+ };
57
+ </script>
58
+
59
+ <style lang="less">
60
+ .error-store {
61
+ margin-right: 12px;
62
+ height: 32px;
63
+ line-height: 32px;
64
+ border: 0;
65
+ .ivu-badge-dot {
66
+ top: 20px;
67
+ }
68
+ .ivu-btn.ivu-btn-text {
69
+ padding: 2px 1px 6px;
70
+ }
71
+ }
72
+ </style>
@@ -0,0 +1,2 @@
1
+ import ErrorStore from './error-store.vue'
2
+ export default ErrorStore
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <div
3
+ v-if="showFullScreenBtn"
4
+ class="full-screen-btn-con"
5
+ @click.native="handleChange"
6
+ >
7
+ <el-tooltip :content="ct('退出全屏')" placement="bottom">
8
+ <i v-show="isFullscreen" class="iconfont icon-fullscreen-exit"></i>
9
+ </el-tooltip>
10
+ <el-tooltip :content="ct('全屏')" placement="bottom">
11
+ <i v-show="!isFullscreen" class="iconfont icon-fullscreen"></i>
12
+ </el-tooltip>
13
+ </div>
14
+ </template>
15
+
16
+ <script setup>
17
+ import { ref, onMounted } from "vue";
18
+ import { ct } from "yh-i18n";
19
+ const showFullScreenBtn = ref(window.navigator.userAgent.indexOf("MSIE") < 0);
20
+ const emits = defineEmits(["change"]);
21
+
22
+ const isFullscreen = ref(false);
23
+ function handleFullscreen() {
24
+ let main = document.body;
25
+ let flag = document.fullscreenElement !== null;
26
+ if (flag) {
27
+ document.exitFullscreen();
28
+ isFullscreen.value = false;
29
+ } else {
30
+ main.requestFullscreen();
31
+ isFullscreen.value = true;
32
+ }
33
+ emits("change", isFullscreen.value);
34
+ }
35
+ function handleChange() {
36
+ handleFullscreen();
37
+ }
38
+ onMounted(() => {
39
+ isFullscreen.value = document.fullscreenElement !== null;
40
+ emits("change", isFullscreen.value);
41
+ });
42
+ </script>
43
+
44
+ <style lang="less">
45
+ .full-screen-btn-con {
46
+ width: var(--header-size);
47
+ height: 32px;
48
+ line-height: 32px;
49
+ border: 0;
50
+ text-align: center;
51
+ cursor: pointer;
52
+ i {
53
+ font-size: 30px;
54
+ color: var(--el-color-white);
55
+ }
56
+ }
57
+ </style>
@@ -0,0 +1,2 @@
1
+ import Fullscreen from './fullscreen.vue'
2
+ export default Fullscreen
@@ -0,0 +1,71 @@
1
+ <template>
2
+ <el-dropdown
3
+ split-button
4
+ class="language-dropdown"
5
+ trigger="click"
6
+ @command="selectLang">
7
+ {{ title }}
8
+ <template #dropdown>
9
+ <el-dropdown-menu>
10
+ <el-dropdown-item
11
+ v-for="(value, key) in localList"
12
+ :commnd="key">
13
+ {{ value }}
14
+ </el-dropdown-item>
15
+ </el-dropdown-menu>
16
+ </template>
17
+ </el-dropdown>
18
+ </template>
19
+
20
+ <script setup>
21
+ import { reactive, computed } from "vue";
22
+ import { delStorage } from "@/libs/util";
23
+ import axios from "@/libs/api.request";
24
+ import { useAppStore } from "@/store/app.js";
25
+
26
+ const appStore = useAppStore();
27
+
28
+ const langList = reactive({
29
+ zh_CN: "中文",
30
+ en_US: "English",
31
+ });
32
+ const localList = reactive({
33
+ zh_CN: "中文简体",
34
+ en_US: "English",
35
+ });
36
+
37
+ const title = computed(() => {
38
+ return langList[appStore.local];
39
+ });
40
+
41
+ function selectLang(e) {
42
+ axios.post("loginController/setLanguage", { language: e }).then((res) => {
43
+ if (res.data.result) {
44
+ delStorage("menu");
45
+ this.$router.push({
46
+ name: this.$config.homeName,
47
+ });
48
+ window.location.reload();
49
+ }
50
+ });
51
+ }
52
+ </script>
53
+ <style lang="scss">
54
+ .language-dropdown.el-dropdown {
55
+ padding: 0 10px;
56
+ color: var(--el-color-white);
57
+ .el-button {
58
+ --el-button-text-color: var(--el-color-white);
59
+ --el-button-active-text-color: var(--el-color-white);
60
+ --el-button-hover-text-color: var(--el-color-white);
61
+ --el-button-bg-color: transparent;
62
+ --el-button-active-bg-color: transparent;
63
+ --el-button-hover-bg-color: transparent;
64
+ --el-button-outline-color: transparent;
65
+ --el-button-active-border-color: var(--el-color-white);
66
+ --el-button-hover-border-color: var(--el-color-white);
67
+ --el-button-border-color: var(--el-color-white);
68
+ }
69
+ }
70
+ </style>
71
+ @/libs/util@/libs/api.request@/store/app.js
@@ -0,0 +1,74 @@
1
+ .side-menu-wrapper {
2
+ user-select: none;
3
+ height: calc(~"100% - 50px");
4
+ overflow-y: auto;
5
+ overflow-x: hidden;
6
+ &::-webkit-scrollbar {
7
+ width: 5px;
8
+ height: 5px;
9
+ }
10
+ /* 滚动条滑块 */
11
+ &::-webkit-scrollbar-thumb {
12
+ border-radius: 5px;
13
+ background: #72797f;
14
+ }
15
+ &::-webkit-scrollbar-track {
16
+ border-radius: 5px;
17
+ background: #001529;
18
+ }
19
+ .el-sub-menu__title,
20
+ .el-menu-item {
21
+ .iconfont {
22
+ display: inline-block;
23
+ max-width: 16px;
24
+ min-width: 0;
25
+ text-align: center;
26
+ margin-right: 10px;
27
+ padding: 0;
28
+ font-size: 16px;
29
+ }
30
+ transform: background 0.3s ease-in-out 0s;
31
+ &.is-active,
32
+ &:hover {
33
+ background: linear-gradient(90deg, #3377ff, #0455c3);
34
+ }
35
+ }
36
+ }
37
+ .side-pupper-menu {
38
+ --el-menu-bg-color: #21304c;
39
+ --el-menu-text-color: var(--el-color-white);
40
+ --el-menu-active-color: var(--el-color-white);
41
+ --el-menu-hover-bg-color: transparent;
42
+ max-height: 100%;
43
+ overflow: auto;
44
+ background-color: var(--el-menu-bg-color);
45
+ &::-webkit-scrollbar {
46
+ width: 5px;
47
+ height: 5px;
48
+ }
49
+ /* 滚动条滑块 */
50
+ &::-webkit-scrollbar-thumb {
51
+ border-radius: 5px;
52
+ background: #72797f;
53
+ }
54
+ &::-webkit-scrollbar-track {
55
+ border-radius: 5px;
56
+ background: var(--el-menu-bg-color);
57
+ }
58
+ .el-menu-item {
59
+ .iconfont {
60
+ display: inline-block;
61
+ max-width: 16px;
62
+ min-width: 0;
63
+ text-align: center;
64
+ margin-right: 10px;
65
+ padding: 0;
66
+ font-size: 16px;
67
+ }
68
+ transform: background 0.3s ease-in-out 0s;
69
+ &.is-active,
70
+ &:hover {
71
+ background: linear-gradient(90deg, #3377ff, #0455c3);
72
+ }
73
+ }
74
+ }
@@ -0,0 +1,75 @@
1
+ <template>
2
+ <el-menu
3
+ :collapse="collapse"
4
+ :collapse-transition="false"
5
+ router
6
+ :default-active="$route.path"
7
+ class="side-menu-wrapper">
8
+ <template v-for="item in menuList">
9
+ <el-menu-item
10
+ :index="item.id"
11
+ v-if="!item.hasChildren">
12
+ <i :class="item.icon"></i>
13
+ <span>{{ item.title }}</span>
14
+ </el-menu-item>
15
+ <el-sub-menu
16
+ :index="item.id"
17
+ popper-class="side-pupper-menu"
18
+ v-else>
19
+ <template #title>
20
+ <i :class="item.icon"></i>
21
+ <span>{{ item.title }}</span>
22
+ </template>
23
+ <template v-for="cItem in item.children">
24
+ <el-menu-item
25
+ :index="cItem.id"
26
+ v-if="!cItem.hasChildren">
27
+ <i :class="cItem.icon"></i>
28
+ <span>{{ cItem.title }}</span>
29
+ </el-menu-item>
30
+ <el-sub-menu
31
+ :index="cItem.id"
32
+ popper-class="side-pupper-menu"
33
+ v-else>
34
+ <template #title>
35
+ <i :class="cItem.icon"></i>
36
+ <span>{{ cItem.title }}</span>
37
+ </template>
38
+ <template v-for="tItem in cItem.children">
39
+ <el-menu-item
40
+ :index="tItem.id"
41
+ v-if="!tItem.hasChildren">
42
+ <i :class="tItem.icon"></i>
43
+ <span>{{ tItem.title }}</span>
44
+ </el-menu-item>
45
+ <el-menu-item
46
+ v-else
47
+ v-for="tti in tItem.children"
48
+ :index="tti.id">
49
+ <i :class="tti.icon"></i>
50
+ <span>{{ tti.title }}</span>
51
+ </el-menu-item>
52
+ </template>
53
+ </el-sub-menu>
54
+ </template>
55
+ </el-sub-menu>
56
+ </template>
57
+ </el-menu>
58
+ </template>
59
+ <script setup>
60
+ const props = defineProps({
61
+ menuList: {
62
+ type: Array,
63
+ default() {
64
+ return [];
65
+ },
66
+ },
67
+ collapse: {
68
+ type: Boolean,
69
+ required: false,
70
+ },
71
+ });
72
+ </script>
73
+ <style lang="less">
74
+ @import "./side-menu.less";
75
+ </style>
@@ -0,0 +1,45 @@
1
+
2
+ .tags-nav {
3
+ position: relative;
4
+ height: 40px;
5
+ user-select: none;
6
+ .contextmenu {
7
+ position: absolute;
8
+ margin: 0;
9
+ padding: 5px 0;
10
+ background: #fff;
11
+ z-index: 1000;
12
+ list-style-type: none;
13
+ border-radius: 4px;
14
+ box-shadow: 2px 2px 3px 0 rgba(0, 0, 0, 0.1);
15
+ li {
16
+ margin: 0;
17
+ padding: 5px 15px;
18
+ cursor: pointer;
19
+ font-size: 14px;
20
+ color: var(--el-text-color-secondary);
21
+ &:hover {
22
+ background: #eee;
23
+ }
24
+ }
25
+ }
26
+ .el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2):hover,
27
+ .el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2):not(.is-active).is-closable:hover{
28
+ padding-left: 20px;
29
+ }
30
+ .el-tabs{
31
+ --el-tabs-header-height: 40px;
32
+ &.el-tabs--border-card{
33
+ border-bottom: 0;
34
+ .el-tabs__item {
35
+ border-left: 1px solid var(--el-border-color-lighter)
36
+ }
37
+ }
38
+ .el-tabs__nav-scroll {
39
+ padding: 0 20px;
40
+ }
41
+ .el-tabs__content{
42
+ display: none;
43
+ }
44
+ }
45
+ }