├── stu-app ├── skyeye.keystore ├── static │ ├── logo.png │ ├── mine │ │ ├── pwd.png │ │ ├── about.png │ │ ├── card.png │ │ ├── calendar.png │ │ ├── message.png │ │ ├── problem.png │ │ ├── question.png │ │ └── no-userphoto.png │ ├── common │ │ ├── to.png │ │ ├── empty.png │ │ ├── exam.png │ │ └── endExam.png │ ├── login-icon.png │ ├── tabBar │ │ ├── mine.png │ │ ├── customer.png │ │ ├── message.png │ │ ├── mine-se.png │ │ ├── customer-se.png │ │ ├── message-se.png │ │ ├── sparepart.png │ │ ├── workbench.png │ │ ├── workorder.png │ │ ├── sparepart-se.png │ │ ├── workbench-se.png │ │ └── workorder-se.png │ └── chunLei-modal │ │ └── close.png ├── .gitignore ├── components │ ├── mescroll-uni │ │ ├── mescroll-body.css │ │ ├── mescroll-uni.css │ │ ├── mixins │ │ │ ├── mescroll-comp.js │ │ │ ├── mescroll-more-item.js │ │ │ └── mescroll-more.js │ │ ├── components │ │ │ ├── mescroll-up.css │ │ │ ├── mescroll-up.vue │ │ │ ├── mescroll-down.css │ │ │ ├── mescroll-down.vue │ │ │ ├── mescroll-top.vue │ │ │ └── mescroll-empty.vue │ │ ├── mescroll-uni-option.js │ │ └── mescroll-mixins.js │ ├── ly-tree │ │ └── tool │ │ │ └── util.js │ ├── uni-list │ │ ├── uni-list.vue │ │ ├── uni-refresh.vue │ │ └── uni-refresh.wxs │ ├── chunLei-modal │ │ └── tabMask.js │ ├── uni-icons │ │ └── icons.js │ ├── pickerAddress │ │ └── pickerAddress.vue │ ├── uni-badge │ │ └── uni-badge.vue │ ├── vmeitime-http │ │ └── index.js │ └── watch-login │ │ └── watch-button.vue ├── .project ├── App.vue ├── pages │ ├── exam │ │ ├── endExam │ │ │ ├── endExamList.vue │ │ │ └── endExamListItem.vue │ │ └── waitExam │ │ │ ├── waitExamList.vue │ │ │ └── waitExamListItem.vue │ ├── common │ │ ├── webView.vue │ │ └── imgPreview.vue │ ├── mine │ │ ├── myMation.vue │ │ └── myEditPwd.vue │ └── workbench │ │ └── workbench.vue ├── main.js ├── uni.scss └── socket.js ├── cloud-seal ├── skyeye.keystore ├── static │ ├── logo.png │ ├── common │ │ ├── to.png │ │ └── empty.png │ ├── login-icon.png │ ├── mine │ │ ├── about.png │ │ ├── card.png │ │ ├── pwd.png │ │ ├── message.png │ │ ├── problem.png │ │ ├── calendar.png │ │ └── question.png │ ├── tabBar │ │ ├── mine.png │ │ ├── customer.png │ │ ├── message.png │ │ ├── mine-se.png │ │ ├── message-se.png │ │ ├── sparepart.png │ │ ├── workbench.png │ │ ├── workorder.png │ │ ├── customer-se.png │ │ ├── sparepart-se.png │ │ ├── workbench-se.png │ │ └── workorder-se.png │ ├── needdelete │ │ ├── face.jpg │ │ ├── icon_file.png │ │ ├── icon_note.png │ │ ├── icon_notes.png │ │ ├── icon_holiday.png │ │ ├── icon_journal.png │ │ └── icon_attendance.png │ ├── fileconsole │ │ ├── share.png │ │ ├── my-share.png │ │ ├── new-folder.png │ │ └── my-recycle-bin.png │ ├── chunLei-modal │ │ └── close.png │ └── workordericon │ │ ├── workorder-add.png │ │ ├── workorder-all.png │ │ ├── workorder-do.png │ │ ├── workorder-sign.png │ │ ├── workorder-wechat.png │ │ ├── workorder-complate.png │ │ ├── workorder-evaluate.png │ │ ├── workorder-examine.png │ │ ├── workorder-recepit.png │ │ ├── workorder-success.png │ │ └── workorder-waitperson.png ├── .gitignore ├── components │ ├── mescroll-uni │ │ ├── mescroll-body.css │ │ ├── mescroll-uni.css │ │ ├── mixins │ │ │ ├── mescroll-comp.js │ │ │ ├── mescroll-more-item.js │ │ │ └── mescroll-more.js │ │ ├── components │ │ │ ├── mescroll-up.css │ │ │ ├── mescroll-up.vue │ │ │ ├── mescroll-down.css │ │ │ ├── mescroll-down.vue │ │ │ ├── mescroll-top.vue │ │ │ └── mescroll-empty.vue │ │ ├── mescroll-uni-option.js │ │ └── mescroll-mixins.js │ ├── ly-tree │ │ └── tool │ │ │ └── util.js │ ├── uni-list │ │ ├── uni-list.vue │ │ ├── uni-refresh.vue │ │ └── uni-refresh.wxs │ ├── chunLei-modal │ │ └── tabMask.js │ ├── uni-icons │ │ └── icons.js │ ├── pickerAddress │ │ └── pickerAddress.vue │ ├── uni-badge │ │ └── uni-badge.vue │ └── watch-login │ │ └── watch-button.vue ├── .project ├── App.vue ├── pages │ ├── notice │ │ ├── noticeDetail.vue │ │ └── myNotice │ │ │ ├── myNoticeList.vue │ │ │ └── myNoticeListItem.vue │ ├── product │ │ ├── productAllList │ │ │ ├── productAllListItem.vue │ │ │ └── productAllList.vue │ │ ├── productChoose.vue │ │ └── productChooseItem.vue │ ├── sparepart │ │ ├── sparepartAllList │ │ │ ├── sparepartAllListItem.vue │ │ │ └── sparepartAllList.vue │ │ ├── sparepartChoose │ │ │ ├── sparepartChoose.vue │ │ │ └── sparepartChooseItem.vue │ │ ├── sparepartMyUse │ │ │ ├── sparepartMyUseList.vue │ │ │ └── sparepartMyUseListItem.vue │ │ ├── sparepartMyApply │ │ │ ├── sparepartMyApplyList.vue │ │ │ └── sparepartMyApplyListItem.vue │ │ ├── sparepartMyOrder │ │ │ ├── sparepartMyOrder.vue │ │ │ └── itemModel.vue │ │ └── sparepartExamine │ │ │ ├── itemModel.vue │ │ │ └── sparepartExamine.vue │ ├── customer │ │ ├── customerList.vue │ │ ├── customerChoose.vue │ │ ├── customerListItem.vue │ │ └── customerChooseItem.vue │ ├── workorder │ │ ├── workorderChoose │ │ │ ├── workorderChoose.vue │ │ │ └── workorderChooseItem.vue │ │ ├── workMyWriteorder │ │ │ ├── workMyWriteorder.vue │ │ │ └── workMyWriteorderItem.vue │ │ ├── workorderState │ │ │ └── workorderState.vue │ │ └── workAllorderState │ │ │ └── workAllorderState.vue │ ├── fileconsole │ │ ├── recycleBin │ │ │ ├── recycleBinList.vue │ │ │ └── recycleBinItem.vue │ │ └── myShareFile │ │ │ ├── myShareFileList.vue │ │ │ └── myShareFileItem.vue │ ├── message │ │ └── messageItem │ │ │ └── groupItem.vue │ ├── worker │ │ ├── workerChoose.vue │ │ └── workerChooseItem.vue │ ├── common │ │ ├── webView.vue │ │ └── imgPreview.vue │ ├── user │ │ └── userChoose │ │ │ └── userChooseState.vue │ ├── mine │ │ ├── myEditPwd.vue │ │ └── myMation.vue │ └── workbench │ │ └── workbench.vue ├── main.js ├── uni.scss └── socket.js ├── .gitignore ├── README.en.md └── README.md /stu-app/skyeye.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/skyeye.keystore -------------------------------------------------------------------------------- /stu-app/static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/logo.png -------------------------------------------------------------------------------- /cloud-seal/skyeye.keystore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/skyeye.keystore -------------------------------------------------------------------------------- /cloud-seal/static/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/logo.png -------------------------------------------------------------------------------- /stu-app/static/mine/pwd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/mine/pwd.png -------------------------------------------------------------------------------- /stu-app/static/common/to.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/common/to.png -------------------------------------------------------------------------------- /stu-app/static/login-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/login-icon.png -------------------------------------------------------------------------------- /stu-app/static/mine/about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/mine/about.png -------------------------------------------------------------------------------- /stu-app/static/mine/card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/mine/card.png -------------------------------------------------------------------------------- /cloud-seal/static/common/to.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/common/to.png -------------------------------------------------------------------------------- /cloud-seal/static/login-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/login-icon.png -------------------------------------------------------------------------------- /cloud-seal/static/mine/about.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/mine/about.png -------------------------------------------------------------------------------- /cloud-seal/static/mine/card.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/mine/card.png -------------------------------------------------------------------------------- /cloud-seal/static/mine/pwd.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/mine/pwd.png -------------------------------------------------------------------------------- /stu-app/static/common/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/common/empty.png -------------------------------------------------------------------------------- /stu-app/static/common/exam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/common/exam.png -------------------------------------------------------------------------------- /stu-app/static/mine/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/mine/calendar.png -------------------------------------------------------------------------------- /stu-app/static/mine/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/mine/message.png -------------------------------------------------------------------------------- /stu-app/static/mine/problem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/mine/problem.png -------------------------------------------------------------------------------- /stu-app/static/mine/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/mine/question.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/mine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/mine.png -------------------------------------------------------------------------------- /cloud-seal/static/common/empty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/common/empty.png -------------------------------------------------------------------------------- /cloud-seal/static/mine/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/mine/message.png -------------------------------------------------------------------------------- /cloud-seal/static/mine/problem.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/mine/problem.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/mine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/mine.png -------------------------------------------------------------------------------- /stu-app/static/common/endExam.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/common/endExam.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/customer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/customer.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/message.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/mine-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/mine-se.png -------------------------------------------------------------------------------- /cloud-seal/static/mine/calendar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/mine/calendar.png -------------------------------------------------------------------------------- /cloud-seal/static/mine/question.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/mine/question.png -------------------------------------------------------------------------------- /cloud-seal/static/needdelete/face.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/needdelete/face.jpg -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/customer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/customer.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/message.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/message.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/mine-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/mine-se.png -------------------------------------------------------------------------------- /stu-app/static/mine/no-userphoto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/mine/no-userphoto.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/customer-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/customer-se.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/message-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/message-se.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/sparepart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/sparepart.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/workbench.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/workbench.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/workorder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/workorder.png -------------------------------------------------------------------------------- /cloud-seal/static/fileconsole/share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/fileconsole/share.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/message-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/message-se.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/sparepart.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/sparepart.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/workbench.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/workbench.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/workorder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/workorder.png -------------------------------------------------------------------------------- /stu-app/static/chunLei-modal/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/chunLei-modal/close.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/sparepart-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/sparepart-se.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/workbench-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/workbench-se.png -------------------------------------------------------------------------------- /stu-app/static/tabBar/workorder-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/stu-app/static/tabBar/workorder-se.png -------------------------------------------------------------------------------- /cloud-seal/static/chunLei-modal/close.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/chunLei-modal/close.png -------------------------------------------------------------------------------- /cloud-seal/static/fileconsole/my-share.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/fileconsole/my-share.png -------------------------------------------------------------------------------- /cloud-seal/static/needdelete/icon_file.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/needdelete/icon_file.png -------------------------------------------------------------------------------- /cloud-seal/static/needdelete/icon_note.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/needdelete/icon_note.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/customer-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/customer-se.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/sparepart-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/sparepart-se.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/workbench-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/workbench-se.png -------------------------------------------------------------------------------- /cloud-seal/static/tabBar/workorder-se.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/tabBar/workorder-se.png -------------------------------------------------------------------------------- /cloud-seal/static/fileconsole/new-folder.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/fileconsole/new-folder.png -------------------------------------------------------------------------------- /cloud-seal/static/needdelete/icon_notes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/needdelete/icon_notes.png -------------------------------------------------------------------------------- /cloud-seal/static/needdelete/icon_holiday.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/needdelete/icon_holiday.png -------------------------------------------------------------------------------- /cloud-seal/static/needdelete/icon_journal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/needdelete/icon_journal.png -------------------------------------------------------------------------------- /cloud-seal/static/fileconsole/my-recycle-bin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/fileconsole/my-recycle-bin.png -------------------------------------------------------------------------------- /cloud-seal/static/needdelete/icon_attendance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/needdelete/icon_attendance.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-add.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-add.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-all.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-all.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-do.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-do.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-sign.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-sign.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-wechat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-wechat.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-complate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-complate.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-evaluate.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-evaluate.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-examine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-examine.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-recepit.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-recepit.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-success.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-success.png -------------------------------------------------------------------------------- /cloud-seal/static/workordericon/workorder-waitperson.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/main0c/cloud-after-sale/HEAD/cloud-seal/static/workordericon/workorder-waitperson.png -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Package Files # 4 | *.war 5 | *.ear 6 | 7 | class 8 | .settings 9 | *.classpath 10 | /bin 11 | classes 12 | /target/ 13 | /unpackage/ 14 | /.project/ 15 | /logs/ 16 | /.idea/ 17 | *.iml -------------------------------------------------------------------------------- /stu-app/.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Package Files # 4 | *.war 5 | *.ear 6 | 7 | class 8 | .settings 9 | *.classpath 10 | /bin 11 | classes 12 | /target/ 13 | /unpackage/ 14 | /.project/ 15 | /logs/ 16 | /.idea/ 17 | *.iml -------------------------------------------------------------------------------- /cloud-seal/.gitignore: -------------------------------------------------------------------------------- 1 | *.class 2 | 3 | # Package Files # 4 | *.war 5 | *.ear 6 | 7 | class 8 | .settings 9 | *.classpath 10 | /bin 11 | classes 12 | /target/ 13 | /unpackage/ 14 | /.project/ 15 | /logs/ 16 | /.idea/ 17 | *.iml -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/mescroll-body.css: -------------------------------------------------------------------------------- 1 | page { 2 | -webkit-overflow-scrolling: touch; /* 使iOS滚动流畅 */ 3 | } 4 | 5 | .mescroll-body { 6 | position: relative; /* 下拉刷新区域相对自身定位 */ 7 | height: auto; /* 不可固定高度,否则overflow: hidden, 可通过设置最小高度使列表不满屏仍可下拉*/ 8 | overflow: hidden; /* 遮住顶部下拉刷新区域 */ 9 | box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */ 10 | } -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/mescroll-body.css: -------------------------------------------------------------------------------- 1 | page { 2 | -webkit-overflow-scrolling: touch; /* 使iOS滚动流畅 */ 3 | } 4 | 5 | .mescroll-body { 6 | position: relative; /* 下拉刷新区域相对自身定位 */ 7 | height: auto; /* 不可固定高度,否则overflow: hidden, 可通过设置最小高度使列表不满屏仍可下拉*/ 8 | overflow: hidden; /* 遮住顶部下拉刷新区域 */ 9 | box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */ 10 | } -------------------------------------------------------------------------------- /cloud-seal/components/ly-tree/tool/util.js: -------------------------------------------------------------------------------- 1 | export const NODE_KEY = '$treeNodeId'; 2 | 3 | export const markNodeData = function(node, data) { 4 | if (!data || data[NODE_KEY]) return; 5 | Object.defineProperty(data, NODE_KEY, { 6 | value: node.id, 7 | enumerable: false, 8 | configurable: false, 9 | writable: false 10 | }); 11 | }; 12 | 13 | export const getNodeKey = function(key, data) { 14 | if (!key) return data[NODE_KEY]; 15 | return data[key]; 16 | }; 17 | 18 | -------------------------------------------------------------------------------- /stu-app/components/ly-tree/tool/util.js: -------------------------------------------------------------------------------- 1 | export const NODE_KEY = '$treeNodeId'; 2 | 3 | export const markNodeData = function(node, data) { 4 | if (!data || data[NODE_KEY]) return; 5 | Object.defineProperty(data, NODE_KEY, { 6 | value: node.id, 7 | enumerable: false, 8 | configurable: false, 9 | writable: false 10 | }); 11 | }; 12 | 13 | export const getNodeKey = function(key, data) { 14 | if (!key) return data[NODE_KEY]; 15 | return data[key]; 16 | }; 17 | 18 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/mescroll-uni.css: -------------------------------------------------------------------------------- 1 | page { 2 | height: 100%; 3 | box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */ 4 | } 5 | 6 | .mescroll-uni-warp{ 7 | height: 100%; 8 | } 9 | 10 | .mescroll-uni { 11 | position: relative; 12 | width: 100%; 13 | height: 100%; 14 | min-height: 200rpx; 15 | overflow-y: auto; 16 | box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */ 17 | } 18 | 19 | /* 定位的方式固定高度 */ 20 | .mescroll-uni-fixed{ 21 | z-index: 1; 22 | position: fixed; 23 | top: 0; 24 | left: 0; 25 | right: 0; 26 | bottom: 0; 27 | width: auto; /* 使right生效 */ 28 | height: auto; /* 使bottom生效 */ 29 | } 30 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/mescroll-uni.css: -------------------------------------------------------------------------------- 1 | page { 2 | height: 100%; 3 | box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */ 4 | } 5 | 6 | .mescroll-uni-warp{ 7 | height: 100%; 8 | } 9 | 10 | .mescroll-uni { 11 | position: relative; 12 | width: 100%; 13 | height: 100%; 14 | min-height: 200rpx; 15 | overflow-y: auto; 16 | box-sizing: border-box; /* 避免设置padding出现双滚动条的问题 */ 17 | } 18 | 19 | /* 定位的方式固定高度 */ 20 | .mescroll-uni-fixed{ 21 | z-index: 1; 22 | position: fixed; 23 | top: 0; 24 | left: 0; 25 | right: 0; 26 | bottom: 0; 27 | width: auto; /* 使right生效 */ 28 | height: auto; /* 使bottom生效 */ 29 | } 30 | -------------------------------------------------------------------------------- /cloud-seal/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | cloud-seal 4 | 5 | 6 | 7 | 8 | 9 | com.aptana.ide.core.unifiedBuilder 10 | 11 | 12 | 13 | 14 | 15 | com.aptana.projects.webnature 16 | 17 | 18 | 19 | 1582018957956 20 | 21 | 26 22 | 23 | org.eclipse.ui.ide.multiFilter 24 | 1.0-name-matches-false-false-node_modules 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /stu-app/.project: -------------------------------------------------------------------------------- 1 | 2 | 3 | cloud-seal 4 | 5 | 6 | 7 | 8 | 9 | com.aptana.ide.core.unifiedBuilder 10 | 11 | 12 | 13 | 14 | 15 | com.aptana.projects.webnature 16 | 17 | 18 | 19 | 1582018957956 20 | 21 | 26 22 | 23 | org.eclipse.ui.ide.multiFilter 24 | 1.0-name-matches-false-false-node_modules 25 | 26 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /cloud-seal/App.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 33 | -------------------------------------------------------------------------------- /stu-app/App.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 33 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/mixins/mescroll-comp.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期: 3 | * 当一个页面只有一个mescroll-body写在子组件时, 则使用mescroll-comp.js (参考 mescroll-comp 案例) 4 | * 当一个页面有多个mescroll-body写在子组件时, 则使用mescroll-more.js (参考 mescroll-more 案例) 5 | */ 6 | const MescrollCompMixin = { 7 | // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 8 | onPageScroll(e) { 9 | let item = this.$refs["mescrollItem"]; 10 | if(item && item.mescroll) item.mescroll.onPageScroll(e); 11 | }, 12 | onReachBottom() { 13 | let item = this.$refs["mescrollItem"]; 14 | if(item && item.mescroll) item.mescroll.onReachBottom(); 15 | }, 16 | // 当down的native: true时, 还需传递此方法进到子组件 17 | onPullDownRefresh(){ 18 | let item = this.$refs["mescrollItem"]; 19 | if(item && item.mescroll) item.mescroll.onPullDownRefresh(); 20 | } 21 | } 22 | 23 | export default MescrollCompMixin; 24 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/mixins/mescroll-comp.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期: 3 | * 当一个页面只有一个mescroll-body写在子组件时, 则使用mescroll-comp.js (参考 mescroll-comp 案例) 4 | * 当一个页面有多个mescroll-body写在子组件时, 则使用mescroll-more.js (参考 mescroll-more 案例) 5 | */ 6 | const MescrollCompMixin = { 7 | // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 8 | onPageScroll(e) { 9 | let item = this.$refs["mescrollItem"]; 10 | if(item && item.mescroll) item.mescroll.onPageScroll(e); 11 | }, 12 | onReachBottom() { 13 | let item = this.$refs["mescrollItem"]; 14 | if(item && item.mescroll) item.mescroll.onReachBottom(); 15 | }, 16 | // 当down的native: true时, 还需传递此方法进到子组件 17 | onPullDownRefresh(){ 18 | let item = this.$refs["mescrollItem"]; 19 | if(item && item.mescroll) item.mescroll.onPullDownRefresh(); 20 | } 21 | } 22 | 23 | export default MescrollCompMixin; 24 | -------------------------------------------------------------------------------- /README.en.md: -------------------------------------------------------------------------------- 1 | # cloud-after-sale 2 | 3 | #### Description 4 | 云售后管理系统手机端 5 | 6 | #### Software Architecture 7 | Software architecture description 8 | 9 | #### Installation 10 | 11 | 1. xxxx 12 | 2. xxxx 13 | 3. xxxx 14 | 15 | #### Instructions 16 | 17 | 1. xxxx 18 | 2. xxxx 19 | 3. xxxx 20 | 21 | #### Contribution 22 | 23 | 1. Fork the repository 24 | 2. Create Feat_xxx branch 25 | 3. Commit your code 26 | 4. Create Pull Request 27 | 28 | 29 | #### Gitee Feature 30 | 31 | 1. You can use Readme\_XXX.md to support different languages, such as Readme\_en.md, Readme\_zh.md 32 | 2. Gitee blog [blog.gitee.com](https://blog.gitee.com) 33 | 3. Explore open source project [https://gitee.com/explore](https://gitee.com/explore) 34 | 4. The most valuable open source project [GVP](https://gitee.com/gvp) 35 | 5. The manual of Gitee [https://gitee.com/help](https://gitee.com/help) 36 | 6. The most popular members [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) 37 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/components/mescroll-up.css: -------------------------------------------------------------------------------- 1 | /* 上拉加载区域 */ 2 | .mescroll-upwarp { 3 | min-height: 60rpx; 4 | padding: 30rpx 0; 5 | text-align: center; 6 | clear: both; 7 | } 8 | 9 | /*提示文本 */ 10 | .mescroll-upwarp .upwarp-tip, 11 | .mescroll-upwarp .upwarp-nodata { 12 | display: inline-block; 13 | font-size: 28rpx; 14 | vertical-align: middle; 15 | /* color: gray; 已在style设置color,此处删去*/ 16 | } 17 | 18 | .mescroll-upwarp .upwarp-tip { 19 | margin-left: 16rpx; 20 | } 21 | 22 | /*旋转进度条 */ 23 | .mescroll-upwarp .upwarp-progress { 24 | display: inline-block; 25 | width: 32rpx; 26 | height: 32rpx; 27 | border-radius: 50%; 28 | border: 2rpx solid gray; 29 | border-bottom-color: transparent !important; /*已在style设置border-color,此处需加 !important*/ 30 | vertical-align: middle; 31 | } 32 | 33 | /* 旋转动画 */ 34 | .mescroll-upwarp .mescroll-rotate { 35 | animation: mescrollUpRotate 0.6s linear infinite; 36 | } 37 | 38 | @keyframes mescrollUpRotate { 39 | 0% { 40 | transform: rotate(0deg); 41 | } 42 | 43 | 100% { 44 | transform: rotate(360deg); 45 | } 46 | } -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/components/mescroll-up.css: -------------------------------------------------------------------------------- 1 | /* 上拉加载区域 */ 2 | .mescroll-upwarp { 3 | min-height: 60rpx; 4 | padding: 30rpx 0; 5 | text-align: center; 6 | clear: both; 7 | } 8 | 9 | /*提示文本 */ 10 | .mescroll-upwarp .upwarp-tip, 11 | .mescroll-upwarp .upwarp-nodata { 12 | display: inline-block; 13 | font-size: 28rpx; 14 | vertical-align: middle; 15 | /* color: gray; 已在style设置color,此处删去*/ 16 | } 17 | 18 | .mescroll-upwarp .upwarp-tip { 19 | margin-left: 16rpx; 20 | } 21 | 22 | /*旋转进度条 */ 23 | .mescroll-upwarp .upwarp-progress { 24 | display: inline-block; 25 | width: 32rpx; 26 | height: 32rpx; 27 | border-radius: 50%; 28 | border: 2rpx solid gray; 29 | border-bottom-color: transparent !important; /*已在style设置border-color,此处需加 !important*/ 30 | vertical-align: middle; 31 | } 32 | 33 | /* 旋转动画 */ 34 | .mescroll-upwarp .mescroll-rotate { 35 | animation: mescrollUpRotate 0.6s linear infinite; 36 | } 37 | 38 | @keyframes mescrollUpRotate { 39 | 0% { 40 | transform: rotate(0deg); 41 | } 42 | 43 | 100% { 44 | transform: rotate(360deg); 45 | } 46 | } -------------------------------------------------------------------------------- /cloud-seal/pages/notice/noticeDetail.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 50 | 51 | 53 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/components/mescroll-up.vue: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 36 | 37 | 40 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/components/mescroll-up.vue: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 36 | 37 | 40 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/mixins/mescroll-more-item.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mescroll-more-item的mixins, 仅在多个 mescroll-body 写在子组件时使用 (参考 mescroll-more 案例) 3 | */ 4 | const MescrollMoreItemMixin = { 5 | props:{ 6 | i: Number, // 每个tab页的专属下标 7 | index: { // 当前tab的下标 8 | type: Number, 9 | default(){ 10 | return 0 11 | } 12 | } 13 | }, 14 | data() { 15 | return { 16 | downOption:{ 17 | auto:false // 不自动加载 18 | }, 19 | upOption:{ 20 | auto:false // 不自动加载 21 | }, 22 | isInit: false // 当前tab是否已初始化 23 | } 24 | }, 25 | watch:{ 26 | // 监听下标的变化 27 | index(val){ 28 | if (this.i === val && !this.isInit) { 29 | this.isInit = true; // 标记为true 30 | this.mescroll && this.mescroll.triggerDownScroll(); 31 | } 32 | } 33 | }, 34 | methods: { 35 | // mescroll组件初始化的回调,可获取到mescroll对象 36 | mescrollInit(mescroll) { 37 | this.mescroll = mescroll; 38 | this.mescrollInitByRef && this.mescrollInitByRef(); // 兼容字节跳动小程序 (mescroll-mixins.js) 39 | // 自动加载当前tab的数据 40 | if(this.i === this.index){ 41 | this.isInit = true; // 标记为true 42 | this.mescroll.triggerDownScroll(); 43 | } 44 | }, 45 | } 46 | } 47 | 48 | export default MescrollMoreItemMixin; 49 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/mixins/mescroll-more-item.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mescroll-more-item的mixins, 仅在多个 mescroll-body 写在子组件时使用 (参考 mescroll-more 案例) 3 | */ 4 | const MescrollMoreItemMixin = { 5 | props:{ 6 | i: Number, // 每个tab页的专属下标 7 | index: { // 当前tab的下标 8 | type: Number, 9 | default(){ 10 | return 0 11 | } 12 | } 13 | }, 14 | data() { 15 | return { 16 | downOption:{ 17 | auto:false // 不自动加载 18 | }, 19 | upOption:{ 20 | auto:false // 不自动加载 21 | }, 22 | isInit: false // 当前tab是否已初始化 23 | } 24 | }, 25 | watch:{ 26 | // 监听下标的变化 27 | index(val){ 28 | if (this.i === val && !this.isInit) { 29 | this.isInit = true; // 标记为true 30 | this.mescroll && this.mescroll.triggerDownScroll(); 31 | } 32 | } 33 | }, 34 | methods: { 35 | // mescroll组件初始化的回调,可获取到mescroll对象 36 | mescrollInit(mescroll) { 37 | this.mescroll = mescroll; 38 | this.mescrollInitByRef && this.mescrollInitByRef(); // 兼容字节跳动小程序 (mescroll-mixins.js) 39 | // 自动加载当前tab的数据 40 | if(this.i === this.index){ 41 | this.isInit = true; // 标记为true 42 | this.mescroll.triggerDownScroll(); 43 | } 44 | }, 45 | } 46 | } 47 | 48 | export default MescrollMoreItemMixin; 49 | -------------------------------------------------------------------------------- /cloud-seal/pages/product/productAllList/productAllListItem.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 44 | 45 | 47 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartAllList/sparepartAllListItem.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 44 | 45 | 47 | -------------------------------------------------------------------------------- /cloud-seal/pages/product/productAllList/productAllList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 44 | 45 | 47 | -------------------------------------------------------------------------------- /cloud-seal/pages/product/productChoose.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 44 | 45 | 47 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/components/mescroll-down.css: -------------------------------------------------------------------------------- 1 | /* 下拉刷新区域 */ 2 | .mescroll-downwarp { 3 | position: absolute; 4 | top: -100%; 5 | left: 0; 6 | width: 100%; 7 | height: 100%; 8 | text-align: center; 9 | } 10 | 11 | /* 下拉刷新--内容区,定位于区域底部 */ 12 | .mescroll-downwarp .downwarp-content { 13 | position: absolute; 14 | left: 0; 15 | bottom: 0; 16 | width: 100%; 17 | min-height: 60rpx; 18 | padding: 20rpx 0; 19 | text-align: center; 20 | } 21 | 22 | /* 下拉刷新--提示文本 */ 23 | .mescroll-downwarp .downwarp-tip { 24 | display: inline-block; 25 | font-size: 28rpx; 26 | vertical-align: middle; 27 | margin-left: 16rpx; 28 | /* color: gray; 已在style设置color,此处删去*/ 29 | } 30 | 31 | /* 下拉刷新--旋转进度条 */ 32 | .mescroll-downwarp .downwarp-progress { 33 | display: inline-block; 34 | width: 32rpx; 35 | height: 32rpx; 36 | border-radius: 50%; 37 | border: 2rpx solid gray; 38 | border-bottom-color: transparent !important; /*已在style设置border-color,此处需加 !important*/ 39 | vertical-align: middle; 40 | } 41 | 42 | /* 旋转动画 */ 43 | .mescroll-downwarp .mescroll-rotate { 44 | animation: mescrollDownRotate 0.6s linear infinite; 45 | } 46 | 47 | @keyframes mescrollDownRotate { 48 | 0% { 49 | transform: rotate(0deg); 50 | } 51 | 52 | 100% { 53 | transform: rotate(360deg); 54 | } 55 | } -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartAllList/sparepartAllList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 44 | 45 | 47 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/components/mescroll-down.css: -------------------------------------------------------------------------------- 1 | /* 下拉刷新区域 */ 2 | .mescroll-downwarp { 3 | position: absolute; 4 | top: -100%; 5 | left: 0; 6 | width: 100%; 7 | height: 100%; 8 | text-align: center; 9 | } 10 | 11 | /* 下拉刷新--内容区,定位于区域底部 */ 12 | .mescroll-downwarp .downwarp-content { 13 | position: absolute; 14 | left: 0; 15 | bottom: 0; 16 | width: 100%; 17 | min-height: 60rpx; 18 | padding: 20rpx 0; 19 | text-align: center; 20 | } 21 | 22 | /* 下拉刷新--提示文本 */ 23 | .mescroll-downwarp .downwarp-tip { 24 | display: inline-block; 25 | font-size: 28rpx; 26 | vertical-align: middle; 27 | margin-left: 16rpx; 28 | /* color: gray; 已在style设置color,此处删去*/ 29 | } 30 | 31 | /* 下拉刷新--旋转进度条 */ 32 | .mescroll-downwarp .downwarp-progress { 33 | display: inline-block; 34 | width: 32rpx; 35 | height: 32rpx; 36 | border-radius: 50%; 37 | border: 2rpx solid gray; 38 | border-bottom-color: transparent !important; /*已在style设置border-color,此处需加 !important*/ 39 | vertical-align: middle; 40 | } 41 | 42 | /* 旋转动画 */ 43 | .mescroll-downwarp .mescroll-rotate { 44 | animation: mescrollDownRotate 0.6s linear infinite; 45 | } 46 | 47 | @keyframes mescrollDownRotate { 48 | 0% { 49 | transform: rotate(0deg); 50 | } 51 | 52 | 100% { 53 | transform: rotate(360deg); 54 | } 55 | } -------------------------------------------------------------------------------- /stu-app/pages/exam/endExam/endExamList.vue: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 49 | 50 | 52 | -------------------------------------------------------------------------------- /stu-app/pages/exam/waitExam/waitExamList.vue: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 49 | 50 | 52 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartChoose/sparepartChoose.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 46 | 47 | 49 | -------------------------------------------------------------------------------- /cloud-seal/pages/notice/myNotice/myNoticeList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 50 | 51 | 53 | -------------------------------------------------------------------------------- /cloud-seal/pages/customer/customerList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 52 | 53 | 55 | -------------------------------------------------------------------------------- /cloud-seal/pages/customer/customerChoose.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 52 | 53 | 55 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartMyUse/sparepartMyUseList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 51 | 52 | 54 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartMyApply/sparepartMyApplyList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 51 | 52 | 54 | -------------------------------------------------------------------------------- /cloud-seal/pages/product/productChooseItem.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 53 | 54 | 56 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/components/mescroll-down.vue: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 44 | 45 | 48 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/mescroll-uni-option.js: -------------------------------------------------------------------------------- 1 | // 全局配置 2 | // mescroll-body 和 mescroll-uni 通用 3 | const GlobalOption = { 4 | down: { 5 | // 其他down的配置参数也可以写,这里只展示了常用的配置: 6 | textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本 7 | textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本 8 | textLoading: '加载中 ...', // 加载中的提示文本 9 | offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调 10 | native: false // 是否使用系统自带的下拉刷新; 默认false; 仅在mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) 11 | }, 12 | up: { 13 | // 其他up的配置参数也可以写,这里只展示了常用的配置: 14 | textLoading: '加载中 ...', // 加载中的提示文本 15 | textNoMore: '-- END --', // 没有更多数据的提示文本 16 | offset: 80, // 距底部多远时,触发upCallback 17 | isBounce: false, // 默认禁止橡皮筋的回弹效果, 必读事项: http://www.mescroll.com/qa.html?v=190725#q25 18 | toTop: { 19 | // 回到顶部按钮,需配置src才显示 20 | src: "http://www.mescroll.com/img/mescroll-totop.png?v=1", // 图片路径 (建议放入static目录, 如 /static/img/mescroll-totop.png ) 21 | offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000px 22 | right: 20, // 到右边的距离, 默认20 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) 23 | bottom: 120, // 到底部的距离, 默认120 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) 24 | width: 72 // 回到顶部图标的宽度, 默认72 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) 25 | }, 26 | empty: { 27 | use: true, // 是否显示空布局 28 | icon: "http://www.mescroll.com/img/mescroll-empty.png?v=1", // 图标路径 (建议放入static目录, 如 /static/img/mescroll-empty.png ) 29 | tip: '~ 暂无相关数据 ~' // 提示 30 | } 31 | } 32 | } 33 | 34 | export default GlobalOption 35 | -------------------------------------------------------------------------------- /stu-app/components/uni-list/uni-list.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 47 | 69 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/components/mescroll-down.vue: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 44 | 45 | 48 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/mescroll-uni-option.js: -------------------------------------------------------------------------------- 1 | // 全局配置 2 | // mescroll-body 和 mescroll-uni 通用 3 | const GlobalOption = { 4 | down: { 5 | // 其他down的配置参数也可以写,这里只展示了常用的配置: 6 | textInOffset: '下拉刷新', // 下拉的距离在offset范围内的提示文本 7 | textOutOffset: '释放更新', // 下拉的距离大于offset范围的提示文本 8 | textLoading: '加载中 ...', // 加载中的提示文本 9 | offset: 80, // 在列表顶部,下拉大于80px,松手即可触发下拉刷新的回调 10 | native: false // 是否使用系统自带的下拉刷新; 默认false; 仅在mescroll-body生效 (值为true时,还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) 11 | }, 12 | up: { 13 | // 其他up的配置参数也可以写,这里只展示了常用的配置: 14 | textLoading: '加载中 ...', // 加载中的提示文本 15 | textNoMore: '-- END --', // 没有更多数据的提示文本 16 | offset: 80, // 距底部多远时,触发upCallback 17 | isBounce: false, // 默认禁止橡皮筋的回弹效果, 必读事项: http://www.mescroll.com/qa.html?v=190725#q25 18 | toTop: { 19 | // 回到顶部按钮,需配置src才显示 20 | src: "http://www.mescroll.com/img/mescroll-totop.png?v=1", // 图片路径 (建议放入static目录, 如 /static/img/mescroll-totop.png ) 21 | offset: 1000, // 列表滚动多少距离才显示回到顶部按钮,默认1000px 22 | right: 20, // 到右边的距离, 默认20 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) 23 | bottom: 120, // 到底部的距离, 默认120 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) 24 | width: 72 // 回到顶部图标的宽度, 默认72 (支持"20rpx", "20px", "20%"格式的值, 纯数字则默认单位rpx) 25 | }, 26 | empty: { 27 | use: true, // 是否显示空布局 28 | icon: "http://www.mescroll.com/img/mescroll-empty.png?v=1", // 图标路径 (建议放入static目录, 如 /static/img/mescroll-empty.png ) 29 | tip: '~ 暂无相关数据 ~' // 提示 30 | } 31 | } 32 | } 33 | 34 | export default GlobalOption 35 | -------------------------------------------------------------------------------- /cloud-seal/components/uni-list/uni-list.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 47 | 69 | -------------------------------------------------------------------------------- /cloud-seal/pages/workorder/workorderChoose/workorderChoose.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 48 | 49 | 51 | -------------------------------------------------------------------------------- /cloud-seal/pages/fileconsole/recycleBin/recycleBinList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 54 | 55 | 57 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartMyApply/sparepartMyApplyListItem.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 51 | 52 | 54 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartMyUse/sparepartMyUseListItem.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 51 | 52 | 54 | -------------------------------------------------------------------------------- /cloud-seal/pages/message/messageItem/groupItem.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 27 | 28 | 71 | -------------------------------------------------------------------------------- /cloud-seal/pages/fileconsole/myShareFile/myShareFileList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 54 | 55 | 57 | -------------------------------------------------------------------------------- /cloud-seal/pages/worker/workerChoose.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 48 | 49 | 51 | -------------------------------------------------------------------------------- /cloud-seal/pages/workorder/workMyWriteorder/workMyWriteorder.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 58 | 59 | 61 | -------------------------------------------------------------------------------- /cloud-seal/pages/common/webView.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 67 | 68 | 70 | -------------------------------------------------------------------------------- /stu-app/pages/common/webView.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 67 | 68 | 70 | -------------------------------------------------------------------------------- /cloud-seal/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App' 3 | 4 | // 接口请求挂载 5 | import api from '@/components/vmeitime-http/' 6 | Vue.prototype.$api = api 7 | 8 | //挂在全局socket 9 | import sockect from "socket.js" 10 | Vue.prototype.$sockect = sockect 11 | 12 | // 验证挂载到全局 13 | import validate from '@/components/form-validate/ys-validate.js' 14 | Vue.prototype.$validate = validate 15 | 16 | // 注册全局modal组件 17 | import chunLeiModal from '@/components/chunLei-modal/chunLei-modal.vue' 18 | Vue.component('chunLei-modal', chunLeiModal); 19 | 20 | //系统文件访问基础路径 21 | Vue.prototype.$fileBasePath = "http://192.168.1.104:8081/" 22 | //系统其他页面访问路径 23 | Vue.prototype.$pagePath = "http://192.168.1.104:8081/" 24 | 25 | Vue.prototype.$imageType = ["png", "jpg", "xbm", "bmp", "webp", "jpeg", "svgz", "git", "ico", "tiff", "svg", "jiff", "pjpeg", "pjp", "tif"] 26 | Vue.prototype.$officeType = ["docx", "doc", "xls", "xlsx", "ppt", "pptx", "wps", "et", "dps", "csv", "pdf"] 27 | Vue.prototype.$vedioType = ["mp4", "rm", "rmvb", "wmv", "avi", "3gp", "mkv"] 28 | Vue.prototype.$packageType = ["zip", "rar"] 29 | Vue.prototype.$epubType = ["epub"] 30 | Vue.prototype.$aceType = ["txt", "sql", "java", "css", "html", "htm", "json", "js", "tpl"] 31 | 32 | // 注册全局组件 33 | import MescrollBody from "@/components/mescroll-uni/mescroll-body.vue" 34 | import MescrollUni from "@/components/mescroll-uni/mescroll-uni.vue" 35 | Vue.component('mescroll-body', MescrollBody) 36 | Vue.component('mescroll-uni', MescrollUni) 37 | 38 | Vue.config.productionTip = false 39 | 40 | App.mpType = 'app' 41 | 42 | const app = new Vue({ 43 | ...App 44 | }) 45 | app.$mount() 46 | -------------------------------------------------------------------------------- /stu-app/main.js: -------------------------------------------------------------------------------- 1 | import Vue from 'vue' 2 | import App from './App' 3 | 4 | // 接口请求挂载 5 | import api from '@/components/vmeitime-http/' 6 | Vue.prototype.$api = api 7 | 8 | //挂在全局socket 9 | import sockect from "socket.js" 10 | Vue.prototype.$sockect = sockect 11 | 12 | // 验证挂载到全局 13 | import validate from '@/components/form-validate/ys-validate.js' 14 | Vue.prototype.$validate = validate 15 | 16 | // 注册全局modal组件 17 | import chunLeiModal from '@/components/chunLei-modal/chunLei-modal.vue' 18 | Vue.component('chunLei-modal', chunLeiModal); 19 | 20 | //系统文件访问基础路径 21 | Vue.prototype.$fileBasePath = "http://192.168.1.104:8081/" 22 | //系统其他页面访问路径 23 | Vue.prototype.$pagePath = "http://192.168.1.104:8081/" 24 | 25 | Vue.prototype.$imageType = ["png", "jpg", "xbm", "bmp", "webp", "jpeg", "svgz", "git", "ico", "tiff", "svg", "jiff", "pjpeg", "pjp", "tif"] 26 | Vue.prototype.$officeType = ["docx", "doc", "xls", "xlsx", "ppt", "pptx", "wps", "et", "dps", "csv", "pdf"] 27 | Vue.prototype.$vedioType = ["mp4", "rm", "rmvb", "wmv", "avi", "3gp", "mkv"] 28 | Vue.prototype.$packageType = ["zip", "rar"] 29 | Vue.prototype.$epubType = ["epub"] 30 | Vue.prototype.$aceType = ["txt", "sql", "java", "css", "html", "htm", "json", "js", "tpl"] 31 | 32 | // 注册全局组件 33 | import MescrollBody from "@/components/mescroll-uni/mescroll-body.vue" 34 | import MescrollUni from "@/components/mescroll-uni/mescroll-uni.vue" 35 | Vue.component('mescroll-body', MescrollBody) 36 | Vue.component('mescroll-uni', MescrollUni) 37 | 38 | Vue.config.productionTip = false 39 | 40 | App.mpType = 'app' 41 | 42 | const app = new Vue({ 43 | ...App 44 | }) 45 | app.$mount() 46 | -------------------------------------------------------------------------------- /stu-app/pages/exam/waitExam/waitExamListItem.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 56 | 57 | 59 | -------------------------------------------------------------------------------- /cloud-seal/pages/customer/customerListItem.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 61 | 62 | 64 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/mixins/mescroll-more.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期: 3 | * 当一个页面只有一个mescroll-body写在子组件时, 则使用mescroll-comp.js (参考 mescroll-comp 案例) 4 | * 当一个页面有多个mescroll-body写在子组件时, 则使用mescroll-more.js (参考 mescroll-more 案例) 5 | */ 6 | const MescrollMoreMixin = { 7 | data() { 8 | return { 9 | tabIndex: 0 // 当前tab下标 10 | } 11 | }, 12 | // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 13 | onPageScroll(e) { 14 | let mescroll = this.getMescroll(this.tabIndex); 15 | mescroll && mescroll.onPageScroll(e); 16 | }, 17 | onReachBottom() { 18 | let mescroll = this.getMescroll(this.tabIndex); 19 | mescroll && mescroll.onReachBottom(); 20 | }, 21 | // 当down的native: true时, 还需传递此方法进到子组件 22 | onPullDownRefresh(){ 23 | let mescroll = this.getMescroll(this.tabIndex); 24 | mescroll && mescroll.onPullDownRefresh(); 25 | }, 26 | methods:{ 27 | // 根据下标获取对应子组件的mescroll 28 | getMescroll(i){ 29 | if(!this.mescrollItems) this.mescrollItems = []; 30 | if(!this.mescrollItems[i]) { 31 | // v-for中的refs 32 | let vForItem = this.$refs["mescrollItem"]; 33 | if(vForItem){ 34 | this.mescrollItems[i] = vForItem[i] 35 | }else{ 36 | // 普通的refs,不可重复 37 | this.mescrollItems[i] = this.$refs["mescrollItem"+i]; 38 | } 39 | } 40 | let item = this.mescrollItems[i] 41 | return item ? item.mescroll : null 42 | }, 43 | // 切换tab,恢复滚动条位置 44 | tabChange(i){ 45 | let mescroll = this.getMescroll(i); 46 | if(mescroll){ 47 | // 延时(比$nextTick靠谱一些),确保元素已渲染 48 | setTimeout(()=>{ 49 | mescroll.scrollTo(mescroll.getScrollTop(),0) 50 | },30) 51 | } 52 | } 53 | } 54 | } 55 | 56 | export default MescrollMoreMixin; 57 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/mixins/mescroll-more.js: -------------------------------------------------------------------------------- 1 | /** 2 | * mescroll-body写在子组件时,需通过mescroll的mixins补充子组件缺少的生命周期: 3 | * 当一个页面只有一个mescroll-body写在子组件时, 则使用mescroll-comp.js (参考 mescroll-comp 案例) 4 | * 当一个页面有多个mescroll-body写在子组件时, 则使用mescroll-more.js (参考 mescroll-more 案例) 5 | */ 6 | const MescrollMoreMixin = { 7 | data() { 8 | return { 9 | tabIndex: 0 // 当前tab下标 10 | } 11 | }, 12 | // 因为子组件无onPageScroll和onReachBottom的页面生命周期,需在页面传递进到子组件 13 | onPageScroll(e) { 14 | let mescroll = this.getMescroll(this.tabIndex); 15 | mescroll && mescroll.onPageScroll(e); 16 | }, 17 | onReachBottom() { 18 | let mescroll = this.getMescroll(this.tabIndex); 19 | mescroll && mescroll.onReachBottom(); 20 | }, 21 | // 当down的native: true时, 还需传递此方法进到子组件 22 | onPullDownRefresh(){ 23 | let mescroll = this.getMescroll(this.tabIndex); 24 | mescroll && mescroll.onPullDownRefresh(); 25 | }, 26 | methods:{ 27 | // 根据下标获取对应子组件的mescroll 28 | getMescroll(i){ 29 | if(!this.mescrollItems) this.mescrollItems = []; 30 | if(!this.mescrollItems[i]) { 31 | // v-for中的refs 32 | let vForItem = this.$refs["mescrollItem"]; 33 | if(vForItem){ 34 | this.mescrollItems[i] = vForItem[i] 35 | }else{ 36 | // 普通的refs,不可重复 37 | this.mescrollItems[i] = this.$refs["mescrollItem"+i]; 38 | } 39 | } 40 | let item = this.mescrollItems[i] 41 | return item ? item.mescroll : null 42 | }, 43 | // 切换tab,恢复滚动条位置 44 | tabChange(i){ 45 | let mescroll = this.getMescroll(i); 46 | if(mescroll){ 47 | // 延时(比$nextTick靠谱一些),确保元素已渲染 48 | setTimeout(()=>{ 49 | mescroll.scrollTo(mescroll.getScrollTop(),0) 50 | },30) 51 | } 52 | } 53 | } 54 | } 55 | 56 | export default MescrollMoreMixin; 57 | -------------------------------------------------------------------------------- /cloud-seal/pages/customer/customerChooseItem.vue: -------------------------------------------------------------------------------- 1 | 27 | 28 | 61 | 62 | 64 | -------------------------------------------------------------------------------- /cloud-seal/pages/fileconsole/recycleBin/recycleBinItem.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 67 | 68 | 70 | -------------------------------------------------------------------------------- /cloud-seal/pages/worker/workerChooseItem.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 58 | 59 | 68 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartMyOrder/sparepartMyOrder.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 42 | 43 | 75 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartExamine/itemModel.vue: -------------------------------------------------------------------------------- 1 | 33 | 34 | 63 | 64 | 66 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartExamine/sparepartExamine.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 45 | 46 | 78 | -------------------------------------------------------------------------------- /stu-app/components/uni-list/uni-refresh.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 59 | 60 | 66 | -------------------------------------------------------------------------------- /cloud-seal/components/uni-list/uni-refresh.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 59 | 60 | 66 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/mescroll-mixins.js: -------------------------------------------------------------------------------- 1 | // mescroll-body 和 mescroll-uni 通用 2 | 3 | // import MescrollUni from "./mescroll-uni.vue"; 4 | // import MescrollBody from "./mescroll-body.vue"; 5 | 6 | const MescrollMixin = { 7 | // components: { // 非H5端无法通过mixin注册组件, 只能在main.js中注册全局组件或具体界面中注册 8 | // MescrollUni, 9 | // MescrollBody 10 | // }, 11 | data() { 12 | return { 13 | mescroll: null //mescroll实例对象 14 | } 15 | }, 16 | // 注册系统自带的下拉刷新 (配置down.native为true时生效, 还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) 17 | onPullDownRefresh(){ 18 | this.mescroll && this.mescroll.onPullDownRefresh(); 19 | }, 20 | // 注册列表滚动事件,用于判定在顶部可下拉刷新,在指定位置可显示隐藏回到顶部按钮 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效) 21 | onPageScroll(e) { 22 | this.mescroll && this.mescroll.onPageScroll(e); 23 | }, 24 | // 注册滚动到底部的事件,用于上拉加载 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效) 25 | onReachBottom() { 26 | this.mescroll && this.mescroll.onReachBottom(); 27 | }, 28 | methods: { 29 | // mescroll组件初始化的回调,可获取到mescroll对象 30 | mescrollInit(mescroll) { 31 | this.mescroll = mescroll; 32 | this.mescrollInitByRef(); // 兼容字节跳动小程序 33 | }, 34 | // 以ref的方式初始化mescroll对象 (兼容字节跳动小程序: http://www.mescroll.com/qa.html?v=20200107#q26) 35 | mescrollInitByRef() { 36 | if(!this.mescroll || !this.mescroll.resetUpScroll){ 37 | let mescrollRef = this.$refs.mescrollRef; 38 | if(mescrollRef) this.mescroll = mescrollRef.mescroll 39 | } 40 | }, 41 | // 下拉刷新的回调 42 | downCallback() { 43 | // mixin默认resetUpScroll 44 | this.mescroll.resetUpScroll() 45 | }, 46 | // 上拉加载的回调 47 | upCallback() { 48 | // mixin默认延时500自动结束加载 49 | setTimeout(()=>{ 50 | this.mescroll.endErr(); 51 | }, 500) 52 | } 53 | }, 54 | mounted() { 55 | this.mescrollInitByRef(); // 兼容字节跳动小程序, 避免未设置@init或@init此时未能取到ref的情况 56 | } 57 | 58 | } 59 | 60 | export default MescrollMixin; 61 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/mescroll-mixins.js: -------------------------------------------------------------------------------- 1 | // mescroll-body 和 mescroll-uni 通用 2 | 3 | // import MescrollUni from "./mescroll-uni.vue"; 4 | // import MescrollBody from "./mescroll-body.vue"; 5 | 6 | const MescrollMixin = { 7 | // components: { // 非H5端无法通过mixin注册组件, 只能在main.js中注册全局组件或具体界面中注册 8 | // MescrollUni, 9 | // MescrollBody 10 | // }, 11 | data() { 12 | return { 13 | mescroll: null //mescroll实例对象 14 | } 15 | }, 16 | // 注册系统自带的下拉刷新 (配置down.native为true时生效, 还需在pages配置enablePullDownRefresh:true;详请参考mescroll-native的案例) 17 | onPullDownRefresh(){ 18 | this.mescroll && this.mescroll.onPullDownRefresh(); 19 | }, 20 | // 注册列表滚动事件,用于判定在顶部可下拉刷新,在指定位置可显示隐藏回到顶部按钮 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效) 21 | onPageScroll(e) { 22 | this.mescroll && this.mescroll.onPageScroll(e); 23 | }, 24 | // 注册滚动到底部的事件,用于上拉加载 (此方法为页面生命周期,无法在子组件中触发, 仅在mescroll-body生效) 25 | onReachBottom() { 26 | this.mescroll && this.mescroll.onReachBottom(); 27 | }, 28 | methods: { 29 | // mescroll组件初始化的回调,可获取到mescroll对象 30 | mescrollInit(mescroll) { 31 | this.mescroll = mescroll; 32 | this.mescrollInitByRef(); // 兼容字节跳动小程序 33 | }, 34 | // 以ref的方式初始化mescroll对象 (兼容字节跳动小程序: http://www.mescroll.com/qa.html?v=20200107#q26) 35 | mescrollInitByRef() { 36 | if(!this.mescroll || !this.mescroll.resetUpScroll){ 37 | let mescrollRef = this.$refs.mescrollRef; 38 | if(mescrollRef) this.mescroll = mescrollRef.mescroll 39 | } 40 | }, 41 | // 下拉刷新的回调 42 | downCallback() { 43 | // mixin默认resetUpScroll 44 | this.mescroll.resetUpScroll() 45 | }, 46 | // 上拉加载的回调 47 | upCallback() { 48 | // mixin默认延时500自动结束加载 49 | setTimeout(()=>{ 50 | this.mescroll.endErr(); 51 | }, 500) 52 | } 53 | }, 54 | mounted() { 55 | this.mescrollInitByRef(); // 兼容字节跳动小程序, 避免未设置@init或@init此时未能取到ref的情况 56 | } 57 | 58 | } 59 | 60 | export default MescrollMixin; 61 | -------------------------------------------------------------------------------- /cloud-seal/uni.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * 这里是uni-app内置的常用样式变量 3 | * 4 | * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 5 | * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App 6 | * 7 | */ 8 | 9 | /** 10 | * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 11 | * 12 | * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 13 | */ 14 | 15 | /* 颜色变量 */ 16 | 17 | /* 行为相关颜色 */ 18 | $uni-color-primary: #007aff; 19 | $uni-color-success: #4cd964; 20 | $uni-color-warning: #f0ad4e; 21 | $uni-color-error: #dd524d; 22 | 23 | /* 文字基本颜色 */ 24 | $uni-text-color:#333;//基本色 25 | $uni-text-color-inverse:#fff;//反色 26 | $uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 27 | $uni-text-color-placeholder: #808080; 28 | $uni-text-color-disable:#c0c0c0; 29 | 30 | /* 背景颜色 */ 31 | $uni-bg-color:#ffffff; 32 | $uni-bg-color-grey:#f8f8f8; 33 | $uni-bg-color-hover:#f1f1f1;//点击状态颜色 34 | $uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 35 | 36 | /* 边框颜色 */ 37 | $uni-border-color:#c8c7cc; 38 | 39 | /* 尺寸变量 */ 40 | 41 | /* 文字尺寸 */ 42 | $uni-font-size-sm:24upx; 43 | $uni-font-size-base:28upx; 44 | $uni-font-size-lg:32upx; 45 | 46 | /* 图片尺寸 */ 47 | $uni-img-size-sm:40upx; 48 | $uni-img-size-base:52upx; 49 | $uni-img-size-lg:80upx; 50 | 51 | /* Border Radius */ 52 | $uni-border-radius-sm: 4upx; 53 | $uni-border-radius-base: 6upx; 54 | $uni-border-radius-lg: 12upx; 55 | $uni-border-radius-circle: 50%; 56 | 57 | /* 水平间距 */ 58 | $uni-spacing-row-sm: 10px; 59 | $uni-spacing-row-base: 20upx; 60 | $uni-spacing-row-lg: 30upx; 61 | 62 | /* 垂直间距 */ 63 | $uni-spacing-col-sm: 8upx; 64 | $uni-spacing-col-base: 16upx; 65 | $uni-spacing-col-lg: 24upx; 66 | 67 | /* 透明度 */ 68 | $uni-opacity-disabled: 0.3; // 组件禁用态的透明度 69 | 70 | /* 文章场景相关 */ 71 | $uni-color-title: #2C405A; // 文章标题颜色 72 | $uni-font-size-title:40upx; 73 | $uni-color-subtitle: #555555; // 二级标题颜色 74 | $uni-font-size-subtitle:36upx; 75 | $uni-color-paragraph: #3F536E; // 文章段落颜色 76 | $uni-font-size-paragraph:30upx; -------------------------------------------------------------------------------- /stu-app/uni.scss: -------------------------------------------------------------------------------- 1 | /** 2 | * 这里是uni-app内置的常用样式变量 3 | * 4 | * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 5 | * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App 6 | * 7 | */ 8 | 9 | /** 10 | * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 11 | * 12 | * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 13 | */ 14 | 15 | /* 颜色变量 */ 16 | 17 | /* 行为相关颜色 */ 18 | $uni-color-primary: #007aff; 19 | $uni-color-success: #4cd964; 20 | $uni-color-warning: #f0ad4e; 21 | $uni-color-error: #dd524d; 22 | 23 | /* 文字基本颜色 */ 24 | $uni-text-color:#333;//基本色 25 | $uni-text-color-inverse:#fff;//反色 26 | $uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息 27 | $uni-text-color-placeholder: #808080; 28 | $uni-text-color-disable:#c0c0c0; 29 | 30 | /* 背景颜色 */ 31 | $uni-bg-color:#ffffff; 32 | $uni-bg-color-grey:#f8f8f8; 33 | $uni-bg-color-hover:#f1f1f1;//点击状态颜色 34 | $uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色 35 | 36 | /* 边框颜色 */ 37 | $uni-border-color:#c8c7cc; 38 | 39 | /* 尺寸变量 */ 40 | 41 | /* 文字尺寸 */ 42 | $uni-font-size-sm:24upx; 43 | $uni-font-size-base:28upx; 44 | $uni-font-size-lg:32upx; 45 | 46 | /* 图片尺寸 */ 47 | $uni-img-size-sm:40upx; 48 | $uni-img-size-base:52upx; 49 | $uni-img-size-lg:80upx; 50 | 51 | /* Border Radius */ 52 | $uni-border-radius-sm: 4upx; 53 | $uni-border-radius-base: 6upx; 54 | $uni-border-radius-lg: 12upx; 55 | $uni-border-radius-circle: 50%; 56 | 57 | /* 水平间距 */ 58 | $uni-spacing-row-sm: 10px; 59 | $uni-spacing-row-base: 20upx; 60 | $uni-spacing-row-lg: 30upx; 61 | 62 | /* 垂直间距 */ 63 | $uni-spacing-col-sm: 8upx; 64 | $uni-spacing-col-base: 16upx; 65 | $uni-spacing-col-lg: 24upx; 66 | 67 | /* 透明度 */ 68 | $uni-opacity-disabled: 0.3; // 组件禁用态的透明度 69 | 70 | /* 文章场景相关 */ 71 | $uni-color-title: #2C405A; // 文章标题颜色 72 | $uni-font-size-title:40upx; 73 | $uni-color-subtitle: #555555; // 二级标题颜色 74 | $uni-font-size-subtitle:36upx; 75 | $uni-color-paragraph: #3F536E; // 文章段落颜色 76 | $uni-font-size-paragraph:30upx; -------------------------------------------------------------------------------- /cloud-seal/components/chunLei-modal/tabMask.js: -------------------------------------------------------------------------------- 1 | export class TabMask{ 2 | constructor(option) { 3 | this.navList = [] 4 | this.tabbarList = [] 5 | 6 | option = option || {} 7 | 8 | let tabbarHeight = !option.tabbarHeight&&option.tabbarHeight!=0?50:option.tabbarHeight 9 | 10 | let navHeight = !option.navHeight&&option.navHeight!=0?(uni.getSystemInfoSync().statusBarHeight + 44):option.navHeight 11 | let opacity = option.opacity || 0 12 | let fn = ()=>{} 13 | this.fn = option.fn || fn 14 | 15 | //#ifdef APP-PLUS 16 | this.creatPlusMask(navHeight,tabbarHeight,opacity) 17 | //#endif 18 | } 19 | creatPlusMask(navHeight,tabbarHeight,opacity){ 20 | let opa = 1-Math.pow((1-opacity),1/10) 21 | 22 | for (let i = 1; i <= 10; i++) { 23 | 24 | let navView = this.creatView({height:`${navHeight}px`,top:0},opa) 25 | let tabbarView = this.creatView({height:`${tabbarHeight}px`,bottom:0},opa) 26 | 27 | this.navList.push(navView) 28 | this.tabbarList.push(tabbarView) 29 | } 30 | } 31 | //生成 opacity view 32 | creatView(style,opa){ 33 | style = { 34 | left:'0px', 35 | width:'100%', 36 | ...style 37 | } 38 | let view = new plus.nativeObj.View('view',style); 39 | view.draw([ 40 | {tag:'rect',id:'rect',color:`rgba(0,0,0,${opa})`,position:{top:'0px',left:'0px',width:'100%',height:'100%'}}, 41 | ]); 42 | view.addEventListener("click", (e) => { 43 | this.fn() 44 | this.hide() 45 | }, false); 46 | return view 47 | } 48 | show(time=300){ 49 | 50 | let i = 0 51 | this.timer = setInterval(()=>{ 52 | if(i==10){ 53 | clearInterval(this.timer) 54 | }else{ 55 | if (this.navList[i]) this.navList[i].show() 56 | if (this.tabbarList[i]) this.tabbarList[i].show() 57 | i++ 58 | } 59 | },time/10) 60 | } 61 | hide(){ 62 | 63 | clearInterval(this.timer) 64 | for (let item of this.navList) { 65 | item.hide(); 66 | } 67 | for (let item of this.tabbarList) { 68 | item.hide(); 69 | } 70 | } 71 | } 72 | 73 | export default TabMask 74 | 75 | -------------------------------------------------------------------------------- /stu-app/components/chunLei-modal/tabMask.js: -------------------------------------------------------------------------------- 1 | export class TabMask{ 2 | constructor(option) { 3 | this.navList = [] 4 | this.tabbarList = [] 5 | 6 | option = option || {} 7 | 8 | let tabbarHeight = !option.tabbarHeight&&option.tabbarHeight!=0?50:option.tabbarHeight 9 | 10 | let navHeight = !option.navHeight&&option.navHeight!=0?(uni.getSystemInfoSync().statusBarHeight + 44):option.navHeight 11 | let opacity = option.opacity || 0 12 | let fn = ()=>{} 13 | this.fn = option.fn || fn 14 | 15 | //#ifdef APP-PLUS 16 | this.creatPlusMask(navHeight,tabbarHeight,opacity) 17 | //#endif 18 | } 19 | creatPlusMask(navHeight,tabbarHeight,opacity){ 20 | let opa = 1-Math.pow((1-opacity),1/10) 21 | 22 | for (let i = 1; i <= 10; i++) { 23 | 24 | let navView = this.creatView({height:`${navHeight}px`,top:0},opa) 25 | let tabbarView = this.creatView({height:`${tabbarHeight}px`,bottom:0},opa) 26 | 27 | this.navList.push(navView) 28 | this.tabbarList.push(tabbarView) 29 | } 30 | } 31 | //生成 opacity view 32 | creatView(style,opa){ 33 | style = { 34 | left:'0px', 35 | width:'100%', 36 | ...style 37 | } 38 | let view = new plus.nativeObj.View('view',style); 39 | view.draw([ 40 | {tag:'rect',id:'rect',color:`rgba(0,0,0,${opa})`,position:{top:'0px',left:'0px',width:'100%',height:'100%'}}, 41 | ]); 42 | view.addEventListener("click", (e) => { 43 | this.fn() 44 | this.hide() 45 | }, false); 46 | return view 47 | } 48 | show(time=300){ 49 | 50 | let i = 0 51 | this.timer = setInterval(()=>{ 52 | if(i==10){ 53 | clearInterval(this.timer) 54 | }else{ 55 | if (this.navList[i]) this.navList[i].show() 56 | if (this.tabbarList[i]) this.tabbarList[i].show() 57 | i++ 58 | } 59 | },time/10) 60 | } 61 | hide(){ 62 | 63 | clearInterval(this.timer) 64 | for (let item of this.navList) { 65 | item.hide(); 66 | } 67 | for (let item of this.tabbarList) { 68 | item.hide(); 69 | } 70 | } 71 | } 72 | 73 | export default TabMask 74 | 75 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/components/mescroll-top.vue: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 49 | 50 | 82 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/components/mescroll-top.vue: -------------------------------------------------------------------------------- 1 | 2 | 13 | 14 | 49 | 50 | 82 | -------------------------------------------------------------------------------- /cloud-seal/pages/workorder/workorderChoose/workorderChooseItem.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 75 | 76 | 78 | -------------------------------------------------------------------------------- /stu-app/pages/mine/myMation.vue: -------------------------------------------------------------------------------- 1 | 47 | 48 | 82 | 83 | 92 | -------------------------------------------------------------------------------- /cloud-seal/pages/fileconsole/myShareFile/myShareFileItem.vue: -------------------------------------------------------------------------------- 1 | 28 | 29 | 81 | 82 | 84 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartChoose/sparepartChooseItem.vue: -------------------------------------------------------------------------------- 1 | 20 | 21 | 71 | 72 | 74 | -------------------------------------------------------------------------------- /cloud-seal/components/mescroll-uni/components/mescroll-empty.vue: -------------------------------------------------------------------------------- 1 | 8 | 15 | 16 | 48 | 49 | 91 | -------------------------------------------------------------------------------- /stu-app/components/mescroll-uni/components/mescroll-empty.vue: -------------------------------------------------------------------------------- 1 | 8 | 15 | 16 | 48 | 49 | 91 | -------------------------------------------------------------------------------- /stu-app/pages/exam/endExam/endExamListItem.vue: -------------------------------------------------------------------------------- 1 | 40 | 41 | 69 | 70 | 79 | -------------------------------------------------------------------------------- /cloud-seal/pages/workorder/workorderState/workorderState.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 66 | 67 | 99 | -------------------------------------------------------------------------------- /cloud-seal/pages/user/userChoose/userChooseState.vue: -------------------------------------------------------------------------------- 1 | 7 | 8 | 82 | 83 | 85 | -------------------------------------------------------------------------------- /cloud-seal/socket.js: -------------------------------------------------------------------------------- 1 | import socket from '@/components/plus-websocket/index.js' 2 | 3 | //检测socket连接是否打开 4 | var socketOpen = false; 5 | //记录未发送的消息 6 | var socketMsgQueue = []; 7 | 8 | var socketTask = null; 9 | 10 | var webSocketPath = 'ws://192.168.1.104:8081/' 11 | 12 | var connect = function() { 13 | var userToken = uni.getStorageSync("userToken") || ''; 14 | //用户信息不为空时创建连接 15 | if(userToken != '' && userToken != 'undefined' && userToken != null){ 16 | //创建连接 17 | socketTask = uni.connectSocket({ 18 | url: webSocketPath + 'phonetalkwebsocket/' + userToken, 19 | data() { 20 | return { 21 | x: '' 22 | }; 23 | }, 24 | header: { 25 | 'content-type': 'application/json' 26 | }, 27 | success: function(res){ 28 | if(res.errMsg == 'connectSocket:ok'){ 29 | console.log('请求成功') 30 | } 31 | }, 32 | fail: function(res){ 33 | console.log(res) 34 | }, 35 | complete: ()=> {} 36 | }); 37 | 38 | //监听WebSocket连接打开事件 39 | socketTask.onOpen(function (res) { 40 | socketOpen = true; 41 | //注意这里有时序问题, 42 | //如果 uni.connectSocket 还没回调 uni.onSocketOpen,而先调用 uni.closeSocket,那么就做不到关闭 WebSocket 的目的。 43 | //必须在 WebSocket 打开期间调用 uni.closeSocket 才能关闭。 44 | console.log('WebSocket连接已打开!'); 45 | // uni.closeSocket(); 46 | }) 47 | 48 | //监听WebSocket接收到服务器的消息事件 49 | socketTask.onMessage(function(res){ 50 | console.log('收到服务器内容:' + res.data); 51 | plus.push.createMessage( "测试消息" ); 52 | }) 53 | 54 | //监听WebSocket错误 55 | socketTask.onError(function(res){ 56 | console.log('WebSocket连接打开失败,请检查!'); 57 | }) 58 | 59 | socketTask.onClose(function(res){ 60 | console.log('WebSocket 已关闭!'); 61 | }) 62 | } 63 | 64 | } 65 | 66 | //发送消息 67 | function sendSocketMessage(msg) { 68 | if (socketOpen && socketTask) { 69 | socketTask.send({ 70 | data: msg, 71 | async success() { 72 | console.log("消息发送成功"); 73 | } 74 | }) 75 | } else { 76 | socketMsgQueue.push(msg); 77 | } 78 | } 79 | 80 | //关闭连接 81 | function cls(){ 82 | var userToken = uni.getStorageSync("userToken") || ''; 83 | 84 | //用户信息不为空时创建连接 85 | if(userToken != '' && userToken != 'undefined' && userToken != null && socketTask){ 86 | socketTask.close({ 87 | success(res) { 88 | this.socketOpen = false; 89 | }, 90 | fail(err) { 91 | console.log("关闭失败", err) 92 | } 93 | }) 94 | } 95 | } 96 | export default { 97 | sendSocketMessage, 98 | cls, 99 | connect 100 | } 101 | -------------------------------------------------------------------------------- /stu-app/components/uni-list/uni-refresh.wxs: -------------------------------------------------------------------------------- 1 | var pullDown = { 2 | threshold: 95, 3 | maxHeight: 200, 4 | callRefresh: 'onrefresh', 5 | callPullingDown: 'onpullingdown', 6 | refreshSelector: '.uni-refresh' 7 | }; 8 | 9 | function ready(newValue, oldValue, ownerInstance, instance) { 10 | var state = instance.getState() 11 | state.canPullDown = newValue; 12 | console.log(newValue); 13 | } 14 | 15 | function touchStart(e, instance) { 16 | var state = instance.getState(); 17 | state.refreshInstance = instance.selectComponent(pullDown.refreshSelector); 18 | state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined); 19 | if (!state.canPullDown) { 20 | return 21 | } 22 | 23 | console.log("touchStart"); 24 | 25 | state.height = 0; 26 | state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY; 27 | state.refreshInstance.setStyle({ 28 | 'height': 0 29 | }); 30 | state.refreshInstance.callMethod("onchange", true); 31 | } 32 | 33 | function touchMove(e, ownerInstance) { 34 | var instance = e.instance; 35 | var state = instance.getState(); 36 | if (!state.canPullDown) { 37 | return 38 | } 39 | 40 | var oldHeight = state.height; 41 | var endY = e.touches[0].pageY || e.changedTouches[0].pageY; 42 | var height = endY - state.touchStartY; 43 | if (height > pullDown.maxHeight) { 44 | return; 45 | } 46 | 47 | var refreshInstance = state.refreshInstance; 48 | refreshInstance.setStyle({ 49 | 'height': height + 'px' 50 | }); 51 | 52 | height = height < pullDown.maxHeight ? height : pullDown.maxHeight; 53 | state.height = height; 54 | refreshInstance.callMethod(pullDown.callPullingDown, { 55 | height: height 56 | }); 57 | } 58 | 59 | function touchEnd(e, ownerInstance) { 60 | var state = e.instance.getState(); 61 | if (!state.canPullDown) { 62 | return 63 | } 64 | 65 | state.refreshInstance.callMethod("onchange", false); 66 | 67 | var refreshInstance = state.refreshInstance; 68 | if (state.height > pullDown.threshold) { 69 | refreshInstance.callMethod(pullDown.callRefresh); 70 | return; 71 | } 72 | 73 | refreshInstance.setStyle({ 74 | 'height': 0 75 | }); 76 | } 77 | 78 | function propObserver(newValue, oldValue, instance) { 79 | pullDown = newValue; 80 | } 81 | 82 | module.exports = { 83 | touchmove: touchMove, 84 | touchstart: touchStart, 85 | touchend: touchEnd, 86 | propObserver: propObserver 87 | } 88 | -------------------------------------------------------------------------------- /cloud-seal/components/uni-list/uni-refresh.wxs: -------------------------------------------------------------------------------- 1 | var pullDown = { 2 | threshold: 95, 3 | maxHeight: 200, 4 | callRefresh: 'onrefresh', 5 | callPullingDown: 'onpullingdown', 6 | refreshSelector: '.uni-refresh' 7 | }; 8 | 9 | function ready(newValue, oldValue, ownerInstance, instance) { 10 | var state = instance.getState() 11 | state.canPullDown = newValue; 12 | console.log(newValue); 13 | } 14 | 15 | function touchStart(e, instance) { 16 | var state = instance.getState(); 17 | state.refreshInstance = instance.selectComponent(pullDown.refreshSelector); 18 | state.canPullDown = (state.refreshInstance != null && state.refreshInstance != undefined); 19 | if (!state.canPullDown) { 20 | return 21 | } 22 | 23 | console.log("touchStart"); 24 | 25 | state.height = 0; 26 | state.touchStartY = e.touches[0].pageY || e.changedTouches[0].pageY; 27 | state.refreshInstance.setStyle({ 28 | 'height': 0 29 | }); 30 | state.refreshInstance.callMethod("onchange", true); 31 | } 32 | 33 | function touchMove(e, ownerInstance) { 34 | var instance = e.instance; 35 | var state = instance.getState(); 36 | if (!state.canPullDown) { 37 | return 38 | } 39 | 40 | var oldHeight = state.height; 41 | var endY = e.touches[0].pageY || e.changedTouches[0].pageY; 42 | var height = endY - state.touchStartY; 43 | if (height > pullDown.maxHeight) { 44 | return; 45 | } 46 | 47 | var refreshInstance = state.refreshInstance; 48 | refreshInstance.setStyle({ 49 | 'height': height + 'px' 50 | }); 51 | 52 | height = height < pullDown.maxHeight ? height : pullDown.maxHeight; 53 | state.height = height; 54 | refreshInstance.callMethod(pullDown.callPullingDown, { 55 | height: height 56 | }); 57 | } 58 | 59 | function touchEnd(e, ownerInstance) { 60 | var state = e.instance.getState(); 61 | if (!state.canPullDown) { 62 | return 63 | } 64 | 65 | state.refreshInstance.callMethod("onchange", false); 66 | 67 | var refreshInstance = state.refreshInstance; 68 | if (state.height > pullDown.threshold) { 69 | refreshInstance.callMethod(pullDown.callRefresh); 70 | return; 71 | } 72 | 73 | refreshInstance.setStyle({ 74 | 'height': 0 75 | }); 76 | } 77 | 78 | function propObserver(newValue, oldValue, instance) { 79 | pullDown = newValue; 80 | } 81 | 82 | module.exports = { 83 | touchmove: touchMove, 84 | touchstart: touchStart, 85 | touchend: touchEnd, 86 | propObserver: propObserver 87 | } 88 | -------------------------------------------------------------------------------- /stu-app/socket.js: -------------------------------------------------------------------------------- 1 | import socket from '@/components/plus-websocket/index.js' 2 | 3 | //检测socket连接是否打开 4 | var socketOpen = false; 5 | //记录未发送的消息 6 | var socketMsgQueue = []; 7 | 8 | var socketTask = null; 9 | 10 | var webSocketPath = 'ws://192.168.1.104:8081/' 11 | 12 | var connect = function() { 13 | var userToken = uni.getStorageSync("userStuToken") || ''; 14 | //用户信息不为空时创建连接 15 | if(userToken != '' && userToken != 'undefined' && userToken != null){ 16 | //创建连接 17 | socketTask = uni.connectSocket({ 18 | url: webSocketPath + 'phonetalkwebsocket/' + userToken, 19 | data() { 20 | return { 21 | x: '' 22 | }; 23 | }, 24 | header: { 25 | 'content-type': 'application/json' 26 | }, 27 | success: function(res){ 28 | if(res.errMsg == 'connectSocket:ok'){ 29 | console.log('请求成功') 30 | } 31 | }, 32 | fail: function(res){ 33 | console.log(res) 34 | }, 35 | complete: ()=> {} 36 | }); 37 | 38 | //监听WebSocket连接打开事件 39 | socketTask.onOpen(function (res) { 40 | socketOpen = true; 41 | //注意这里有时序问题, 42 | //如果 uni.connectSocket 还没回调 uni.onSocketOpen,而先调用 uni.closeSocket,那么就做不到关闭 WebSocket 的目的。 43 | //必须在 WebSocket 打开期间调用 uni.closeSocket 才能关闭。 44 | console.log('WebSocket连接已打开!'); 45 | // uni.closeSocket(); 46 | }) 47 | 48 | //监听WebSocket接收到服务器的消息事件 49 | socketTask.onMessage(function(res){ 50 | console.log('收到服务器内容:' + res.data); 51 | if(typeof plus != 'undefined'){ 52 | plus.push.createMessage( "测试消息" ); 53 | } 54 | }) 55 | 56 | //监听WebSocket错误 57 | socketTask.onError(function(res){ 58 | console.log('WebSocket连接打开失败,请检查!'); 59 | }) 60 | 61 | socketTask.onClose(function(res){ 62 | console.log('WebSocket 已关闭!'); 63 | }) 64 | } 65 | 66 | } 67 | 68 | //发送消息 69 | function sendSocketMessage(msg) { 70 | if (socketOpen && socketTask) { 71 | socketTask.send({ 72 | data: msg, 73 | async success() { 74 | console.log("消息发送成功"); 75 | } 76 | }) 77 | } else { 78 | socketMsgQueue.push(msg); 79 | } 80 | } 81 | 82 | //关闭连接 83 | function cls(){ 84 | var userToken = uni.getStorageSync("userStuToken") || ''; 85 | 86 | //用户信息不为空时创建连接 87 | if(userToken != '' && userToken != 'undefined' && userToken != null && socketTask){ 88 | socketTask.close({ 89 | success(res) { 90 | this.socketOpen = false; 91 | }, 92 | fail(err) { 93 | console.log("关闭失败", err) 94 | } 95 | }) 96 | } 97 | } 98 | export default { 99 | sendSocketMessage, 100 | cls, 101 | connect 102 | } 103 | -------------------------------------------------------------------------------- /stu-app/components/uni-icons/icons.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'contact': '\ue100', 3 | 'person': '\ue101', 4 | 'personadd': '\ue102', 5 | 'contact-filled': '\ue130', 6 | 'person-filled': '\ue131', 7 | 'personadd-filled': '\ue132', 8 | 'phone': '\ue200', 9 | 'email': '\ue201', 10 | 'chatbubble': '\ue202', 11 | 'chatboxes': '\ue203', 12 | 'phone-filled': '\ue230', 13 | 'email-filled': '\ue231', 14 | 'chatbubble-filled': '\ue232', 15 | 'chatboxes-filled': '\ue233', 16 | 'weibo': '\ue260', 17 | 'weixin': '\ue261', 18 | 'pengyouquan': '\ue262', 19 | 'chat': '\ue263', 20 | 'qq': '\ue264', 21 | 'videocam': '\ue300', 22 | 'camera': '\ue301', 23 | 'mic': '\ue302', 24 | 'location': '\ue303', 25 | 'mic-filled': '\ue332', 26 | 'speech': '\ue332', 27 | 'location-filled': '\ue333', 28 | 'micoff': '\ue360', 29 | 'image': '\ue363', 30 | 'map': '\ue364', 31 | 'compose': '\ue400', 32 | 'trash': '\ue401', 33 | 'upload': '\ue402', 34 | 'download': '\ue403', 35 | 'close': '\ue404', 36 | 'redo': '\ue405', 37 | 'undo': '\ue406', 38 | 'refresh': '\ue407', 39 | 'star': '\ue408', 40 | 'plus': '\ue409', 41 | 'minus': '\ue410', 42 | 'circle': '\ue411', 43 | 'checkbox': '\ue411', 44 | 'close-filled': '\ue434', 45 | 'clear': '\ue434', 46 | 'refresh-filled': '\ue437', 47 | 'star-filled': '\ue438', 48 | 'plus-filled': '\ue439', 49 | 'minus-filled': '\ue440', 50 | 'circle-filled': '\ue441', 51 | 'checkbox-filled': '\ue442', 52 | 'closeempty': '\ue460', 53 | 'refreshempty': '\ue461', 54 | 'reload': '\ue462', 55 | 'starhalf': '\ue463', 56 | 'spinner': '\ue464', 57 | 'spinner-cycle': '\ue465', 58 | 'search': '\ue466', 59 | 'plusempty': '\ue468', 60 | 'forward': '\ue470', 61 | 'back': '\ue471', 62 | 'left-nav': '\ue471', 63 | 'checkmarkempty': '\ue472', 64 | 'home': '\ue500', 65 | 'navigate': '\ue501', 66 | 'gear': '\ue502', 67 | 'paperplane': '\ue503', 68 | 'info': '\ue504', 69 | 'help': '\ue505', 70 | 'locked': '\ue506', 71 | 'more': '\ue507', 72 | 'flag': '\ue508', 73 | 'home-filled': '\ue530', 74 | 'gear-filled': '\ue532', 75 | 'info-filled': '\ue534', 76 | 'help-filled': '\ue535', 77 | 'more-filled': '\ue537', 78 | 'settings': '\ue560', 79 | 'list': '\ue562', 80 | 'bars': '\ue563', 81 | 'loop': '\ue565', 82 | 'paperclip': '\ue567', 83 | 'eye': '\ue568', 84 | 'arrowup': '\ue580', 85 | 'arrowdown': '\ue581', 86 | 'arrowleft': '\ue582', 87 | 'arrowright': '\ue583', 88 | 'arrowthinup': '\ue584', 89 | 'arrowthindown': '\ue585', 90 | 'arrowthinleft': '\ue586', 91 | 'arrowthinright': '\ue587', 92 | 'pulldown': '\ue588', 93 | 'closefill': '\ue589', 94 | 'sound': '\ue590', 95 | 'scan': '\ue612' 96 | } 97 | -------------------------------------------------------------------------------- /cloud-seal/components/uni-icons/icons.js: -------------------------------------------------------------------------------- 1 | export default { 2 | 'contact': '\ue100', 3 | 'person': '\ue101', 4 | 'personadd': '\ue102', 5 | 'contact-filled': '\ue130', 6 | 'person-filled': '\ue131', 7 | 'personadd-filled': '\ue132', 8 | 'phone': '\ue200', 9 | 'email': '\ue201', 10 | 'chatbubble': '\ue202', 11 | 'chatboxes': '\ue203', 12 | 'phone-filled': '\ue230', 13 | 'email-filled': '\ue231', 14 | 'chatbubble-filled': '\ue232', 15 | 'chatboxes-filled': '\ue233', 16 | 'weibo': '\ue260', 17 | 'weixin': '\ue261', 18 | 'pengyouquan': '\ue262', 19 | 'chat': '\ue263', 20 | 'qq': '\ue264', 21 | 'videocam': '\ue300', 22 | 'camera': '\ue301', 23 | 'mic': '\ue302', 24 | 'location': '\ue303', 25 | 'mic-filled': '\ue332', 26 | 'speech': '\ue332', 27 | 'location-filled': '\ue333', 28 | 'micoff': '\ue360', 29 | 'image': '\ue363', 30 | 'map': '\ue364', 31 | 'compose': '\ue400', 32 | 'trash': '\ue401', 33 | 'upload': '\ue402', 34 | 'download': '\ue403', 35 | 'close': '\ue404', 36 | 'redo': '\ue405', 37 | 'undo': '\ue406', 38 | 'refresh': '\ue407', 39 | 'star': '\ue408', 40 | 'plus': '\ue409', 41 | 'minus': '\ue410', 42 | 'circle': '\ue411', 43 | 'checkbox': '\ue411', 44 | 'close-filled': '\ue434', 45 | 'clear': '\ue434', 46 | 'refresh-filled': '\ue437', 47 | 'star-filled': '\ue438', 48 | 'plus-filled': '\ue439', 49 | 'minus-filled': '\ue440', 50 | 'circle-filled': '\ue441', 51 | 'checkbox-filled': '\ue442', 52 | 'closeempty': '\ue460', 53 | 'refreshempty': '\ue461', 54 | 'reload': '\ue462', 55 | 'starhalf': '\ue463', 56 | 'spinner': '\ue464', 57 | 'spinner-cycle': '\ue465', 58 | 'search': '\ue466', 59 | 'plusempty': '\ue468', 60 | 'forward': '\ue470', 61 | 'back': '\ue471', 62 | 'left-nav': '\ue471', 63 | 'checkmarkempty': '\ue472', 64 | 'home': '\ue500', 65 | 'navigate': '\ue501', 66 | 'gear': '\ue502', 67 | 'paperplane': '\ue503', 68 | 'info': '\ue504', 69 | 'help': '\ue505', 70 | 'locked': '\ue506', 71 | 'more': '\ue507', 72 | 'flag': '\ue508', 73 | 'home-filled': '\ue530', 74 | 'gear-filled': '\ue532', 75 | 'info-filled': '\ue534', 76 | 'help-filled': '\ue535', 77 | 'more-filled': '\ue537', 78 | 'settings': '\ue560', 79 | 'list': '\ue562', 80 | 'bars': '\ue563', 81 | 'loop': '\ue565', 82 | 'paperclip': '\ue567', 83 | 'eye': '\ue568', 84 | 'arrowup': '\ue580', 85 | 'arrowdown': '\ue581', 86 | 'arrowleft': '\ue582', 87 | 'arrowright': '\ue583', 88 | 'arrowthinup': '\ue584', 89 | 'arrowthindown': '\ue585', 90 | 'arrowthinleft': '\ue586', 91 | 'arrowthinright': '\ue587', 92 | 'pulldown': '\ue588', 93 | 'closefill': '\ue589', 94 | 'sound': '\ue590', 95 | 'scan': '\ue612' 96 | } 97 | -------------------------------------------------------------------------------- /cloud-seal/pages/sparepart/sparepartMyOrder/itemModel.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | 91 | 92 | 94 | -------------------------------------------------------------------------------- /cloud-seal/pages/mine/myEditPwd.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 79 | 80 | 82 | -------------------------------------------------------------------------------- /stu-app/pages/mine/myEditPwd.vue: -------------------------------------------------------------------------------- 1 | 31 | 32 | 79 | 80 | 82 | -------------------------------------------------------------------------------- /cloud-seal/pages/workorder/workAllorderState/workAllorderState.vue: -------------------------------------------------------------------------------- 1 | 21 | 22 | 73 | 74 | 106 | -------------------------------------------------------------------------------- /cloud-seal/pages/workorder/workMyWriteorder/workMyWriteorderItem.vue: -------------------------------------------------------------------------------- 1 | 34 | 35 | 94 | 95 | 97 | -------------------------------------------------------------------------------- /cloud-seal/pages/notice/myNotice/myNoticeListItem.vue: -------------------------------------------------------------------------------- 1 | 23 | 24 | 92 | 93 | 102 | -------------------------------------------------------------------------------- /cloud-seal/pages/workbench/workbench.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 61 | 62 | 115 | -------------------------------------------------------------------------------- /cloud-seal/pages/mine/myMation.vue: -------------------------------------------------------------------------------- 1 | 61 | 62 | 103 | 104 | 113 | -------------------------------------------------------------------------------- /cloud-seal/components/pickerAddress/pickerAddress.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 117 | 118 | 120 | -------------------------------------------------------------------------------- /stu-app/components/pickerAddress/pickerAddress.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 117 | 118 | 120 | -------------------------------------------------------------------------------- /cloud-seal/components/uni-badge/uni-badge.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 40 | 41 | 123 | -------------------------------------------------------------------------------- /stu-app/components/uni-badge/uni-badge.vue: -------------------------------------------------------------------------------- 1 | 5 | 6 | 40 | 41 | 123 | -------------------------------------------------------------------------------- /stu-app/pages/workbench/workbench.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 72 | 73 | 126 | -------------------------------------------------------------------------------- /stu-app/components/vmeitime-http/index.js: -------------------------------------------------------------------------------- 1 | /** 2 | * 通用uni-app网络请求 3 | * 基于 Promise 对象实现更简单的 request 使用方式,支持请求和响应拦截 4 | */ 5 | export default { 6 | config: { 7 | baseUrl: "http://192.168.1.104:8081/", 8 | data: {}, 9 | header: { 10 | 'Content-Type':'application/x-www-form-urlencoded', 11 | "userToken": uni.getStorageSync("userStuToken") || '', 12 | "requestType": "2" 13 | }, 14 | method: "GET", 15 | dataType: "json", 16 | /* 如设为json,会对返回的数据做一次 JSON.parse */ 17 | responseType: "text", 18 | success() {}, 19 | fail() {}, 20 | complete() {} 21 | }, 22 | request(options) { 23 | if (!options) { 24 | options = {} 25 | } 26 | options.baseUrl = options.baseUrl || this.config.baseUrl 27 | options.dataType = options.dataType || this.config.dataType 28 | options.url = options.baseUrl + options.url 29 | options.data = options.data || {} 30 | options.method = options.method || this.config.method 31 | 32 | return new Promise((resolve, reject) => { 33 | let _config = null 34 | 35 | options.complete = (response) => { 36 | let statusCode = response.statusCode 37 | if (statusCode === 200) { //成功 38 | //判断当前登录用户是否超时 39 | if(response.header.sessionstatus && 'TIMEOUT' === response.header.sessionstatus){ 40 | uni.showToast({ 41 | icon: 'none', 42 | position: 'bottom', 43 | title: '登录超时,请重新登录.', 44 | complete: function(){ 45 | uni.reLaunch({ 46 | url: '/pages/login/login', 47 | }); 48 | } 49 | }); 50 | return; 51 | }else if(response.header.sessionstatus && 'NOAUTHPOINT' === response.header.sessionstatus){ 52 | uni.showToast({ 53 | icon: 'none', 54 | position: 'bottom', 55 | title: '您不具备该权限.' 56 | }); 57 | return; 58 | } 59 | //请求成功 60 | resolve(response.data); 61 | } else { 62 | //请求失败 63 | resolve({ 64 | bean: "", 65 | error: "0", 66 | returnCode: -9999, 67 | returnMessage: "请求失败!", 68 | rows: "", 69 | total: 0 70 | }); 71 | } 72 | } 73 | 74 | _config = Object.assign({}, this.config, options) 75 | _config.requestId = new Date().getTime() 76 | _config.header.userToken = uni.getStorageSync("userStuToken") || '' 77 | 78 | //发起请求 79 | uni.request(_config); 80 | }); 81 | }, 82 | get(url, data, options) { 83 | if (!options) { 84 | options = {} 85 | } 86 | options.url = url 87 | options.data = data 88 | options.method = 'GET' 89 | return this.request(options) 90 | }, 91 | post(url, data, options) { 92 | if (!options) { 93 | options = {} 94 | } 95 | options.url = url 96 | options.data = data 97 | options.method = 'POST' 98 | return this.request(options) 99 | }, 100 | put(url, data, options) { 101 | if (!options) { 102 | options = {} 103 | } 104 | options.url = url 105 | options.data = data 106 | options.method = 'PUT' 107 | return this.request(options) 108 | }, 109 | delete(url, data, options) { 110 | if (!options) { 111 | options = {} 112 | } 113 | options.url = url 114 | options.data = data 115 | options.method = 'DELETE' 116 | return this.request(options) 117 | } 118 | } 119 | -------------------------------------------------------------------------------- /stu-app/components/watch-login/watch-button.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 41 | 42 | 109 | -------------------------------------------------------------------------------- /cloud-seal/components/watch-login/watch-button.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 41 | 42 | 109 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # cloud-after-sale 2 | 3 | #### 介绍 4 | 基于uniapp开发的适用于微信小程序,头条小程序,支付宝小程序,H5端的云售后。目前包括云售后各种功能的静态页面,集成多种自定义插件,[ 微信 + 支付宝 + 百度 + 头条 ] 小程序 + APP + 公众号 + PC + H5 项目代码简洁注释丰富上手容易,适合学习和企业中使用。 5 | 6 | > 该项目为售后工单系统的手机端,包括工单、申领单、客户、产品等多模块内容,目前正在做前后端联调。旨在真正意义上完成云售后的概念 7 | 8 | #### 已集成插件 9 | - [动态标签](https://ext.dcloud.net.cn/plugin?id=316) (v1.2) 10 | - [文件上传](https://ext.dcloud.net.cn/plugin?id=877) (2019-11-04) 11 | - [图片上传](https://ext.dcloud.net.cn/plugin?id=296) (2019-04-08) 12 | - [下拉刷新,上拉加载](https://ext.dcloud.net.cn/plugin?id=343) (v1.2.4 ⬆) 13 | - [表单验证](https://ext.dcloud.net.cn/plugin?id=746) (2019-09-06) 14 | - [popup 弹出层](https://ext.dcloud.net.cn/plugin?id=254) (2019-04-30) 15 | - [树插件](https://ext.dcloud.net.cn/plugin?id=1000) (v1.09 ⬇) 16 | - [位置判断](https://ext.dcloud.net.cn/plugin?id=594) (2019-07-20) 17 | - [选项卡导航栏](https://ext.dcloud.net.cn/plugin?id=626) (2019-08-02) 18 | - [文件管理器](https://ext.dcloud.net.cn/plugin?id=680) (v1.0.0) 19 | - [Badge 数字角标](https://ext.dcloud.net.cn/plugin?id=21) (v1.0.5) 20 | - [Fab 悬浮按钮](https://ext.dcloud.net.cn/plugin?id=144) (v1.0.5) 21 | - [js独立覆盖原生导航,几种常用类型,自定义modal](https://ext.dcloud.net.cn/plugin?id=820) (v1.2.0) 22 | - [消息界面](https://ext.dcloud.net.cn/plugin?id=208) (2019-04-04) 23 | 24 | #### 项目交流群 25 | 26 | - 开源不易,给个`star`吧 27 | - 项目交流群:(群一(满):[696070023](http://shang.qq.com/wpa/qunwpa?idkey=e9aace2bf3e05f37ed5f0377c3827c6683d970ac0bcc61b601f70dc861053229))(群二:[836039567](https://shang.qq.com/wpa/qunwpa?idkey=7bb6f29b27f772aadca9c7c4e384f7833c64e9c3c947b5e946c7b303d1fe174a))(群三:[887391486](https://shang.qq.com/wpa/qunwpa?idkey=a65f2e0292eb1048bb13abb7adca302bd83e3465974861ec1f04c2f7fffc4d99)) 28 | - 请不要重复加群,一个群就可以了,把机会留给更多人 29 | - 进群先看公告!!!进群先看公告!!!进群先看公告!!! 重要的事情说三遍 30 | - 此软件为个人软件,没有试用地址,主项目地址:https://gitee.com/doc_wei01/skyeye 31 | 32 | #### 平台推荐 33 | 34 | - 地图(高德地图):https://lbs.amap.com/ 35 | - 安卓平台签名证书:https://ask.dcloud.net.cn/article/35777 36 | - 消息推送平台(个推):https://dev.getui.com/dev/#/appManage 37 | - uni-push:https://dev.dcloud.net.cn/uni/push 38 | 39 | #### 开发工具 40 | 41 | > HBuilderX:[下载地址](https://www.dcloud.io/hbuilderx.html) 42 | 43 | #### 插件集成项 44 | 45 | > 插件安装方法:【工具】->【插件安装】 46 | 47 | - NPM:nodejs包管理,众多插件的安装基础 48 | - APP真机运行:App开发真机运行(需要的安装即可) 49 | - uni-app编辑:uni-app编译到各端的编译器 50 | - js-beautify:格式化vue,html,js,css,json代码 51 | - eslint-plugin-vue:vue语法校验 52 | - less编译:编译less为css,uni-app编译或对文件右键-外部命令编译时使用 53 | - scss/sass编译:编译scss为css,uni-app编译或对文件右键-外部命令编译时使用 54 | 55 | #### 功能点 56 | 57 | > 该功能点为目前已开发功能,`还在持续更新中` 58 | 59 | - 工单管理 60 | - 申领单管理 61 | - 配件管理 62 | - 产品管理 63 | - 客户管理 64 | - 云盘管理 65 | - 考勤签到 66 | - 工作日志 67 | 68 | 69 | #### 效果图 70 | 71 | 效果图|效果图|效果图|效果图 72 | -------|-------|-------|------- 73 | |![输入图片说明](https://images.gitee.com/uploads/images/2020/0210/152434_b36e023c_1541735.png "1.png")|![输入图片说明](https://images.gitee.com/uploads/images/2020/0219/103041_6738cf11_1541735.png "1.png")|![输入图片说明](https://images.gitee.com/uploads/images/2020/0210/152535_2d3e3249_1541735.png "1.png")|![输入图片说明](https://images.gitee.com/uploads/images/2020/0210/152603_2f610677_1541735.png "1.png")| 74 | |![输入图片说明](https://images.gitee.com/uploads/images/2020/0210/152629_8ce90e88_1541735.png "1.png")|![输入图片说明](https://images.gitee.com/uploads/images/2020/0210/152657_5a39487c_1541735.png "1.png")|![输入图片说明](https://images.gitee.com/uploads/images/2020/0219/102857_767524d2_1541735.png "1.png")|![输入图片说明](https://images.gitee.com/uploads/images/2020/0219/102935_f74b3947_1541735.png "1.png")| 75 | 76 | 77 | -------------------------------------------------------------------------------- /cloud-seal/pages/common/imgPreview.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 69 | 70 | 147 | -------------------------------------------------------------------------------- /stu-app/pages/common/imgPreview.vue: -------------------------------------------------------------------------------- 1 | 19 | 20 | 69 | 70 | 147 | --------------------------------------------------------------------------------