73 |
74 |
82 | 系统登录
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 | 登录
92 |
93 |
94 |
95 |
96 |
97 |
98 |
--------------------------------------------------------------------------------
/template/components/video-player/lang/de.json:
--------------------------------------------------------------------------------
1 | {
2 | "Play": "Wiedergabe",
3 | "Pause": "Pause",
4 | "Current Time": "Aktueller Zeitpunkt",
5 | "Duration Time": "Dauer",
6 | "Remaining Time": "Verbleibende Zeit",
7 | "Stream Type": "Streamtyp",
8 | "LIVE": "LIVE",
9 | "Loaded": "Geladen",
10 | "Progress": "Status",
11 | "Fullscreen": "Vollbild",
12 | "Non-Fullscreen": "Kein Vollbild",
13 | "Mute": "Ton aus",
14 | "Unmute": "Ton ein",
15 | "Playback Rate": "Wiedergabegeschwindigkeit",
16 | "Subtitles": "Untertitel",
17 | "subtitles off": "Untertitel aus",
18 | "Captions": "Untertitel",
19 | "captions off": "Untertitel aus",
20 | "Chapters": "Kapitel",
21 | "You aborted the media playback": "Sie haben die Videowiedergabe abgebrochen.",
22 | "A network error caused the media download to fail part-way.": "Der Videodownload ist aufgrund eines Netzwerkfehlers fehlgeschlagen.",
23 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Das Video konnte nicht geladen werden, da entweder ein Server- oder Netzwerkfehler auftrat oder das Format nicht unterstützt wird.",
24 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Die Videowiedergabe wurde entweder wegen eines Problems mit einem beschädigten Video oder wegen verwendeten Funktionen, die vom Browser nicht unterstützt werden, abgebrochen.",
25 | "No compatible source was found for this media.": "Für dieses Video wurde keine kompatible Quelle gefunden.",
26 | "Play Video": "Video abspielen",
27 | "Close": "Schließen",
28 | "Modal Window": "Modales Fenster",
29 | "This is a modal window": "Dies ist ein modales Fenster",
30 | "This modal can be closed by pressing the Escape key or activating the close button.": "Durch Drücken der Esc-Taste bzw. Betätigung der Schaltfläche \"Schließen\" wird dieses modale Fenster geschlossen.",
31 | ", opens captions settings dialog": ", öffnet Einstellungen für Untertitel",
32 | ", opens subtitles settings dialog": ", öffnet Einstellungen für Untertitel",
33 | ", selected": ", ausgewählt",
34 | "Close Modal Dialog": "Modales Fenster schließen",
35 | "Descriptions": "Beschreibungen",
36 | "descriptions off": "Beschreibungen aus",
37 | "The media is encrypted and we do not have the keys to decrypt it.": "Die Entschlüsselungsschlüssel für den verschlüsselten Medieninhalt sind nicht verfügbar.",
38 | ", opens descriptions settings dialog": ", öffnet Einstellungen für Beschreibungen",
39 | "Audio Track": "Tonspur"
40 | }
41 |
--------------------------------------------------------------------------------
/template/components/video-player/lang/fr.json:
--------------------------------------------------------------------------------
1 | {
2 | "Play": "Lecture",
3 | "Pause": "Pause",
4 | "Current Time": "Temps actuel",
5 | "Duration Time": "Durée",
6 | "Remaining Time": "Temps restant",
7 | "Stream Type": "Type de flux",
8 | "LIVE": "EN DIRECT",
9 | "Loaded": "Chargé",
10 | "Progress": "Progression",
11 | "Fullscreen": "Plein écran",
12 | "Non-Fullscreen": "Fenêtré",
13 | "Mute": "Sourdine",
14 | "Unmute": "Son activé",
15 | "Playback Rate": "Vitesse de lecture",
16 | "Subtitles": "Sous-titres",
17 | "subtitles off": "Sous-titres désactivés",
18 | "Captions": "Sous-titres transcrits",
19 | "captions off": "Sous-titres transcrits désactivés",
20 | "Chapters": "Chapitres",
21 | "Close Modal Dialog": "Fermer la boîte de dialogue modale",
22 | "Descriptions": "Descriptions",
23 | "descriptions off": "descriptions désactivées",
24 | "Audio Track": "Piste audio",
25 | "You aborted the media playback": "Vous avez interrompu la lecture de la vidéo.",
26 | "A network error caused the media download to fail part-way.": "Une erreur de réseau a interrompu le téléchargement de la vidéo.",
27 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Cette vidéo n'a pas pu être chargée, soit parce que le serveur ou le réseau a échoué ou parce que le format n'est pas reconnu.",
28 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "La lecture de la vidéo a été interrompue à cause d'un problème de corruption ou parce que la vidéo utilise des fonctionnalités non prises en charge par votre navigateur.",
29 | "No compatible source was found for this media.": "Aucune source compatible n'a été trouvée pour cette vidéo.",
30 | "The media is encrypted and we do not have the keys to decrypt it.": "Le média est chiffré et nous n'avons pas les clés pour le déchiffrer.",
31 | "Play Video": "Lire la vidéo",
32 | "Close": "Fermer",
33 | "Modal Window": "Fenêtre modale",
34 | "This is a modal window": "Ceci est une fenêtre modale",
35 | "This modal can be closed by pressing the Escape key or activating the close button.": "Ce modal peut être fermé en appuyant sur la touche Échap ou activer le bouton de fermeture.",
36 | ", opens captions settings dialog": ", ouvrir les paramètres des sous-titres transcrits",
37 | ", opens subtitles settings dialog": ", ouvrir les paramètres des sous-titres",
38 | ", opens descriptions settings dialog": ", ouvrir les paramètres des descriptions",
39 | ", selected": ", sélectionné"
40 | }
41 |
--------------------------------------------------------------------------------
/template/components/video-player/lang/el.json:
--------------------------------------------------------------------------------
1 | {
2 | "Play": "Aναπαραγωγή",
3 | "Pause": "Παύση",
4 | "Current Time": "Τρέχων χρόνος",
5 | "Duration Time": "Συνολικός χρόνος",
6 | "Remaining Time": "Υπολοιπόμενος χρόνος",
7 | "Stream Type": "Τύπος ροής",
8 | "LIVE": "ΖΩΝΤΑΝΑ",
9 | "Loaded": "Φόρτωση επιτυχής",
10 | "Progress": "Πρόοδος",
11 | "Fullscreen": "Πλήρης οθόνη",
12 | "Non-Fullscreen": "Έξοδος από πλήρη οθόνη",
13 | "Mute": "Σίγαση",
14 | "Unmute": "Kατάργηση σίγασης",
15 | "Playback Rate": "Ρυθμός αναπαραγωγής",
16 | "Subtitles": "Υπότιτλοι",
17 | "subtitles off": "απόκρυψη υπότιτλων",
18 | "Captions": "Λεζάντες",
19 | "captions off": "απόκρυψη λεζάντων",
20 | "Chapters": "Κεφάλαια",
21 | "Close Modal Dialog": "Κλείσιμο παραθύρου",
22 | "Descriptions": "Περιγραφές",
23 | "descriptions off": "απόκρυψη περιγραφών",
24 | "Audio Track": "Ροή ήχου",
25 | "You aborted the media playback": "Ακυρώσατε την αναπαραγωγή",
26 | "A network error caused the media download to fail part-way.": "Ένα σφάλμα δικτύου προκάλεσε την αποτυχία μεταφόρτωσης του αρχείου προς αναπαραγωγή.",
27 | "The media could not be loaded, either because the server or network failed or because the format is not supported.": "Το αρχείο προς αναπαραγωγή δεν ήταν δυνατό να φορτωθεί είτε γιατί υπήρξε σφάλμα στον διακομιστή ή το δίκτυο, είτε γιατί ο τύπος του αρχείου δεν υποστηρίζεται.",
28 | "The media playback was aborted due to a corruption problem or because the media used features your browser did not support.": "Η αναπαραγωγή ακυρώθηκε είτε λόγω κατεστραμμένου αρχείου, είτε γιατί το αρχείο απαιτεί λειτουργίες που δεν υποστηρίζονται από το πρόγραμμα περιήγησης που χρησιμοποιείτε.",
29 | "No compatible source was found for this media.": "Δεν βρέθηκε συμβατή πηγή αναπαραγωγής για το συγκεκριμένο αρχείο.",
30 | "The media is encrypted and we do not have the keys to decrypt it.": "Το αρχείο προς αναπαραγωγή είναι κρυπτογραφημένo και δεν υπάρχουν τα απαραίτητα κλειδιά αποκρυπτογράφησης.",
31 | "Play Video": "Αναπαραγωγή βίντεο",
32 | "Close": "Κλείσιμο",
33 | "Modal Window": "Aναδυόμενο παράθυρο",
34 | "This is a modal window": "Το παρών είναι ένα αναδυόμενο παράθυρο",
35 | "This modal can be closed by pressing the Escape key or activating the close button.": "Αυτό το παράθυρο μπορεί να εξαφανιστεί πατώντας το πλήκτρο Escape ή πατώντας το κουμπί κλεισίματος.",
36 | ", opens captions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις λεζάντες",
37 | ", opens subtitles settings dialog": ", εμφανίζει τις ρυθμίσεις για τους υπότιτλους",
38 | ", opens descriptions settings dialog": ", εμφανίζει τις ρυθμίσεις για τις περιγραφές",
39 | ", selected": ", επιλεγμένο"
40 | }
41 |
--------------------------------------------------------------------------------
/template/theme/element-variables.css:
--------------------------------------------------------------------------------
1 | :root {
2 |
3 | /* Transition
4 | -------------------------- */
5 |
6 | /* Colors
7 | -------------------------- */
8 |
9 | /* Link
10 | -------------------------- */
11 |
12 | /* Border
13 | -------------------------- */
14 |
15 | /* Box-shadow
16 | -------------------------- */
17 |
18 | /* Fill
19 | -------------------------- */
20 |
21 | /* Font
22 | -------------------------- */
23 |
24 | /* Size
25 | -------------------------- */
26 |
27 | /* z-index
28 | -------------------------- */
29 |
30 | /* Disable base
31 | -------------------------- */
32 |
33 | /* Icon
34 | -------------------------- */
35 |
36 | /* Checkbox
37 | -------------------------- */
38 |
39 |
40 |
41 | /* Radio
42 | -------------------------- */
43 |
44 | /* Select
45 | -------------------------- */
46 |
47 | /* Alert
48 | -------------------------- */
49 |
50 | /* Message Box
51 | -------------------------- */
52 |
53 | /* Message
54 | -------------------------- */
55 |
56 | /* Notification
57 | -------------------------- */
58 |
59 | /* Input
60 | -------------------------- */
61 |
62 | /* Cascader
63 | -------------------------- */
64 |
65 | /* Group
66 | -------------------------- */
67 |
68 | /* Tab
69 | -------------------------- */
70 |
71 | /* Button
72 | -------------------------- */
73 |
74 |
75 | /* cascader
76 | -------------------------- */
77 |
78 | /* Switch
79 | -------------------------- */
80 |
81 | /* Dialog
82 | -------------------------- */
83 |
84 | /* Table
85 | -------------------------- */
86 |
87 | /* Pagination
88 | -------------------------- */
89 |
90 | /* Popover
91 | -------------------------- */
92 |
93 | /* Tooltip
94 | -------------------------- */
95 |
96 | /* Tag
97 | -------------------------- */
98 |
99 | /* Dropdown
100 | -------------------------- */
101 |
102 | /* Badge
103 | -------------------------- */
104 |
105 | /* Card
106 | --------------------------*/
107 |
108 | /* Slider
109 | --------------------------*/
110 |
111 | /* Steps
112 | --------------------------*/
113 |
114 | /* Menu
115 | --------------------------*/
116 |
117 | /* Rate
118 | --------------------------*/
119 |
120 | /* DatePicker
121 | --------------------------*/
122 |
123 | /* Loading
124 | --------------------------*/
125 |
126 | /* Scrollbar
127 | --------------------------*/
128 |
129 | /* Carousel
130 | --------------------------*/
131 |
132 | /* Collapse
133 | --------------------------*/
134 |
135 | /* Transfer
136 | --------------------------*/
137 | }
138 |
--------------------------------------------------------------------------------
/template/assets/util/sort.js:
--------------------------------------------------------------------------------
1 | import util from 'ddv-util'
2 |
3 | export default sort
4 | /**
5 | * array 检测数组
6 | * opts 配置参数
7 | * [callback] 回调,有则使用异步,没有则同步
8 | * [isRec] 是否递归查询
9 | */
10 | function sort (array, opts, callback, isRec) {
11 | if (!Array.isArray(array)) {
12 | throw new Error('"data" is not an array')
13 | }
14 |
15 | if (!(typeof callback === 'function')) {
16 | isRec = callback === true
17 | callback = null
18 | }
19 |
20 | if (array.length <= 1 && !isRec) {
21 | if (callback) {
22 | callback(array)
23 | } else {
24 | return array
25 | }
26 | }
27 | let sortOrderCheck = ['asc', 'desc']
28 | var arr = []
29 | util.extend(true, arr, array)
30 | /**
31 | * sortOrder 排序规则,asc是指定列按升序排列,desc则是指定列按降序排列
32 | * prop 排序检测key;如为一维数组则可以不传
33 | * children 指定子节点对象的某个属性值
34 | */
35 | opts = (typeof opts === 'object') ? opts : { sortOrder: 'desc' }
36 | // 默认降序
37 | opts.sortOrder = sortOrderCheck.includes(opts.sortOrder) ? opts.sortOrder : 'desc'
38 | sortOrderCheck = void 0
39 |
40 | var recFn = (arr) => {
41 | arr.forEach(item => {
42 | if (Array.isArray(item[opts.children]) && item[opts.children].length > 1) {
43 | item = item[opts.children].sort(by(opts.prop, opts.sortOrder))
44 | recFn(item)
45 | }
46 | })
47 | }
48 |
49 | var fn = () => {
50 | arr.sort(by(opts.prop, opts.sortOrder))
51 |
52 | if (isRec && opts.children) {
53 | recFn(arr)
54 | }
55 | }
56 |
57 | if (callback) {
58 | Promise.resolve()
59 | .then(() => {
60 | fn()
61 | callback(arr)
62 | })
63 | } else {
64 | fn()
65 | return arr
66 | }
67 | }
68 |
69 | function isNumber (data, prop) {
70 | var flag = false
71 |
72 | if (typeof data === 'object') {
73 | flag = !!(Number(data[prop]) || Number(data[prop] === 0));
74 | } else if (typeof data === 'number' || typeof data === 'string') {
75 | flag = !!(Number(data) || Number(data === 0));
76 | }
77 | return flag
78 | }
79 |
80 | function by(name, sort) {
81 | return function(o, p) {
82 | var a, b;
83 | var flag = sort === "desc" ? 1 : -1;
84 | let oFlag = isNumber(o, name)
85 | let pFlag = isNumber(p, name)
86 |
87 | if (o && p && oFlag && pFlag) {
88 | oFlag = pFlag = void 0;
89 | a = typeof o === "object" ? parseInt(o[name]) : parseInt(o);
90 | b = typeof p === "object" ? parseInt(p[name]) : parseInt(p);
91 | if (a === b) {
92 | return 0;
93 | }
94 | if (typeof a === typeof b) {
95 | return a < b ? flag : -flag;
96 | }
97 | return typeof a < typeof b ? flag : -flag;
98 | }
99 | };
100 | }
101 |
--------------------------------------------------------------------------------
/template/plugins/inject.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | const emptyLeft = '(\\s|^)'
3 | const emptyright = '(\\s|$)'
4 |
5 | let filters = { // 过滤器
6 | time: (val, rule = 'Y-m-d h:m:s') => {
7 | return d.date(rule, val)
8 | }
9 | }
10 |
11 | Object.keys(filters).forEach(key => {
12 | Vue.filter(key, filters[key])
13 | })
14 | // class操作兼容
15 | function hasClass (elements, cName) {
16 | return !!elements.className.match(new RegExp(emptyLeft + cName + emptyright))
17 | }
18 | function addClass (elements, cName) {
19 | if (!hasClass(elements, cName)) {
20 | elements.className += ' ' + cName
21 | }
22 | }
23 | function removeClass (elements, cName) {
24 | if (hasClass(elements, cName)) {
25 | elements.className = elements.className.replace(new RegExp(emptyLeft + cName + emptyright), ' ')
26 | }
27 | }
28 | let directive = { // 指令
29 | center: function (el, binding) { // 图片居中切割
30 | el.onload = (e) => {
31 | let w = el.naturalWidth
32 | let h = el.naturalHeight
33 | let pW = el.parentNode.offsetWidth
34 | let pH = el.parentNode.offsetHeight
35 | let ratio = w / h
36 | let pRatio = pW / pH
37 | if (pRatio > ratio) {
38 | removeClass(el, 'Hcenter')
39 | addClass(el, 'Vcenter')
40 | // el.classList.remove('Hcenter')
41 | // el.classList.add('Vcenter')
42 | } else {
43 | removeClass(el, 'Vcenter')
44 | addClass(el, 'Hcenter')
45 | // el.classList.remove('Vcenter')
46 | // el.classList.add('Hcenter')
47 | }
48 | }
49 | },
50 | flex: function (el, binding) { // 容器自适应
51 | // el.classList.add('flex-box')
52 | addClass(el, 'flex-box')
53 | var div = document.createElement('div')
54 | div.className = 'expansion'
55 | div.style.paddingBottom = binding.value * 100 + '%'
56 | el.appendChild(div)
57 | },
58 | src: function (el, binding) {
59 | if (binding.value === el.src) return
60 | setTimeout(() => {
61 | let pW = el.parentNode.offsetWidth
62 | let pH = el.parentNode.offsetHeight
63 | if (binding.modifiers.center) {
64 | el.src = binding.value + '?x-oss-process=image/resize,m_fill,h_' + parseInt(pH) + ',w_' + parseInt(pW)
65 | el.onload = function (e) {
66 | let w = el.naturalWidth
67 | let h = el.naturalHeight
68 | let ratio = w / h
69 | let pRatio = pW / pH
70 | if (pRatio > ratio) {
71 | removeClass(el, 'Hcenter')
72 | addClass(el, 'Vcenter')
73 | // el.classList.remove('Hcenter')
74 | // el.classList.add('Vcenter')
75 | } else {
76 | removeClass(el, 'Vcenter')
77 | addClass(el, 'Hcenter')
78 | // el.classList.remove('Vcenter')
79 | // el.classList.add('Hcenter')
80 | }
81 | }
82 | } else {
83 | el.src = binding.value + '?x-oss-process=image/resize,m_lfit,h_' + parseInt(pH) + ',w_' + parseInt(pW)
84 | }
85 | }, 10)
86 | }
87 | }
88 |
89 | Object.keys(directive).forEach(key => {
90 | Vue.directive(key, directive[key])
91 | })
92 |
--------------------------------------------------------------------------------
/template/components/admin/common/ddvWangeditor/component/wangeditor.vue:
--------------------------------------------------------------------------------
1 |
6 |
7 |
8 |