diff --git a/IRC.Core.SCP/HostConfig/SwaggerSetup.cs b/IRC.Core.SCP/HostConfig/SwaggerSetup.cs new file mode 100644 index 000000000..ab627ea11 --- /dev/null +++ b/IRC.Core.SCP/HostConfig/SwaggerSetup.cs @@ -0,0 +1,134 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.OpenApi.Models; +using Swashbuckle.AspNetCore.Filters; +using Swashbuckle.AspNetCore.SwaggerGen; +using Swashbuckle.AspNetCore.SwaggerUI; +using System; +using System.ComponentModel; +using System.IO; +using System.Linq; +using System.Reflection; + +namespace IRaCIS.Core.API; + +public enum SwaggerVersion +{ + //[Description("HIR修改")] + //HIR = -1, + + //[Description("医生模块")] + //Reviewer = 1, + + [Description("项目模块")] + Trial = 2, + //[Description("入组模块")] + //Enroll = 3, + //[Description("工作量模块")] + //Workload = 4, + //[Description("通用信息获取")] + //Common = 5, + //[Description("机构信息模块")] + //Institution = 6, + //[Description("统计模块")] + //DashboardStatistics = 7, + //[Description("财务模块")] + //Financial = 8, + //[Description("管理模块")] + //Management = 9, + //[Description("影像模块")] + //Image = 10, + //[Description("读片模块")] + //Reading = 11 +}; + + +public static class SwaggerSetup +{ + public static void AddSwaggerSetup(this IServiceCollection services) + { + services.AddEndpointsApiExplorer(); + services.AddSwaggerGen(options => + { + + typeof(SwaggerVersion).GetFields(BindingFlags.Public | BindingFlags.Static).ToList() + .ForEach(field => + { + var description = field.GetCustomAttribute()?.Description ?? field.Name; + options.SwaggerDoc(field.Name, new Microsoft.OpenApi.Models.OpenApiInfo + { + Version = field.Name, + Description = $"{field.Name} API", + Title = description // 使用Description作为Title + }); + }); + + // 接口排序 + options.OrderActionsBy(o => o.GroupName); + + //添加注释 + var basePath = AppContext.BaseDirectory; + //var xmlPath1 = Path.Combine(basePath, "IRaCIS.Core.Application.xml"); + var xmlPath2 = Path.Combine(basePath, "IRC.Core.SCP.xml"); + //options.IncludeXmlComments(xmlPath1, true); + options.IncludeXmlComments(xmlPath2, true); + + // 在header中添加token,传递到后台 + options.OperationFilter(); + + + // 添加登录按钮 + options.AddSecurityDefinition("bearerAuth", new OpenApiSecurityScheme() + { + Description = "JWT Authorization header using the Bearer scheme. Example: \"Authorization: Bearer {token}\"", + Name = "Authorization", + //In = "header", + //Type = "apiKey" + }); + + }); + } + + + + public static void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + app.UseSwagger(); + app.UseSwaggerUI(options => + { + typeof(SwaggerVersion).GetFields(BindingFlags.Public | BindingFlags.Static).ToList() + .ForEach(field => + { + var description = field.GetCustomAttribute()?.Description ?? field.Name; + options.SwaggerEndpoint($"swagger/{field.Name}/swagger.json", $"{description}"); + }); + + + var data = Assembly.GetExecutingAssembly().Location; + options.IndexStream = () => Assembly.GetExecutingAssembly() + .GetManifestResourceStream("IRC.Core.SCP.wwwroot.swagger.ui.Index.html"); + + //路径配置,设置为空,表示直接在根域名(localhost:8001)访问该文件, + //注意localhost:8001/swagger是访问不到的,去launchSettings.json把launchUrl去掉,如果你想换一个路径,直接写名字即可,比如直接写c.Route = "doc"; + options.RoutePrefix = string.Empty; + + //DocExpansion设置为none可折叠所有方法 + options.DocExpansion(DocExpansion.None); + + //DefaultModelsExpandDepth设置为 - 1 可不显示models + options.DefaultModelsExpandDepth(-1); + + // 关键一句:关闭外网校验 + options.ConfigObject.ValidatorUrl = null; + }); + } + + + + + + + +} diff --git a/IRC.Core.SCP/IRC.Core.SCP.csproj b/IRC.Core.SCP/IRC.Core.SCP.csproj index 29f14b989..ae9eda876 100644 --- a/IRC.Core.SCP/IRC.Core.SCP.csproj +++ b/IRC.Core.SCP/IRC.Core.SCP.csproj @@ -4,8 +4,25 @@ net8.0 enable enable + + True + .\IRC.Core.SCP.xml + + + + + + + + Always + + + Always + + + @@ -30,6 +47,7 @@ + diff --git a/IRC.Core.SCP/IRC.Core.SCP.xml b/IRC.Core.SCP/IRC.Core.SCP.xml new file mode 100644 index 000000000..71060c383 --- /dev/null +++ b/IRC.Core.SCP/IRC.Core.SCP.xml @@ -0,0 +1,64 @@ + + + + IRC.Core.SCP + + + + + 单个文件接收 归档 + + + + + + + + 传输完成后,自动给检查绑定访视 + + + + + + + oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder + + + + + + + + + + oosFolderPath 不要 "/ "开头 应该: TempFolder/ChildFolder + + + + + + + + + + 删除某个目录的文件 + + + + + + + 统一返回前端数据包装,之前在控制器包装,现在修改为动态Api 在ResultFilter这里包装,减少重复冗余代码 + by zhouhang 2021.09.12 周末 + + + + + 异步版本 + + + + + + + diff --git a/IRC.Core.SCP/Program.cs b/IRC.Core.SCP/Program.cs index e6278b35d..b3d4a885c 100644 --- a/IRC.Core.SCP/Program.cs +++ b/IRC.Core.SCP/Program.cs @@ -6,6 +6,7 @@ using FellowOakDicom; using FellowOakDicom.Imaging; using FellowOakDicom.Imaging.NativeCodec; using FellowOakDicom.Network; +using IRaCIS.Core.API; using IRaCIS.Core.Infra.EFCore; using IRaCIS.Core.SCP; using IRaCIS.Core.SCP.Filter; @@ -141,7 +142,7 @@ builder.Services.AddFellowOakDicom().AddTranscoderManager() // .AddImageManager()) // .SkipValidation() - + // .Build(); @@ -151,18 +152,23 @@ builder.Services.AddFellowOakDicom().AddTranscoderManager + + + + + %(DocumentTitle) + + + + + + %(HeadContent) + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + + + \ No newline at end of file diff --git a/IRC.Core.SCP/wwwroot/swagger/ui/abp.js b/IRC.Core.SCP/wwwroot/swagger/ui/abp.js new file mode 100644 index 000000000..9957fdf7a --- /dev/null +++ b/IRC.Core.SCP/wwwroot/swagger/ui/abp.js @@ -0,0 +1,117 @@ +var abp = abp || {}; +(function () { + + /* Application paths *****************************************/ + + // Current application root path (including virtual directory if exists). + abp.appPath = abp.appPath || '/'; + + /* AUTHORIZATION **********************************************/ + // Implements Authorization API that simplifies usage of authorization scripts generated by Abp. + + abp.auth = abp.auth || {}; + + abp.auth.tokenCookieName = 'Abp.AuthToken'; + abp.auth.tokenHeaderName = 'Authorization'; + + abp.auth.setToken = function (authToken, expireDate) { + abp.utils.setCookieValue(abp.auth.tokenCookieName, authToken, expireDate, abp.appPath); + }; + + abp.auth.getToken = function () { + return abp.utils.getCookieValue(abp.auth.tokenCookieName); + } + + abp.auth.clearToken = function () { + abp.auth.setToken(); + } + + /* UTILS ***************************************************/ + + abp.utils = abp.utils || {}; + + /** + * Sets a cookie value for given key. + * This is a simple implementation created to be used by ABP. + * Please use a complete cookie library if you need. + * @param {string} key + * @param {string} value + * @param {Date} expireDate (optional). If not specified the cookie will expire at the end of session. + * @param {string} path (optional) + */ + abp.utils.setCookieValue = function (key, value, expireDate, path) { + var cookieValue = encodeURIComponent(key) + '='; + + if (value) { + cookieValue = cookieValue + encodeURIComponent(value); + } + + if (expireDate) { + cookieValue = cookieValue + "; expires=" + expireDate.toUTCString(); + } + + if (path) { + cookieValue = cookieValue + "; path=" + path; + } + + document.cookie = cookieValue; + }; + + /** + * Gets a cookie with given key. + * This is a simple implementation created to be used by ABP. + * Please use a complete cookie library if you need. + * @param {string} key + * @returns {string} Cookie value or null + */ + abp.utils.getCookieValue = function (key) { + var equalities = document.cookie.split('; '); + for (var i = 0; i < equalities.length; i++) { + if (!equalities[i]) { + continue; + } + + var splitted = equalities[i].split('='); + if (splitted.length != 2) { + continue; + } + + if (decodeURIComponent(splitted[0]) === key) { + return decodeURIComponent(splitted[1] || ''); + } + } + + return null; + }; + + /** + * Deletes cookie for given key. + * This is a simple implementation created to be used by ABP. + * Please use a complete cookie library if you need. + * @param {string} key + * @param {string} path (optional) + */ + abp.utils.deleteCookie = function (key, path) { + var cookieValue = encodeURIComponent(key) + '='; + + cookieValue = cookieValue + "; expires=" + (new Date(new Date().getTime() - 86400000)).toUTCString(); + + if (path) { + cookieValue = cookieValue + "; path=" + path; + } + + document.cookie = cookieValue; + } + + /* SECURITY ***************************************/ + abp.security = abp.security || {}; + abp.security.antiForgery = abp.security.antiForgery || {}; + + abp.security.antiForgery.tokenCookieName = 'XSRF-TOKEN'; + abp.security.antiForgery.tokenHeaderName = 'X-XSRF-TOKEN'; + + abp.security.antiForgery.getToken = function () { + return abp.utils.getCookieValue(abp.security.antiForgery.tokenCookieName); + }; + +})(); diff --git a/IRC.Core.SCP/wwwroot/swagger/ui/abp.swagger.js b/IRC.Core.SCP/wwwroot/swagger/ui/abp.swagger.js new file mode 100644 index 000000000..7c05c38da --- /dev/null +++ b/IRC.Core.SCP/wwwroot/swagger/ui/abp.swagger.js @@ -0,0 +1,597 @@ +var abp = abp || {}; +(function () { + + /* md5*/ + + /* + * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message + * Digest Algorithm, as defined in RFC 1321. + * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002. + * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet + * Distributed under the BSD License + * See http://pajhome.org.uk/crypt/md5 for more info. + */ + + /* + * Configurable variables. You may need to tweak these to be compatible with + * the server-side, but the defaults work in most cases. + */ + var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ + var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ + var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ + + /* + * These are the functions you'll usually want to call + * They take string arguments and return either hex or base-64 encoded strings + */ + function hex_md5(s) { return binl2hex(core_md5(str2binl(s), s.length * chrsz)); } + function b64_md5(s) { return binl2b64(core_md5(str2binl(s), s.length * chrsz)); } + function str_md5(s) { return binl2str(core_md5(str2binl(s), s.length * chrsz)); } + function hex_hmac_md5(key, data) { return binl2hex(core_hmac_md5(key, data)); } + function b64_hmac_md5(key, data) { return binl2b64(core_hmac_md5(key, data)); } + function str_hmac_md5(key, data) { return binl2str(core_hmac_md5(key, data)); } + + /* + * Perform a simple self-test to see if the VM is working + */ + function md5_vm_test() { + return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72"; + } + + /* + * Calculate the MD5 of an array of little-endian words, and a bit length + */ + function core_md5(x, len) { + /* append padding */ + x[len >> 5] |= 0x80 << ((len) % 32); + x[(((len + 64) >>> 9) << 4) + 14] = len; + + var a = 1732584193; + var b = -271733879; + var c = -1732584194; + var d = 271733878; + + for (var i = 0; i < x.length; i += 16) { + var olda = a; + var oldb = b; + var oldc = c; + var oldd = d; + + a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); + d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); + c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); + b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); + a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); + d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); + c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); + b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); + a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); + d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); + c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); + b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); + a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); + d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); + c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); + b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); + + a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); + d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); + c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); + b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302); + a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); + d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); + c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); + b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); + a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); + d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); + c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); + b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); + a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); + d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); + c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); + b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); + + a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); + d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); + c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); + b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); + a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); + d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); + c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); + b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); + a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); + d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222); + c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); + b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); + a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); + d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); + c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); + b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); + + a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844); + d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); + c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); + b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); + a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); + d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); + c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); + b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); + a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); + d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); + c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); + b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); + a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); + d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); + c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); + b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); + + a = safe_add(a, olda); + b = safe_add(b, oldb); + c = safe_add(c, oldc); + d = safe_add(d, oldd); + } + return Array(a, b, c, d); + + } + + /* + * These functions implement the four basic operations the algorithm uses. + */ + function md5_cmn(q, a, b, x, s, t) { + return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); + } + function md5_ff(a, b, c, d, x, s, t) { + return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); + } + function md5_gg(a, b, c, d, x, s, t) { + return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); + } + function md5_hh(a, b, c, d, x, s, t) { + return md5_cmn(b ^ c ^ d, a, b, x, s, t); + } + function md5_ii(a, b, c, d, x, s, t) { + return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); + } + + /* + * Calculate the HMAC-MD5, of a key and some data + */ + function core_hmac_md5(key, data) { + var bkey = str2binl(key); + if (bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz); + + var ipad = Array(16), opad = Array(16); + for (var i = 0; i < 16; i++) { + ipad[i] = bkey[i] ^ 0x36363636; + opad[i] = bkey[i] ^ 0x5C5C5C5C; + } + + var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz); + return core_md5(opad.concat(hash), 512 + 128); + } + + /* + * Add integers, wrapping at 2^32. This uses 16-bit operations internally + * to work around bugs in some JS interpreters. + */ + function safe_add(x, y) { + var lsw = (x & 0xFFFF) + (y & 0xFFFF); + var msw = (x >> 16) + (y >> 16) + (lsw >> 16); + return (msw << 16) | (lsw & 0xFFFF); + } + + /* + * Bitwise rotate a 32-bit number to the left. + */ + function bit_rol(num, cnt) { + return (num << cnt) | (num >>> (32 - cnt)); + } + + /* + * Convert a string to an array of little-endian words + * If chrsz is ASCII, characters >255 have their hi-byte silently ignored. + */ + function str2binl(str) { + var bin = Array(); + var mask = (1 << chrsz) - 1; + for (var i = 0; i < str.length * chrsz; i += chrsz) + bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32); + return bin; + } + + /* + * Convert an array of little-endian words to a string + */ + function binl2str(bin) { + var str = ""; + var mask = (1 << chrsz) - 1; + for (var i = 0; i < bin.length * 32; i += chrsz) + str += String.fromCharCode((bin[i >> 5] >>> (i % 32)) & mask); + return str; + } + + /* + * Convert an array of little-endian words to a hex string. + */ + function binl2hex(binarray) { + var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; + var str = ""; + for (var i = 0; i < binarray.length * 4; i++) { + str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + + hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF); + } + return str; + } + + /* + * Convert an array of little-endian words to a base-64 string + */ + function binl2b64(binarray) { + var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + var str = ""; + for (var i = 0; i < binarray.length * 4; i += 3) { + var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 0xFF) << 16) + | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8) + | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF); + for (var j = 0; j < 4; j++) { + if (i * 8 + j * 6 > binarray.length * 32) str += b64pad; + else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F); + } + } + return str; + } + + + /* Swagger */ + + abp.swagger = abp.swagger || {}; + + abp.swagger.addAuthToken = function () { + var authToken = abp.auth.getToken(); + if (!authToken) { + return false; + } + + var cookieAuth = new SwaggerClient.ApiKeyAuthorization(abp.auth.tokenHeaderName, 'Bearer ' + authToken, 'header'); + swaggerUi.api.clientAuthorizations.add('bearerAuth', cookieAuth); + return true; + } + + abp.swagger.addCsrfToken = function () { + var csrfToken = abp.security.antiForgery.getToken(); + if (!csrfToken) { + return false; + } + var csrfCookieAuth = new SwaggerClient.ApiKeyAuthorization(abp.security.antiForgery.tokenHeaderName, csrfToken, 'header'); + swaggerUi.api.clientAuthorizations.add(abp.security.antiForgery.tokenHeaderName, csrfCookieAuth); + return true; + } + + function loginUserInternal(tenantId, callback) { + + var usernameOrEmailAddress = document.getElementById('userName').value; + // if (!usernameOrEmailAddress) { + // alert('UserName Can Not Be Null'); + // return false; + // } + + var password = document.getElementById('password').value; + var pwdMd5 = document.getElementById('pwdMd5').value; + console.log(pwdMd5); + if (!password && !pwdMd5) { + alert('PassWord And Md5 Can Not Be Null'); + return false; + } + + var xhr = new XMLHttpRequest(); + + xhr.onreadystatechange = function () { + + if (xhr.readyState === XMLHttpRequest.DONE) { + // debugger; + if (xhr.status === 200) { + // debugger; + + var resultdata = JSON.parse(xhr.responseText); + if (resultdata.ErrorMessage != '') { + alert(resultdata.ErrorMessage); + return false; + } + if (resultdata.code == 300) { + alert(resultdata.message); + } + else { + var responseJSON = JSON.parse(xhr.responseText); + var result = responseJSON; + var expireDate = new Date(Date.now() + (60 * 60 * 24 * 1000)); + abp.auth.setToken(result.Result.JWTStr, expireDate); + let selectDom = document.getElementById("roleSelect") + selectDom.options.length = 0; + result.Result.BasicInfo.AccountList.forEach(item => { + selectDom.options.add(new Option(item.UserTypeShortName, item.Id)); + }) + // callback(); + } + + } else { + alert('Login failed !'); + } + } + }; + + xhr.open('POST', '/User/getUserLoginRoleList', true); + xhr.setRequestHeader('Abp.TenantId', tenantId); + xhr.setRequestHeader('Content-type', 'application/json'); + var parm = { + + + UserName: usernameOrEmailAddress, + Password: hex_md5(password), + } + if (pwdMd5 != '') { + parm.Password = pwdMd5; + } + xhr.send(JSON.stringify(parm)); + //xhr.send("{" + "userName:'" + usernameOrEmailAddress + "'," + "passWord:'" + password + "'}"); + + }; + function loginUserInternalRole(tenantId, callback) { + + var usernameOrEmailAddress = document.getElementById('roleSelect').value; + //if (!usernameOrEmailAddress) { + // alert('UserName Can Not Be Null'); + // return false; + //} + + var password = document.getElementById('password').value; + var pwdMd5 = document.getElementById('pwdMd5').value; + console.log(pwdMd5); + if (!password && !pwdMd5) { + alert('PassWord And Md5 Can Not Be Null'); + return false; + } + + var xhr = new XMLHttpRequest(); + + xhr.onreadystatechange = function () { + + if (xhr.readyState === XMLHttpRequest.DONE) { + // debugger; + if (xhr.status === 200) { + // debugger; + + var resultdata = JSON.parse(xhr.responseText); + if (resultdata.ErrorMessage != '') { + alert(resultdata.ErrorMessage); + return false; + } + if (resultdata.code == 300) { + alert(resultdata.message); + } + else { + var responseJSON = JSON.parse(xhr.responseText); + var result = responseJSON; + var expireDate = new Date(Date.now() + (60 * 60 * 24 * 1000)); + abp.auth.setToken(result.Result, expireDate); + + callback(); + } + + } else { + alert('Login failed !'); + } + } + }; + + xhr.open('get', `/User/loginSelectUserRole?userRoleId=${usernameOrEmailAddress}`, true); + xhr.setRequestHeader('Abp.TenantId', tenantId); + xhr.setRequestHeader('Content-type', 'application/json'); + var authToken = abp.auth.getToken(); + xhr.setRequestHeader('Authorization', `Bearer ${authToken}`); + xhr.send(); + //xhr.send("{" + "userName:'" + usernameOrEmailAddress + "'," + "passWord:'" + password + "'}"); + + }; + abp.swagger.login = function (callback) { + //Get TenantId first + var tenancyName = document.getElementById('tenancyName').value; + + if (tenancyName) { + var xhrTenancyName = new XMLHttpRequest(); + xhrTenancyName.onreadystatechange = function () { + if (xhrTenancyName.readyState === XMLHttpRequest.DONE && xhrTenancyName.status === 200) { + var responseJSON = JSON.parse(xhrTenancyName.responseText); + var result = responseJSON.result; + if (result.state === 1) { // Tenant exists and active. + loginUserInternal(result.tenantId, callback); // Login for tenant + } else { + alert('There is no such tenant or tenant is not active !'); + } + } + }; + + xhrTenancyName.open('POST', '/api/services/app/Account/IsTenantAvailable', true); + xhrTenancyName.setRequestHeader('Content-type', 'application/json'); + xhrTenancyName.send("{" + "tenancyName:'" + tenancyName + "'}"); + } else { + loginUserInternal(null, callback); // Login for host + } + }; + abp.swagger.loginRole = function (callback) { + //Get TenantId first + var tenancyName = document.getElementById('tenancyName').value; + + if (tenancyName) { + var xhrTenancyName = new XMLHttpRequest(); + xhrTenancyName.onreadystatechange = function () { + if (xhrTenancyName.readyState === XMLHttpRequest.DONE && xhrTenancyName.status === 200) { + var responseJSON = JSON.parse(xhrTenancyName.responseText); + var result = responseJSON.result; + if (result.state === 1) { // Tenant exists and active. + loginUserInternalRole(result.tenantId, callback); // Login for tenant + } else { + alert('There is no such tenant or tenant is not active !'); + } + } + }; + + xhrTenancyName.open('POST', '/api/services/app/Account/IsTenantAvailable', true); + xhrTenancyName.setRequestHeader('Content-type', 'application/json'); + xhrTenancyName.send("{" + "tenancyName:'" + tenancyName + "'}"); + } else { + loginUserInternalRole(null, callback); // Login for host + } + }; + + abp.swagger.logout = function () { + abp.auth.clearToken(); + } + + abp.swagger.closeAuthDialog = function () { + if (document.getElementById('abp-auth-dialog')) { + document.getElementsByClassName("swagger-ui")[1].removeChild(document.getElementById('abp-auth-dialog')); + } + } + + abp.swagger.openAuthDialog = function (loginCallback) { + abp.swagger.closeAuthDialog(); + + var abpAuthDialog = document.createElement('div'); + abpAuthDialog.className = 'dialog-ux'; + abpAuthDialog.id = 'abp-auth-dialog'; + + document.getElementsByClassName("swagger-ui")[1].appendChild(abpAuthDialog); + + // -- backdrop-ux + var backdropUx = document.createElement('div'); + backdropUx.className = 'backdrop-ux'; + abpAuthDialog.appendChild(backdropUx); + + // -- modal-ux + var modalUx = document.createElement('div'); + modalUx.className = 'modal-ux'; + abpAuthDialog.appendChild(modalUx); + + // -- -- modal-dialog-ux + var modalDialogUx = document.createElement('div'); + modalDialogUx.className = 'modal-dialog-ux'; + modalUx.appendChild(modalDialogUx); + + // -- -- -- modal-ux-inner + var modalUxInner = document.createElement('div'); + modalUxInner.className = 'modal-ux-inner'; + modalDialogUx.appendChild(modalUxInner); + + // -- -- -- -- modal-ux-header + var modalUxHeader = document.createElement('div'); + modalUxHeader.className = 'modal-ux-header'; + modalUxInner.appendChild(modalUxHeader); + + var modalHeader = document.createElement('h3'); + modalHeader.innerText = 'Authorize'; + modalUxHeader.appendChild(modalHeader); + + // -- -- -- -- modal-ux-content + var modalUxContent = document.createElement('div'); + modalUxContent.className = 'modal-ux-content'; + modalUxInner.appendChild(modalUxContent); + + modalUxContent.onkeydown = function (e) { + if (e.keyCode === 13) { + //try to login when user presses enter on authorize modal + abp.swagger.login(loginCallback); + } + }; + + //Inputs + createInput(modalUxContent, 'tenancyName', 'Tenancy Name (Leave empty for Host)'); + createInput(modalUxContent, 'userName', 'Username or email address', 'text', 'cyldev'); + createInput(modalUxContent, 'password', 'Password', 'password', '123456'); + createInput(modalUxContent, 'pwdMd5', 'PwdMd5', 'text', ''); + createSelect(modalUxContent, 'roleSelect', 'role', []) + + //Buttons + var authBtnWrapper = document.createElement('div'); + authBtnWrapper.className = 'auth-btn-wrapper'; + modalUxContent.appendChild(authBtnWrapper); + + //Close button + var closeButton = document.createElement('button'); + closeButton.className = 'btn modal-btn auth btn-done button'; + closeButton.innerText = 'Close'; + closeButton.style.marginRight = '5px'; + closeButton.onclick = abp.swagger.closeAuthDialog; + authBtnWrapper.appendChild(closeButton); + + //Authorize button + var authorizeButton = document.createElement('button'); + authorizeButton.className = 'btn modal-btn auth authorize button'; + authorizeButton.innerText = 'Login'; + authorizeButton.onclick = function () { + abp.swagger.login(loginCallback); + }; + authBtnWrapper.appendChild(authorizeButton); + + // login role + var authorizeButton = document.createElement('button'); + authorizeButton.className = 'btn modal-btn auth authorize button'; + authorizeButton.innerText = 'LoginRole'; + authorizeButton.onclick = function () { + abp.swagger.loginRole(loginCallback); + }; + authBtnWrapper.appendChild(authorizeButton); + } + + function createInput(container, id, title, type, value = "") { + var wrapper = document.createElement('div'); + wrapper.className = 'wrapper'; + if (id == "tenancyName") { + wrapper.style.display = 'none'; + } + container.appendChild(wrapper); + + var label = document.createElement('label'); + label.innerText = title; + wrapper.appendChild(label); + + var section = document.createElement('section'); + section.className = 'block-tablet col-10-tablet block-desktop col-10-desktop'; + wrapper.appendChild(section); + + var input = document.createElement('input'); + input.id = id; + input.type = type ? type : 'text'; + input.style.width = '100%'; + input.value = value; + input.autocomplete = "off"; + + + section.appendChild(input); + } + function createSelect(container, id, title, option = []) { + var wrapper = document.createElement('div'); + wrapper.className = 'wrapper'; + if (id == "tenancyName") { + wrapper.style.display = 'none'; + } + container.appendChild(wrapper); + + var label = document.createElement('label'); + label.innerText = title; + wrapper.appendChild(label); + + var section = document.createElement('section'); + section.className = 'block-tablet col-10-tablet block-desktop col-10-desktop'; + wrapper.appendChild(section); + + var input = document.createElement('select'); + input.id = id; + input.style.width = '100%'; + option.forEach(item => { + input.options.add(new Option(item.UserTypeShortName, item.Id)); + }) + + section.appendChild(input); + } + +})(); \ No newline at end of file diff --git a/IRaCIS.Core.Application/TestService.cs b/IRaCIS.Core.Application/TestService.cs index 87f938d98..7eb5d4c16 100644 --- a/IRaCIS.Core.Application/TestService.cs +++ b/IRaCIS.Core.Application/TestService.cs @@ -59,28 +59,50 @@ namespace IRaCIS.Core.Application.Service public static int IntValue = 100; - public async Task TestImage(string fileFullPath) + public async Task TestImage(string folderPath) { - var file = await DicomFile.OpenAsync(fileFullPath); - // 生成缩略图 - using (var memoryStream = new MemoryStream()) + + if (!Directory.Exists(folderPath)) + return ResponseOutput.Ok("目录不存在"); + + // 获取所有 .dcm 文件 + var dicomFiles = Directory.GetFiles(folderPath); + + foreach (var fileFullPath in dicomFiles) { - DicomImage image = new DicomImage(file.Dataset); - - var sharpimage = image.RenderImage().AsSharpImage(); - sharpimage.Save(memoryStream, new JpegEncoder()); - - - // 关键点:一定要回到开头 - memoryStream.Position = 0; - - using (var fileStream = File.Create($"{fileFullPath}.jpg")) + try { - await memoryStream.CopyToAsync(fileStream); - } + var file = await DicomFile.OpenAsync(fileFullPath); + + // 生成缩略图 + using (var memoryStream = new MemoryStream()) + { + DicomImage image = new DicomImage(file.Dataset); + + var sharpimage = image.RenderImage().AsSharpImage(); + sharpimage.Save(memoryStream, new JpegEncoder()); + + + // 关键点:一定要回到开头 + memoryStream.Position = 0; + + using (var fileStream = File.Create($"{fileFullPath}.jpg")) + { + await memoryStream.CopyToAsync(fileStream); + } + + } + } + catch (Exception) + { + + continue; + } } + + return ResponseOutput.Ok(); }