@ -0,0 +1 @@ |
|||
doc.cncore.club |
|||
@ -0,0 +1,13 @@ |
|||
## Authors |
|||
|
|||
* Author: [@WangJunZzz](https://github.com/WangJunZzz) |
|||
* Email: 510423039@qq.com |
|||
* Blogs: https://www.cnblogs.com/WangJunZzz |
|||
|
|||
|
|||
## 赞助 |
|||
如果你觉得这个项目对你有帮助,你可以帮作者买一杯咖啡表示支持! |
|||
 |
|||
|
|||
|
|||
|
|||
@ -0,0 +1,25 @@ |
|||
# License |
|||
|
|||
**MIT License** |
|||
|
|||
MIT License |
|||
|
|||
Copyright (c) 2021 WangJunZzz |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
|||
@ -0,0 +1,43 @@ |
|||
# 发行说明 |
|||
|
|||
## 5.3.2.4 |
|||
|
|||
**Bug** |
|||
|
|||
* 升级Vben2.8,组织机构编辑错误 #62 |
|||
|
|||
## 5.3.2.3 |
|||
|
|||
**功能** |
|||
|
|||
* 权限菜单级联操作 #48 |
|||
|
|||
**Bug** |
|||
|
|||
* 统一参数返回值过滤器,空指针异常 #61 |
|||
|
|||
## 5.3.2.2 |
|||
|
|||
**功能** |
|||
|
|||
* 启用GlobalUsing功能 #56 |
|||
* 采用Directory.Build.targets管理 nuget包 #55 |
|||
|
|||
|
|||
**Bug** |
|||
|
|||
* Vben 分页组件总条数显示异常 #59 |
|||
|
|||
## 5.3.2.1 |
|||
|
|||
**功能** |
|||
|
|||
* 调整NotificationManagement聚合设计 #51 |
|||
* 调整NotificationManagement,Redis配置 #50 |
|||
* 升级Abp5.3.2 |
|||
|
|||
|
|||
**Bug** |
|||
|
|||
* 多个hangfire定时任务,只执行单个问题 #54 |
|||
* vue客户端先启动,SignalR不尝试重连 #49 |
|||
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 76 KiB |
@ -0,0 +1,45 @@ |
|||
Title: Abp Vnext Pro |
|||
# Abp Vnext Pro |
|||
|
|||
<img width="140" align="right" src="/img/logo.svg"> |
|||
[](https://github.com/WangJunZzz/abp-vnext-pro/blob/main/LICENSE) |
|||
|
|||
|
|||
## 介绍 |
|||
|
|||
- 完全免费开源 |
|||
- ABP vNext的前身是asp.net boilerplate(老版abp),它不是一个简单的版本更新,而是完全基于.NET Core的重写。 |
|||
- ABP vNext 社区版的UI不使用于实际项目开发。为此,结合Vben Admin 打造开箱即用的ABP vNext Pro。 |
|||
|
|||
|
|||
## 系统功能 |
|||
|
|||
- [x] 用户管理 |
|||
- [x] 角色管理 |
|||
- [x] 审计日志 |
|||
- [x] 后台任务 |
|||
- [x] 集成事件 |
|||
- [ ] IdentityServer4 |
|||
* [x] 客户端管理 |
|||
* [x] Api 资源管理 |
|||
* [x] ApiScope 管理 |
|||
* [x] Identity 资源管理 |
|||
- [x] SinglaR 消息通知(站内信) |
|||
- [x] 多语言 |
|||
- [x] 数据字典 |
|||
- [x] 容器化部署 |
|||
- [x] 单元测试 |
|||
- [x] ES 日志 |
|||
- [x] Setting 管理 |
|||
- [x] 多租户 |
|||
- [x] 文件管理 |
|||
|
|||
## 演示 |
|||
- [演示地址](http://120.24.194.14:8012/) |
|||
|
|||
 |
|||
 |
|||
 |
|||
 |
|||
 |
|||
 |
|||
@ -0,0 +1,183 @@ |
|||
# Docker部署 |
|||
## Lion.AbpPro.HttpApi.Host |
|||
|
|||
- 在Lion.AbpPro.HttpApi.Host目录下执行 |
|||
|
|||
```bash |
|||
dotnet public -o publish |
|||
``` |
|||
|
|||
- 生成 Docker 镜像 |
|||
|
|||
```bash |
|||
docker build -t Lion.AbpPro.HttpApi.Host . |
|||
``` |
|||
|
|||
- 运行容器 |
|||
|
|||
```bash |
|||
docker run -itd --name Lion.AbpPro.HttpApi.Host -p 8011:80 Lion.AbpPro.HttpApi.Host |
|||
``` |
|||
|
|||
- Dockerfile 文件 |
|||
|
|||
```yml |
|||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 |
|||
|
|||
# 创建目录 |
|||
RUN mkdir /app |
|||
|
|||
COPY publish /app |
|||
|
|||
RUN echo "deb http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" > /etc/apt/sources.list && \ |
|||
echo "deb-src http://mirrors.aliyun.com/debian/ bullseye main non-free contrib" >> /etc/apt/sources.list && \ |
|||
echo "deb http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ |
|||
echo "deb-src http://mirrors.aliyun.com/debian-security/ bullseye-security main" >> /etc/apt/sources.list && \ |
|||
echo "deb http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ |
|||
echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-updates main non-free contrib" >> /etc/apt/sources.list && \ |
|||
echo "deb http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ |
|||
echo "deb-src http://mirrors.aliyun.com/debian/ bullseye-backports main non-free contrib" >> /etc/apt/sources.list && \ |
|||
apt-get update && \ |
|||
apt-get install libgdiplus libc6-dev -y && \ |
|||
ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll && \ |
|||
ln -s /usr/lib/x86_64-linux-gnu/libdl.so /usr/lib/libdl.dll && apt-get clean |
|||
|
|||
# 设置工作目录 |
|||
WORKDIR /app |
|||
|
|||
# 暴露80端口 |
|||
EXPOSE 80 |
|||
# 设置时区 .net6 才有这个问题 |
|||
ENV TZ=Asia/Shanghai |
|||
|
|||
# 设置环境变量 |
|||
ENV ASPNETCORE_ENVIRONMENT=Production |
|||
|
|||
ENTRYPOINT ["dotnet", "Lion.AbpPro.HttpApi.Host.dll"] |
|||
|
|||
``` |
|||
|
|||
## Lion.AbpPro.IdentityServer |
|||
|
|||
- 在Lion.AbpPro.IdentityServer目录下执行 |
|||
|
|||
```bash |
|||
dotnet public -o publish |
|||
``` |
|||
|
|||
- 生成 Docker 镜像 |
|||
|
|||
```bash |
|||
docker build -t Lion.AbpPro.IdentityServer . |
|||
``` |
|||
|
|||
- 运行容器 |
|||
|
|||
```bash |
|||
docker run -itd --name Lion.AbpPro.IdentityServer -p 8013:80 Lion.AbpPro.IdentityServer |
|||
``` |
|||
|
|||
- Dockerfile 文件 |
|||
|
|||
```yml |
|||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 |
|||
|
|||
# 创建目录 |
|||
RUN mkdir /app |
|||
|
|||
COPY publish /app |
|||
|
|||
# 设置工作目录 |
|||
WORKDIR /app |
|||
|
|||
# 暴露80端口 |
|||
EXPOSE 80 |
|||
|
|||
# 设置时区 .net6 才有这个问题 |
|||
ENV TZ=Asia/Shanghai |
|||
|
|||
# 设置环境变量 |
|||
ENV ASPNETCORE_ENVIRONMENT=Production |
|||
|
|||
ENTRYPOINT ["dotnet", "Lion.AbpPro.IdentityServer.dll"] |
|||
|
|||
``` |
|||
|
|||
|
|||
## Lion.AbpPro.WebGateway |
|||
|
|||
- 在Lion.AbpPro.WebGateway目录下执行 |
|||
|
|||
```bash |
|||
dotnet public -o publish |
|||
``` |
|||
|
|||
- 生成 Docker 镜像 |
|||
|
|||
```bash |
|||
docker build -t Lion.AbpPro.WebGateway . |
|||
``` |
|||
|
|||
- 运行容器 |
|||
|
|||
```bash |
|||
docker run -itd --name Lion.AbpPro.WebGateway -p 8013:80 Lion.AbpPro.WebGateway |
|||
``` |
|||
|
|||
- Dockerfile 文件 |
|||
|
|||
```yml |
|||
FROM mcr.microsoft.com/dotnet/aspnet:6.0 |
|||
|
|||
# 创建目录 |
|||
RUN mkdir /app |
|||
|
|||
COPY publish /app |
|||
|
|||
# 设置工作目录 |
|||
WORKDIR /app |
|||
|
|||
# 暴露80端口 |
|||
EXPOSE 80 |
|||
|
|||
# 设置时区 .net6 才有这个问题 |
|||
ENV TZ=Asia/Shanghai |
|||
|
|||
# 设置环境变量 |
|||
ENV ASPNETCORE_ENVIRONMENT=Production |
|||
|
|||
ENTRYPOINT ["dotnet", "Lion.AbpPro.WebGateway.dll"] |
|||
``` |
|||
|
|||
|
|||
## Vue3 |
|||
- 修改env.production 接口地址为以上你发布的地址 |
|||
- 打包项目 |
|||
|
|||
```bash |
|||
npm run build |
|||
``` |
|||
|
|||
- 生产Docker镜像 |
|||
|
|||
```bash |
|||
docker build -t Lion.AbpPro.Vue3 . |
|||
``` |
|||
|
|||
- 运行容器 |
|||
|
|||
```bash |
|||
docker run -itd --name Lion.AbpPro.Vue3 -p 8012:80 Lion.AbpPro.Vue3 |
|||
``` |
|||
|
|||
- Dockerfile 文件 |
|||
|
|||
```yml |
|||
FROM nginx:1.17.3-alpine as base |
|||
EXPOSE 80 |
|||
COPY /_nginx/nginx.conf /etc/nginx/nginx.conf |
|||
COPY /_nginx/env.js /etc/nginx/env.js |
|||
COPY /_nginx/default.conf /etc/nginx/conf.d/default.conf |
|||
COPY /dist/ /usr/share/nginx/html |
|||
CMD ["nginx", "-g", "daemon off;"] |
|||
``` |
|||
@ -0,0 +1,225 @@ |
|||
# Github自动化部署 |
|||
|
|||
|
|||
## 添加部署 yaml |
|||
|
|||
- 在项目根目录下添加 .github/workflow/ |
|||
|
|||
### 后端项目 |
|||
|
|||
```yaml |
|||
name: 后端部署(API,IdentityServer4,Gateways) # 指定名称 |
|||
on: |
|||
push: |
|||
branches: |
|||
- main # 代码推送到main分支的时候触发jobs |
|||
|
|||
jobs: |
|||
build: |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- uses: actions/checkout@v2 |
|||
- name: Install Dotnet 6.x |
|||
uses: actions/setup-dotnet@v1 |
|||
with: |
|||
dotnet-version: "6.0" # 安装Dotnet 环境 |
|||
include-prerelease: True |
|||
- name: 编译 |
|||
run: dotnet build aspnet-core/Lion.AbpPro.sln # 编译项目 |
|||
|
|||
- name: 单元测试 |
|||
run: dotnet test aspnet-core/services/test/Lion.AbpPro.Domain.Tests/Lion.AbpPro.Domain.Tests.csproj # 运行单元测试 |
|||
|
|||
- name: 发布->Lion.AbpPro.HttpApi.Host |
|||
run: dotnet publish aspnet-core/services/host/Lion.AbpPro.HttpApi.Host/Lion.AbpPro.HttpApi.Host.csproj -o Lion.AbpPro.HttpApi.Host # 发布Host项目 |
|||
|
|||
- name: 发布->Lion.AbpPro.IdentityServer |
|||
run: dotnet publish aspnet-core/services/host/Lion.AbpPro.IdentityServer/Lion.AbpPro.IdentityServer.csproj -o Lion.AbpPro.IdentityServer # 发布IdentityServer项目 |
|||
|
|||
- name: 发布->Lion.AbpPro.IdentityServer |
|||
run: dotnet publish aspnet-core/gateways/Lion.AbpPro.WebGateway/Lion.AbpPro.WebGateway.csproj -o Lion.AbpPro.WebGateway # 发布网关项目 |
|||
|
|||
- name: 部署->Lion.AbpPro.HttpApi.Host |
|||
uses: easingthemes/ssh-deploy@v2.2.11 |
|||
env: |
|||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} # 服务器生成的ssh key 在github 下添加secret |
|||
ARGS: "-avzr --delete --exclude 'appsettings.json'" # 把发布好的项目复制到服务器,并且删除服务器上的/root/wwwroot/Lion.AbpPro.HttpApi.Host下的文件但是不包括appsettings.json |
|||
SOURCE: "Lion.AbpPro.HttpApi.Host" # 对应上面发布好的目录 |
|||
REMOTE_HOST: ${{ secrets.REMOTE_HOST }} # 服务器公网ip地址 |
|||
REMOTE_USER: ${{ secrets.REMOTE_USER }} # 用户名 |
|||
TARGET: "/root/wwwroot" # 发布到服务器指定目录 |
|||
|
|||
- name: 部署->Lion.AbpPro.IdentityServer |
|||
uses: easingthemes/ssh-deploy@v2.2.11 |
|||
env: |
|||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} |
|||
ARGS: "-avzr --delete --exclude 'appsettings.json'" |
|||
SOURCE: "Lion.AbpPro.IdentityServer" |
|||
REMOTE_HOST: ${{ secrets.REMOTE_HOST }} |
|||
REMOTE_USER: ${{ secrets.REMOTE_USER }} |
|||
TARGET: "/root/wwwroot" |
|||
|
|||
- name: 部署->Lion.AbpPro.WebGateway |
|||
uses: easingthemes/ssh-deploy@v2.2.11 |
|||
env: |
|||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} |
|||
ARGS: "-avzr --delete --exclude 'appsettings.json'" |
|||
SOURCE: "Lion.AbpPro.WebGateway" |
|||
REMOTE_HOST: ${{ secrets.REMOTE_HOST }} |
|||
REMOTE_USER: ${{ secrets.REMOTE_USER }} |
|||
TARGET: "/root/wwwroot" |
|||
``` |
|||
|
|||
## 安装 supervisor |
|||
|
|||
```bash |
|||
yum install -y supervisor |
|||
systemctl start supervisord |
|||
systemctl enable supervisord # 设置为开机启动 |
|||
``` |
|||
|
|||
- 默认配置目录在 /etc/supervisord.d |
|||
|
|||
```bash |
|||
yum install -y supervisor |
|||
systemctl start supervisord |
|||
systemctl enable supervisord # 设置为开机启动 |
|||
``` |
|||
|
|||
- 开启 web 管理界面 |
|||
|
|||
```bash |
|||
# vi vi /etc/supervisord.conf |
|||
[inet_http_server] ; inet (TCP) server disabled by default |
|||
port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface) |
|||
username=admin ; # 管理web端登录用户名 |
|||
password=1q2w3E*. ; # 管理web端登录密码 |
|||
``` |
|||
|
|||
- 查看是否能访问 http://ip:9001 |
|||
 |
|||
|
|||
- 添加 Lion.AbpPro.HttpApi.Host.ini |
|||
|
|||
```bash |
|||
[program:Lion.AbpPro.HttpApi.Host] |
|||
command=/bin/bash -c "dotnet Lion.AbpPro.HttpApi.Host.dll --urls=http://*:8011" |
|||
directory=/root/wwwroot/Lion.AbpPro.HttpApi.Host |
|||
autostart=true |
|||
autorestart=true |
|||
stderr_logfile=/root/wwwroot/Lion.AbpPro.HttpApi.Host/err.log |
|||
stdout_logfile=/root/wwwroot/Lion.AbpPro.HttpApi.Host/out.log |
|||
user=root |
|||
``` |
|||
|
|||
- 添加 Lion.AbpPro.IdentityServer.ini |
|||
|
|||
```bash |
|||
[program:Lion.AbpPro.IdentityServer] |
|||
command=/bin/bash -c "dotnet Lion.AbpPro.IdentityServer.dll --urls=http://*:8013" |
|||
directory=/root/wwwroot/Lion.AbpPro.IdentityServer |
|||
autostart=true |
|||
autorestart=true |
|||
stderr_logfile=/root/wwwroot/Lion.AbpPro.IdentityServer/err.log |
|||
stdout_logfile=/root/wwwroot/Lion.AbpPro.IdentityServer/out.log |
|||
user=root |
|||
|
|||
``` |
|||
|
|||
- 添加 Lion.AbpPro.WebGateway.ini |
|||
|
|||
```bash |
|||
[program:Lion.AbpPro.WebGateway] |
|||
command=/bin/bash -c "dotnet Lion.AbpPro.WebGateway.dll --urls=http://*:8014" |
|||
directory=/root/wwwroot/Lion.AbpPro.WebGateway |
|||
autostart=true |
|||
autorestart=true |
|||
stderr_logfile=/root/wwwroot/Lion.AbpPro.WebGateway/err.log |
|||
stdout_logfile=/root/wwwroot/Lion.AbpPro.WebGateway/out.log |
|||
user=root |
|||
|
|||
``` |
|||
|
|||
- 重新加载配置 supervisorctl reload |
|||
|
|||
## 前端配置 |
|||
|
|||
- 安装 Nginx |
|||
|
|||
```bash |
|||
sudo yum install -y nginx |
|||
systemctl start nginx # 启动 Nginx |
|||
systemctl enable nginx # 启用开机启动 Nginx |
|||
``` |
|||
|
|||
- 访问 http://ip:80 |
|||
 |
|||
|
|||
-- 配置 Yml |
|||
|
|||
```yaml |
|||
name: 前端部署(vue) |
|||
on: |
|||
push: |
|||
branches: |
|||
- main |
|||
|
|||
jobs: |
|||
build: |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Checkout |
|||
uses: actions/checkout@v2.3.1 |
|||
with: |
|||
persist-credentials: false |
|||
|
|||
- name: 编译|发布 |
|||
run: | |
|||
cd vben271 |
|||
yarn |
|||
npm run build |
|||
|
|||
- name: 部署->Vue |
|||
uses: easingthemes/ssh-deploy@v2.2.11 |
|||
env: |
|||
SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }} |
|||
ARGS: "-avzr --delete" |
|||
SOURCE: "vben271/dist" |
|||
REMOTE_HOST: ${{ secrets.REMOTE_HOST }} |
|||
REMOTE_USER: ${{ secrets.REMOTE_USER }} |
|||
TARGET: "/root/wwwroot" |
|||
``` |
|||
|
|||
- 配置 Nginx |
|||
|
|||
```bash |
|||
|
|||
# vi /etc/nginx/nginx.conf |
|||
server { |
|||
listen 8012; |
|||
listen [::]:8012; |
|||
server_name _; |
|||
root /root/wwwroot/dist; |
|||
|
|||
# Load configuration files for the default server block. |
|||
include /etc/nginx/default.d/*.conf; |
|||
|
|||
#vue-router配置 解决刷新浏览器 404问题 |
|||
location / { |
|||
try_files $uri $uri/ @router; |
|||
index index.html; |
|||
} |
|||
location @router { |
|||
rewrite ^.*$ /index.html last; |
|||
} |
|||
|
|||
error_page 404 /404.html; |
|||
location = /404.html { |
|||
} |
|||
|
|||
error_page 500 502 503 504 /50x.html; |
|||
location = /50x.html { |
|||
} |
|||
} |
|||
|
|||
``` |
|||
@ -0,0 +1,38 @@ |
|||
## 配置 |
|||
|
|||
```csharp |
|||
/// <summary> |
|||
/// 配置Magicodes.IE 导入导出 |
|||
/// </summary> |
|||
private void ConfigureMagicodes(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.AddTransient<IExporter, ExcelExporter>(); |
|||
context.Services.AddTransient<IExcelExporter, ExcelExporter>(); |
|||
} |
|||
``` |
|||
|
|||
## 示例 |
|||
|
|||
```csharp |
|||
/// <summary> |
|||
/// 用户导出列表 |
|||
/// </summary> |
|||
/// <returns></returns> |
|||
[Authorize(AbpProPermissions.SystemManagement.UserExport)] |
|||
public async Task<ActionResult> ExportAsync(PagingUserListInput input) |
|||
{ |
|||
var request = new GetIdentityUsersInput |
|||
{ |
|||
Filter = input.Filter?.Trim(), |
|||
MaxResultCount = input.PageSize, |
|||
SkipCount = input.SkipCount, |
|||
Sorting = " LastModificationTime desc" |
|||
}; |
|||
List<Volo.Abp.Identity.IdentityUser> source = await _identityUserRepository |
|||
.GetListAsync(request.Sorting, request.MaxResultCount, request.SkipCount, request.Filter); |
|||
var result = ObjectMapper.Map<List<Volo.Abp.Identity.IdentityUser>, List<ExportIdentityUserOutput>>(source); |
|||
var bytes = await _excelExporter.ExportAsByteArray<ExportIdentityUserOutput>(result); |
|||
return new XlsxFileResult(bytes: bytes, fileDownloadName: $"用户导出列表{DateTime.Now:yyyyMMdd}"); |
|||
} |
|||
|
|||
``` |
|||
@ -0,0 +1,201 @@ |
|||
# 统一返回值格式 |
|||
|
|||
- 在使用 abp 的过程中,如果提供给第三方接口要实现返回值统一需要怎么做? |
|||
|
|||
```csharp |
|||
{ |
|||
// 返回格式类似这种 |
|||
"success": false, |
|||
"message": "请求失败", |
|||
"data": null, |
|||
"code": 500 |
|||
} |
|||
``` |
|||
|
|||
- 定义返回类型 |
|||
|
|||
```csharp |
|||
public class WrapResult<T> |
|||
{ |
|||
public bool Success { get; private set; } |
|||
|
|||
public string Message { get; private set; } |
|||
|
|||
public T Data { get; private set; } |
|||
|
|||
public int Code { get; private set; } |
|||
|
|||
public WrapResult() |
|||
{ |
|||
Success = true; |
|||
Message = "Success"; |
|||
Data = default; |
|||
Code = 200; |
|||
} |
|||
|
|||
public void SetSuccess(T data, string message = "Success", int code = 200) |
|||
{ |
|||
Success = true; |
|||
Data = data; |
|||
Code = code; |
|||
} |
|||
|
|||
public void SetFail(string message = "Fail", int code = 500) |
|||
{ |
|||
Success = false; |
|||
Message = message; |
|||
Code = code; |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## 实现思路 |
|||
|
|||
- 定义 DontWrapResultAttribute |
|||
|
|||
```csharp |
|||
public class DontWrapResultAttribute : Attribute |
|||
{ |
|||
} |
|||
``` |
|||
|
|||
- 实现 IAsyncExceptionFilter(拦截异常,抛异常时指定返回格式) |
|||
|
|||
```csharp |
|||
public sealed class ResultExceptionFilter : IAsyncExceptionFilter, ITransientDependency |
|||
{ |
|||
public async Task OnExceptionAsync(ExceptionContext context) |
|||
{ |
|||
if (!ShouldHandleException(context)) |
|||
{ |
|||
return; |
|||
} |
|||
|
|||
await HandleAndWrapException(context); |
|||
} |
|||
|
|||
private bool ShouldHandleException(ExceptionContext context) |
|||
{ |
|||
if (context.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.GetCustomAttributes(typeof(DontWrapResultAttribute), true).Any()) |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
if (context.ActionDescriptor.GetMethodInfo().GetCustomAttributes(typeof(DontWrapResultAttribute), true).Any()) |
|||
{ |
|||
return true; |
|||
} |
|||
|
|||
return false; |
|||
} |
|||
|
|||
private async Task HandleAndWrapException(ExceptionContext context) |
|||
{ |
|||
var exceptionHandlingOptions = context.GetRequiredService<IOptions<AbpExceptionHandlingOptions>>().Value; |
|||
var exceptionToErrorInfoConverter = context.GetRequiredService<IExceptionToErrorInfoConverter>(); |
|||
var remoteServiceErrorInfo = exceptionToErrorInfoConverter.Convert(context.Exception, options => |
|||
{ |
|||
options.SendExceptionsDetailsToClients = exceptionHandlingOptions.SendExceptionsDetailsToClients; |
|||
options.SendStackTraceToClients = exceptionHandlingOptions.SendStackTraceToClients; |
|||
}); |
|||
|
|||
var logLevel = context.Exception.GetLogLevel(); |
|||
|
|||
var remoteServiceErrorInfoBuilder = new StringBuilder(); |
|||
remoteServiceErrorInfoBuilder.AppendLine($"---------- {nameof(RemoteServiceErrorInfo)} ----------"); |
|||
remoteServiceErrorInfoBuilder.AppendLine(context.GetRequiredService<IJsonSerializer>().Serialize(remoteServiceErrorInfo, indented: true)); |
|||
|
|||
var logger = context.GetService<ILogger<ResultExceptionFilter>>(NullLogger<ResultExceptionFilter>.Instance); |
|||
|
|||
logger.LogWithLevel(logLevel, remoteServiceErrorInfoBuilder.ToString()); |
|||
|
|||
logger.LogException(context.Exception, logLevel); |
|||
|
|||
await context.GetRequiredService<IExceptionNotifier>().NotifyAsync(new ExceptionNotificationContext(context.Exception)); |
|||
context.HttpContext.Response.StatusCode = 200; |
|||
var result = SimplifyMessage(context); |
|||
context.Result = new ObjectResult(result); |
|||
context.Exception = null; //Handled! |
|||
} |
|||
|
|||
private WrapResult<object> SimplifyMessage(ExceptionContext context) |
|||
{ |
|||
var result = new WrapResult<object>(); |
|||
var localizer = context.GetService<IStringLocalizer<AbpProResource>>(); |
|||
switch (context.Exception) |
|||
{ |
|||
case AbpAuthorizationException: |
|||
result.SetFail("权限不足", 401); |
|||
break; |
|||
case AbpValidationException: |
|||
result.SetFail("请求参数验证失败", 400); |
|||
break; |
|||
case EntityNotFoundException: |
|||
result.SetFail("实体不存在", 506); |
|||
break; |
|||
case NotImplementedException: |
|||
result.SetFail("未实现功能", 507); |
|||
break; |
|||
default: |
|||
{ |
|||
if (context.Exception is IHasErrorCode codeException) |
|||
{ |
|||
result.SetFail(localizer[codeException.Code]); |
|||
foreach (var key in context.Exception.Data.Keys) |
|||
{ |
|||
result.SetFail(result.Message.Replace("{" + key + "}", context.Exception.Data[key]?.ToString())); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
result.SetFail(context.Exception.Message); |
|||
} |
|||
|
|||
break; |
|||
} |
|||
} |
|||
|
|||
return result; |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## 注册 Filter |
|||
|
|||
```csharp |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
context.Services.AddMvc(options => |
|||
{ |
|||
options.Filters.Add(typeof(ResultExceptionFilter)); |
|||
}); |
|||
} |
|||
``` |
|||
|
|||
## 使用 |
|||
|
|||
- 在 Controller 上或者 Action 上打上 DontWrapResultAttribute 特性 |
|||
- 例如 |
|||
|
|||
```csharp |
|||
[Route("Permissions")] |
|||
[DontWrapResult] |
|||
public class PermissionController : AbpProController,IRolePermissionAppService |
|||
{ |
|||
private readonly IRolePermissionAppService _rolePermissionAppService; |
|||
|
|||
public PermissionController(IRolePermissionAppService rolePermissionAppService) |
|||
{ |
|||
_rolePermissionAppService = rolePermissionAppService; |
|||
} |
|||
|
|||
[HttpPost("tree")] |
|||
[SwaggerOperation(summary: "获取角色权限", Tags = new[] { "Permissions" })] |
|||
[WrapResult] //控制器上打了 action上就不需要 |
|||
public Task<PermissionOutput> GetPermissionAsync(GetPermissionInput input) |
|||
{ |
|||
return _rolePermissionAppService.GetPermissionAsync(input); |
|||
} |
|||
|
|||
} |
|||
``` |
|||
@ -0,0 +1,21 @@ |
|||
# 贡献 |
|||
|
|||
贡献最简单的方式之一就是参与讨论和issue讨论。 |
|||
|
|||
如果您有任何疑问或问题,请在Lion.AbpPro仓库中报告: |
|||
|
|||
[提交Issue](https://github.com/WangJunZzz/abp-vnext-pro/issues) |
|||
|
|||
|
|||
## 提交更改 |
|||
|
|||
您还可以通过提交代码更改PR来做出贡献。 |
|||
|
|||
> |
|||
Pull requests 可让您告诉其他人已推送到GitHub上存储库的更改。 打开 Pull requests 后,您可以与协作者讨论和审查做出的更改,并在更改合并到存储库之前添加后续提交。 |
|||
|
|||
## 其他资源 |
|||
|
|||
* [issue 和 pull requests](https://help.github.com/articles/filtering-issues-and-pull-requests/) |
|||
|
|||
* [使用搜索过滤 issue 和 pull requests](https://help.github.com/articles/using-search-to-filter-issues-and-pull-requests/) |
|||
@ -0,0 +1,91 @@ |
|||
# 介绍 |
|||
|
|||
Lion.AbpPro 是Abp Vnext 的Vue3版本实现,同时也是免费开源。它有助于提高开发效率,属于开箱即用的后台管理系统,也能适用微服务。 |
|||
|
|||
## 后端项目结构 |
|||
```bash |
|||
├── Directory.Build.props nuget 版本控制 |
|||
├── frameworks # 公共模块 |
|||
│ ├── CAP # dotnetcore.cap |
|||
│ └── Extensions # 自定义扩展 |
|||
├── gateways # 网关 |
|||
│ └── Lion.AbpPro.WebGateway # 基于ocelot网关 |
|||
├── modules # 模块 |
|||
│ ├── DataDictionaryManagement # 数据字典 |
|||
│ ├── FileManagement # 基于阿里云的文件服务 |
|||
│ └── NotificationManagement # 通知服务 |
|||
├── services # 公共静态资源目录 |
|||
│ ├── host # 启动模块 |
|||
│ ├── CompanyName.ProjectName.HttpApi.Host # admin ui host |
|||
│ └── CompanyName.ProjectName.IdentityServer # IdentityServer host |
|||
│ ├── src # 源码 |
|||
│ └── CompanyName.ProjectName.DbMigrator # 迁移控制台程序 |
|||
│ └── test # 单元测试 |
|||
├── shared # 公共Host |
|||
│ ├── Lion.AbpPro.Shared.Hosting.Gateways # 网关host模块 |
|||
│ └── Lion.AbpPro.Shared.Hosting.Microservices # 服务host模块 |
|||
``` |
|||
|
|||
## 前端项目结构 |
|||
```bash |
|||
├── _nginx # docker 打包 |
|||
├── build # 打包脚本相关 |
|||
│ ├── config # 配置文件 |
|||
│ ├── generate # 生成器 |
|||
│ ├── script # 脚本 |
|||
│ └── vite # vite配置 |
|||
├── mock # mock文件夹 |
|||
├── public # 公共静态资源目录 |
|||
├── src # 主目录 |
|||
│ ├── api # 接口文件 |
|||
│ ├── assets # 资源文件 |
|||
│ │ ├── icons # icon sprite 图标文件夹 |
|||
│ │ ├── images # 项目存放图片的文件夹 |
|||
│ │ └── svg # 项目存放svg图片的文件夹 |
|||
│ ├── components # 公共组件 |
|||
│ ├── design # 样式文件 |
|||
│ ├── directives # 指令 |
|||
│ ├── enums # 枚举/常量 |
|||
│ ├── hooks # hook |
|||
│ │ ├── component # 组件相关hook |
|||
│ │ ├── core # 基础hook |
|||
│ │ ├── event # 事件相关hook |
|||
│ │ ├── setting # 配置相关hook |
|||
│ │ └── web # web相关hook |
|||
│ ├── layouts # 布局文件 |
|||
│ │ ├── default # 默认布局 |
|||
│ │ ├── iframe # iframe布局 |
|||
│ │ └── page # 页面布局 |
|||
│ ├── locales # 多语言 |
|||
│ ├── logics # 逻辑 |
|||
│ ├── main.ts # 主入口 |
|||
│ ├── router # 路由配置 |
|||
│ ├── services # Nswag生成的代理 |
|||
│ │ ├── ServiceProxies.ts # Nswag生成的代理 |
|||
│ │ ├── ServiceProxyBase.ts # Nswag生成的代理拦截器 |
|||
│ ├── settings # 项目配置 |
|||
│ │ ├── componentSetting.ts # 组件配置 |
|||
│ │ ├── designSetting.ts # 样式配置 |
|||
│ │ ├── encryptionSetting.ts # 加密配置 |
|||
│ │ ├── localeSetting.ts # 多语言配置 |
|||
│ │ ├── projectSetting.ts # 项目配置 |
|||
│ │ └── siteSetting.ts # 站点配置 |
|||
│ ├── store # 数据仓库 |
|||
│ ├── utils # 工具类 |
|||
│ └── views # 页面 |
|||
├── test # 测试 |
|||
│ └── server # 测试用到的服务 |
|||
│ ├── api # 测试服务器 |
|||
│ ├── upload # 测试上传服务器 |
|||
│ └── websocket # 测试ws服务器 |
|||
├── types # 类型文件 |
|||
├── vite.config.ts # vite配置文件 |
|||
└── windi.config.ts # windcss配置文件 |
|||
``` |
|||
## 相关视频 |
|||
|
|||
待完善 |
|||
|
|||
## 相关文章 |
|||
|
|||
待完善 |
|||
@ -0,0 +1,72 @@ |
|||
# 快速开始 |
|||
|
|||
## 先决条件 |
|||
- [dotnet core 6.0.202](https://dotnet.microsoft.com/en-us/download/dotnet/6.0) |
|||
- [nodejs 16+](https://nodejs.org/zh-cn/) |
|||
- [pnpm](https://www.pnpm.cn/installation) |
|||
- [mysql](https://dev.mysql.com/downloads/installer/) |
|||
- [redis](https://redis.io/docs/getting-started/installation/) |
|||
- [rabbitmq 可选](https://www.rabbitmq.com/download.html) |
|||
|
|||
!!! info "Docker一键安装Mysql|Redis|Rabbitmq" |
|||
|
|||
快速搭建必要环境,下载 [docker-compose.yaml](docker-compose.yaml) , 执行: docker-compose up -d |
|||
|
|||
|
|||
## 创建新项目 |
|||
|
|||
### 直接Clone |
|||
|
|||
``` bash |
|||
git clone https://github.com/WangJunZzz/abp-vnext-pro.git |
|||
``` |
|||
|
|||
或者 |
|||
|
|||
### GUI创建项目 |
|||
 |
|||
|
|||
### 后端 |
|||
- 修改 HttpApi.Host-> appsettings.json 配置 |
|||
- Mysql 连接字符串 |
|||
- Redis 连接字符串 |
|||
- RabbitMq(如果不需要启用设置为 false) |
|||
- Es 地址即可(如果没有 es 也可以运行,只是前端 es 日志页面无法使用而已,不影响后端项目启动) |
|||
- 修改 IdentityServer-> appsettings.json 数据库连接字符串 |
|||
- 修改 DbMigrator-> appsettings.json 数据库连接字符串 |
|||
- 右键单击.DbMigrator项目,设置为启动项目运行,按F5(或Ctrl + F5) 运行应用程序. 它将具有如下所示的输出: |
|||
 |
|||
|
|||
!!! note 种子数据 |
|||
|
|||
初始的种子数据在数据库中创建了 admin 用户(密码为1q2w3E*) 用于登录应用程序. 所以, 对于新数据库至少使用 .DbMigrator 一次. |
|||
|
|||
|
|||
!!! note Ocelot网关 |
|||
|
|||
如果不需要使用Ocelot网关可以移除Lion.AbpPro.WebGateway项目,前端接口地址直接修改为Lion.AbpPro.HttpApi.Host的接口地址。 |
|||
|
|||
!!! note IdentityServer4 |
|||
|
|||
如果不需要使用IdentityServer4可以移除Lion.AbpPro.IdentityServer项目,请参考如何如何移除IdentityServer4 |
|||
|
|||
- 多项目启动(HttpApi.Host,IdentityServer,WebGateway),就能看到后台服务登陆页面,如下: |
|||
 |
|||
|
|||
|
|||
|
|||
|
|||
## 前端 |
|||
- [Vben Admin 文档](https://vvbin.cn/doc-next/) |
|||
|
|||
### 安装npm包 |
|||
|
|||
```bash |
|||
pnmp install |
|||
``` |
|||
|
|||
### 启动项目 |
|||
|
|||
```bash |
|||
npm run dev |
|||
``` |
|||
@ -0,0 +1,166 @@ |
|||
# 配置 |
|||
|
|||
## 日志 |
|||
|
|||
### 日志级别 |
|||
|
|||
!!! info "Debug --> Information --> Warning --> Error --> Fatal" |
|||
|
|||
```json |
|||
"Serilog": { |
|||
"Using": [ |
|||
"Serilog.Sinks.Console", |
|||
"Serilog.Sinks.File" |
|||
], |
|||
"MinimumLevel": { |
|||
// 默认全局日志级别 |
|||
"Default": "Information", |
|||
"Override": { |
|||
//名称空间为 Microsoft 日志级别 |
|||
"Microsoft": "Information", |
|||
//名称空间为 Volo.Abp 日志级别 |
|||
"Volo.Abp": "Information", |
|||
//名称空间为 Hangfire 日志级别 |
|||
"Hangfire": "Information", |
|||
//名称空间为 DotNetCore.CAP 日志级别 |
|||
"DotNetCore.CAP": "Information", |
|||
//名称空间为 Serilog.AspNetCore 日志级别 |
|||
"Serilog.AspNetCore": "Information", |
|||
//名称空间为 Microsoft.EntityFrameworkCore 日志级别 |
|||
"Microsoft.EntityFrameworkCore": "Warning", |
|||
//名称空间为 Microsoft.AspNetCore 日志级别 |
|||
"Microsoft.AspNetCore": "Information" |
|||
} |
|||
}, |
|||
"WriteTo": [ |
|||
{ |
|||
// 输出到控制台日志 |
|||
"Name": "Console" |
|||
}, |
|||
{ |
|||
// 输出到文件 |
|||
"Name": "File", |
|||
"Args": { |
|||
"path": "logs/logs-.txt", |
|||
// 按天输出 |
|||
"rollingInterval": "Day" |
|||
} |
|||
} |
|||
] |
|||
} |
|||
``` |
|||
|
|||
### 写入ES |
|||
!!! WARNING "先决条件:搭建好ES环境" |
|||
- Enabled:是否启用 |
|||
- Url:es地址 |
|||
- IndexFormat:es索引 |
|||
- UserName:用户名 |
|||
- Password:密码 |
|||
- SearchIndexFormat:es日志查询索引模式 |
|||
|
|||
```json |
|||
"ElasticSearch": { |
|||
"Enabled": "false", |
|||
"Url": "http://es.cn", |
|||
"IndexFormat": "Lion.AbpPro.development.{0:yyyy.MM.dd}", |
|||
"UserName": "elastic", |
|||
"Password": "aVVhjQ95RP7nbwNy", |
|||
"SearchIndexFormat": "Lion.AbpPro.development*" |
|||
}, |
|||
``` |
|||
|
|||
- 查看Lion.AbpPro.HttpApi.Host.Program.cs |
|||
|
|||
```csharp |
|||
public class Program |
|||
{ |
|||
public static void Main(string[] args) |
|||
{ |
|||
CreateHostBuilder(args).Build().Run(); |
|||
|
|||
} |
|||
private static IHostBuilder CreateHostBuilder(string[] args) => |
|||
Host.CreateDefaultBuilder(args) |
|||
.ConfigureWebHostDefaults(webBuilder => |
|||
{ |
|||
webBuilder.ConfigureKestrel((context, options) => { options.Limits.MaxRequestBodySize = 1024 * 50; }); |
|||
webBuilder.UseStartup<Startup>(); |
|||
}) |
|||
.UseSerilog((context, loggerConfiguration) => |
|||
{ |
|||
// 配置ES日志 |
|||
SerilogToEsExtensions.SetSerilogConfiguration( |
|||
loggerConfiguration, |
|||
context.Configuration); |
|||
}).UseAutofac(); |
|||
} |
|||
``` |
|||
|
|||
|
|||
## 跨域(CORS) |
|||
|
|||
- 允许指定策略 |
|||
```json |
|||
"App": { |
|||
// 逗号分隔 |
|||
"CorsOrigins": "http://*.com,http://localhost:4200" |
|||
}, |
|||
``` |
|||
- 配置跨域 |
|||
|
|||
```csharp |
|||
private void ConfigureCors(ServiceConfigurationContext context) |
|||
{ |
|||
var configuration = context.Services.GetConfiguration(); |
|||
context.Services.AddCors(options => |
|||
{ |
|||
options.AddPolicy(DefaultCorsPolicyName, builder => |
|||
{ |
|||
builder |
|||
.WithOrigins( |
|||
configuration["App:CorsOrigins"] |
|||
.Split(",", StringSplitOptions.RemoveEmptyEntries) |
|||
.Select(o => o.RemovePostFix("/")) |
|||
.ToArray() |
|||
) |
|||
.WithAbpExposedHeaders() |
|||
.SetIsOriginAllowedToAllowWildcardSubdomains() |
|||
.AllowAnyHeader() |
|||
.AllowAnyMethod() |
|||
.AllowCredentials(); |
|||
}); |
|||
}); |
|||
} |
|||
``` |
|||
|
|||
## AccessToken |
|||
|
|||
- Audience:接收对象 |
|||
- Issuer:签发主体 |
|||
- SecurityKey:密钥 |
|||
- ExpirationTime:过期时间(单位小时) |
|||
```json |
|||
"Jwt": { |
|||
"Audience": "Lion.AbpPro", |
|||
"SecurityKey": "dzehzRz9a8asdfasfdadfasdfasdfafsdadfasbasdf=", |
|||
"Issuer": "Lion.AbpPro", |
|||
"ExpirationTime": 30 |
|||
} |
|||
``` |
|||
|
|||
## CAP |
|||
!!! WARNING "如果要切换其他中间件请参考 [dotnetcore.cap](https://cap.dotnetcore.xyz/)" |
|||
|
|||
- Enabled: 是否启用 |
|||
- RabbitMq:Mq配置 |
|||
```json |
|||
"Cap": { |
|||
"Enabled": "true", |
|||
"RabbitMq": { |
|||
"HostName": "localhost", |
|||
"UserName": "admin", |
|||
"Password": "admin" |
|||
} |
|||
} |
|||
``` |
|||
@ -0,0 +1,49 @@ |
|||
### CQRS |
|||
CQRS:命令查询职责隔离,命令是指 插入、修改、删除,就是更改数据的动作.通过 Freesql 解决单一数据模型带来的查询尴尬场面。 |
|||
当前架构下,Freesql 和 ef 不在一个事务,最好实现就是用来做查询,比如分页查询。 |
|||
 |
|||
|
|||
## 配置 |
|||
|
|||
```csharp |
|||
public class AbpProFreeSqlModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
var configuration = context.Services.GetConfiguration(); |
|||
var connectionString = configuration.GetConnectionString("Default"); |
|||
var freeSql = new FreeSql.FreeSqlBuilder() |
|||
.UseConnectionString(FreeSql.DataType.MySql, connectionString) |
|||
.Build(); |
|||
|
|||
context.Services.AddSingleton<IFreeSql>(freeSql); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## 使用 |
|||
|
|||
- 在 Domain 层添加接口 |
|||
|
|||
```csharp |
|||
public interface IUserFreeSqlBasicRepository |
|||
{ |
|||
Task<List<UserOutput>> GetListAsync(); |
|||
} |
|||
``` |
|||
|
|||
- 在 Freesql 层添加实现 |
|||
|
|||
```csharp |
|||
public class UserFreeSqlBasicRepository : FreeSqlBasicRepository, IUserFreeSqlBasicRepository |
|||
{ |
|||
public async Task<List<UserOutput>> GetListAsync() |
|||
{ |
|||
var sql = "select id from AbpUsers"; |
|||
var result = await FreeSql.Select<UserOutput>() |
|||
.WithSql(sql) |
|||
.ToListAsync(); |
|||
return result; |
|||
} |
|||
} |
|||
``` |
|||
@ -0,0 +1,116 @@ |
|||
# 前端 |
|||
[Vben Admin 文档](https://vvbin.cn/doc-next/) |
|||
|
|||
|
|||
## 代码生成 |
|||
!!! info "前端接口,参数,自动生成,全部采用 Post 方式" |
|||
- 所有访问后端接口代码自动生成 [NSwag](https://github.com/RicoSuter/NSwag) |
|||
|
|||
|
|||
|
|||
### 配置代理的地址 |
|||
|
|||
- nswag->nswag.json |
|||
|
|||
```json |
|||
"documentGenerator": { |
|||
"fromDocument": { |
|||
// 代理地址,只有生成的时候用,不区分环境 |
|||
"url": "http://localhost:44315/swagger/v1/swagger.json", |
|||
} |
|||
} |
|||
``` |
|||
|
|||
- 如果接口参数或者返回值有改变,需要重新生成代理,执行: |
|||
|
|||
```bash |
|||
npm run nswag |
|||
``` |
|||
|
|||
### 后端Api格式 |
|||
|
|||
```csharp |
|||
// 一定要打Tags,因为前端会根据这个生成代理类 |
|||
// 建议参数都封装为一个Input |
|||
[SwaggerOperation(summary: "登录", Tags = new[] {"Account"})] |
|||
public Task<LoginOutput> LoginAsync(LoginInput input) |
|||
{ |
|||
return _loginAppService.LoginAsync(input); |
|||
} |
|||
``` |
|||
|
|||
## 前端多环境 |
|||
- .env.development 和.env.production |
|||
- VITE_API_URL:后端接口地址 |
|||
- VITE_AUTH_URL:IdentityServer接口地址 |
|||
|
|||
## 权限配置 |
|||
|
|||
### 菜单权限 |
|||
|
|||
```ts |
|||
import type { AppRouteModule } from "/@/router/types"; |
|||
import { LAYOUT } from "/@/router/constant"; |
|||
import { t } from "/@/hooks/web/useI18n"; |
|||
const tenant: AppRouteModule = { |
|||
path: "/tenant", |
|||
name: "Tenant", |
|||
component: LAYOUT, |
|||
meta: { |
|||
orderNo: 30, |
|||
icon: "ant-design:contacts-outlined", |
|||
title: t("routes.tenant.tenantManagement"), |
|||
}, |
|||
children: [ |
|||
{ |
|||
path: "Tenant", |
|||
name: "Tenant", |
|||
component: () => import("/@/views/tenants/Tenant.vue"), |
|||
meta: { |
|||
title: t("routes.tenant.tenantList"), |
|||
icon: "ant-design:switcher-filled", |
|||
policy: "AbpTenantManagement.Tenants", //菜单权限 |
|||
}, |
|||
}, |
|||
], |
|||
}; |
|||
|
|||
export default tenant; |
|||
``` |
|||
|
|||
### 按钮权限 |
|||
|
|||
```vue |
|||
<template> |
|||
<div> |
|||
<BasicTable @register="registerTable" size="small"> |
|||
<template #action="{ record }"> |
|||
<TableAction |
|||
:actions="[ |
|||
{ |
|||
icon: 'ant-design:edit-outlined', |
|||
auth: 'AbpIdentity.Users.Update', // 按钮权限 |
|||
label: t('common.editText'), |
|||
onClick: handleEdit.bind(null, record), |
|||
}, |
|||
]" |
|||
:dropDownActions="[ |
|||
{ |
|||
auth: 'AbpIdentity.Users.Delete', // 按钮权限 |
|||
label: t('common.delText'), |
|||
onClick: handleDelete.bind(null, record), |
|||
}, |
|||
{ |
|||
auth: 'System.Users.Enable', // 按钮权限 |
|||
label: !record.isActive ? t('common.enabled') : t('common.disEnabled'), |
|||
onClick: handleLock.bind(null, record), |
|||
}, |
|||
]" |
|||
/> |
|||
</template> |
|||
</BasicTable> |
|||
<CreateAbpUser @register="registerCreateAbpUserModal" @reload="reload" :bodyStyle="{ 'padding-top': '0' }" /> |
|||
<EditAbpUser @register="registerEditAbpUserModal" @reload="reload" :bodyStyle="{ 'padding-top': '0' }" /> |
|||
</div> |
|||
</template> |
|||
``` |
|||
@ -0,0 +1,57 @@ |
|||
# 数据字典模块 |
|||
Abp自带的Setting模块可能满足不了需求,特意提供数据字典模块。 |
|||
 |
|||
|
|||
## 安装 |
|||
|
|||
- Lion.Abp.DataDictionaryManagement.Application |
|||
- Lion.Abp.DataDictionaryManagement.Application.Contracts |
|||
- Lion.Abp.DataDictionaryManagement.Domain |
|||
- Lion.Abp.DataDictionaryManagement.Domain.Shared |
|||
- Lion.Abp.DataDictionaryManagement.EntityFrameworkCore |
|||
- Lion.Abp.DataDictionaryManagement.HttpApi |
|||
- Lion.Abp.DataDictionaryManagement.HttpApi.Client |
|||
|
|||
## 模块依赖 |
|||
|
|||
- 添加 DependsOn(typeof(DataDictionaryManagementXxxModule)) 特性到对应模块。 |
|||
|
|||
- 在EntityFrameworkCore层添加数据库配置在AbpProDbContext.cs的OnModelCreating()方法中添加builder.ConfigureDataDictionaryManagement(); |
|||
|
|||
## 实体 |
|||
**DataDictionary** 表结构: |
|||
|
|||
字段名 | 描述 | 类型 |
|||
:---|:---|:--- |
|||
Id | Id | Guid |
|||
TenantId | 租户id | Guid? |
|||
Code | 字典编码 | string |
|||
DisplayText | 显示名 | string |
|||
Description | 描述 | DateTime |
|||
Details | 字典明细 | List<DataDictionaryDetail> |
|||
IsDeleted | 是否删除 | bool |
|||
DeleterId | 删除人 | Guid? |
|||
DeletionTime | 删除时间 | DateTime |
|||
LastModifierId | 最后修改人 | Guid? |
|||
LastModificationTime | 最后修改时间 | DateTime |
|||
CreatorId | 创建人 | Guid? |
|||
CreationTime | 创建时间 | DateTime |
|||
|
|||
**DataDictionaryDetail** 表结构: |
|||
|
|||
字段名 | 描述 | 类型 |
|||
:---|:---|:--- |
|||
Id | Id | Guid |
|||
DataDictionaryId | 所属字典Id | Guid |
|||
Order | 排序 | Int |
|||
Code | 字典编码 | string |
|||
IsEnabled | 启/停用(默认启用) | bool |
|||
DisplayText | 显示名 | string |
|||
Description | 描述 | DateTime |
|||
IsDeleted | 是否删除 | bool |
|||
DeleterId | 删除人 | Guid? |
|||
DeletionTime | 删除时间 | DateTime |
|||
LastModifierId | 最后修改人 | Guid? |
|||
LastModificationTime | 最后修改时间 | DateTime |
|||
CreatorId | 创建人 | Guid? |
|||
CreationTime | 创建时间 | DateTime |
|||
@ -0,0 +1,60 @@ |
|||
# 数据字典模块 |
|||
|
|||
- 与abp自带的文件模块不一样,此模块接入阿里云oss作为云存储。 |
|||
- 前端上传文件到OSS,文件模块保存相对路径。 |
|||
|
|||
 |
|||
|
|||
## 安装 |
|||
|
|||
- Lion.Abp.FileManagement.Application |
|||
- Lion.Abp.FileManagement.Application.Contracts |
|||
- Lion.Abp.FileManagement.Domain |
|||
- Lion.Abp.FileManagement.Domain.Shared |
|||
- Lion.Abp.FileManagement.EntityFrameworkCore |
|||
- Lion.Abp.FileManagement.HttpApi |
|||
- Lion.Abp.FileManagement.HttpApi.Client |
|||
|
|||
|
|||
## 模块依赖 |
|||
|
|||
- 添加 DependsOn(typeof(FileManagementXxxModule)) 特性到对应模块。 |
|||
- 在EntityFrameworkCore层添加数据库配置在AbpProDbContext.cs的OnModelCreating()方法中添加builder.ConfigureFileManagement(); |
|||
|
|||
## 实体 |
|||
**File** 表结构: |
|||
|
|||
字段名 | 描述 | 类型 |
|||
:---|:---|:--- |
|||
Id | Id | Guid |
|||
TenantId | 租户id | Guid? |
|||
FileName | 文件名称 | string |
|||
FilePath | 文件路径 | string |
|||
IsDeleted | 是否删除 | bool |
|||
DeleterId | 删除人 | Guid? |
|||
DeletionTime | 删除时间 | DateTime |
|||
LastModifierId | 最后修改人 | Guid? |
|||
LastModificationTime | 最后修改时间 | DateTime |
|||
CreatorId | 创建人 | Guid? |
|||
CreationTime | 创建时间 | DateTime |
|||
|
|||
## OSS配置 |
|||
[阿里云OSS配置](https://help.aliyun.com/document_detail/100624.html) |
|||
|
|||
- 将OSS配置添加到AppSetting |
|||
## AppSetting配置 |
|||
```Json |
|||
"AliYun": { |
|||
"OSS": { |
|||
"AccessKeyId": "LTAI5tLkt3vvScGPVZ5qKJDc1S", |
|||
"AccessKeySecret": "BixV8vP5uPrbsdwjYzzsEXOPjkxPST12S", |
|||
"Endpoint": "oss-cn-shenzhen.aliyuncs.com", |
|||
"ContainerName": "lion-abp-pro", |
|||
"RegionId": "oss-cn-shenzhen", |
|||
"RoleArn": "acs:ram::1846393972471789:role/ramosst1t" |
|||
} |
|||
} |
|||
``` |
|||
|
|||
## 上传组件 |
|||
- [前端UploadOss.ts](https://github.com/WangJunZzz/abp-vnext-pro/blob/main/vben28/src/views/admin/files/UploadOss.ts) |
|||
@ -0,0 +1,39 @@ |
|||
# 身份管理模块 |
|||
|
|||
- 身份模块基于 [Microsoft Identity](https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/identity?view=aspnetcore-6.0) 库 用于管理角色,用户及其权限. |
|||
|
|||
|
|||
## 用户 |
|||
- 此页用于查看用户列表. 您可以创建/编辑和删除用户, 将角色分配给用户。 |
|||
 |
|||
- 一个用户可以有零个或多个角色. 用户从其角色继承权限 。 |
|||
|
|||
## 角色 |
|||
- 角色用于按分组给用户分配权限. |
|||
 |
|||
- 角色除了角色名称之外还有2个属性: |
|||
- Default: 如果某个角色被标记为 "default", 那么当新用户注册到应用程序时, 其将被作为默认角色分配给新用户. |
|||
- Public: 用户的公共角色可以被应用程序中的其他用户看到. 这个功能在身份模块中没有用到, 但被提供作为你可能希望在你自己的应用程序中使用的功能. |
|||
|
|||
## 组织单元 |
|||
- 组织单元由 OrganizationUnit 实体表示. 它的基本属性是: |
|||
- TenantId: 组织单元的租户Id. 对于宿主可以是 null. |
|||
- ParentId: 父级组织单元的Id. 如果这是一个根级组织单元,它可以是 null. |
|||
- Code: 对于租户唯一的层级字符串编码. |
|||
- DisplayName: 组织单元的显示名称. |
|||
|
|||
### 组织树 |
|||
- 由于组织单元可以有父级, 因此租户的所有组织单元是一个 树 结构. 这个树有一些规则; |
|||
- 可以有多个根级 (ParentId 是 null 的) . |
|||
- 一个组织单元的第一级子项数量有限制 (因为下面解释的固定的组织单元编码单位长度) . |
|||
|
|||
### 组织单元编码 |
|||
- 组织单元编码是通过 OrganizationUnitManager 服务自动生成和维护的. 它是一个字符串, 像这样:"00001.00042.00005" |
|||
- 通常用这种编码可以轻易地 (递归) 查询出数据库中组织单元的所有子项. 这个编码有一些规则 (当你使用 OrganizationUnitManager 时自动被应用的) : |
|||
- 对 租户 是 唯一的. |
|||
- 同一组织单元的全部子项都具有 以父级组织单元编码开头的 编码. |
|||
- 如示例中所示, 它是固定长度的且是基于树中组织单元的级别的. |
|||
- 尽管组织单元编码是唯一的, 但如果你移动了相关的组织单元, 它也可以被更改. |
|||
- 请注意, 你必须根据Id引用一个组织单元, 而不是编码, 因为编码后续是可以被更改的. |
|||
|
|||
 |
|||
@ -0,0 +1,90 @@ |
|||
# 设置管理 |
|||
|
|||
[官方Setting模块参考文档](https://docs.abp.io/zh-Hans/abp/latest/Settings) |
|||
|
|||
配置系统是在启动时配置应用程序很好的方式. 除了配置之外, ABP提供了另外一种设置和获取应用程序设置的方式. |
|||
设置存储在动态数据源(通常是数据库)中的键值对. 设置系统预构建了用户,租户,全局和默认设置方法并且可以进行扩展. |
|||
|
|||
## 定义设置 |
|||
使用设置之前需要定义它. ABP是 模块化的, 不同的模块可以拥有不同的设置. 只需要实现SettingDefinitionProvider类既可. 示例如下: |
|||
|
|||
!!! info "和官方Setting模块区别,值添加了2个属性,一个分组,一个组件类型" |
|||
|
|||
```csharp |
|||
public class CustomSettingProvider : SettingDefinitionProvider |
|||
{ |
|||
public override void Define(ISettingDefinitionContext context) |
|||
{ |
|||
context.Add( |
|||
new SettingDefinition( |
|||
AbpProSettings.Other.Github, |
|||
"https://github.com/WangJunZzz/abp-vnext-pro", |
|||
L("DisplayName:" + AbpProSettings.Other.Github), |
|||
L("Description:" + AbpProSettings.Other.Github) |
|||
) |
|||
// 分组 |
|||
.WithProperty(AbpProSettings.Group.Default,AbpProSettings.Group.OtherManagement) |
|||
// 前端组件类型 |
|||
.WithProperty(AbpProSettings.ControlType.Default,AbpProSettings.ControlType.TypeText)); |
|||
} |
|||
} |
|||
``` |
|||
|
|||
- SettingDefinition 类具有以下属性: |
|||
- Name: 应用程序中设置的唯一名称. 是具有约束的唯一属性, 在应用程序获取/设置此设置的值 (设置名称定义为常量而不是魔法字符串是个好主意). |
|||
- DefaultValue: 设置的默认值. |
|||
- DisplayName: 本地化的字符串,用于在UI上显示名称. |
|||
- Description: 本地化的字符串,用于在UI上显示描述. |
|||
|
|||
- 上面添加了2个属性,为了适配vue前端,一个设置Setting属于哪个分组,一个是根据Setting的类型指定对应的前端组件,比如字符串就是,Input组件。 |
|||
- 支持以下组件:Text,CheckBox,Number |
|||
|
|||
## 读取设置值 |
|||
ISettingProvider 用于获取指定设置的值或所有设置的值. 示例用法: |
|||
```csharp |
|||
public class MyService |
|||
{ |
|||
private readonly ISettingProvider _settingProvider; |
|||
|
|||
//Inject ISettingProvider in the constructor |
|||
public MyService(ISettingProvider settingProvider) |
|||
{ |
|||
_settingProvider = settingProvider; |
|||
} |
|||
|
|||
public async Task FooAsync() |
|||
{ |
|||
//Get a value as string. |
|||
string userName = await _settingProvider.GetOrNullAsync("Smtp.UserName"); |
|||
|
|||
//Get a bool value and fallback to the default value (false) if not set. |
|||
bool enableSsl = await _settingProvider.GetAsync<bool>("Smtp.EnableSsl"); |
|||
|
|||
//Get a bool value and fallback to the provided default value (true) if not set. |
|||
bool enableSsl = await _settingProvider.GetAsync<bool>( |
|||
"Smtp.EnableSsl", defaultValue: true); |
|||
|
|||
//Get a bool value with the IsTrueAsync shortcut extension method |
|||
bool enableSsl = await _settingProvider.IsTrueAsync("Smtp.EnableSsl"); |
|||
|
|||
//Get an int value or the default value (0) if not set |
|||
int port = (await _settingProvider.GetAsync<int>("Smtp.Port")); |
|||
|
|||
//Get an int value or null if not provided |
|||
int? port = (await _settingProvider.GetOrNullAsync("Smtp.Port"))?.To<int>(); |
|||
} |
|||
} |
|||
``` |
|||
> ISettingProvider 是非常常用的服务,一些基类中(如IApplicationService)已经将其属性注入. 这种情况下可以直接使用SettingProvider. |
|||
|
|||
ISettingProvider 使用设置值提供程序来获取设置值. 如果值提供程序无法获取设置值,则会回退到下一个值提供程序. |
|||
DefaultValueSettingValueProvider: 从设置定义的默认值中获取值. |
|||
ConfigurationSettingValueProvider: 从IConfiguration服务中获取值. |
|||
GlobalSettingValueProvider: 获取设置的全局值. |
|||
TenantSettingValueProvider: 获取当前租户的设置值. |
|||
UserSettingValueProvider: 获取当前用户的设置值. |
|||
|
|||
> 设置回退系统从底部 (用户) 到 顶部(默认) 方向起作用. |
|||
|
|||
|
|||
|
|||
@ -0,0 +1,111 @@ |
|||
# 实时通信 |
|||
集成Abp SignalR,实现类似站内信模块。 |
|||
|
|||
- 发送消息会在前端右上角,根据不同消息等级有不同的窗体提示。 |
|||
|
|||
 |
|||
|
|||
- 在右上角灯泡按钮可以看到接受的消息。 |
|||
|
|||
 |
|||
|
|||
## 安装 |
|||
|
|||
- Lion.Abp.NotificationManagement.Application |
|||
- Lion.Abp.NotificationManagement.Application.Contracts |
|||
- Lion.Abp.NotificationManagement.Domain |
|||
- Lion.Abp.NotificationManagement.Domain.Shared |
|||
- Lion.Abp.NotificationManagement.EntityFrameworkCore |
|||
- Lion.Abp.NotificationManagement.HttpApi |
|||
- Lion.Abp.NotificationManagement.HttpApi.Client |
|||
|
|||
## 模块依赖 |
|||
|
|||
- 添加 DependsOn(typeof(NotificationManagementXxxModule)) 特性到对应模块。 |
|||
|
|||
- 在EntityFrameworkCore层添加数据库配置在AbpProDbContext.cs的OnModelCreating()方法中添加builder.ConfigureNotificationManagement(); |
|||
|
|||
## 实体 |
|||
**Notification** 表结构: |
|||
|
|||
字段名 | 描述 | 类型 |
|||
:---|:---|:--- |
|||
Id | Id | Guid |
|||
Title | 消息标题 | string |
|||
Content | 消息内容 | string |
|||
MessageType | 消息类型 | MessageType |
|||
MessageLevel | 消息等级 | MessageLevel |
|||
SenderId | 创建人 | 发送人 |
|||
NotificationSubscriptions | 消息订阅者集合 | List<NotificationSubscription> |
|||
IsDeleted | 是否删除 | bool |
|||
DeleterId | 删除人 | Guid? |
|||
DeletionTime | 删除时间 | DateTime |
|||
LastModifierId | 最后修改人 | Guid? |
|||
LastModificationTime | 最后修改时间 | DateTime |
|||
CreatorId | 创建人 | Guid? |
|||
CreationTime | 创建时间 | DateTime |
|||
|
|||
**NotificationSubscription** 表结构: |
|||
|
|||
字段名 | 描述 | 类型 |
|||
:---|:---|:--- |
|||
Id | Id | Guid |
|||
ReceiveId | 接收人 | Guid |
|||
Read | 是否已读 | bool |
|||
ReadTime | 已读时间 | DateTime? |
|||
IsDeleted | 是否删除 | bool |
|||
DeleterId | 删除人 | Guid? |
|||
DeletionTime | 删除时间 | DateTime |
|||
LastModifierId | 最后修改人 | Guid? |
|||
LastModificationTime | 最后修改时间 | DateTime |
|||
CreatorId | 创建人 | Guid? |
|||
CreationTime | 创建时间 | DateTime |
|||
|
|||
## 发送消息 |
|||
- 注入NotificationManager,NotificationAppService即可发送不同级别,不同等级的消息。 |
|||
- 发送给指定人 |
|||
```csharp |
|||
/// <summary> |
|||
/// 发送警告文本消息 |
|||
/// </summary> |
|||
/// <param name="title">标题</param> |
|||
/// <param name="content">消息内容</param> |
|||
/// <param name="receiveIds">接受人,发送给谁。</param> |
|||
await _notificationManager.SendCommonWarningMessageAsync(title,content,receiveIds); |
|||
``` |
|||
- 发送给所有人 |
|||
```csharp |
|||
/// <summary> |
|||
/// 发送警告文本消息 |
|||
/// </summary> |
|||
/// <param name="title">标题</param> |
|||
/// <param name="content">消息内容</param> |
|||
await _notificationManager.SendBroadCastInformationMessageAsync(title,content); |
|||
``` |
|||
|
|||
## 依赖 |
|||
- 如果服务分布式部署,需要使用Redis(默认依赖),解决SignalR消息重复问题。 |
|||
```csharp |
|||
private void ConfigurationSignalR(ServiceConfigurationContext context) |
|||
{ |
|||
var redisConnection = context.Services.GetConfiguration()["Redis:Configuration"]; |
|||
if (redisConnection.IsNullOrWhiteSpace()) |
|||
{ |
|||
throw new UserFriendlyException(message: "Redis连接字符串未配置."); |
|||
} |
|||
context.Services.AddSignalR() |
|||
.AddStackExchangeRedis(redisConnection, options => { options.Configuration.ChannelPrefix = "Lion.AbpPro"; }); |
|||
} |
|||
``` |
|||
|
|||
## Vue客户端连接 |
|||
- 在用户登陆成功之后,连接SignalR,并且带自动重连机制。[源码](https://github.com/WangJunZzz/abp-vnext-pro/blob/main/vben28/src/hooks/web/useSignalR.ts) |
|||
- 示例如下: |
|||
|
|||
|
|||
```ts |
|||
const { startConnect } = useSignalR(); |
|||
onMounted(() => { |
|||
startConnect(); |
|||
}); |
|||
``` |
|||
@ -0,0 +1,5 @@ |
|||
## 编译 |
|||
|
|||
### VS 编译项目字符串超过 256 个字符 |
|||
|
|||
- 把项目拷贝到磁盘根目录 OR 使用 Rider 开发 |
|||
@ -0,0 +1,101 @@ |
|||
# Project information |
|||
site_name: Lion.AbpPro |
|||
site_url: http://cap.dotnetcore.xyz |
|||
site_description: AbpPro Vue 版本实现 |
|||
site_author: AbpPro Team |
|||
|
|||
repo_name: "GitHub" |
|||
repo_url: "https://github.com/WangJunZzz/abp-vnext-pro" |
|||
edit_uri: "edit/master/docs/content" |
|||
docs_dir: "content" |
|||
|
|||
# Copyright |
|||
copyright: Copyright © 2022 <a href="https://github.com/WangJunZzz/abp-vnext-pro"></a>. |
|||
|
|||
#theme: material |
|||
theme: |
|||
name: "material" |
|||
palette: |
|||
primary: "deep purple" |
|||
accent: "indigo" |
|||
language: en |
|||
include_sidebar: true |
|||
logo: "img/logo.svg" |
|||
favicon: "img/favicon.ico" |
|||
features: |
|||
- navigation.tabs |
|||
- navigation.instant |
|||
i18n: |
|||
prev: "Previous" |
|||
next: "Next" |
|||
|
|||
#Customization |
|||
extra: |
|||
social: |
|||
- icon: "fontawesome/brands/github" |
|||
link: "https://github.com/WangJunZzz/abp-vnext-pro" |
|||
|
|||
|
|||
# Extensions |
|||
markdown_extensions: |
|||
- markdown.extensions.admonition |
|||
- markdown.extensions.codehilite: |
|||
guess_lang: true |
|||
linenums: false |
|||
- markdown.extensions.def_list |
|||
- markdown.extensions.footnotes |
|||
- markdown.extensions.meta |
|||
- markdown.extensions.toc: |
|||
permalink: true |
|||
- pymdownx.arithmatex |
|||
- pymdownx.betterem: |
|||
smart_enable: all |
|||
- pymdownx.caret |
|||
- pymdownx.critic |
|||
- pymdownx.details |
|||
- pymdownx.emoji: |
|||
emoji_generator: !!python/name:pymdownx.emoji.to_svg |
|||
- pymdownx.inlinehilite |
|||
- pymdownx.keys |
|||
- pymdownx.magiclink: |
|||
repo_url_shorthand: true |
|||
user: dotnetcore |
|||
repo: cap |
|||
- pymdownx.mark |
|||
- pymdownx.smartsymbols |
|||
- pymdownx.superfences |
|||
- pymdownx.tasklist: |
|||
custom_checkbox: true |
|||
- pymdownx.tilde |
|||
|
|||
nav: |
|||
- Home: index.md |
|||
- 文档(中文): |
|||
- 入门: |
|||
- 快速开始: user-guide/zh/getting-started/quick-start.md |
|||
- 介绍: user-guide/zh/getting-started/introduction.md |
|||
- 贡献: user-guide/zh/getting-started/contributing.md |
|||
- 基础设施: |
|||
- 配置: user-guide/zh/infrastructure/config.md |
|||
- 前端: user-guide/zh/infrastructure/frontend.md |
|||
- FreeSql: user-guide/zh/infrastructure/freesql.md |
|||
- 应用模块: |
|||
- 身份认证: user-guide/zh/modules/identity.md |
|||
- 设置(Setting): user-guide/zh/modules/setting.md |
|||
- 数据字典: user-guide/zh/modules/dic.md |
|||
- 文件管理: user-guide/zh/modules/file.md |
|||
- 实时通信: user-guide/zh/modules/signalr.md |
|||
- 扩展: |
|||
- 统一返回值格式: user-guide/zh/extension/统一返回值格式.md |
|||
- Magicodes.IE: user-guide/zh/extension/MagicodesIE.md |
|||
- 部署: |
|||
- Docker: user-guide/zh/deploy/docker.md |
|||
- Github自动化部署: user-guide/zh/deploy/github.md |
|||
- 常见问题: |
|||
- 问题: user-guide/zh/problem/problem.md |
|||
- Release: |
|||
- 发行说明: about/release-notes.md |
|||
- 关于: |
|||
- Contact Us: about/contact-us.md |
|||
- License: about/license.md |
|||
|
|||
@ -0,0 +1,957 @@ |
|||
|
|||
<!doctype html> |
|||
<html lang="en" class="no-js"> |
|||
<head> |
|||
|
|||
<meta charset="utf-8"> |
|||
<meta name="viewport" content="width=device-width,initial-scale=1"> |
|||
|
|||
<meta name="description" content="AbpPro Vue 版本实现"> |
|||
|
|||
|
|||
<meta name="author" content="AbpPro Team"> |
|||
|
|||
|
|||
<link rel="icon" href="/img/favicon.ico"> |
|||
<meta name="generator" content="mkdocs-1.3.0, mkdocs-material-8.3.9"> |
|||
|
|||
|
|||
|
|||
<title>Lion.AbpPro</title> |
|||
|
|||
|
|||
|
|||
<link rel="stylesheet" href="/assets/stylesheets/main.1d29e8d0.min.css"> |
|||
|
|||
|
|||
<link rel="stylesheet" href="/assets/stylesheets/palette.cbb835fc.min.css"> |
|||
|
|||
|
|||
|
|||
<meta name="theme-color" content="#7e56c2"> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> |
|||
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback"> |
|||
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style> |
|||
|
|||
|
|||
|
|||
<script>__md_scope=new URL("/",location),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
</head> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<body dir="ltr" data-md-color-scheme="" data-md-color-primary="deep-purple" data-md-color-accent="indigo"> |
|||
|
|||
|
|||
|
|||
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off"> |
|||
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off"> |
|||
<label class="md-overlay" for="__drawer"></label> |
|||
<div data-md-component="skip"> |
|||
|
|||
</div> |
|||
<div data-md-component="announce"> |
|||
|
|||
</div> |
|||
|
|||
|
|||
|
|||
|
|||
<header class="md-header" data-md-component="header"> |
|||
<nav class="md-header__inner md-grid" aria-label="Header"> |
|||
<a href="/." title="Lion.AbpPro" class="md-header__button md-logo" aria-label="Lion.AbpPro" data-md-component="logo"> |
|||
|
|||
<img src="/img/logo.svg" alt="logo"> |
|||
|
|||
</a> |
|||
<label class="md-header__button md-icon" for="__drawer"> |
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg> |
|||
</label> |
|||
<div class="md-header__title" data-md-component="header-title"> |
|||
<div class="md-header__ellipsis"> |
|||
<div class="md-header__topic"> |
|||
<span class="md-ellipsis"> |
|||
Lion.AbpPro |
|||
</span> |
|||
</div> |
|||
<div class="md-header__topic" data-md-component="header-topic"> |
|||
<span class="md-ellipsis"> |
|||
|
|||
|
|||
|
|||
</span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
|
|||
<label class="md-header__button md-icon" for="__search"> |
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> |
|||
</label> |
|||
<div class="md-search" data-md-component="search" role="dialog"> |
|||
<label class="md-search__overlay" for="__search"></label> |
|||
<div class="md-search__inner" role="search"> |
|||
<form class="md-search__form" name="search"> |
|||
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required> |
|||
<label class="md-search__icon md-icon" for="__search"> |
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg> |
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg> |
|||
</label> |
|||
<nav class="md-search__options" aria-label="Search"> |
|||
|
|||
<button type="reset" class="md-search__icon md-icon" aria-label="Clear" tabindex="-1"> |
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg> |
|||
</button> |
|||
</nav> |
|||
|
|||
</form> |
|||
<div class="md-search__output"> |
|||
<div class="md-search__scrollwrap" data-md-scrollfix> |
|||
<div class="md-search-result" data-md-component="search-result"> |
|||
<div class="md-search-result__meta"> |
|||
Initializing search |
|||
</div> |
|||
<ol class="md-search-result__list"></ol> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
<div class="md-header__source"> |
|||
<a href="https://github.com/WangJunZzz/abp-vnext-pro" title="Go to repository" class="md-source" data-md-component="source"> |
|||
<div class="md-source__icon md-icon"> |
|||
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> |
|||
</div> |
|||
<div class="md-source__repository"> |
|||
GitHub |
|||
</div> |
|||
</a> |
|||
</div> |
|||
|
|||
</nav> |
|||
|
|||
</header> |
|||
|
|||
<div class="md-container" data-md-component="container"> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs"> |
|||
<div class="md-tabs__inner md-grid"> |
|||
<ul class="md-tabs__list"> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-tabs__item"> |
|||
<a href="/." class="md-tabs__link"> |
|||
Home |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-tabs__item"> |
|||
<a href="/user-guide/zh/getting-started/quick-start/" class="md-tabs__link"> |
|||
文档(中文) |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-tabs__item"> |
|||
<a href="/user-guide/zh/problem/problem/" class="md-tabs__link"> |
|||
常见问题 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-tabs__item"> |
|||
<a href="/about/release-notes/" class="md-tabs__link"> |
|||
Release |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-tabs__item"> |
|||
<a href="/about/contact-us/" class="md-tabs__link"> |
|||
关于 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
</ul> |
|||
</div> |
|||
</nav> |
|||
|
|||
|
|||
|
|||
<main class="md-main" data-md-component="main"> |
|||
<div class="md-main__inner md-grid"> |
|||
|
|||
|
|||
|
|||
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" > |
|||
<div class="md-sidebar__scrollwrap"> |
|||
<div class="md-sidebar__inner"> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<nav class="md-nav md-nav--primary md-nav--lifted" aria-label="Navigation" data-md-level="0"> |
|||
<label class="md-nav__title" for="__drawer"> |
|||
<a href="/." title="Lion.AbpPro" class="md-nav__button md-logo" aria-label="Lion.AbpPro" data-md-component="logo"> |
|||
|
|||
<img src="/img/logo.svg" alt="logo"> |
|||
|
|||
</a> |
|||
Lion.AbpPro |
|||
</label> |
|||
|
|||
<div class="md-nav__source"> |
|||
<a href="https://github.com/WangJunZzz/abp-vnext-pro" title="Go to repository" class="md-source" data-md-component="source"> |
|||
<div class="md-source__icon md-icon"> |
|||
|
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81z"/></svg> |
|||
</div> |
|||
<div class="md-source__repository"> |
|||
GitHub |
|||
</div> |
|||
</a> |
|||
</div> |
|||
|
|||
<ul class="md-nav__list" data-md-scrollfix> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/." class="md-nav__link"> |
|||
Home |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item md-nav__item--nested"> |
|||
|
|||
|
|||
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2" type="checkbox" id="__nav_2" > |
|||
|
|||
|
|||
|
|||
|
|||
<label class="md-nav__link" for="__nav_2"> |
|||
文档(中文) |
|||
<span class="md-nav__icon md-icon"></span> |
|||
</label> |
|||
|
|||
<nav class="md-nav" aria-label="文档(中文)" data-md-level="1"> |
|||
<label class="md-nav__title" for="__nav_2"> |
|||
<span class="md-nav__icon md-icon"></span> |
|||
文档(中文) |
|||
</label> |
|||
<ul class="md-nav__list" data-md-scrollfix> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item md-nav__item--nested"> |
|||
|
|||
|
|||
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_1" type="checkbox" id="__nav_2_1" > |
|||
|
|||
|
|||
|
|||
|
|||
<label class="md-nav__link" for="__nav_2_1"> |
|||
入门 |
|||
<span class="md-nav__icon md-icon"></span> |
|||
</label> |
|||
|
|||
<nav class="md-nav" aria-label="入门" data-md-level="2"> |
|||
<label class="md-nav__title" for="__nav_2_1"> |
|||
<span class="md-nav__icon md-icon"></span> |
|||
入门 |
|||
</label> |
|||
<ul class="md-nav__list" data-md-scrollfix> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/getting-started/quick-start/" class="md-nav__link"> |
|||
快速开始 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/getting-started/introduction/" class="md-nav__link"> |
|||
介绍 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/getting-started/contributing/" class="md-nav__link"> |
|||
贡献 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
</ul> |
|||
</nav> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item md-nav__item--nested"> |
|||
|
|||
|
|||
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_2" type="checkbox" id="__nav_2_2" > |
|||
|
|||
|
|||
|
|||
|
|||
<label class="md-nav__link" for="__nav_2_2"> |
|||
基础设施 |
|||
<span class="md-nav__icon md-icon"></span> |
|||
</label> |
|||
|
|||
<nav class="md-nav" aria-label="基础设施" data-md-level="2"> |
|||
<label class="md-nav__title" for="__nav_2_2"> |
|||
<span class="md-nav__icon md-icon"></span> |
|||
基础设施 |
|||
</label> |
|||
<ul class="md-nav__list" data-md-scrollfix> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/infrastructure/config/" class="md-nav__link"> |
|||
配置 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/infrastructure/frontend/" class="md-nav__link"> |
|||
前端 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/infrastructure/freesql/" class="md-nav__link"> |
|||
FreeSql |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
</ul> |
|||
</nav> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item md-nav__item--nested"> |
|||
|
|||
|
|||
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_3" type="checkbox" id="__nav_2_3" > |
|||
|
|||
|
|||
|
|||
|
|||
<label class="md-nav__link" for="__nav_2_3"> |
|||
应用模块 |
|||
<span class="md-nav__icon md-icon"></span> |
|||
</label> |
|||
|
|||
<nav class="md-nav" aria-label="应用模块" data-md-level="2"> |
|||
<label class="md-nav__title" for="__nav_2_3"> |
|||
<span class="md-nav__icon md-icon"></span> |
|||
应用模块 |
|||
</label> |
|||
<ul class="md-nav__list" data-md-scrollfix> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/modules/identity/" class="md-nav__link"> |
|||
身份认证 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/modules/setting/" class="md-nav__link"> |
|||
设置(Setting) |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/modules/dic/" class="md-nav__link"> |
|||
数据字典 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/modules/file/" class="md-nav__link"> |
|||
文件管理 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/modules/signalr/" class="md-nav__link"> |
|||
实时通信 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
</ul> |
|||
</nav> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item md-nav__item--nested"> |
|||
|
|||
|
|||
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_4" type="checkbox" id="__nav_2_4" > |
|||
|
|||
|
|||
|
|||
|
|||
<label class="md-nav__link" for="__nav_2_4"> |
|||
扩展 |
|||
<span class="md-nav__icon md-icon"></span> |
|||
</label> |
|||
|
|||
<nav class="md-nav" aria-label="扩展" data-md-level="2"> |
|||
<label class="md-nav__title" for="__nav_2_4"> |
|||
<span class="md-nav__icon md-icon"></span> |
|||
扩展 |
|||
</label> |
|||
<ul class="md-nav__list" data-md-scrollfix> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/extension/%E7%BB%9F%E4%B8%80%E8%BF%94%E5%9B%9E%E5%80%BC%E6%A0%BC%E5%BC%8F/" class="md-nav__link"> |
|||
统一返回值格式 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/extension/MagicodesIE/" class="md-nav__link"> |
|||
Magicodes.IE |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
</ul> |
|||
</nav> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item md-nav__item--nested"> |
|||
|
|||
|
|||
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_2_5" type="checkbox" id="__nav_2_5" > |
|||
|
|||
|
|||
|
|||
|
|||
<label class="md-nav__link" for="__nav_2_5"> |
|||
部署 |
|||
<span class="md-nav__icon md-icon"></span> |
|||
</label> |
|||
|
|||
<nav class="md-nav" aria-label="部署" data-md-level="2"> |
|||
<label class="md-nav__title" for="__nav_2_5"> |
|||
<span class="md-nav__icon md-icon"></span> |
|||
部署 |
|||
</label> |
|||
<ul class="md-nav__list" data-md-scrollfix> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/deploy/docker/" class="md-nav__link"> |
|||
Docker |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/deploy/github/" class="md-nav__link"> |
|||
Github自动化部署 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
</ul> |
|||
</nav> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
</ul> |
|||
</nav> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item md-nav__item--nested"> |
|||
|
|||
|
|||
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_3" type="checkbox" id="__nav_3" > |
|||
|
|||
|
|||
|
|||
|
|||
<label class="md-nav__link" for="__nav_3"> |
|||
常见问题 |
|||
<span class="md-nav__icon md-icon"></span> |
|||
</label> |
|||
|
|||
<nav class="md-nav" aria-label="常见问题" data-md-level="1"> |
|||
<label class="md-nav__title" for="__nav_3"> |
|||
<span class="md-nav__icon md-icon"></span> |
|||
常见问题 |
|||
</label> |
|||
<ul class="md-nav__list" data-md-scrollfix> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/user-guide/zh/problem/problem/" class="md-nav__link"> |
|||
问题 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
</ul> |
|||
</nav> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item md-nav__item--nested"> |
|||
|
|||
|
|||
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_4" type="checkbox" id="__nav_4" > |
|||
|
|||
|
|||
|
|||
|
|||
<label class="md-nav__link" for="__nav_4"> |
|||
Release |
|||
<span class="md-nav__icon md-icon"></span> |
|||
</label> |
|||
|
|||
<nav class="md-nav" aria-label="Release" data-md-level="1"> |
|||
<label class="md-nav__title" for="__nav_4"> |
|||
<span class="md-nav__icon md-icon"></span> |
|||
Release |
|||
</label> |
|||
<ul class="md-nav__list" data-md-scrollfix> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/about/release-notes/" class="md-nav__link"> |
|||
发行说明 |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
</ul> |
|||
</nav> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item md-nav__item--nested"> |
|||
|
|||
|
|||
<input class="md-nav__toggle md-toggle" data-md-toggle="__nav_5" type="checkbox" id="__nav_5" > |
|||
|
|||
|
|||
|
|||
|
|||
<label class="md-nav__link" for="__nav_5"> |
|||
关于 |
|||
<span class="md-nav__icon md-icon"></span> |
|||
</label> |
|||
|
|||
<nav class="md-nav" aria-label="关于" data-md-level="1"> |
|||
<label class="md-nav__title" for="__nav_5"> |
|||
<span class="md-nav__icon md-icon"></span> |
|||
关于 |
|||
</label> |
|||
<ul class="md-nav__list" data-md-scrollfix> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/about/contact-us/" class="md-nav__link"> |
|||
Contact Us |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<li class="md-nav__item"> |
|||
<a href="/about/license/" class="md-nav__link"> |
|||
License |
|||
</a> |
|||
</li> |
|||
|
|||
|
|||
|
|||
|
|||
</ul> |
|||
</nav> |
|||
</li> |
|||
|
|||
|
|||
|
|||
</ul> |
|||
</nav> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
|
|||
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" > |
|||
<div class="md-sidebar__scrollwrap"> |
|||
<div class="md-sidebar__inner"> |
|||
|
|||
|
|||
<nav class="md-nav md-nav--secondary" aria-label="Table of contents"> |
|||
|
|||
|
|||
|
|||
|
|||
</nav> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
|
|||
|
|||
<div class="md-content" data-md-component="content"> |
|||
<article class="md-content__inner md-typeset"> |
|||
|
|||
<h1>404 - Not found</h1> |
|||
|
|||
</article> |
|||
|
|||
</div> |
|||
</div> |
|||
|
|||
</main> |
|||
|
|||
<footer class="md-footer"> |
|||
|
|||
<div class="md-footer-meta md-typeset"> |
|||
<div class="md-footer-meta__inner md-grid"> |
|||
<div class="md-copyright"> |
|||
|
|||
<div class="md-copyright__highlight"> |
|||
Copyright © 2022 <a href="https://github.com/WangJunZzz/abp-vnext-pro"></a>. |
|||
</div> |
|||
|
|||
|
|||
Made with |
|||
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener"> |
|||
Material for MkDocs |
|||
</a> |
|||
|
|||
</div> |
|||
|
|||
<div class="md-social"> |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
|
|||
<a href="https://github.com/WangJunZzz/abp-vnext-pro" target="_blank" rel="noopener" title="github.com" class="md-social__link"> |
|||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 496 512"><!--! Font Awesome Free 6.1.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2022 Fonticons, Inc.--><path d="M165.9 397.4c0 2-2.3 3.6-5.2 3.6-3.3.3-5.6-1.3-5.6-3.6 0-2 2.3-3.6 5.2-3.6 3-.3 5.6 1.3 5.6 3.6zm-31.1-4.5c-.7 2 1.3 4.3 4.3 4.9 2.6 1 5.6 0 6.2-2s-1.3-4.3-4.3-5.2c-2.6-.7-5.5.3-6.2 2.3zm44.2-1.7c-2.9.7-4.9 2.6-4.6 4.9.3 2 2.9 3.3 5.9 2.6 2.9-.7 4.9-2.6 4.6-4.6-.3-1.9-3-3.2-5.9-2.9zM244.8 8C106.1 8 0 113.3 0 252c0 110.9 69.8 205.8 169.5 239.2 12.8 2.3 17.3-5.6 17.3-12.1 0-6.2-.3-40.4-.3-61.4 0 0-70 15-84.7-29.8 0 0-11.4-29.1-27.8-36.6 0 0-22.9-15.7 1.6-15.4 0 0 24.9 2 38.6 25.8 21.9 38.6 58.6 27.5 72.9 20.9 2.3-16 8.8-27.1 16-33.7-55.9-6.2-112.3-14.3-112.3-110.5 0-27.5 7.6-41.3 23.6-58.9-2.6-6.5-11.1-33.3 2.6-67.9 20.9-6.5 69 27 69 27 20-5.6 41.5-8.5 62.8-8.5s42.8 2.9 62.8 8.5c0 0 48.1-33.6 69-27 13.7 34.7 5.2 61.4 2.6 67.9 16 17.7 25.8 31.5 25.8 58.9 0 96.5-58.9 104.2-114.8 110.5 9.2 7.9 17 22.9 17 46.4 0 33.7-.3 75.4-.3 83.6 0 6.5 4.6 14.4 17.3 12.1C428.2 457.8 496 362.9 496 252 496 113.3 383.5 8 244.8 8zM97.2 352.9c-1.3 1-1 3.3.7 5.2 1.6 1.6 3.9 2.3 5.2 1 1.3-1 1-3.3-.7-5.2-1.6-1.6-3.9-2.3-5.2-1zm-10.8-8.1c-.7 1.3.3 2.9 2.3 3.9 1.6 1 3.6.7 4.3-.7.7-1.3-.3-2.9-2.3-3.9-2-.6-3.6-.3-4.3.7zm32.4 35.6c-1.6 1.3-1 4.3 1.3 6.2 2.3 2.3 5.2 2.6 6.5 1 1.3-1.3.7-4.3-1.3-6.2-2.2-2.3-5.2-2.6-6.5-1zm-11.4-14.7c-1.6 1-1.6 3.6 0 5.9 1.6 2.3 4.3 3.3 5.6 2.3 1.6-1.3 1.6-3.9 0-6.2-1.4-2.3-4-3.3-5.6-2z"/></svg> |
|||
</a> |
|||
|
|||
</div> |
|||
|
|||
</div> |
|||
</div> |
|||
</footer> |
|||
|
|||
</div> |
|||
<div class="md-dialog" data-md-component="dialog"> |
|||
<div class="md-dialog__inner md-typeset"></div> |
|||
</div> |
|||
<script id="__config" type="application/json">{"base": "/", "features": ["navigation.tabs", "navigation.instant"], "search": "/assets/javascripts/workers/search.b97dbffb.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.config.lang": "en", "search.config.pipeline": "trimmer, stopWordFilter", "search.config.separator": "[\\s\\-]+", "search.placeholder": "Search", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version.title": "Select version"}}</script> |
|||
|
|||
|
|||
<script src="/assets/javascripts/bundle.6c7ad80a.min.js"></script> |
|||
|
|||
|
|||
</body> |
|||
</html> |
|||
@ -0,0 +1 @@ |
|||
doc.cncore.club |
|||
|
After Width: | Height: | Size: 1.8 KiB |
@ -0,0 +1,18 @@ |
|||
/*! |
|||
* Lunr languages, `Danish` language |
|||
* https://github.com/MihaiValentin/lunr-languages
|
|||
* |
|||
* Copyright 2014, Mihai Valentin |
|||
* http://www.mozilla.org/MPL/
|
|||
*/ |
|||
/*! |
|||
* based on |
|||
* Snowball JavaScript Library v0.3 |
|||
* http://code.google.com/p/urim/
|
|||
* http://snowball.tartarus.org/
|
|||
* |
|||
* Copyright 2010, Oleg Mazko |
|||
* http://www.mozilla.org/MPL/
|
|||
*/ |
|||
|
|||
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){var e,r=f.cursor+3;if(d=f.limit,0<=r&&r<=f.limit){for(a=r;;){if(e=f.cursor,f.in_grouping(w,97,248)){f.cursor=e;break}if(f.cursor=e,e>=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d<a&&(d=a)}}function n(){var e,r;if(f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}}); |
|||
@ -0,0 +1 @@ |
|||
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Za-zA-Z0-90-9",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}}); |
|||
@ -0,0 +1 @@ |
|||
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n<p.length;n++)r?a.push(new e.Token(p[n],{position:[f,p[n].length],index:a.length})):a.push(p[n]),f+=p[n].length;l=c+1}return a},e.ja.stemmer=function(){return function(e){return e}}(),e.Pipeline.registerFunction(e.ja.stemmer,"stemmer-ja"),e.ja.wordCharacters="一二三四五六七八九十百千万億兆一-龠々〆ヵヶぁ-んァ-ヴーア-ン゙a-zA-Za-zA-Z0-90-9",e.ja.trimmer=e.trimmerSupport.generateTrimmer(e.ja.wordCharacters),e.Pipeline.registerFunction(e.ja.trimmer,"trimmer-ja"),e.ja.stopWordFilter=e.generateStopWordFilter("これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし".split(" ")),e.Pipeline.registerFunction(e.ja.stopWordFilter,"stopWordFilter-ja"),e.jp=e.ja,e.Pipeline.registerFunction(e.jp.stemmer,"stemmer-jp"),e.Pipeline.registerFunction(e.jp.trimmer,"trimmer-jp"),e.Pipeline.registerFunction(e.jp.stopWordFilter,"stopWordFilter-jp")}}); |
|||
@ -0,0 +1 @@ |
|||
module.exports=require("./lunr.ja"); |
|||
@ -0,0 +1 @@ |
|||
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),i=t.join("-"),r="",n=[],s=[],p=0;p<t.length;++p)"en"==t[p]?(r+="\\w",n.unshift(e.stopWordFilter),n.push(e.stemmer),s.push(e.stemmer)):(r+=e[t[p]].wordCharacters,e[t[p]].stopWordFilter&&n.unshift(e[t[p]].stopWordFilter),e[t[p]].stemmer&&(n.push(e[t[p]].stemmer),s.push(e[t[p]].stemmer)));var o=e.trimmerSupport.generateTrimmer(r);return e.Pipeline.registerFunction(o,"lunr-multi-trimmer-"+i),n.unshift(o),function(){this.pipeline.reset(),this.pipeline.add.apply(this.pipeline,n),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add.apply(this.searchPipeline,s))}}}}); |
|||
@ -0,0 +1,18 @@ |
|||
/*! |
|||
* Lunr languages, `Norwegian` language |
|||
* https://github.com/MihaiValentin/lunr-languages
|
|||
* |
|||
* Copyright 2014, Mihai Valentin |
|||
* http://www.mozilla.org/MPL/
|
|||
*/ |
|||
/*! |
|||
* based on |
|||
* Snowball JavaScript Library v0.3 |
|||
* http://code.google.com/p/urim/
|
|||
* http://snowball.tartarus.org/
|
|||
* |
|||
* Copyright 2010, Oleg Mazko |
|||
* http://www.mozilla.org/MPL/
|
|||
*/ |
|||
|
|||
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a<s&&(a=s)}}function i(){var e,r,n;if(w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}}); |
|||
@ -0,0 +1 @@ |
|||
!function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s<t;s++)i[s]=r.charCodeAt(s);return i},!r&&""!=r||!t&&0!=t||!i)throw"Bad Among initialisation: s:"+r+", substring_i: "+t+", result: "+i;this.s_size=r.length,this.s=this.toCharArray(r),this.substring_i=t,this.result=i,this.method=s},SnowballProgram:function(){var r;return{bra:0,ket:0,limit:0,cursor:0,limit_backward:0,setCurrent:function(t){r=t,this.cursor=0,this.limit=t.length,this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit},getCurrent:function(){var t=r;return r=null,t},in_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e>s||e<i)return this.cursor++,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e<i)return this.cursor--,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor+s)!=i.charCodeAt(s))return!1;return this.cursor+=t,!0},eq_s_b:function(t,i){if(this.cursor-this.limit_backward<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor-t+s)!=i.charCodeAt(s))return!1;return this.cursor-=t,!0},find_among:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=l;m<_.s_size;m++){if(n+l==u){f=-1;break}if(f=r.charCodeAt(n+l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=_.s_size-1-l;m>=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}}); |
|||
@ -0,0 +1,18 @@ |
|||
/*! |
|||
* Lunr languages, `Swedish` language |
|||
* https://github.com/MihaiValentin/lunr-languages
|
|||
* |
|||
* Copyright 2014, Mihai Valentin |
|||
* http://www.mozilla.org/MPL/
|
|||
*/ |
|||
/*! |
|||
* based on |
|||
* Snowball JavaScript Library v0.3 |
|||
* http://code.google.com/p/urim/
|
|||
* http://snowball.tartarus.org/
|
|||
* |
|||
* Copyright 2010, Oleg Mazko |
|||
* http://www.mozilla.org/MPL/
|
|||
*/ |
|||
|
|||
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o<a&&(o=a)}}function t(){var e,r=w.limit_backward;if(w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}}); |
|||
@ -0,0 +1 @@ |
|||
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[-]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}}); |
|||
@ -0,0 +1 @@ |
|||
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}}); |
|||
@ -0,0 +1 @@ |
|||
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("nodejieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 以 于 上 他 而 后 之 来 及 了 因 下 可 到 由 这 与 也 此 但 并 个 其 已 无 小 我 们 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 从 到 得 打 凡 儿 尔 该 各 给 跟 和 何 还 即 几 既 看 据 距 靠 啦 了 另 么 每 们 嘛 拿 哪 那 您 凭 且 却 让 仍 啥 如 若 使 谁 虽 随 同 所 她 哇 嗡 往 哪 些 向 沿 哟 用 于 咱 则 怎 曾 至 致 着 诸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}}); |
|||
@ -0,0 +1,206 @@ |
|||
/** |
|||
* export the module via AMD, CommonJS or as a browser global |
|||
* Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
|
|||
*/ |
|||
;(function (root, factory) { |
|||
if (typeof define === 'function' && define.amd) { |
|||
// AMD. Register as an anonymous module.
|
|||
define(factory) |
|||
} else if (typeof exports === 'object') { |
|||
/** |
|||
* Node. Does not work with strict CommonJS, but |
|||
* only CommonJS-like environments that support module.exports, |
|||
* like Node. |
|||
*/ |
|||
module.exports = factory() |
|||
} else { |
|||
// Browser globals (root is window)
|
|||
factory()(root.lunr); |
|||
} |
|||
}(this, function () { |
|||
/** |
|||
* Just return a value to define the module export. |
|||
* This example returns an object, but the module |
|||
* can return a function as the exported value. |
|||
*/ |
|||
|
|||
return function(lunr) { |
|||
// TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript
|
|||
// (c) 2008 Taku Kudo <taku@chasen.org>
|
|||
// TinySegmenter is freely distributable under the terms of a new BSD licence.
|
|||
// For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt
|
|||
|
|||
function TinySegmenter() { |
|||
var patterns = { |
|||
"[一二三四五六七八九十百千万億兆]":"M", |
|||
"[一-龠々〆ヵヶ]":"H", |
|||
"[ぁ-ん]":"I", |
|||
"[ァ-ヴーア-ン゙ー]":"K", |
|||
"[a-zA-Za-zA-Z]":"A", |
|||
"[0-90-9]":"N" |
|||
} |
|||
this.chartype_ = []; |
|||
for (var i in patterns) { |
|||
var regexp = new RegExp(i); |
|||
this.chartype_.push([regexp, patterns[i]]); |
|||
} |
|||
|
|||
this.BIAS__ = -332 |
|||
this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378}; |
|||
this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920}; |
|||
this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266}; |
|||
this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352}; |
|||
this.BP2__ = {"BO":60,"OO":-1762}; |
|||
this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965}; |
|||
this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146}; |
|||
this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699}; |
|||
this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973}; |
|||
this.BW1__ = {",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741,"ませ":2448,"まで":1711,"まま":2600,"まる":-2155,"やむ":-1947,"よっ":-2565,"れた":2369,"れで":-913,"をし":1860,"を見":731,"亡く":-1886,"京都":2558,"取り":-2784,"大き":-2604,"大阪":1497,"平方":-2314,"引き":-1336,"日本":-195,"本当":-2423,"毎日":-2113,"目指":-724,"B1あ":1404,"B1同":542,"」と":1682}; |
|||
this.BW2__ = {"..":-11822,"11":-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1890,"とこ":-1746,"とと":-2279,"との":720,"とみ":5168,"とも":-3941,"ない":-2488,"なが":-1313,"など":-6509,"なの":2614,"なん":3099,"にお":-1615,"にし":2748,"にな":2454,"によ":-7236,"に対":-14943,"に従":-4688,"に関":-11388,"のか":2093,"ので":-7059,"のに":-6041,"のの":-6125,"はい":1073,"はが":-1033,"はず":-2532,"ばれ":1813,"まし":-1316,"まで":-6621,"まれ":5409,"めて":-3153,"もい":2230,"もの":-10713,"らか":-944,"らし":-1611,"らに":-1897,"りし":651,"りま":1620,"れた":4270,"れて":849,"れば":4114,"ろう":6067,"われ":7901,"を通":-11877,"んだ":728,"んな":-4115,"一人":602,"一方":-1375,"一日":970,"一部":-1051,"上が":-4479,"会社":-1116,"出て":2163,"分の":-7758,"同党":970,"同日":-913,"大阪":-2471,"委員":-1250,"少な":-1050,"年度":-8669,"年間":-1626,"府県":-2363,"手権":-1982,"新聞":-4066,"日新":-722,"日本":-7068,"日米":3372,"曜日":-601,"朝鮮":-2355,"本人":-2697,"東京":-1543,"然と":-1384,"社会":-1276,"立て":-990,"第に":-1612,"米国":-4268,"11":-669}; |
|||
this.BW3__ = {"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":6521,"ず,":3426,"ず、":3426,"ずに":841,"そう":428,"た.":8875,"た。":8875,"たい":-594,"たの":812,"たり":-1183,"たる":-853,"だ.":4098,"だ。":4098,"だっ":1004,"った":-4748,"って":300,"てい":6240,"てお":855,"ても":302,"です":1437,"でに":-1482,"では":2295,"とう":-1387,"とし":2266,"との":541,"とも":-3543,"どう":4664,"ない":1796,"なく":-903,"など":2135,"に,":-1021,"に、":-1021,"にし":1771,"にな":1906,"には":2644,"の,":-724,"の、":-724,"の子":-1000,"は,":1337,"は、":1337,"べき":2181,"まし":1113,"ます":6943,"まっ":-1549,"まで":6154,"まれ":-793,"らし":1479,"られ":6820,"るる":3818,"れ,":854,"れ、":854,"れた":1850,"れて":1375,"れば":-3246,"れる":1091,"われ":-605,"んだ":606,"んで":798,"カ月":990,"会議":860,"入り":1232,"大会":2217,"始め":1681,"市":965,"新聞":-5055,"日,":974,"日、":974,"社会":2024,"カ月":990}; |
|||
this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832}; |
|||
this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649}; |
|||
this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393}; |
|||
this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841}; |
|||
this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68}; |
|||
this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591}; |
|||
this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685}; |
|||
this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156}; |
|||
this.TW1__ = {"につい":-4681,"東京都":2026}; |
|||
this.TW2__ = {"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216}; |
|||
this.TW3__ = {"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287}; |
|||
this.TW4__ = {"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865}; |
|||
this.UC1__ = {"A":484,"K":93,"M":645,"O":-505}; |
|||
this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646}; |
|||
this.UC3__ = {"A":-1370,"I":2311}; |
|||
this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646}; |
|||
this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831}; |
|||
this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387}; |
|||
this.UP1__ = {"O":-214}; |
|||
this.UP2__ = {"B":69,"O":935}; |
|||
this.UP3__ = {"B":189}; |
|||
this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422}; |
|||
this.UQ2__ = {"BH":216,"BI":113,"OK":1759}; |
|||
this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212}; |
|||
this.UW1__ = {",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135}; |
|||
this.UW2__ = {",":-829,"、":-829,"〇":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978,"保":362,"入":548,"初":-3025,"副":-1566,"北":-3414,"区":-422,"大":-1769,"天":-865,"太":-483,"子":-1519,"学":760,"実":1023,"小":-2009,"市":-813,"年":-1060,"強":1067,"手":-1519,"揺":-1033,"政":1522,"文":-1355,"新":-1682,"日":-1815,"明":-1462,"最":-630,"朝":-1843,"本":-1650,"東":-931,"果":-665,"次":-2378,"民":-180,"気":-1740,"理":752,"発":529,"目":-1584,"相":-242,"県":-1165,"立":-763,"第":810,"米":509,"自":-1353,"行":838,"西":-744,"見":-3874,"調":1010,"議":1198,"込":3041,"開":1758,"間":-1257,"「":-645,"」":3145,"ッ":831,"ア":-587,"カ":306,"キ":568}; |
|||
this.UW3__ = {",":4889,"1":-800,"−":-1723,"、":4889,"々":-2311,"〇":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":2773,"わ":-1207,"を":6620,"ん":-518,"ア":551,"グ":1319,"ス":874,"ッ":-1350,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278,"・":-3794,"一":-1619,"下":-1759,"世":-2087,"両":3815,"中":653,"主":-758,"予":-1193,"二":974,"人":2742,"今":792,"他":1889,"以":-1368,"低":811,"何":4265,"作":-361,"保":-2439,"元":4858,"党":3593,"全":1574,"公":-3030,"六":755,"共":-1880,"円":5807,"再":3095,"分":457,"初":2475,"別":1129,"前":2286,"副":4437,"力":365,"動":-949,"務":-1872,"化":1327,"北":-1038,"区":4646,"千":-2309,"午":-783,"協":-1006,"口":483,"右":1233,"各":3588,"合":-241,"同":3906,"和":-837,"員":4513,"国":642,"型":1389,"場":1219,"外":-241,"妻":2016,"学":-1356,"安":-423,"実":-1008,"家":1078,"小":-513,"少":-3102,"州":1155,"市":3197,"平":-1804,"年":2416,"広":-1030,"府":1605,"度":1452,"建":-2352,"当":-3885,"得":1905,"思":-1291,"性":1822,"戸":-488,"指":-3973,"政":-2013,"教":-1479,"数":3222,"文":-1489,"新":1764,"日":2099,"旧":5792,"昨":-661,"時":-1248,"曜":-951,"最":-937,"月":4125,"期":360,"李":3094,"村":364,"東":-805,"核":5156,"森":2438,"業":484,"氏":2613,"民":-1694,"決":-1073,"法":1868,"海":-495,"無":979,"物":461,"特":-3850,"生":-273,"用":914,"町":1215,"的":7313,"直":-1835,"省":792,"県":6293,"知":-1528,"私":4231,"税":401,"立":-960,"第":1201,"米":7767,"系":3066,"約":3663,"級":1384,"統":-4229,"総":1163,"線":1255,"者":6457,"能":725,"自":-2869,"英":785,"見":1044,"調":-562,"財":-733,"費":1777,"車":1835,"軍":1375,"込":-1504,"通":-1136,"選":-681,"郎":1026,"郡":4404,"部":1200,"金":2163,"長":421,"開":-1432,"間":1302,"関":-1282,"雨":2009,"電":-1045,"非":2066,"駅":1620,"1":-800,"」":2670,"・":-3794,"ッ":-1350,"ア":551,"グ":1319,"ス":874,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278}; |
|||
this.UW4__ = {",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"〇":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":1464,"ま":1051,"み":-2082,"む":-882,"め":-5046,"も":4169,"ゃ":-2666,"や":2795,"ょ":-1544,"よ":3351,"ら":-2922,"り":-9726,"る":-14896,"れ":-2613,"ろ":-4570,"わ":-1783,"を":13150,"ん":-2352,"カ":2145,"コ":1789,"セ":1287,"ッ":-724,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637,"・":-4371,"ー":-11870,"一":-2069,"中":2210,"予":782,"事":-190,"井":-1768,"人":1036,"以":544,"会":950,"体":-1286,"作":530,"側":4292,"先":601,"党":-2006,"共":-1212,"内":584,"円":788,"初":1347,"前":1623,"副":3879,"力":-302,"動":-740,"務":-2715,"化":776,"区":4517,"協":1013,"参":1555,"合":-1834,"和":-681,"員":-910,"器":-851,"回":1500,"国":-619,"園":-1200,"地":866,"場":-1410,"塁":-2094,"士":-1413,"多":1067,"大":571,"子":-4802,"学":-1397,"定":-1057,"寺":-809,"小":1910,"屋":-1328,"山":-1500,"島":-2056,"川":-2667,"市":2771,"年":374,"庁":-4556,"後":456,"性":553,"感":916,"所":-1566,"支":856,"改":787,"政":2182,"教":704,"文":522,"方":-856,"日":1798,"時":1829,"最":845,"月":-9066,"木":-485,"来":-442,"校":-360,"業":-1043,"氏":5388,"民":-2716,"気":-910,"沢":-939,"済":-543,"物":-735,"率":672,"球":-1267,"生":-1286,"産":-1101,"田":-2900,"町":1826,"的":2586,"目":922,"省":-3485,"県":2997,"空":-867,"立":-2112,"第":788,"米":2937,"系":786,"約":2171,"経":1146,"統":-1169,"総":940,"線":-994,"署":749,"者":2145,"能":-730,"般":-852,"行":-792,"規":792,"警":-1184,"議":-244,"谷":-1000,"賞":730,"車":-1481,"軍":1158,"輪":-1433,"込":-3370,"近":929,"道":-1291,"選":2596,"郎":-4866,"都":1192,"野":-1100,"銀":-2213,"長":357,"間":-2344,"院":-2297,"際":-2604,"電":-878,"領":-1659,"題":-792,"館":-1984,"首":1749,"高":2120,"「":1895,"」":3798,"・":-4371,"ッ":-724,"ー":-11870,"カ":2145,"コ":1789,"セ":1287,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637}; |
|||
this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区":-901,"告":848,"員":2104,"大":-1296,"学":-548,"定":1785,"嵐":-1304,"市":-2991,"席":921,"年":1763,"思":872,"所":-814,"挙":1618,"新":-1682,"日":218,"月":-4353,"査":932,"格":1356,"機":-1508,"氏":-1347,"田":240,"町":-3912,"的":-3149,"相":1319,"省":-1052,"県":-4003,"研":-997,"社":-278,"空":-813,"統":1955,"者":-2233,"表":663,"語":-1073,"議":1219,"選":-1018,"郎":-368,"長":786,"間":1191,"題":2368,"館":-689,"1":-514,"E2":-32768,"「":363,"イ":241,"ル":451,"ン":-343}; |
|||
this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"1":-270,"E1":306,"ル":-673,"ン":-496}; |
|||
|
|||
return this; |
|||
} |
|||
TinySegmenter.prototype.ctype_ = function(str) { |
|||
for (var i in this.chartype_) { |
|||
if (str.match(this.chartype_[i][0])) { |
|||
return this.chartype_[i][1]; |
|||
} |
|||
} |
|||
return "O"; |
|||
} |
|||
|
|||
TinySegmenter.prototype.ts_ = function(v) { |
|||
if (v) { return v; } |
|||
return 0; |
|||
} |
|||
|
|||
TinySegmenter.prototype.segment = function(input) { |
|||
if (input == null || input == undefined || input == "") { |
|||
return []; |
|||
} |
|||
var result = []; |
|||
var seg = ["B3","B2","B1"]; |
|||
var ctype = ["O","O","O"]; |
|||
var o = input.split(""); |
|||
for (i = 0; i < o.length; ++i) { |
|||
seg.push(o[i]); |
|||
ctype.push(this.ctype_(o[i])) |
|||
} |
|||
seg.push("E1"); |
|||
seg.push("E2"); |
|||
seg.push("E3"); |
|||
ctype.push("O"); |
|||
ctype.push("O"); |
|||
ctype.push("O"); |
|||
var word = seg[3]; |
|||
var p1 = "U"; |
|||
var p2 = "U"; |
|||
var p3 = "U"; |
|||
for (var i = 4; i < seg.length - 3; ++i) { |
|||
var score = this.BIAS__; |
|||
var w1 = seg[i-3]; |
|||
var w2 = seg[i-2]; |
|||
var w3 = seg[i-1]; |
|||
var w4 = seg[i]; |
|||
var w5 = seg[i+1]; |
|||
var w6 = seg[i+2]; |
|||
var c1 = ctype[i-3]; |
|||
var c2 = ctype[i-2]; |
|||
var c3 = ctype[i-1]; |
|||
var c4 = ctype[i]; |
|||
var c5 = ctype[i+1]; |
|||
var c6 = ctype[i+2]; |
|||
score += this.ts_(this.UP1__[p1]); |
|||
score += this.ts_(this.UP2__[p2]); |
|||
score += this.ts_(this.UP3__[p3]); |
|||
score += this.ts_(this.BP1__[p1 + p2]); |
|||
score += this.ts_(this.BP2__[p2 + p3]); |
|||
score += this.ts_(this.UW1__[w1]); |
|||
score += this.ts_(this.UW2__[w2]); |
|||
score += this.ts_(this.UW3__[w3]); |
|||
score += this.ts_(this.UW4__[w4]); |
|||
score += this.ts_(this.UW5__[w5]); |
|||
score += this.ts_(this.UW6__[w6]); |
|||
score += this.ts_(this.BW1__[w2 + w3]); |
|||
score += this.ts_(this.BW2__[w3 + w4]); |
|||
score += this.ts_(this.BW3__[w4 + w5]); |
|||
score += this.ts_(this.TW1__[w1 + w2 + w3]); |
|||
score += this.ts_(this.TW2__[w2 + w3 + w4]); |
|||
score += this.ts_(this.TW3__[w3 + w4 + w5]); |
|||
score += this.ts_(this.TW4__[w4 + w5 + w6]); |
|||
score += this.ts_(this.UC1__[c1]); |
|||
score += this.ts_(this.UC2__[c2]); |
|||
score += this.ts_(this.UC3__[c3]); |
|||
score += this.ts_(this.UC4__[c4]); |
|||
score += this.ts_(this.UC5__[c5]); |
|||
score += this.ts_(this.UC6__[c6]); |
|||
score += this.ts_(this.BC1__[c2 + c3]); |
|||
score += this.ts_(this.BC2__[c3 + c4]); |
|||
score += this.ts_(this.BC3__[c4 + c5]); |
|||
score += this.ts_(this.TC1__[c1 + c2 + c3]); |
|||
score += this.ts_(this.TC2__[c2 + c3 + c4]); |
|||
score += this.ts_(this.TC3__[c3 + c4 + c5]); |
|||
score += this.ts_(this.TC4__[c4 + c5 + c6]); |
|||
// score += this.ts_(this.TC5__[c4 + c5 + c6]);
|
|||
score += this.ts_(this.UQ1__[p1 + c1]); |
|||
score += this.ts_(this.UQ2__[p2 + c2]); |
|||
score += this.ts_(this.UQ3__[p3 + c3]); |
|||
score += this.ts_(this.BQ1__[p2 + c2 + c3]); |
|||
score += this.ts_(this.BQ2__[p2 + c3 + c4]); |
|||
score += this.ts_(this.BQ3__[p3 + c2 + c3]); |
|||
score += this.ts_(this.BQ4__[p3 + c3 + c4]); |
|||
score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]); |
|||
score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]); |
|||
score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]); |
|||
score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]); |
|||
var p = "O"; |
|||
if (score > 0) { |
|||
result.push(word); |
|||
word = ""; |
|||
p = "B"; |
|||
} |
|||
p1 = p2; |
|||
p2 = p3; |
|||
p3 = p; |
|||
word += seg[i]; |
|||
} |
|||
result.push(word); |
|||
|
|||
return result; |
|||
} |
|||
|
|||
lunr.TinySegmenter = TinySegmenter; |
|||
}; |
|||
|
|||
})); |
|||
@ -0,0 +1 @@ |
|||
{"version":3,"sources":["src/assets/stylesheets/palette/_scheme.scss","../../../src/assets/stylesheets/palette.scss","src/assets/stylesheets/palette/_accent.scss","src/assets/stylesheets/palette/_primary.scss","src/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"AA2BA,cAGE,6BAKE,YAAA,CAGA,mDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CACA,mDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CAGA,gDAAA,CACA,gDAAA,CAGA,uCAAA,CACA,iCAAA,CACA,kCAAA,CACA,mCAAA,CACA,mCAAA,CACA,kCAAA,CACA,iCAAA,CACA,+CAAA,CACA,6DAAA,CACA,gEAAA,CACA,4DAAA,CACA,4DAAA,CACA,6DAAA,CAGA,6CAAA,CAGA,+CAAA,CAGA,2CAAA,CAGA,uDAAA,CACA,6DAAA,CACA,2DAAA,CAGA,yDAAA,CAGA,mDAAA,CACA,mDAAA,CAGA,qDAAA,CACA,wDAAA,CAGA,wEAAA,CAKA,yEAAA,CAKA,yECxDF,CD6DE,kHAEE,YC3DJ,CD+DE,gHAEE,eC7DJ,CDoFE,yDACE,4BClFJ,CDiFE,2DACE,4BC/EJ,CD8EE,gEACE,4BC5EJ,CD2EE,2DACE,4BCzEJ,CDwEE,yDACE,4BCtEJ,CDqEE,0DACE,4BCnEJ,CDkEE,gEACE,4BChEJ,CD+DE,0DACE,4BC7DJ,CD4DE,2OACE,4BCjDJ,CDwDA,+FAGE,iCCtDF,CACF,CCjDE,2BACE,4BAAA,CACA,oDAAA,CAOE,yBAAA,CACA,8CD6CN,CCvDE,4BACE,4BAAA,CACA,mDAAA,CAOE,yBAAA,CACA,8CDoDN,CC9DE,8BACE,4BAAA,CACA,qDAAA,CAOE,yBAAA,CACA,8CD2DN,CCrEE,mCACE,4BAAA,CACA,qDAAA,CAOE,yBAAA,CACA,8CDkEN,CC5EE,8BACE,4BAAA,CACA,qDAAA,CAOE,yBAAA,CACA,8CDyEN,CCnFE,4BACE,4BAAA,CACA,qDAAA,CAOE,yBAAA,CACA,8CDgFN,CC1FE,kCACE,4BAAA,CACA,oDAAA,CAOE,yBAAA,CACA,8CDuFN,CCjGE,4BACE,4BAAA,CACA,oDAAA,CAOE,yBAAA,CACA,8CD8FN,CCxGE,4BACE,4BAAA,CACA,oDAAA,CAOE,yBAAA,CACA,8CDqGN,CC/GE,6BACE,4BAAA,CACA,mDAAA,CAOE,yBAAA,CACA,8CD4GN,CCtHE,mCACE,4BAAA,CACA,oDAAA,CAOE,yBAAA,CACA,8CDmHN,CC7HE,4BACE,4BAAA,CACA,oDAAA,CAIE,oCAAA,CACA,2CD6HN,CCpIE,8BACE,4BAAA,CACA,oDAAA,CAIE,oCAAA,CACA,2CDoIN,CC3IE,6BACE,yBAAA,CACA,oDAAA,CAIE,oCAAA,CACA,2CD2IN,CClJE,8BACE,4BAAA,CACA,oDAAA,CAIE,oCAAA,CACA,2CDkJN,CCzJE,mCACE,4BAAA,CACA,qDAAA,CAOE,yBAAA,CACA,8CDsJN,CE3JE,4BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFwJN,CEnKE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFgKN,CE3KE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFwKN,CEnLE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFgLN,CE3LE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFwLN,CEnME,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFgMN,CE3ME,mCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFwMN,CEnNE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFgNN,CE3NE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFwNN,CEnOE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFgON,CE3OE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFwON,CEnPE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,qCAAA,CACA,4CFmPN,CE3PE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,qCAAA,CACA,4CF2PN,CEnQE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,qCAAA,CACA,4CFmQN,CE3QE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,qCAAA,CACA,4CF2QN,CEnRE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFgRN,CE3RE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CFwRN,CEnSE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CAAA,CAKA,4BF4RN,CE5SE,kCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,+CAAA,CAKA,4BFqSN,CEtRE,sEACE,4BFyRJ,CE1RE,+DACE,4BF6RJ,CE9RE,iEACE,4BFiSJ,CElSE,gEACE,4BFqSJ,CEtSE,iEACE,4BFySJ,CEhSA,8BACE,0BAAA,CACA,+CAAA,CACA,2CAAA,CACA,qCAAA,CACA,4CAAA,CAGA,4BFiSF,CGrMI,mCDtFA,+CACE,gCF8RJ,CE3RI,qDACE,gCF6RN,CExRE,iEACE,qBF0RJ,CACF,CGhNI,sCDnEA,uCACE,0CFsRJ,CACF,CE7QA,8BACE,0BAAA,CACA,4CAAA,CACA,gCAAA,CACA,0BAAA,CACA,+CAAA,CAGA,4BF8QF,CE3QE,yCACE,qBF6QJ,CG9MI,wCDxDA,8CACE,gCFyQJ,CACF,CGtOI,mCD5BA,+CACE,oCFqQJ,CElQI,qDACE,mCFoQN,CACF,CG3NI,wCDjCA,iFACE,qBF+PJ,CACF,CGnPI,sCDLA,uCACE,qBF2PJ,CACF","file":"palette.css"} |
|||
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 55 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 54 KiB |
|
After Width: | Height: | Size: 8.2 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 45 KiB |
|
After Width: | Height: | Size: 76 KiB |
@ -0,0 +1,103 @@ |
|||
<?xml version="1.0" encoding="UTF-8"?> |
|||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/about/contact-us/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/about/license/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/about/release-notes/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/deploy/docker/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/deploy/github/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/extension/MagicodesIE/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/extension/%E7%BB%9F%E4%B8%80%E8%BF%94%E5%9B%9E%E5%80%BC%E6%A0%BC%E5%BC%8F/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/getting-started/contributing/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/getting-started/introduction/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/getting-started/quick-start/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/infrastructure/config/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/infrastructure/freesql/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/infrastructure/frontend/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/modules/dic/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/modules/file/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/modules/identity/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/modules/setting/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/modules/signalr/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
<url> |
|||
<loc>http://cap.dotnetcore.xyz/user-guide/zh/problem/problem/</loc> |
|||
<lastmod>2022-08-06</lastmod> |
|||
<changefreq>daily</changefreq> |
|||
</url> |
|||
</urlset> |
|||