diff --git a/src/Jiaowu.Api/Controllers/SystemController.cs b/src/Jiaowu.Api/Controllers/SystemController.cs new file mode 100644 index 0000000..e0bc941 --- /dev/null +++ b/src/Jiaowu.Api/Controllers/SystemController.cs @@ -0,0 +1,28 @@ +using System.Reflection; +using Microsoft.AspNetCore.Authorization; +using Microsoft.AspNetCore.Mvc; + +namespace Jiaowu.Api.Controllers; + +[ApiController] +[Route("api/system")] +public sealed class SystemController : ControllerBase +{ + [AllowAnonymous] + [HttpGet("version")] + [ProducesResponseType(StatusCodes.Status200OK)] + public SystemVersionResponse GetVersion() + { + var assembly = typeof(SystemController).Assembly; + var informationalVersion = assembly + .GetCustomAttribute()? + .InformationalVersion; + var version = informationalVersion?.Split('+', 2)[0] + ?? assembly.GetName().Version?.ToString(3) + ?? "unknown"; + + return new SystemVersionResponse(version); + } +} + +public sealed record SystemVersionResponse(string Version); diff --git a/src/Jiaowu.Api/Jiaowu.Api.csproj b/src/Jiaowu.Api/Jiaowu.Api.csproj index 3a8e64c..65c6016 100644 --- a/src/Jiaowu.Api/Jiaowu.Api.csproj +++ b/src/Jiaowu.Api/Jiaowu.Api.csproj @@ -2,6 +2,7 @@ net10.0 + 2.2.0 enable enable $([System.IO.Path]::GetFullPath('$(MSBuildProjectDirectory)/../../web')) diff --git a/tests/Jiaowu.Api.Tests/SystemControllerTests.cs b/tests/Jiaowu.Api.Tests/SystemControllerTests.cs new file mode 100644 index 0000000..3cea691 --- /dev/null +++ b/tests/Jiaowu.Api.Tests/SystemControllerTests.cs @@ -0,0 +1,14 @@ +using Jiaowu.Api.Controllers; + +namespace Jiaowu.Api.Tests; + +public sealed class SystemControllerTests +{ + [Fact] + public void GetVersion_ReturnsConfiguredApplicationVersion() + { + var response = new SystemController().GetVersion(); + + Assert.Equal("1.0.0", response.Version); + } +} diff --git a/web/package.json b/web/package.json index 8719192..c9e3cfc 100644 --- a/web/package.json +++ b/web/package.json @@ -1,7 +1,7 @@ { "name": "web", "private": true, - "version": "1.0.0", + "version": "2.2.0-rc1", "type": "module", "scripts": { "dev": "vite", diff --git a/web/src/App.vue b/web/src/App.vue index 9b555aa..dc18b09 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -1,8 +1,10 @@ diff --git a/web/src/components.d.ts b/web/src/components.d.ts index 7c23b38..6595905 100644 --- a/web/src/components.d.ts +++ b/web/src/components.d.ts @@ -57,6 +57,7 @@ declare module 'vue' { RichMessageContent: typeof import('./components/RichMessageContent.vue')['default'] RouterLink: typeof import('vue-router')['RouterLink'] RouterView: typeof import('vue-router')['RouterView'] + SiteFooter: typeof import('./components/SiteFooter.vue')['default'] SmartLaunchScreen: typeof import('./components/SmartLaunchScreen.vue')['default'] } export interface GlobalDirectives { diff --git a/web/src/components/SiteFooter.vue b/web/src/components/SiteFooter.vue new file mode 100644 index 0000000..b7bee05 --- /dev/null +++ b/web/src/components/SiteFooter.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/web/src/env.d.ts b/web/src/env.d.ts new file mode 100644 index 0000000..54eaa07 --- /dev/null +++ b/web/src/env.d.ts @@ -0,0 +1,3 @@ +/// + +declare const __APP_VERSION__: string diff --git a/web/vite.config.ts b/web/vite.config.ts index 965564c..efae32d 100644 --- a/web/vite.config.ts +++ b/web/vite.config.ts @@ -1,15 +1,23 @@ import { defineConfig, loadEnv } from 'vite' +import { readFileSync } from 'node:fs' import vue from '@vitejs/plugin-vue' import AutoImport from 'unplugin-auto-import/vite' import Components from 'unplugin-vue-components/vite' import { ElementPlusResolver } from 'unplugin-vue-components/resolvers' +const packageJson = JSON.parse( + readFileSync(new URL('./package.json', import.meta.url), 'utf8'), +) as { version: string } + // https://vite.dev/config/ export default defineConfig(({ mode }) => { const env = loadEnv(mode, process.cwd(), '') const isCapacitor = env.VITE_ROUTER_MODE === 'hash' return { + define: { + __APP_VERSION__: JSON.stringify(packageJson.version), + }, plugins: [ vue(), AutoImport({