1 2 3 4 5 6 7 |
SET STATISTICS IO ON SET STATISTICS TIME ON SELECT er.ReportID, er.ReportName, er.ReportNumber FROM dbo.EmployeeReports er WHERE er.ReportNumber LIKE '%33%' SET STATISTICS IO OFF SET STATISTICS TIME OFF |
1 2 3 4 5 6 7 |
SET STATISTICS IO ON SET STATISTICS TIME ON SELECT er.ReportID, er.ReportName, er.ReportNumber FROM dbo.EmployeeReports er WHERE er.ReportNumber LIKE '%33%' SET STATISTICS IO OFF SET STATISTICS TIME OFF |
In diesem Beitrag will ich eine Schritt für Schritt Anleitung geben, wie man Nuxt 3 mit Keycloak autorisiert.
Die Thematik um Autorisierung und Authentifizierung bedarf einer soliden Kenntnis in der Thematik. Ich empfehle daher unbedingt sich die Zeit zu nehmen und das folgende Video anzuschauen und sicher zu gehen, dass alles verstanden wurde:
Typescript muss in VS Code installiert werden. -g steht für globally (Alle Projekte)
1 |
npm i -g typescript |
Typescript Version prüfen
1 |
tsc --version |
Enums
Ein Fehler ist aufgetreten. Bitte versuchen Sie es später erneut. |
Objekte werden mit reactive<type>({…}) reactiviert und primitive Datentypen mit ref<string>(…)
1 2 |
const myVariable = ref<string>("test"); const opel = reactive<myCar>({wheels: 4, name'Astra'}); |
Mixins werden in eine Vue Instanz hinzugefügt. So als würde man 2 Vue Instanzen verschmelzen. Composables sind dem ähnlich. In Mixins wird alles importiert, bei Composables muss jede Variable, Methode, etc. einzeln importiert werden.
Guter Artikel dazu:
What is a Vue.js Composable? – Vue.js Tutorials (vueschool.io)
Wenn man durch eine App navigiert, dann ist der Seitenaufbau überall identisch. Das Menü, die Kopfzeile und Fusszeile sind auf jeder Seite identisch. Lediglich der Inhalt ändert sich.
In Nuxt 3 werden Layouts im “layouts”-Ordner erstellt und anschließend in die app.vue hinzugefügt. Einzelne Seiten werden im “pages”-Ordner erstellt.
Nuxt 3 routet die pages anhand des Namens. Nur die page “index.vue” wird zum root Knoten geroutet.
Also erstellen wir ein Verzeichnis “layouts” und ein Verzeichnis “pages”.
In das “layouts” Verzeichnis, eine Datei erstellen “default.vue”.
und folgenden Inhalt kopieren:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
<template> <v-app> <v-app-bar> <v-app-bar-nav-icon @click.stop="drawer = !drawer"></v-app-bar-nav-icon> <v-toolbar-title>Meine neue App</v-toolbar-title> <v-spacer></v-spacer> <v-btn variant="text" icon="mdi-magnify"></v-btn> <v-btn variant="text" icon="mdi-filter"></v-btn> <v-btn variant="text" icon="mdi-dots-vertical"></v-btn> </v-app-bar> <!-- prepend-icon="mdi-folder" --> <v-navigation-drawer v-model="drawer" bottom permanent> <v-list nav> <v-list-item v-for="item in items" :key="item.to" :title="item.title" :to="item.to" ></v-list-item> </v-list> </v-navigation-drawer> <v-main> <slot /> </v-main> </v-app> </template> <script> export default { data: () => ({ drawer: true, group: null, currentItem: null, items: [ { title: "Start", to: "/", }, { title: "Page 1", to: "pageOne", }, ], }), watch: { group() { this.drawer = true; }, }, }; </script> |
Dort, wo <slot /> steht, kommt der Inhalt der einzelnen Pages hinein.
Jetzt in das Verzeichnis “pages”
die Datei index.vue mit folgenden Inhalt
1 2 3 |
<template> <h1>Index page</h1> </template> |
und die Datei “pageOne.vue” mit folgenden Inhalt erstellen
1 2 3 |
<template> <h1>Page One</h1> </template> |
In der app.vue müssen wir nun sagen, dass wir nicht mehr die Nuxt Welcome page sehen wollen, sondern unser Layout:
1 2 3 4 5 |
<template> <NuxtLayout name="default"> <NuxtPage /> </NuxtLayout> </template> |
Wenn man aus der Microsoft Welt kommt und Webseiten mit JQuery bearbeitet hat, dann sind UI Framworks wie Vue eine wahre Veränderung. In meiner ASP WebApp habe ich Vue2 über CDN eingebunden und Vue anstatt JQuery genutzt. Vue funktioniert aber am besten mit NodeJs. Der Versuch NodeJs zu erlernen verlief aber immer in Frust. Weil es keinen roten Faden gibt, wie etwas umgesetzt werden kann. Es gibt keinen besten Weg. Es gibt sehr viele neue Begriffe und Definitionen, die Stück um Stück erlernt werden müssen. Es ist definitiv ein anderes lernen wie eine erprobte Sprache wie C# oder Java.
Deshalb ist hier mein roter Faden. Ziel soll am eine App sein, die folgende Punkte mit sich bringt:
Ok habe ich mir gedacht. Es wird ja wohl nicht so schwer sein folgenden Code zu parsen und die Templates entsprechend zu ersetzen:
1 2 3 4 5 6 7 8 9 10 11 |
Dies ist ein Test bla bla bla {{for group in Groups}} Die Bezeichnung der Gruppe ist: {{group.Title}} {{for subGroup in a.SubGroups}} Die Bezeichnung der Untergruppe ist: {{subGroup.Title}} und auch hier kann ich auf die Gruppe zugreifen: {{group.Title}} {{/for}} {{/for}} Und das Ende vom Lied ist das Ende vom Lied |
vue.js oder mustache verwendet eine ähnliche Syntax.
Ich könnte an dieser Stelle mustache für C# verwenden und er würde mir das Template ersetzen, allerdings benötige ich nicht nur das Ergebnis als String sondern ich möchte bei jedenm Iterationsaufruf eingreifen können.
Bisher habe ich mir folgende Tools angeschaut:
Leider ist Sprache sehr schlecht dokumentiert und es fehlen Beispiele wie man das umsetzen könnte. Dennoch würde ich es gerne bevorzugen.
Konstanten kann man in Vue einfach im Created Hook definieren.
Generell sollte man sich das Arbeiten mit Konstanten angewöhnen.
if(UserTypeId == 7) {…} stellt den Entwickler vor die Frage, was an diesen UserType nun so besonders ist.
Besser: if(UserTypeId == USERTYPE_GUEST) . So weiß jeder, die folgende Logik betrifft den Gastbenutzer
1 2 3 |
created() { this.USERTYPE_GUEST = 7; }, |
Mal angenommen man möchte alle Felder auf einer Seite deaktivieren. Man könnte input für input durchgehen und mit :disabled=”isEditable” das Feld deaktivieren.
Oder man schreibt eine Custom Directive, die diese Logik abbildet: https://vuejs.org/v2/guide/custom-directive.html
Möchte man das global haben:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Vue.directive("disableall", { bind: function (el, binding) { if ((!binding.hasOwnProperty('value')) || binding.value) { const tags = ["input", "button", "textarea", "select"]; tags.forEach(tagName => { const nodes = el.getElementsByTagName(tagName); for (let i = 0; i < nodes.length; i++) { nodes[i].disabled = true; nodes[i].tabIndex = -1; } }); } } }); |
Oder per Instanz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
directives: { disableall: { // directive definition bind: function (el, binding) { if ((!binding.hasOwnProperty('value')) || binding.value) { const tags = ["input", "button", "textarea", "select"]; tags.forEach(tagName => { const nodes = el.getElementsByTagName(tagName); for (let i = 0; i < nodes.length; i++) { nodes[i].disabled = true; nodes[i].tabIndex = -1; } }); } } } } |
Eingebunden wird das nun mit.
1 2 3 |
<div v-disableall="!isEditable"> ... </div> |
oder
1 2 3 |
<div v-disableall="true"> ... </div> |
oder ohne Bedingung
1 2 3 |
<div v-disableall> ... </div> |
Cmd öffnen
1 2 |
reg add "hkcu\software\microsoft\command processor" /v CompletionChar /d 9 /t REG_DWORD /f reg add "hkcu\software\microsoft\command processor" /v PathCompletionChar /d 9 /t REG_DWORD /f |
Befehle eingeben
Cmd neustarten und mit cd Tab den Pfad autocompleten lassen 🙂
Mir kam mal folgende Problemstellung in die Gedanken:
Mal angenommen ich muss unterschiedliche Aufgaben abarbeiten. Diese befinden sich in einer Warteschleife. So dass sie nacheinander oder auch asynchron parallel abgearbeitet werden sollen.
Jede Aufgabe besitzt eine Priorität. Sagen wie 1 (unwichtig) – 10 (sehr wichtig). In die Warteschleife kommen immer wieder Aufgaben nach. Das Problem ist, es werden die sehr wichtigen immer zuerst abgearbeitet. Die weniger wichtigen kommen daher nie dran und werden nie verarbeitet. Die Lösung ist ein Punktesystem mit Zeitangabe. Die Priorität ist dient dann als Faktor und wird mit der Anzahl Minuten multipliziert. Das ergibt die Summe der Punkte pro Datensatz
Beispiel: Es ist Momentan 12:00 Uhr Mittags.
Sortiert man diese Liste nun nach Punkten ergibt sich eine neue Reihenfolge
So hat jeder Datensatz eine Chance drangenommen zu werden. Je länger er in der Warteschleife verweilt, desto höher wird sein Punktesatz.
Login