CrazyIter_Bin há 5 meses atrás
pai
commit
678b2ccba6
51 ficheiros alterados com 331 adições e 43505 exclusões
  1. 0 10
      IES.ExamServer/App.xaml
  2. 0 139
      IES.ExamServer/App.xaml.cs
  3. 0 10
      IES.ExamServer/AssemblyInfo.cs
  4. 0 42708
      IES.ExamServer/Configs/latlng.json
  5. BIN
      IES.ExamServer/Configs/logo.png
  6. 0 157
      IES.ExamServer/Controllers/HomeController.cs
  7. 0 68
      IES.ExamServer/DI/LiteDBFactory.cs
  8. 0 68
      IES.ExamServer/DI/SignalRHost/SignalRExamServerHub.cs
  9. 0 13
      IES.ExamServer/Helper/Constant.cs
  10. 0 54
      IES.ExamServer/Helper/QRCodeHelper.cs
  11. 0 50
      IES.ExamServer/IES.ExamServer.csproj
  12. 0 28
      IES.ExamServer/MainWindow.xaml
  13. 0 50
      IES.ExamServer/MainWindow.xaml.cs
  14. 0 33
      IES.ExamServer/Models/Teacher.cs
  15. 0 24
      IES.ExamServer/appsettings.json
  16. 33 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Controllers/WeatherForecastController.cs
  17. 6 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamServer/IES.ExamServer.Server.http
  18. 24 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamServer/IES.ExamServer.csproj
  19. 32 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Program.cs
  20. 45 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Properties/launchSettings.json
  21. 13 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamServer/WeatherForecast.cs
  22. 8 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamServer/appsettings.Development.json
  23. 9 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamServer/appsettings.json
  24. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/.editorconfig
  25. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/.gitignore
  26. 1 2
      ies.examwebview/IES.ExamWebview.esproj
  27. 1 1
      ies.examwebview/README.md
  28. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/eslint.config.js
  29. 0 1
      ies.examwebview/index.html
  30. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/jsconfig.json
  31. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/nuget.config
  32. 1 1
      ies.examwebview/package.json
  33. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/public/favicon.ico
  34. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/App.vue
  35. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/assets/base.css
  36. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/assets/logo.svg
  37. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/assets/main.css
  38. 87 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/HelloWorld.vue
  39. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/TheWelcome.vue
  40. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/WelcomeItem.vue
  41. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/icons/IconCommunity.vue
  42. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/icons/IconDocumentation.vue
  43. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/icons/IconEcosystem.vue
  44. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/icons/IconSupport.vue
  45. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/icons/IconTooling.vue
  46. 0 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/main.js
  47. 57 0
      TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/vite.config.js
  48. 14 14
      TEAMModelOS.sln
  49. 0 12
      ies.examwebview/CHANGELOG.md
  50. 0 44
      ies.examwebview/src/components/HelloWorld.vue
  51. 0 18
      ies.examwebview/vite.config.js

+ 0 - 10
IES.ExamServer/App.xaml

@@ -1,10 +0,0 @@
-<Application x:Class="IES.ExamServer.App"
-             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-             xmlns:local="clr-namespace:IES.ExamServer"
-             Startup="ApplicationStartup">
-    <!-- 这里将 StartupUri 属性删除,然后注册 Startup 事件 -->
-    <Application.Resources>
-
-    </Application.Resources>
-</Application>

+ 0 - 139
IES.ExamServer/App.xaml.cs

@@ -1,139 +0,0 @@
-using IES.ExamServer.DI;
-using IES.ExamServer.DI.SignalRHost;
-using IES.ExamServer.Helper;
-using Microsoft.AspNetCore.Builder;
-using Microsoft.AspNetCore.Hosting;
-using Microsoft.AspNetCore.StaticFiles;
-using Microsoft.Extensions.Caching.Memory;
-using Microsoft.Extensions.Configuration;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.DependencyInjection.Extensions;
-using System.Configuration;
-using System.IO;
-using System.Net.Http;
-using System.Net.Http.Json;
-using System.Text.Json;
-using System.Text.Json.Nodes;
-using System.Windows;
-using System.Windows.Interop;
-
-namespace IES.ExamServer
-{
-    public partial class App : Application, IAsyncDisposable
-    {
-        public WebApplication? WebApplication { get; private set; }
-
-        public async ValueTask DisposeAsync()
-        {
-            if (WebApplication is not null)
-            {
-                await WebApplication.DisposeAsync();
-            }
-            GC.SuppressFinalize(this);
-        }
-
-        private async void ApplicationStartup(object sender, StartupEventArgs e)
-        {
-            // 这里是创建 ASP.NET 版通用主机的代码
-            var builder = WebApplication.CreateBuilder(Environment.GetCommandLineArgs());
-            builder.Configuration.SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile("appsettings.json", optional: true, reloadOnChange: true);
-            //builder.WebHost.UseUrls("http://*:5000;https://*:5001");
-            // 注册主窗口和其他服务
-            builder.Services.AddControllersWithViews();
-            builder.Services.AddSingleton<MainWindow>();
-            builder.Services.AddSingleton(this);
-            builder.Services.AddHttpClient();
-            builder.Services.AddSignalR();
-            builder.Services.AddHttpContextAccessor();
-            string localAppDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
-            string dbpath = $"{localAppDataPath}\\ExamServer\\LiteDB";
-            if (!System.IO.Directory.Exists(dbpath))
-            {
-                System.IO.Directory.CreateDirectory(dbpath);
-            }
-            string liteDBPath = $"Filename={dbpath}\\data.db;Connection=shared";
-            
-            var connections_LiteDB = new List<LiteDBFactoryOptions>
-            {
-                new LiteDBFactoryOptions { Name = "Master", Connectionstring = liteDBPath}
-            };
-            builder.Services.AddLiteDB(connections_LiteDB);
-            builder.Services.AddMemoryCache();
-            string path = $"{builder.Environment.ContentRootPath}/Configs";
-            builder.Services.AddCors(options =>
-            {
-                options.AddDefaultPolicy(
-                builder =>
-                {
-
-                    builder.AllowAnyOrigin()
-                            .AllowAnyHeader()
-                            .AllowAnyMethod();
-                });
-            });
-            var app = builder.Build();
-            // 这里是文件类型映射,如果你的静态文件在浏览器中加载报 404,那么需要在这里注册,这里我加载一个 3D 场景文件的类型
-            var contentTypeProvider = new FileExtensionContentTypeProvider();
-            contentTypeProvider.Mappings[".glb"] = "model/gltf-binary";
-            app.UseDefaultFiles();
-            app.UseStaticFiles(new StaticFileOptions
-            {
-                ContentTypeProvider = contentTypeProvider,
-            });
-            // 你如果使用了 Vue Router 或者其他前端路由了,需要在这里添加这句话让路由返回前端,而不是 ASP.NET Core 处理
-            app.MapFallbackToFile("/index.html");
-            //PRODUCTION uses webpack static files
-            app.UseRouting();
-            app.UseHttpsRedirection(); //開發中暫時關掉
-            //如果应用使用身份验证/授权功能(如 AuthorizePage 或 [Authorize]),请将对 UseAuthentication 和 UseAuthorization的
-            //调用放在之后、UseRouting 和 UseCors,但在 UseEndpoints之前
-            app.UseAuthentication();
-            app.UseAuthorization();
-            app.MapControllers();
-            app.MapHub<SignalRExamServerHub>("/signalr/screen").RequireCors("any");
-            WebApplication = app;
-            // 处理退出事件,退出 App 时关闭 ASP.NET Core
-            Exit += async (s, e) => await WebApplication.StopAsync();
-            // 显示主窗口
-            MainWindow = app.Services.GetRequiredService<MainWindow>();
-            MainWindow.Show();
-            IMemoryCache? cache = app.Services.GetRequiredService<IMemoryCache>();
-            IHttpClientFactory? clientFactory = app.Services.GetRequiredService<IHttpClientFactory>();
-            LiteDBFactory liteDBFactory = app.Services.GetRequiredService<LiteDBFactory>();
-            JsonNode? data = null;
-            try
-            {
-                string? CenterUrl = builder.Configuration.GetValue<string>("ExamServer:CenterUrl");
-                var httpclient = clientFactory.CreateClient();
-                httpclient.Timeout=  TimeSpan.FromSeconds(10);
-                HttpResponseMessage message = await httpclient.PostAsJsonAsync($"{CenterUrl}/core/system-info", new { });
-                if (message.IsSuccessStatusCode)
-                {
-                    string content = await message.Content.ReadAsStringAsync();
-                    data = JsonSerializer.Deserialize<JsonNode>(content);
-                    data!["centerUrl"]=CenterUrl;
-                    cache.Set(Constant._KeyServerCenter, data);
-                    SystemInfo? system= JsonSerializer.Deserialize<SystemInfo>(data);
-                    system!.id= $"{DateTimeOffset.Now.ToUnixTimeMilliseconds()}";
-                    liteDBFactory.GetLiteDatabase().GetCollection<SystemInfo>("System").Insert(system);
-                }
-            }
-            catch (Exception ex)
-            {
-            }
-            await app.RunAsync().ConfigureAwait(false);
-        }
-    }
-    public class SystemInfo 
-    {
-        public string? id { get; set; }
-        public string? version {  get; set; }
-        public string? description { get; set; }
-        public long nowtime { get; set; }
-        public string? region { get; set; }
-        public string? ip { get; set; }
-        public string? date { get; set; }
-        public string? centerUrl { get; set; }
-        
-    }
-}

+ 0 - 10
IES.ExamServer/AssemblyInfo.cs

@@ -1,10 +0,0 @@
-using System.Windows;
-
-[assembly: ThemeInfo(
-    ResourceDictionaryLocation.None,            //where theme specific resource dictionaries are located
-                                                //(used if a resource is not found in the page,
-                                                // or application resource dictionaries)
-    ResourceDictionaryLocation.SourceAssembly   //where the generic resource dictionary is located
-                                                //(used if a resource is not found in the page,
-                                                // app, or any theme specific resource dictionaries)
-)]

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 42708
IES.ExamServer/Configs/latlng.json


BIN
IES.ExamServer/Configs/logo.png


+ 0 - 157
IES.ExamServer/Controllers/HomeController.cs

@@ -1,157 +0,0 @@
-using IES.ExamServer.Helper;
-using Microsoft.AspNetCore.Http.HttpResults;
-using Microsoft.AspNetCore.Mvc;
-using Microsoft.Extensions.Caching.Memory;
-using Microsoft.Extensions.Configuration;
- 
-using System.IO;
-using System.Linq;
-using System.Net.Http; 
-using System.Text.Json.Nodes;
- 
- 
-using System.DrawingCore;
-using System.DrawingCore.Imaging;
-using System.DirectoryServices.ActiveDirectory;
-using ZXing.QrCode.Internal;
-using System.Text.Json;
-using ZXing.Aztec.Internal;
-using System.IdentityModel.Tokens.Jwt;
-using IES.ExamServer.Models;
-using System.Net.Http.Json;
-
-namespace IES.ExamServer.Controllers
-{
-    [Route("core")]
-    [ApiController]
-    public class HomeController : ControllerBase
-    {
-        private readonly IConfiguration _configuration;
-        private readonly IHttpClientFactory _httpClientFactory;
-        private readonly IMemoryCache _memoryCache;
-        public HomeController(IConfiguration configuration, IHttpClientFactory httpClientFactory, IMemoryCache memoryCache)
-        {
-            _configuration=configuration;
-            _httpClientFactory=httpClientFactory;
-            _memoryCache=memoryCache;
-        }
-        [HttpGet("/init")]
-        public async Task<IActionResult> Init()
-        {
-            int code = 0;
-            string msg = string.Empty;
-            try {
-
-                _memoryCache.TryGetValue(Constant._KeyServerCenter, out JsonNode? data);
-                if (data!=null)
-                {
-                    return Ok(new { code = 200, msg = "云端服务连接成功!", data = data });
-                }
-                else {
-                    code=500;
-                    msg="云端服务未连接!";
-                }
-
-
-            } catch (Exception ex)
-            {
-                code=500;
-                msg="云端服务未连接!";
-            }
-            return Ok(new { code, msg });
-        }
-
-
-        /**
-        {
-            "type":"sms",//qrcode二维码扫码登录:randomCode必传;  sms 短信验证登录:randomCode必传,mobile必传
-            "randomCode",
-            "mobile":"1528377****"
-        }
-        **/
-        /// <summary>
-        /// 登录验证
-        /// </summary>
-        /// <param name="randomCode"></param>
-        /// <returns></returns>
-        [HttpPost("/login-check")]
-        public async Task<IActionResult> LoginCheck(JsonNode json)
-        {
-            string randomCode = $"{json["randomCode"]}";
-            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls12;
-            string? CenterUrl = _configuration.GetValue<string>("ExamServer:CenterUrl");
-            var response = await _httpClientFactory.CreateClient().GetAsync($"{CenterUrl}/hita/check-login?code={randomCode}");
-            if (response.IsSuccessStatusCode)
-            {
-                string content = await response.Content.ReadAsStringAsync();
-                if (!string.IsNullOrWhiteSpace(content)) 
-                {
-                    var jsons = JsonSerializer.Deserialize<JsonNode>(content);
-                    if (jsons != null) 
-                    {
-                      
-                        TmdidImplicit? token = JsonSerializer.Deserialize<TmdidImplicit>(jsons["implicit_token"]);
-                        string x_auth_token = $"{jsons["x_auth_token"]}";
-                        List<School>? schools = JsonSerializer.Deserialize<List<School>>(jsons["schools"]);
-                        var jwt = new JwtSecurityToken(token?.id_token);
-                        var id = jwt.Payload.Sub;
-                        jwt.Payload.TryGetValue("name", out object? name);
-                        jwt.Payload.TryGetValue("picture", out object? picture);
-                    }
-                }
-            }
-            return Ok();
-        }
-        /// <summary>
-        /// 登录模式初始化
-        /// </summary>
-        /// <returns></returns>
-        [HttpGet("/login-init")]
-        public async Task<IActionResult> LoginInit(JsonNode json)
-        {
-            var type = json["type"];
-            string qrcode = string.Empty;
-            string randomCode = "";
-            switch (true) 
-            {
-                case bool when $"{type}".Equals("qrcode"):
-                    { 
-                        // 生成二维码图片
-                        Random random = new Random();
-                        randomCode = $"{random.Next(1000, 9999)}";
-                        string? CenterUrl = _configuration.GetValue<string>("ExamServer:CenterUrl");
-                        string content = $"{CenterUrl}/joinSchool?schoolCode=login:{randomCode}&m=%E7%99%BB%E5%BD%95&o=1";
-                        Bitmap qrCodeImage = QRCodeHelper.GetBitmap(content, 200, 200);
-                        using (MemoryStream stream = new MemoryStream())
-                        {
-                            qrCodeImage.Save(stream, ImageFormat.Png);
-                            byte[] data = stream.ToArray();
-                            qrcode=$"data:image/png;base64,{Convert.ToBase64String(data)}";
-                        }
-                        return Ok(new { code = 200, randomCode = randomCode, qrcode, type });
-                    }
-                case bool when $"{type}".Equals("smspin"):
-                    {
-                        int send = 0;
-                        if (  !string.IsNullOrWhiteSpace($"{json["area"]}") &&  !string.IsNullOrWhiteSpace($"{json["to"]}"))
-                        {
-                            string? CenterUrl = _configuration.GetValue<string>("ExamServer:CenterUrl");
-                            string url = $"{CenterUrl}/core/sendsms/pin";
-                            HttpResponseMessage message= await _httpClientFactory.CreateClient().PostAsJsonAsync(url, new { });
-                            if (message.IsSuccessStatusCode) 
-                            {
-                                string content =await message.Content.ReadAsStringAsync();
-                                JsonNode? jsonNode = JsonSerializer.Deserialize<JsonNode>(content);
-                                if (jsonNode!=null && int.TryParse($"{jsonNode["send"]}", out int s)) 
-                                {
-                                    send = s;
-                                }
-                            }
-                        }
-                        return Ok(new { code = 200, send, type });
-                    }
-            }
-            return Ok(new { code = 400});
-        }
-    }
-}

+ 0 - 68
IES.ExamServer/DI/LiteDBFactory.cs

@@ -1,68 +0,0 @@
-using LiteDB;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.DependencyInjection.Extensions;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Options;
-using System;
-using System.Collections.Concurrent;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace IES.ExamServer.DI
-{
-    public class LiteDBFactory
-    {
-        private readonly IServiceProvider _services;
-        private readonly IOptionsMonitor<LiteDBFactoryOptions> _optionsMonitor;
-        private readonly ILogger _logger;
-        private ConcurrentDictionary<string, LiteDatabase> LiteDatabases { get; } = new ConcurrentDictionary<string, LiteDatabase>();
-        public LiteDBFactory(IServiceProvider services, IOptionsMonitor<LiteDBFactoryOptions> optionsMonitor, ILogger<LiteDBFactory> logger)
-        {
-            if (services == null) throw new ArgumentNullException(nameof(services));
-            if (optionsMonitor == null) throw new ArgumentNullException(nameof(optionsMonitor));
-
-            _services = services;
-            _optionsMonitor = optionsMonitor;
-            _logger = logger;
-        }
-
-        public LiteDatabase GetLiteDatabase(string name = "Master")
-        {
-            try
-            {
-                var DB = LiteDatabases.GetOrAdd(name, x => new LiteDatabase(_optionsMonitor.Get(name).Connectionstring));
-                return DB;
-            }
-            catch (Exception e)
-            {
-                _logger?.LogWarning(e, e.Message);
-                return null;
-            }
-        }
-    }
-    public class LiteDBFactoryOptions
-    {
-        public string? Name { get; set; }
-        public string? Connectionstring { get; set; }
-    }
-    public static class LiteDBFactoryExtensions
-    {
-        public static IServiceCollection AddLiteDB(this IServiceCollection services, List<LiteDBFactoryOptions> connectionstrings)
-        {
-            if (services == null) throw new ArgumentNullException(nameof(services));
-            if (connectionstrings == null) throw new ArgumentNullException(nameof(connectionstrings));
-
-
-            services.TryAddSingleton<LiteDBFactory>();
-            //多个连接字符串注入
-            connectionstrings.ForEach(connection =>
-            {
-                services.Configure<LiteDBFactoryOptions>(connection.Name, o => { o.Name = connection.Name; o.Connectionstring = connection.Connectionstring; });
-            });
-
-            return services;
-        }
-    }
-}

+ 0 - 68
IES.ExamServer/DI/SignalRHost/SignalRExamServerHub.cs

@@ -1,68 +0,0 @@
-using Microsoft.AspNetCore.SignalR;
-using Microsoft.Extensions.Logging;
-
-
-namespace IES.ExamServer.DI.SignalRHost
-{
-    public  class SignalRExamServerHub : Hub<IClient>
-    {
-        private readonly ILogger<SignalRExamServerHub> _logger;
-      
-        public SignalRExamServerHub(ILogger<SignalRExamServerHub> logger)
-        {
-            _logger = logger;
-           
-        }
-    }
-    public interface IClient
-    {
-        Task ReceiveMessage(MessageBody message);
-        Task ReceiveConnection(MessageBody message);
-        Task ReceiveDisConnection(MessageBody message);
-    }
-    public abstract class MessageBody
-    {
-        public MessageBody()
-        {
-            time = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds();
-        }
-        /// <summary>
-        /// 连接id
-        /// </summary>
-        public virtual string? connid { get; set; }
-        /// <summary>
-        /// 客户端id
-        /// </summary>
-        public virtual string? clientid { get; set; }
-        /// <summary>
-        /// 状态  busy 忙碌,free 空闲,down 离线,error 错误
-        /// </summary>
-        public virtual string? status { get; set; }
-        /// <summary>
-        /// 消息内容
-        /// </summary>
-        public virtual string? content { get; set; }
-        /// <summary>
-        /// 消息创建时间
-        /// </summary>
-        public virtual long time { get; }
-        /// <summary>
-        /// 授权类型,bookjs_api 
-        /// </summary>
-        public virtual string? grant_type { get; set; }
-        /// <summary>
-        /// 消息类型
-        /// </summary>
-        public virtual MessageType message_type { get; set; }
-
-    }
-    public enum MessageType
-    {
-        conn_success,//连接成功
-        conn_error,// 连接失败
-        task_send_success,// 任务发送成功
-        task_send_error,// 任务发送失败
-        task_execute_success,// 任务执行成功
-        task_execute_error,// 任务执行失败
-    }
-}

+ 0 - 13
IES.ExamServer/Helper/Constant.cs

@@ -1,13 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace IES.ExamServer.Helper
-{
-    public static class Constant
-    {
-        public static string _KeyServerCenter = "Server:Center:Data";
-    }
-}

Diff do ficheiro suprimidas por serem muito extensas
+ 0 - 54
IES.ExamServer/Helper/QRCodeHelper.cs


+ 0 - 50
IES.ExamServer/IES.ExamServer.csproj

@@ -1,50 +0,0 @@
-<Project Sdk="Microsoft.NET.Sdk">
-
-  <PropertyGroup>
-    <OutputType>WinExe</OutputType>
-    <TargetFramework>net8.0-windows</TargetFramework>
-    <Nullable>enable</Nullable>
-    <ImplicitUsings>enable</ImplicitUsings>
-    <UseWPF>true</UseWPF>
-  </PropertyGroup>
-  <ItemGroup>
-    <None Remove="Configs\latlng.json" />
-  </ItemGroup>
-
-  <ItemGroup>
-    <Content Include="Configs\latlng.json">
-      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
-      <ExcludeFromSingleFile>true</ExcludeFromSingleFile>
-      <CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
-    </Content>
-  </ItemGroup>
-  <ItemGroup>
-    <PackageReference Include="LiteDB" Version="5.0.21" />
-    <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.1" />
-    <PackageReference Include="Microsoft.Extensions.Hosting" Version="8.0.1" />
-    <PackageReference Include="Microsoft.Extensions.Hosting.Abstractions" Version="8.0.1" />
-    <PackageReference Include="Microsoft.Extensions.Logging" Version="8.0.1" />
-    <PackageReference Include="Microsoft.Web.WebView2" Version="1.0.2903.40" />
-    <PackageReference Include="System.Drawing.Common" Version="8.0.6" />
-    <PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.1.2" />
-    <PackageReference Include="ZXing.Net" Version="0.16.9" />
-    <PackageReference Include="ZXing.Net.Bindings.ZKWeb.System.Drawing" Version="0.16.7" />
-  </ItemGroup>
-  <ItemGroup>
-	<FrameworkReference Include="Microsoft.AspNetCore.App" />
-  </ItemGroup>
-  <ItemGroup>
-	<!-- 这里模仿 ASP.NET Core,将 SPA 资源文件存于 wwwroot 文件夹下 -->
-	<None Update="wwwroot\**">
-		<CopyToOutputDirectory>Always</CopyToOutputDirectory>
-	</None>
-  </ItemGroup>
-  <ItemGroup>
-    <None Update="appsettings.json">
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
-    </None>
-    <None Update="Configs\logo.png">
-      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
-    </None>
-  </ItemGroup>
-</Project>

+ 0 - 28
IES.ExamServer/MainWindow.xaml

@@ -1,28 +0,0 @@
-<Window x:Class="IES.ExamServer.MainWindow"
-        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
-        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
-        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
-        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
-        xmlns:local="clr-namespace:IES.ExamServer"
-        xmlns:wv2="clr-namespace:Microsoft.Web.WebView2.Wpf;assembly=Microsoft.Web.WebView2.Wpf"
-        mc:Ignorable="d"
-        Title="评测服务端" Height="900" Width="1600" SnapsToDevicePixels="True"    ShowInTaskbar="True" WindowStyle="ToolWindow"
-        WindowStartupLocation="CenterScreen" Topmost="False" AllowsTransparency="False"  Background="White">
-    <!-- 在上面加入 xmlns:wv2 属性用于引用 WebView2 控件 -->
-    <Grid>
-       
-            <StackPanel Grid.Row="0">
-                <WrapPanel Height="50">
-                    
-                </WrapPanel>
-                <StackPanel Height="850" >
-                    <WrapPanel Height="850" Width="1500" >
-                        <!-- 这里插入 WebView2 控件,我们默认可以让 Source 是 http://localhost:5000,这是 ASP.NET Core 的默认监听地址 -->
-                        <wv2:WebView2 Height="850" Width="1500" Name="webView" Source="{Binding SourceUrl, FallbackValue='https://localhost:5000'}" AllowDrop="True" SnapsToDevicePixels="True"/>
-                    </WrapPanel>
-                </StackPanel>
-            </StackPanel>
-            
-        
-    </Grid>
-</Window>

+ 0 - 50
IES.ExamServer/MainWindow.xaml.cs

@@ -1,50 +0,0 @@
-using Microsoft.AspNetCore.Hosting.Server.Features;
-using Microsoft.AspNetCore.Hosting.Server;
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Security.Policy;
-using System.Text;
-using System.Threading.Tasks;
-using System.Windows;
-using System.Windows.Controls;
-using System.Windows.Data;
-using System.Windows.Documents;
-using System.Windows.Input;
-using System.Windows.Media;
-using System.Windows.Media.Imaging;
-using System.Windows.Shapes;
-using Microsoft.Web.WebView2.Core;
-using Microsoft.Web.WebView2.Wpf;
-using Microsoft.Web.WebView2.WinForms;
-
-namespace IES.ExamServer
-{
-    /// <summary>
-    /// MainWindow.xaml 的交互逻辑
-    /// </summary>
-    public partial class MainWindow : Window
-    {
-        public string SourceUrl { get; set; }
-        public MainWindow(IServer server)
-        {
-            InitializeComponent();
-            // 这里通过注入的 IServer 对象来获取监听的 Url
-            var addresses = server.Features.Get<IServerAddressesFeature>()?.Addresses;
-            SourceUrl = addresses is not null ? (addresses.FirstOrDefault() ?? "https://localhost:5001") : "https://localhost:5001";
-            // 无 VM,用自身当 VM
-            DataContext = this;
-            
-            webView.NavigationStarting += WebView2_NavigationStarting;
-        }
-
-        
-
-        private async void WebView2_NavigationStarting(object? sender, CoreWebView2NavigationStartingEventArgs e)
-        {
-            var userDataFolder =  System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "ExamServer\\Temp\\webview2_temp");
-            var environment = await CoreWebView2Environment.CreateAsync(null, userDataFolder);
-            await webView.EnsureCoreWebView2Async();
-        }
-    }
-}

+ 0 - 33
IES.ExamServer/Models/Teacher.cs

@@ -1,33 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Linq;
-using System.Text;
-using System.Threading.Tasks;
-
-namespace IES.ExamServer.Models
-{
-    public class Teacher
-    {
-        public string? id {  get; set; }
-        public string? name { get; set; }
-        public string? picture {  get; set; }
-        public string? x_auth_token {  get; set; }
-        public string? access_token { get; set; }
-        public List<School> schools { get; set; }= new List<School>();
-    }
-
-    public class School
-    {
-        public string? id { get; set; }
-        public string? name { get; set; }
-        public string? picture { get; set; }
-    }
-    [Serializable]
-    public class TmdidImplicit
-    {
-        public string? id_token { get; set; }
-        public string? access_token { get; set; }
-        public string? expires_in { get; set; }
-        public string? token_type { get; set; }
-    }
-}

+ 0 - 24
IES.ExamServer/appsettings.json

@@ -1,24 +0,0 @@
-{
-  "AllowedHosts": "*",
-  "Logging": {
-    "LogLevel": {
-      "Default": "Information",
-      "System.Net.Http.HttpClient": "Warning"
-    }
-  },
-  "Kestrel": {
-    "Endpoints": {
-      "Http": {
-        "Url": "http://*:5000"
-      },
-      "Https": {
-        "Url": "https://*:5001"
-      }
-    }
-  },
-  "ExamServer": {
-    "Timeout": 30000,
-    "Delay": 500,
-    "CenterUrl": "https://www.teammodel.cn"
-  }
-}

+ 33 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Controllers/WeatherForecastController.cs

@@ -0,0 +1,33 @@
+using Microsoft.AspNetCore.Mvc;
+
+namespace IES.ExamServer.Server.Controllers
+{
+    [ApiController]
+    [Route("[controller]")]
+    public class WeatherForecastController : ControllerBase
+    {
+        private static readonly string[] Summaries = new[]
+        {
+            "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
+        };
+
+        private readonly ILogger<WeatherForecastController> _logger;
+
+        public WeatherForecastController(ILogger<WeatherForecastController> logger)
+        {
+            _logger = logger;
+        }
+
+        [HttpGet]
+        public IEnumerable<WeatherForecast> Get()
+        {
+            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
+            {
+                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
+                TemperatureC = Random.Shared.Next(-20, 55),
+                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
+            })
+            .ToArray();
+        }
+    }
+}

+ 6 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/IES.ExamServer.Server.http

@@ -0,0 +1,6 @@
+@IES.ExamServer.Server_HostAddress = http://localhost:5147
+
+GET {{IES.ExamServer.Server_HostAddress}}/weatherforecast/
+Accept: application/json
+
+###

+ 24 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/IES.ExamServer.csproj

@@ -0,0 +1,24 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net8.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+    <SpaRoot>..\ies.examserver.client</SpaRoot>
+    <SpaProxyLaunchCommand>npm run dev</SpaProxyLaunchCommand>
+    <SpaProxyServerUrl>https://localhost:5173</SpaProxyServerUrl>
+  </PropertyGroup>
+
+  <ItemGroup>
+    <ProjectReference Include="..\ies.examserver.client\IES.ExamWebview.esproj">
+      <ReferenceOutputAssembly>false</ReferenceOutputAssembly>
+    </ProjectReference>
+  </ItemGroup>
+
+  <ItemGroup>
+    <PackageReference Include="Microsoft.AspNetCore.SpaProxy">
+      <Version>8.*-*</Version>
+    </PackageReference>
+  </ItemGroup>
+
+</Project>

+ 32 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Program.cs

@@ -0,0 +1,32 @@
+namespace IES.ExamServer.Server
+{
+    public class Program
+    {
+        public static void Main(string[] args)
+        {
+            var builder = WebApplication.CreateBuilder(args);
+
+            // Add services to the container.
+
+            builder.Services.AddControllers();
+
+            var app = builder.Build();
+
+            app.UseDefaultFiles();
+            app.UseStaticFiles();
+
+            // Configure the HTTP request pipeline.
+
+            app.UseHttpsRedirection();
+
+            app.UseAuthorization();
+
+
+            app.MapControllers();
+
+            app.MapFallbackToFile("/index.html");
+
+            app.Run();
+        }
+    }
+}

+ 45 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/Properties/launchSettings.json

@@ -0,0 +1,45 @@
+{
+  "$schema": "http://json.schemastore.org/launchsettings.json",
+  "iisSettings": {
+    "windowsAuthentication": false,
+    "anonymousAuthentication": true,
+    "iisExpress": {
+      "applicationUrl": "http://localhost:62961",
+      "sslPort": 44325
+    }
+  },
+  "profiles": {
+    "http": {
+      "commandName": "Project",
+      "dotnetRunMessages": true,
+      "launchBrowser": true,
+      "launchUrl": "weatherforecast",
+      "applicationUrl": "http://localhost:5147",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy"
+      }
+    },
+    "https": {
+      "commandName": "Project",
+      "dotnetRunMessages": true,
+      "launchBrowser": true,
+      "launchUrl": "weatherforecast",
+      "applicationUrl": "https://localhost:7181;http://localhost:5147",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy"
+      }
+    },
+    "IIS Express": {
+      "commandName": "IISExpress",
+      "launchBrowser": true,
+      "launchUrl": "weatherforecast",
+      "environmentVariables": {
+        "ASPNETCORE_ENVIRONMENT": "Development",
+        "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.SpaProxy"
+      }
+    }
+  }
+}
+

+ 13 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/WeatherForecast.cs

@@ -0,0 +1,13 @@
+namespace IES.ExamServer.Server
+{
+    public class WeatherForecast
+    {
+        public DateOnly Date { get; set; }
+
+        public int TemperatureC { get; set; }
+
+        public int TemperatureF => 32 + (int)(TemperatureC / 0.5556);
+
+        public string? Summary { get; set; }
+    }
+}

+ 8 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/appsettings.Development.json

@@ -0,0 +1,8 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  }
+}

+ 9 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamServer/appsettings.json

@@ -0,0 +1,9 @@
+{
+  "Logging": {
+    "LogLevel": {
+      "Default": "Information",
+      "Microsoft.AspNetCore": "Warning"
+    }
+  },
+  "AllowedHosts": "*"
+}

ies.examwebview/.editorconfig → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/.editorconfig


ies.examwebview/.gitignore → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/.gitignore


+ 1 - 2
ies.examwebview/IES.ExamWebview.esproj

@@ -1,4 +1,4 @@
-<Project Sdk="Microsoft.VisualStudio.JavaScript.Sdk/1.0.2125207">
+<Project Sdk="Microsoft.VisualStudio.JavaScript.Sdk/1.0.1184077">
   <PropertyGroup>
   <PropertyGroup>
     <StartupCommand>npm run dev</StartupCommand>
     <StartupCommand>npm run dev</StartupCommand>
     <JavaScriptTestRoot>.\</JavaScriptTestRoot>
     <JavaScriptTestRoot>.\</JavaScriptTestRoot>
@@ -7,6 +7,5 @@
     <ShouldRunBuildScript>false</ShouldRunBuildScript>
     <ShouldRunBuildScript>false</ShouldRunBuildScript>
     <!-- Folder where production build objects will be placed -->
     <!-- Folder where production build objects will be placed -->
     <BuildOutputFolder>$(MSBuildProjectDirectory)\dist</BuildOutputFolder>
     <BuildOutputFolder>$(MSBuildProjectDirectory)\dist</BuildOutputFolder>
-	<PublishAssetsDirectory>$(MSBuildProjectDirectory)\dist</PublishAssetsDirectory>
   </PropertyGroup>
   </PropertyGroup>
 </Project>
 </Project>

+ 1 - 1
ies.examwebview/README.md

@@ -1,4 +1,4 @@
-# ies.examwebview
+# ies.examserver.client
 
 
 This template should help get you started developing with Vue 3 in Vite.
 This template should help get you started developing with Vue 3 in Vite.
 
 

ies.examwebview/eslint.config.js → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/eslint.config.js


+ 0 - 1
ies.examwebview/index.html

@@ -7,7 +7,6 @@
     <title>Vite App</title>
     <title>Vite App</title>
   </head>
   </head>
   <body>
   <body>
-      <div>1234</div>
     <div id="app"></div>
     <div id="app"></div>
     <script type="module" src="/src/main.js"></script>
     <script type="module" src="/src/main.js"></script>
   </body>
   </body>

ies.examwebview/jsconfig.json → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/jsconfig.json


ies.examwebview/nuget.config → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/nuget.config


+ 1 - 1
ies.examwebview/package.json

@@ -1,5 +1,5 @@
 {
 {
-  "name": "examwebview",
+  "name": "ies.examserver.client",
   "version": "0.0.0",
   "version": "0.0.0",
   "private": true,
   "private": true,
   "type": "module",
   "type": "module",

ies.examwebview/public/favicon.ico → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/public/favicon.ico


ies.examwebview/src/App.vue → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/App.vue


ies.examwebview/src/assets/base.css → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/assets/base.css


ies.examwebview/src/assets/logo.svg → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/assets/logo.svg


ies.examwebview/src/assets/main.css → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/assets/main.css


+ 87 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/HelloWorld.vue

@@ -0,0 +1,87 @@
+<template>
+    <div class="weather-component">
+        <h1>Weather forecast</h1>
+        <p>This component demonstrates fetching data from the server.</p>
+
+        <div v-if="loading" class="loading">
+            Loading... Please refresh once the ASP.NET backend has started. See <a href="https://aka.ms/jspsintegrationvue">https://aka.ms/jspsintegrationvue</a> for more details.
+        </div>
+
+        <div v-if="post" class="content">
+            <table>
+                <thead>
+                    <tr>
+                        <th>Date</th>
+                        <th>Temp. (C)</th>
+                        <th>Temp. (F)</th>
+                        <th>Summary</th>
+                    </tr>
+                </thead>
+                <tbody>
+                    <tr v-for="forecast in post" :key="forecast.date">
+                        <td>{{ forecast.date }}</td>
+                        <td>{{ forecast.temperatureC }}</td>
+                        <td>{{ forecast.temperatureF }}</td>
+                        <td>{{ forecast.summary }}</td>
+                    </tr>
+                </tbody>
+            </table>
+        </div>
+    </div>
+</template>
+
+<script lang="js">
+    import { defineComponent } from 'vue';
+
+    export default defineComponent({
+        data() {
+            return {
+                loading: false,
+                post: null
+            };
+        },
+        created() {
+            // fetch the data when the view is created and the data is
+            // already being observed
+            this.fetchData();
+        },
+        watch: {
+            // call again the method if the route changes
+            '$route': 'fetchData'
+        },
+        methods: {
+            fetchData() {
+                this.post = null;
+                this.loading = true;
+
+                fetch('weatherforecast')
+                    .then(r => r.json())
+                    .then(json => {
+                        this.post = json;
+                        this.loading = false;
+                        return;
+                    });
+            }
+        },
+    });
+</script>
+
+<style scoped>
+th {
+    font-weight: bold;
+}
+
+th, td {
+    padding-left: .5rem;
+    padding-right: .5rem;
+}
+
+.weather-component {
+    text-align: center;
+}
+
+table {
+    margin-left: auto;
+    margin-right: auto;
+}
+</style>

ies.examwebview/src/components/TheWelcome.vue → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/TheWelcome.vue


ies.examwebview/src/components/WelcomeItem.vue → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/WelcomeItem.vue


ies.examwebview/src/components/icons/IconCommunity.vue → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/icons/IconCommunity.vue


ies.examwebview/src/components/icons/IconDocumentation.vue → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/icons/IconDocumentation.vue


ies.examwebview/src/components/icons/IconEcosystem.vue → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/icons/IconEcosystem.vue


ies.examwebview/src/components/icons/IconSupport.vue → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/icons/IconSupport.vue


ies.examwebview/src/components/icons/IconTooling.vue → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/components/icons/IconTooling.vue


ies.examwebview/src/main.js → TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/src/main.js


+ 57 - 0
TEAMModelOS.Extension/IES.Exam/IES.ExamWebview/vite.config.js

@@ -0,0 +1,57 @@
+import { fileURLToPath, URL } from 'node:url';
+
+import { defineConfig } from 'vite';
+import plugin from '@vitejs/plugin-vue';
+import fs from 'fs';
+import path from 'path';
+import child_process from 'child_process';
+import { env } from 'process';
+
+const baseFolder =
+    env.APPDATA !== undefined && env.APPDATA !== ''
+        ? `${env.APPDATA}/ASP.NET/https`
+        : `${env.HOME}/.aspnet/https`;
+
+const certificateName = "ies.examserver.client";
+const certFilePath = path.join(baseFolder, `${certificateName}.pem`);
+const keyFilePath = path.join(baseFolder, `${certificateName}.key`);
+
+if (!fs.existsSync(certFilePath) || !fs.existsSync(keyFilePath)) {
+    if (0 !== child_process.spawnSync('dotnet', [
+        'dev-certs',
+        'https',
+        '--export-path',
+        certFilePath,
+        '--format',
+        'Pem',
+        '--no-password',
+    ], { stdio: 'inherit', }).status) {
+        throw new Error("Could not create certificate.");
+    }
+}
+
+const target = env.ASPNETCORE_HTTPS_PORT ? `https://localhost:${env.ASPNETCORE_HTTPS_PORT}` :
+    env.ASPNETCORE_URLS ? env.ASPNETCORE_URLS.split(';')[0] : 'https://localhost:7181';
+
+// https://vitejs.dev/config/
+export default defineConfig({
+    plugins: [plugin()],
+    resolve: {
+        alias: {
+            '@': fileURLToPath(new URL('./src', import.meta.url))
+        }
+    },
+    server: {
+        proxy: {
+            '^/weatherforecast': {
+                target,
+                secure: false
+            }
+        },
+        port: 5173,
+        https: {
+            key: fs.readFileSync(keyFilePath),
+            cert: fs.readFileSync(certFilePath),
+        }
+    }
+})

+ 14 - 14
TEAMModelOS.sln

@@ -35,9 +35,9 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AzureCosmosDBEmulator", "Az
 EndProject
 EndProject
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IES.HybridCloud", "IES.HybridCloud\IES.HybridCloud.csproj", "{0FC9DE8A-488B-4ACD-88D5-8DEDECA1FF42}"
 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IES.HybridCloud", "IES.HybridCloud\IES.HybridCloud.csproj", "{0FC9DE8A-488B-4ACD-88D5-8DEDECA1FF42}"
 EndProject
 EndProject
-Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IES.ExamServer", "IES.ExamServer\IES.ExamServer.csproj", "{68B47A7A-880E-4967-85BA-89F37CEBAB93}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IES.ExamServer", "TEAMModelOS.Extension\IES.Exam\IES.ExamServer\IES.ExamServer.csproj", "{63A605DC-873F-45D3-8A90-5D87D929454C}"
 EndProject
 EndProject
-Project("{54A90642-561A-4BB1-A94E-469ADEE60C69}") = "IES.ExamWebview", "IES.ExamWebview\IES.ExamWebview.esproj", "{F4C21ADB-37D8-4B02-B1F6-E04E9F6E27D6}"
+Project("{54A90642-561A-4BB1-A94E-469ADEE60C69}") = "IES.ExamWebview", "TEAMModelOS.Extension\IES.Exam\IES.ExamWebview\IES.ExamWebview.esproj", "{83C35616-BEE2-4975-A6D9-A4BF48FAFAAA}"
 EndProject
 EndProject
 Global
 Global
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
 	GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -107,16 +107,16 @@ Global
 		{0FC9DE8A-488B-4ACD-88D5-8DEDECA1FF42}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0FC9DE8A-488B-4ACD-88D5-8DEDECA1FF42}.Debug|Any CPU.Build.0 = Debug|Any CPU
 		{0FC9DE8A-488B-4ACD-88D5-8DEDECA1FF42}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0FC9DE8A-488B-4ACD-88D5-8DEDECA1FF42}.Release|Any CPU.ActiveCfg = Release|Any CPU
 		{0FC9DE8A-488B-4ACD-88D5-8DEDECA1FF42}.Release|Any CPU.Build.0 = Release|Any CPU
 		{0FC9DE8A-488B-4ACD-88D5-8DEDECA1FF42}.Release|Any CPU.Build.0 = Release|Any CPU
-		{68B47A7A-880E-4967-85BA-89F37CEBAB93}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{68B47A7A-880E-4967-85BA-89F37CEBAB93}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{68B47A7A-880E-4967-85BA-89F37CEBAB93}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{68B47A7A-880E-4967-85BA-89F37CEBAB93}.Release|Any CPU.Build.0 = Release|Any CPU
-		{F4C21ADB-37D8-4B02-B1F6-E04E9F6E27D6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
-		{F4C21ADB-37D8-4B02-B1F6-E04E9F6E27D6}.Debug|Any CPU.Build.0 = Debug|Any CPU
-		{F4C21ADB-37D8-4B02-B1F6-E04E9F6E27D6}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
-		{F4C21ADB-37D8-4B02-B1F6-E04E9F6E27D6}.Release|Any CPU.ActiveCfg = Release|Any CPU
-		{F4C21ADB-37D8-4B02-B1F6-E04E9F6E27D6}.Release|Any CPU.Build.0 = Release|Any CPU
-		{F4C21ADB-37D8-4B02-B1F6-E04E9F6E27D6}.Release|Any CPU.Deploy.0 = Release|Any CPU
+		{63A605DC-873F-45D3-8A90-5D87D929454C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{63A605DC-873F-45D3-8A90-5D87D929454C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{63A605DC-873F-45D3-8A90-5D87D929454C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{63A605DC-873F-45D3-8A90-5D87D929454C}.Release|Any CPU.Build.0 = Release|Any CPU
+		{83C35616-BEE2-4975-A6D9-A4BF48FAFAAA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+		{83C35616-BEE2-4975-A6D9-A4BF48FAFAAA}.Debug|Any CPU.Build.0 = Debug|Any CPU
+		{83C35616-BEE2-4975-A6D9-A4BF48FAFAAA}.Debug|Any CPU.Deploy.0 = Debug|Any CPU
+		{83C35616-BEE2-4975-A6D9-A4BF48FAFAAA}.Release|Any CPU.ActiveCfg = Release|Any CPU
+		{83C35616-BEE2-4975-A6D9-A4BF48FAFAAA}.Release|Any CPU.Build.0 = Release|Any CPU
+		{83C35616-BEE2-4975-A6D9-A4BF48FAFAAA}.Release|Any CPU.Deploy.0 = Release|Any CPU
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(SolutionProperties) = preSolution
 	GlobalSection(SolutionProperties) = preSolution
 		HideSolutionNode = FALSE
 		HideSolutionNode = FALSE
@@ -133,8 +133,8 @@ Global
 		{A76FCB84-C9FF-46C6-8B82-FC7538779A98} = {9B74B53F-20E8-46CC-903B-62AEB1583DD7}
 		{A76FCB84-C9FF-46C6-8B82-FC7538779A98} = {9B74B53F-20E8-46CC-903B-62AEB1583DD7}
 		{5A3E1C89-D2BA-4758-A017-189811E0935F} = {9B74B53F-20E8-46CC-903B-62AEB1583DD7}
 		{5A3E1C89-D2BA-4758-A017-189811E0935F} = {9B74B53F-20E8-46CC-903B-62AEB1583DD7}
 		{0FC9DE8A-488B-4ACD-88D5-8DEDECA1FF42} = {9B74B53F-20E8-46CC-903B-62AEB1583DD7}
 		{0FC9DE8A-488B-4ACD-88D5-8DEDECA1FF42} = {9B74B53F-20E8-46CC-903B-62AEB1583DD7}
-		{68B47A7A-880E-4967-85BA-89F37CEBAB93} = {9B74B53F-20E8-46CC-903B-62AEB1583DD7}
-		{F4C21ADB-37D8-4B02-B1F6-E04E9F6E27D6} = {9B74B53F-20E8-46CC-903B-62AEB1583DD7}
+		{63A605DC-873F-45D3-8A90-5D87D929454C} = {9B74B53F-20E8-46CC-903B-62AEB1583DD7}
+		{83C35616-BEE2-4975-A6D9-A4BF48FAFAAA} = {9B74B53F-20E8-46CC-903B-62AEB1583DD7}
 	EndGlobalSection
 	EndGlobalSection
 	GlobalSection(ExtensibilityGlobals) = postSolution
 	GlobalSection(ExtensibilityGlobals) = postSolution
 		SolutionGuid = {76440725-5E50-4288-851F-BA5C0BC8E8C6}
 		SolutionGuid = {76440725-5E50-4288-851F-BA5C0BC8E8C6}

+ 0 - 12
ies.examwebview/CHANGELOG.md

@@ -1,12 +0,0 @@
-This file explains how Visual Studio created the project.
-
-The following tools were used to generate this project:
-- create-vite
-
-The following steps were used to generate this project:
-- Create vue project with create-vite: `npm init --yes vue@latest ies.examwebview -- --eslint `.
-- Create project file (`ies.examwebview.esproj`).
-- Create `launch.json` to enable debugging.
-- Create `nuget.config` to specify location of the JavaScript Project System SDK (which is used in the first line in `ies.examwebview.esproj`).
-- Add project to solution.
-- Write this file.

+ 0 - 44
ies.examwebview/src/components/HelloWorld.vue

@@ -1,44 +0,0 @@
-<script setup>
-defineProps({
-  msg: {
-    type: String,
-    required: true,
-  },
-})
-</script>
-
-<template>
-  <div class="greetings">
-    <h1 class="green">{{ msg }}</h1>
-    <h3>
-      You’ve successfully created a project with
-      <a href="https://vite.dev/" target="_blank" rel="noopener">Vite</a> +
-      <a href="https://vuejs.org/" target="_blank" rel="noopener">Vue 3</a>.
-    </h3>
-  </div>
-</template>
-
-<style scoped>
-h1 {
-  font-weight: 500;
-  font-size: 2.6rem;
-  position: relative;
-  top: -10px;
-}
-
-h3 {
-  font-size: 1.2rem;
-}
-
-.greetings h1,
-.greetings h3 {
-  text-align: center;
-}
-
-@media (min-width: 1024px) {
-  .greetings h1,
-  .greetings h3 {
-    text-align: left;
-  }
-}
-</style>

+ 0 - 18
ies.examwebview/vite.config.js

@@ -1,18 +0,0 @@
-import { fileURLToPath, URL } from 'node:url'
-
-import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import vueDevTools from 'vite-plugin-vue-devtools'
-
-// https://vite.dev/config/
-export default defineConfig({
-  plugins: [
-    vue(),
-    vueDevTools(),
-  ],
-  resolve: {
-    alias: {
-      '@': fileURLToPath(new URL('./src', import.meta.url))
-    },
-  },
-})