diff --git a/package.json b/package.json
index 1acce49..2b048cb 100644
--- a/package.json
+++ b/package.json
@@ -25,7 +25,7 @@
"@eslint/eslintrc": "^3.3.0",
"@eslint/js": "^9.22.0",
"@mdi/font": "^7.4.47",
- "@profcomff/api-uilib": "^2025.4.15",
+ "@profcomff/api-uilib": "^2025.10.15",
"@types/node": "^22.13.10",
"@typescript-eslint/eslint-plugin": "^8.26.1",
"@typescript-eslint/parser": "^8.26.1",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index c793f49..8e1370c 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -31,8 +31,8 @@ importers:
specifier: ^7.4.47
version: 7.4.47
'@profcomff/api-uilib':
- specifier: ^2025.4.15
- version: 2025.4.15
+ specifier: ^2025.10.15
+ version: 2025.10.15
'@types/node':
specifier: ^22.13.10
version: 22.13.10
@@ -649,8 +649,8 @@ packages:
resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
- '@profcomff/api-uilib@2025.4.15':
- resolution: {integrity: sha512-uCRxCblplBY56NORHcqiP5GVgF7GCiXUYwYBiHXymq9cLvnwzT+Dk0yCyQ5gDWkNtlQ+BnXnpyr82FPdTI1xkg==}
+ '@profcomff/api-uilib@2025.10.15':
+ resolution: {integrity: sha512-M4/PlFfMR85bBNXyY3ejTaHlvcLc0Y5Oq4PQUoQm+oYW/zEOLJrAb2UjGOw9ZUUEcQTRpW1rs/2LCqeMpGGZVg==}
'@redocly/ajv@8.11.2':
resolution: {integrity: sha512-io1JpnwtIcvojV7QKDUSIuMN/ikdOUd1ReEnUnMKGfDVridQZ31J0MmIuqwuRjWDZfmvr+Q0MqCcfHM2gTivOg==}
@@ -781,8 +781,8 @@ packages:
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
- '@types/estree@1.0.7':
- resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==}
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
@@ -2872,7 +2872,7 @@ snapshots:
'@pkgr/core@0.1.1': {}
- '@profcomff/api-uilib@2025.4.15':
+ '@profcomff/api-uilib@2025.10.15':
dependencies:
openapi-fetch: 0.10.6
@@ -2974,13 +2974,13 @@ snapshots:
'@types/eslint@9.6.1':
dependencies:
- '@types/estree': 1.0.7
+ '@types/estree': 1.0.8
'@types/json-schema': 7.0.15
optional: true
'@types/estree@1.0.6': {}
- '@types/estree@1.0.7':
+ '@types/estree@1.0.8':
optional: true
'@types/json-schema@7.0.15': {}
diff --git a/src/components/TheLecturerSearchCard.vue b/src/components/TheLecturerSearchCard.vue
index 72c1da4..2de70df 100644
--- a/src/components/TheLecturerSearchCard.vue
+++ b/src/components/TheLecturerSearchCard.vue
@@ -39,7 +39,7 @@
отзывы: {{ lecturer.comments?.length ?? '—' }}
- оценка: {{ lecturer.mark_general > 0 ? '+' : '' }}{{ lecturer.mark_general?.toFixed(2) ?? '—' }}
+ оценка: {{ lecturer.mark_weighted > 0 ? '+' : '' }}{{ lecturer.mark_weighted.toFixed(2) ?? '—' }}
diff --git a/src/components/TheSearchBar.vue b/src/components/TheSearchBar.vue
index eabf83c..bb7506f 100644
--- a/src/components/TheSearchBar.vue
+++ b/src/components/TheSearchBar.vue
@@ -39,6 +39,21 @@
@click:clear="subject = ''"
@click.stop
/>
+
+
+
= {};
@@ -138,6 +156,7 @@ async function shareSearch() {
if (order.value && order.value !== 'по релевантности') params.order = order.value;
if (subject.value) params.subject = subject.value;
if (propsParent.page > 1) params.page = propsParent.page;
+ if (mark.value) params.mark = mark.value;
// Значение ascending обратное иконке (если иконка ascending, то значение false)
const isAscending = iconAscDesc.value === 'mdi-sort-alphabetical-ascending';
diff --git a/src/pages/MainPage.vue b/src/pages/MainPage.vue
index f3860a4..d0e6429 100644
--- a/src/pages/MainPage.vue
+++ b/src/pages/MainPage.vue
@@ -29,6 +29,7 @@ const subject = ref(searchStore.subject);
const order = ref(searchStore.order || 'по релевантности');
const ascending = ref(searchStore.ascending);
const page = ref(searchStore.page);
+const mark = ref(searchStore.mark || '');
// Вычисляем порядковые номера для компактного режима
const lecturerRatings = computed(() => {
@@ -44,6 +45,7 @@ async function updateLecturersList() {
subject: subject.value,
orderBy: OrderFromText[order.value as keyof typeof OrderFromText] as Order,
ascending: ascending.value,
+ mark: mark.value || undefined,
});
}
@@ -56,10 +58,11 @@ async function onSearchParamChange() {
await updateLecturersList();
}
+watch(mark, onSearchParamChange);
watch(page, updateLecturersList);
function toLecturerPage(id: number) {
- searchStore.setParams(name.value, subject.value, order.value, ascending.value, page.value);
+ searchStore.setParams(name.value, subject.value, order.value, ascending.value, page.value, mark.value);
router.push({ path: 'lecturer', query: { lecturer_id: id } });
}
@@ -74,6 +77,7 @@ function toggleViewMode() {
v-model:search-query="name"
v-model:subject="subject"
v-model:order="order"
+ v-model:mark="mark"
:is-admin="userAdmin"
:ascending="ascending"
:page="page"
diff --git a/src/store/lecturerStore.ts b/src/store/lecturerStore.ts
index bbc3d4c..c5ac449 100644
--- a/src/store/lecturerStore.ts
+++ b/src/store/lecturerStore.ts
@@ -12,6 +12,7 @@ interface FetchLecturersParams {
subject?: string;
orderBy?: Order;
ascending?: boolean;
+ mark?: string;
}
export const useLecturerStore = defineStore('lecturer', () => {
@@ -23,16 +24,23 @@ export const useLecturerStore = defineStore('lecturer', () => {
// Actions
async function fetchLecturers(params: FetchLecturersParams) {
const offset = (params.page - 1) * params.itemsPerPage;
+
+ // Создаем объект параметров запроса
+ const queryParams: Record = {
+ limit: params.itemsPerPage,
+ offset,
+ info: ['comments'],
+ order_by: `${params.ascending ? '+' : '-'}${params.orderBy ?? 'mark_general'}`,
+ };
+
+ // Добавляем опциональные параметры
+ if (params.name) queryParams.name = params.name;
+ if (params.subject) queryParams.subject = params.subject;
+ if (params.mark) queryParams.mark = params.mark;
+
const res = await apiClient.GET('/rating/lecturer', {
params: {
- query: {
- limit: params.itemsPerPage,
- name: params.name,
- offset,
- info: ['comments'],
- subject: params.subject,
- order_by: `${params.ascending ? '+' : '-'}${params.orderBy ?? 'mark_general'}`,
- },
+ query: queryParams,
},
});
diff --git a/src/store/searchStore.ts b/src/store/searchStore.ts
index a10fd0d..865acad 100644
--- a/src/store/searchStore.ts
+++ b/src/store/searchStore.ts
@@ -8,17 +8,33 @@ export const useSearchStore = defineStore('search', () => {
const order = ref('по общей оценке');
const ascending = ref(false);
const page = ref(1);
+ const mark = ref('');
const getParams = () => {
- return name.value, subject.value, order.value, ascending.value, page.value;
+ return {
+ name: name.value,
+ subject: subject.value,
+ order: order.value,
+ ascending: ascending.value,
+ page: page.value,
+ mark: mark.value,
+ };
};
- const setParams = (oldName: string, oldSubject: Subject, oldOrder: string, oldAsc: boolean, oldPage: number) => {
+ const setParams = (
+ oldName: string,
+ oldSubject: Subject,
+ oldOrder: string,
+ oldAsc: boolean,
+ oldPage: number,
+ oldMark?: string,
+ ) => {
name.value = oldName;
subject.value = oldSubject;
order.value = oldOrder;
ascending.value = oldAsc;
page.value = oldPage;
+ mark.value = oldMark || '';
};
return {
@@ -27,6 +43,7 @@ export const useSearchStore = defineStore('search', () => {
order,
ascending,
page,
+ mark,
getParams,
setParams,