This commit is contained in:
Warunee Tamkoo 2024-06-11 14:07:20 +07:00
parent 2842279165
commit 8a53037137
14 changed files with 154 additions and 239 deletions

View file

@ -1,86 +1,86 @@
name: release-test
run-name: release-test ${{ github.actor }}
on:
push:
tags:
- "version-[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch:
push:
tags:
- "version-[0-9]+.[0-9]+.[0-9]+"
workflow_dispatch:
env:
REGISTRY: docker.frappet.com
IMAGE_NAME: ehr/bma-ehr-admin
DEPLOY_HOST: 49.0.91.80
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-admin
REGISTRY: docker.frappet.com
IMAGE_NAME: ehr/bma-ehr-admin
DEPLOY_HOST: frappet.com
COMPOSE_PATH: /home/frappet/docker/bma/bma-ehr-admin
jobs:
# act workflow_dispatch -W .github/workflows/release.yaml --input IMAGE_VER=test-v6.1 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd
release-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# skip Set up QEMU because it fail on act and container
# Gen Version try to get version from tag or inut
- name: Set output tags
id: vars
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
- name: Gen Version
id: gen_ver
run: |
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
IMAGE_VER=${{ steps.vars.outputs.tag }}
else
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
fi
if [[ $IMAGE_VER == '' ]]; then
IMAGE_VER='test-vBeta'
fi
echo '::set-output name=image_ver::'$IMAGE_VER
- name: Test Version
run: |
echo $GITHUB_REF
echo ${{ steps.gen_ver.outputs.image_ver }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login in to registry
uses: docker/login-action@v2
with:
registry: ${{env.REGISTRY}}
username: ${{secrets.DOCKER_USER}}
password: ${{secrets.DOCKER_PASS}}
- name: Build and load local docker image
uses: docker/build-push-action@v3
with:
context: .
platforms: linux/amd64
push: true
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
# act workflow_dispatch -W .github/workflows/release.yaml --input IMAGE_VER=test-v6.1 -s DOCKER_USER=sorawit -s DOCKER_PASS=P@ssword -s SSH_PASSWORD=P@ssw0rd
release-test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
# skip Set up QEMU because it fail on act and container
# Gen Version try to get version from tag or inut
- name: Set output tags
id: vars
run: echo "tag=${GITHUB_REF#refs/*/}" >> $GITHUB_OUTPUT
- name: Gen Version
id: gen_ver
run: |
if [[ $GITHUB_REF == 'refs/tags/'* ]]; then
IMAGE_VER=${{ steps.vars.outputs.tag }}
else
IMAGE_VER=${{ github.event.inputs.IMAGE_VER }}
fi
if [[ $IMAGE_VER == '' ]]; then
IMAGE_VER='test-vBeta'
fi
echo '::set-output name=image_ver::'$IMAGE_VER
- name: Test Version
run: |
echo $GITHUB_REF
echo ${{ steps.gen_ver.outputs.image_ver }}
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2
- name: Login in to registry
uses: docker/login-action@v2
with:
registry: ${{env.REGISTRY}}
username: ${{secrets.DOCKER_USER}}
password: ${{secrets.DOCKER_PASS}}
- name: Build and load local docker image
uses: docker/build-push-action@v3
with:
context: .
platforms: linux/amd64
push: true
tags: ${{env.REGISTRY}}/${{env.IMAGE_NAME}}:${{ steps.gen_ver.outputs.image_ver }},${{env.REGISTRY}}/${{env.IMAGE_NAME}}:latest
- name: Reload docker compose
uses: appleboy/ssh-action@v0.1.8
with:
host: ${{env.DEPLOY_HOST}}
username: frappet
password: ${{ secrets.SSH_PASSWORD }}
port: 10102
script: |
cd "${{env.COMPOSE_PATH}}"
docker compose pull
docker compose up -d
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
- uses: snow-actions/line-notify@v1.1.0
if: success()
with:
access_token: ${{ secrets.TOKEN_LINE }}
message: |
-Success✅✅✅
Image: ${{env.IMAGE_NAME}}
Version: ${{ steps.gen_ver.outputs.IMAGE_VER }}
By: ${{secrets.DOCKER_USER}}
- uses: snow-actions/line-notify@v1.1.0
if: failure()
with:
access_token: ${{ secrets.TOKEN_LINE }}
message: |
-Failure❌❌❌
Image: ${{env.IMAGE_NAME}}
Version: ${{ steps.gen_ver.outputs.IMAGE_VER }}
By: ${{secrets.DOCKER_USER}}
- name: Reload docker compose
uses: appleboy/ssh-action@v0.1.8
with:
host: ${{env.DEPLOY_HOST}}
username: frappet
password: ${{ secrets.SSH_PASSWORD }}
port: 10102
script: |
cd "${{env.COMPOSE_PATH}}"
docker compose pull
docker compose up -d
echo "${{ steps.gen_ver.outputs.image_ver }}"> success
- uses: snow-actions/line-notify@v1.1.0
if: success()
with:
access_token: ${{ secrets.TOKEN_LINE }}
message: |
-Success✅✅✅
Image: ${{env.IMAGE_NAME}}
Version: ${{ steps.gen_ver.outputs.IMAGE_VER }}
By: ${{secrets.DOCKER_USER}}
- uses: snow-actions/line-notify@v1.1.0
if: failure()
with:
access_token: ${{ secrets.TOKEN_LINE }}
message: |
-Failure❌❌❌
Image: ${{env.IMAGE_NAME}}
Version: ${{ steps.gen_ver.outputs.IMAGE_VER }}
By: ${{secrets.DOCKER_USER}}

View file

@ -57,7 +57,7 @@ const menuList = readonly<any[]>([
activeIcon: "person",
label: "ข้อมูลหลัก",
path: "metadata",
role: ["SUPER_ADMIN", "ADMIN"],
role: ["SUPER_ADMIN"],
children: [
{
key: 2.0,
@ -100,12 +100,12 @@ const menuList = readonly<any[]>([
},
{
key: 2.0,
label: "จัดการบทบาท (Roles)",
label: "จัดการบทบาทและสิทธิ์ (Roles)",
path: "manageRoles",
},
{
key: 2.0,
label: "จัดการสิทธิ์ (Permissions)",
label: "กำหนดสิทธิ์ (Permissions)",
path: "managePermission",
},
],

View file

@ -418,13 +418,11 @@ onMounted(() => {
</d-table>
</div>
copyPosition
<DialogAddPosition
v-model:add-position="modalAddPosition"
v-model:form-data="formPositionSelect"
v-model:edit-check="editPosition"
v-model:copy-check="copyPosition"
:get-data="searchInput"
/>
</template>

View file

@ -48,9 +48,7 @@ export default [
name: "masterCalendarWork",
component: calendarWorkPage,
meta: {
Auth: true,
Key: [7],
Role: "metadata",
Role: ["SUPER_ADMIN"],
},
},
{
@ -58,9 +56,7 @@ export default [
name: "masterInsigniaPage",
component: masterInsignia,
meta: {
Auth: true,
Key: [7],
Role: "metadata",
Role: ["SUPER_ADMIN"],
},
},
{
@ -68,9 +64,7 @@ export default [
name: "masterInsigniadetail",
component: detailInsignia,
meta: {
Auth: true,
Key: [7],
Role: "metadata",
Role: ["SUPER_ADMIN"],
},
},
{
@ -78,9 +72,7 @@ export default [
name: "masterPersonal",
component: personalPage,
meta: {
Auth: true,
Key: [7],
Role: "metadata",
Role: ["SUPER_ADMIN"],
},
},
{
@ -88,9 +80,7 @@ export default [
name: "masterPersonalDistrict",
component: personalDistrict,
meta: {
Auth: true,
Key: [7],
Role: "metadata",
Role: ["SUPER_ADMIN"],
},
},
{
@ -98,9 +88,7 @@ export default [
name: "masterPersonalSubDistrict",
component: personalSubDistrict,
meta: {
Auth: true,
Key: [7],
Role: "metadata",
Role: ["SUPER_ADMIN"],
},
},
{
@ -108,9 +96,7 @@ export default [
name: "masterPosition",
component: positionPage,
meta: {
Auth: true,
Key: [7],
Role: "metadata",
Role: ["SUPER_ADMIN"],
},
},
{
@ -118,9 +104,7 @@ export default [
name: "masterPositionLevel",
component: positionLevelPage,
meta: {
Auth: true,
Key: [9],
Role: "metadata",
Role: ["SUPER_ADMIN"],
},
},
{
@ -128,9 +112,7 @@ export default [
name: "masterPositionEmployee",
component: positionEmployeePage,
meta: {
Auth: true,
Key: [8],
Role: "metadata",
Role: ["SUPER_ADMIN"],
},
},
{
@ -138,9 +120,7 @@ export default [
name: "masterPositionEmployeeLevel",
component: positionEmployeeLevelPage,
meta: {
Auth: true,
Key: [9],
Role: "metadata",
Role: ["SUPER_ADMIN"],
},
},
@ -149,9 +129,7 @@ export default [
name: "KPIIndicatorByPlan",
component: IndicatorByPlan,
meta: {
Auth: true,
Key: [1.1],
Role: "evaluateKPI",
Role: ["SUPER_ADMIN"],
},
},
@ -160,9 +138,7 @@ export default [
name: "KPIIndicatorByPlan/Add",
component: IndicatorByPlanDetail,
meta: {
Auth: true,
Key: [1.1],
Role: "evaluateKPI",
Role: ["SUPER_ADMIN"],
},
},
{
@ -170,9 +146,7 @@ export default [
name: "KPIIndicatorByPlanByid",
component: IndicatorByPlanDetail,
meta: {
Auth: true,
Key: [1.1],
Role: "evaluateKPI",
Role: ["SUPER_ADMIN"],
},
},
{
@ -180,9 +154,7 @@ export default [
name: "KPIIndicatorByRole",
component: IndicatorByRole,
meta: {
Auth: true,
Key: [1.1],
Role: "evaluateKPI",
Role: ["SUPER_ADMIN"],
},
},
{
@ -190,9 +162,7 @@ export default [
name: "KPIIndicatorByRoleAdd",
component: IndicatorByRoleDetail,
meta: {
Auth: true,
Key: [1.1],
Role: "evaluateKPI",
Role: ["SUPER_ADMIN"],
},
},
{
@ -200,9 +170,7 @@ export default [
name: "KPIIndicatorByRoleByid",
component: IndicatorByRoleDetail,
meta: {
Auth: true,
Key: [1.1],
Role: "evaluateKPI",
Role: ["SUPER_ADMIN"],
},
},
{
@ -210,9 +178,7 @@ export default [
name: "KPICompetency",
component: competencyPage,
meta: {
Auth: true,
Key: [1.1],
Role: "evaluateKPI",
Role: ["SUPER_ADMIN"],
},
},
{
@ -220,9 +186,7 @@ export default [
name: "KPICompetencyAdd",
component: competencyAddPage,
meta: {
Auth: true,
Key: [1.1],
Role: "evaluateKPI",
Role: ["SUPER_ADMIN"],
},
},
{
@ -230,9 +194,7 @@ export default [
name: "KPICompetencyByid",
component: competencyAddPage,
meta: {
Auth: true,
Key: [1.1],
Role: "evaluateKPI",
Role: ["SUPER_ADMIN"],
},
},
@ -241,9 +203,7 @@ export default [
name: "strategic",
component: StrategicView,
meta: {
Auth: true,
Key: [1.6],
Role: "development",
Role: ["SUPER_ADMIN"],
},
},
{
@ -251,9 +211,7 @@ export default [
name: "KPIAssignment",
component: AssignmentView,
meta: {
Auth: true,
Key: [1.6],
Role: "development",
Role: ["SUPER_ADMIN"],
},
},
{
@ -261,9 +219,7 @@ export default [
name: "KPIAssignmentById",
component: AssignmentDetailView,
meta: {
Auth: true,
Key: [1.1],
Role: "evaluateKPI",
Role: ["SUPER_ADMIN"],
},
},
];

View file

@ -127,7 +127,7 @@ watch(
lazy-rules
hide-bottom-space
class="inputgreen"
label="คำอิบาย"
label="คำอิบาย"
type="textarea"
/>
</div>

View file

@ -18,9 +18,7 @@ export default [
name: "manageUsers",
component: ListsPageUser,
meta: {
Auth: true,
Key: [7],
Role: "user_role",
Role: ["SUPER_ADMIN", "ADMIN"],
},
},
{
@ -28,25 +26,15 @@ export default [
name: "manageUsersRolesId",
component: PageManagementRole,
meta: {
Auth: true,
Key: [7],
Role: "user_role",
Role: ["SUPER_ADMIN", "ADMIN"],
},
},
{
path: "/users/:id",
name: "masterInsignia",
},
{
path: "/roles",
name: "manageRoles",
component: ListsPageRole,
meta: {
Auth: true,
Key: [7],
Role: "user_role",
Role: ["SUPER_ADMIN", "ADMIN"],
},
},
@ -55,9 +43,7 @@ export default [
name: "manageRolesId",
component: ListsPage2Role,
meta: {
Auth: true,
Key: [7],
Role: "user_role",
Role: ["SUPER_ADMIN", "ADMIN"],
},
},
@ -66,9 +52,7 @@ export default [
name: "managePermission",
component: PermissionPage,
meta: {
Auth: true,
Key: [7],
Role: "user_role",
Role: ["SUPER_ADMIN", "ADMIN"],
},
},
];

View file

@ -153,7 +153,9 @@ onMounted(() => {
<template>
<div class="row items-center">
<div class="toptitle text-dark row items-center q-py-xs">ดการบทบาท</div>
<div class="toptitle text-dark row items-center q-py-xs">
ดการบทบาทและสทธ
</div>
</div>
<q-card flast bordered class="q-pa-md">

View file

@ -1171,7 +1171,7 @@ function onSubmit() {
class="q-mr-sm"
@click="router.go(-1)"
/>
ดการทธบทบาท
ดการบทบาทและทธ
</div>
<q-form greedy @submit.prevent @validation-success="onSubmit">
@ -1200,7 +1200,7 @@ function onSubmit() {
lazy-rules
hide-bottom-space
class="inputgreen"
label="คำอิบาย"
label="คำอิบาย"
type="textarea"
/>
</div>
@ -1247,12 +1247,28 @@ function onSubmit() {
icon="info"
flat
size="12px"
><q-tooltip class="text-body1 ">
><q-tooltip class="text-body1">
<div class="column">
<div class="row no-wrap"><strong>ROOT</strong>-ทธเขาถงขอมลในทกระด งแตระดบของตวเองลงไปชนลางส และขนไปถงชนบนส</div>
<div class="row no-wrap"><strong>CHILD</strong>-ทธเขาถงขอมลเฉพาะระดบชนปจจนของตวเอง ลงไปถงชนลางส</div>
<div class="row no-wrap"><strong>NORMAL</strong>-ทธเขาถงขอมลเฉพาะในระดบชนตวเองเทาน ไมสามารถขนหรอลงได</div>
<div class="row no-wrap"><strong>SPECIFIC</strong>-ทธเขาถงขอมลเฉพาะเจาะจง งจะตองกำ หนด ID ของขอมลทองการเขาถงดวย</div>
<div class="row no-wrap">
<strong>ROOT</strong>-ทธเขาถงขอมลในทกระด
งแตระดบของตวเองลงไปชนลางส
และขนไปถงชนบนส
</div>
<div class="row no-wrap">
<strong>CHILD</strong
>-ทธเขาถงขอมลเฉพาะระดบชนปจจนของตวเอง
ลงไปถงชนลางส
</div>
<div class="row no-wrap">
<strong>NORMAL</strong
>-ทธเขาถงขอมลเฉพาะในระดบชนตวเองเทาน
ไมสามารถขนหรอลงได
</div>
<div class="row no-wrap">
<strong>SPECIFIC</strong
>-ทธเขาถงขอมลเฉพาะเจาะจง งจะตองกำ หนด ID
ของขอมลทองการเขาถงดวย
</div>
</div>
</q-tooltip></q-btn
></q-th
@ -1659,10 +1675,9 @@ function onSubmit() {
top: -5px;
right: -5px;
}
.absolute-customH{
.absolute-customH {
position: absolute;
top: -2px;
right: -2px;
}
</style>

View file

@ -105,7 +105,7 @@ const columns = ref<QTableProps["columns"]>([
{
name: "role",
align: "left",
label: "สิทธิ์การจัดการ",
label: "สิทธิ์",
sortable: false,
field: "role",
headerStyle: "font-size: 14px",
@ -352,7 +352,7 @@ onMounted(() => {
<template>
<div class="row items-center">
<div class="toptitle text-dark row items-center q-py-xs">ดการทธ</div>
<div class="toptitle text-dark row items-center q-py-xs">กำหนดทธ</div>
</div>
<q-card flast bordered>
@ -568,7 +568,7 @@ onMounted(() => {
size="17px"
name="mdi-account-group"
/>
<div class="q-pl-md">ดการทธ</div>
<div class="q-pl-md">กำหนดทธ</div>
</div>
</q-item-section>
</q-item>

View file

@ -6,8 +6,6 @@ export default [
name: "viewLogs",
component: ListsPage,
meta: {
Auth: true,
Key: [7],
Role: ["SUPER_ADMIN", "ADMIN"],
},
},

View file

@ -0,0 +1,10 @@
import keycloak from "@/plugins/keycloak";
const checkPermission = (array2: string[]): boolean => {
if (keycloak.tokenParsed) {
const array1: string[] = keycloak.tokenParsed?.role;
return array1.some((element) => array2.includes(element));
} else return false;
};
export default checkPermission;

View file

@ -10,6 +10,7 @@ import ModuleLogs from "@/modules/03_logs/router";
// TODO: ใช้หรือไม่?
import keycloak from "@/plugins/keycloak";
import checkPermission from "@/plugins/checkPermission";
const router = createRouter({
history: createWebHistory(import.meta.env.BASE_URL),
@ -66,16 +67,10 @@ router.beforeEach((to, from, next) => {
});
} else {
// keycloak.updateToken(60);
// const role = keycloak.tokenParsed?.role;
// console.log("tokenParsed===>", keycloak.tokenParsed?.role);
// console.log("Role===>", to.meta.Role);
// console.log(hasCommonValues(role, to.meta.Role));
// if (role.includes(to.meta.Role)) {
// if (checkPermission(to.meta.Role)) {
next();
// } else {
// next({ path: "" });
// // next();
// }
}
} else {

View file

@ -1,41 +0,0 @@
import { defineStore } from "pinia";
import { ref } from "vue";
export const useroleUserDataStore = defineStore("roleusers", () => {
const insignia1Role = ref<boolean>(false);
const insignia2Role = ref<boolean>(false);
const caregiverRole = ref<boolean>(false);
const chairmanRole = ref<boolean>(false);
const commanderRole = ref<boolean>(false);
const admin2Role = ref<boolean>(false);
const adminRole = ref<boolean>(false);
const oligarchRole = ref<boolean>(false);
// const hasCommonValues = (array1: number[], array2: number[]): boolean => {
// return array1.some((element) => array2.includes(element));
// };
const fetchroleUser = async (keycloak: any) => {
if (keycloak != null) {
insignia1Role.value = await keycloak.includes("insignia1");
insignia2Role.value = await keycloak.includes("insignia2");
caregiverRole.value = await keycloak.includes("caregiver");
chairmanRole.value = await keycloak.includes("chairman");
commanderRole.value = await keycloak.includes("commander");
admin2Role.value = await keycloak.includes("admin2");
adminRole.value = await keycloak.includes("admin");
oligarchRole.value = await keycloak.includes("oligarch");
}
};
return {
fetchroleUser,
insignia1Role,
insignia2Role,
caregiverRole,
chairmanRole,
commanderRole,
admin2Role,
adminRole,
};
});

View file

@ -16,6 +16,7 @@ import type {
optionType,
} from "../interface/request/main/main";
import { menuList } from "../interface/request/main/main";
import checkPermission from "@/plugins/checkPermission";
// import { useroleUserDataStore } from "@/stores/roleUser";
const { setVerticalScrollPosition } = scroll;
@ -269,8 +270,6 @@ const doLogout = () => {
* งชอผใชงานจาก keycloak
*/
if (keycloak.tokenParsed != null) {
console.log("tokenParsed===>", keycloak.tokenParsed);
fullname.value = keycloak.tokenParsed.name;
role.value = keycloak.tokenParsed.role;
}
@ -762,8 +761,7 @@ watch(
<q-list padding>
<div v-for="(menuItem, index) in menuList" :key="index">
<!-- เมนอย -->
<!-- v-if="role.includes(menuItem.role)" -->
<div>
<div v-if="checkPermission(menuItem.role)">
<q-expansion-item
group="somegroup"
class="menuSub"