[
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.md",
    "content": "---\nname: Bug report\nabout: Create a report to help us improve\ntitle: ''\nlabels: ''\nassignees: ''\n\n---\n\n**Describe the bug**\nA clear and concise description of what the bug is.\n\n**To Reproduce**\nSteps to reproduce the behavior:\n1. Go to '...'\n2. Click on '....'\n3. Scroll down to '....'\n4. See error\n\n**Expected behavior**\nA clear and concise description of what you expected to happen.\n\n**Screenshots**\nIf applicable, add screenshots to help explain your problem.\n\n**Desktop (please complete the following information):**\n - OS: [e.g. iOS]\n - Browser [e.g. chrome, safari]\n - Version [e.g. 22]\n\n**Smartphone (please complete the following information):**\n - Device: [e.g. iPhone6]\n - OS: [e.g. iOS8.1]\n - Browser [e.g. stock browser, safari]\n - Version [e.g. 22]\n\n**Additional context**\nAdd any other context about the problem here.\n"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "content": "blank_issues_enabled: true\ncontact_links:\n  - name: 🆕 Create new issue\n    url: http://new-issue.go-admin.dev\n    about: The issue which is not created via http://new-issue.go-admin.dev will be closed immediately.\n  - name: 🆕 创建一个新 Issue\n    url: http://new-issue.go-admin.dev\n    about: 不是用 http://new-issue.go-admin.dev 创建的 issue 会被机器人自动关闭。\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE/pr_cn.md",
    "content": "<!--\n首先，感谢你的贡献！😄\n\n新特性请提交至 feature 分支，其余可提交至 master 分支。\n在维护者审核通过后会合并。\n请确保填写以下 pull request 的信息，谢谢！~\n-->\n\n[[English Template / 英文模板](https://github.com/go-admin-team/go-admin/blob/master/.github/PULL_REQUEST_TEMPLATE.md)]\n\n### 🤔 这个变动的性质是？\n\n- [ ] 新特性提交\n- [ ] 日常 bug 修复\n- [ ] 站点、文档改进\n- [ ] 演示代码改进\n- [ ] 组件样式/交互改进\n- [ ] TypeScript 定义更新\n- [ ] 包体积优化\n- [ ] 性能优化\n- [ ] 功能增强\n- [ ] 国际化改进\n- [ ] 重构\n- [ ] 代码风格优化\n- [ ] 测试用例\n- [ ] 分支合并\n- [ ] 其他改动（是关于什么的改动？）\n\n### 🔗 相关 Issue\n\n<!--\n1. 描述相关需求的来源，如相关的 issue 讨论链接。\n-->\n\n### 💡 需求背景和解决方案\n\n<!--\n1. 要解决的具体问题。\n2. 列出最终的 API 实现和用法。\n3. 涉及UI/交互变动需要有截图或 GIF。\n-->\n\n### 📝 更新日志\n\n<!--\n从用户角度描述具体变化，以及可能的 breaking change 和其他风险。\n-->\n\n| 语言    | 更新描述 |\n| ------- | -------- |\n| 🇺🇸 英文 |          |\n| 🇨🇳 中文 |          |\n\n### ☑️ 请求合并前的自查清单\n\n⚠️ 请自检并全部**勾选全部选项**。⚠️\n\n- [ ] 文档已补充或无须补充\n- [ ] 代码演示已提供或无须提供\n- [ ] TypeScript 定义已补充或无须补充\n- [ ] Changelog 已提供或无须提供\n"
  },
  {
    "path": ".github/PULL_REQUEST_TEMPLATE.md",
    "content": "<!--\nFirst of all, thank you for your contribution! 😄\n\nFor requesting to pull a new feature or bugfix, please send it from a feature/bugfix branch based on the `master` branch.\n\nBefore submitting your pull request, please make sure the checklist below is confirmed.\n\nYour pull requests will be merged after one of the collaborators approve.\n\nThank you!\n\n-->\n\n[[中文版模板 / Chinese template](https://github.com/go-admin-team/go-admin/blob/master/.github/PULL_REQUEST_TEMPLATE/pr_cn.md)]\n\n### 🤔 This is a ...\n\n- [ ] New feature\n- [ ] Bug fix\n- [ ] Site / documentation update\n- [ ] Demo update\n- [ ] Component style update\n- [ ] TypeScript definition update\n- [ ] Bundle size optimization\n- [ ] Performance optimization\n- [ ] Enhancement feature\n- [ ] Internationalization\n- [ ] Refactoring\n- [ ] Code style optimization\n- [ ] Test Case\n- [ ] Branch merge\n- [ ] Other (about what?)\n\n### 🔗 Related issue link\n\n<!--\n1. Put the related issue or discussion links here.\n-->\n\n### 💡 Background and solution\n\n<!--\n1. Describe the problem and the scenario.\n2. GIF or snapshot should be provided if includes UI/interactive modification.\n3. How to fix the problem, and list the final API implementation and usage sample if that is a new feature.\n-->\n\n### 📝 Changelog\n\n<!--\nDescribe changes from the user side, and list all potential break changes or other risks.\n--->\n\n| Language   | Changelog |\n| ---------- | --------- |\n| 🇺🇸 English |           |\n| 🇨🇳 Chinese |           |\n\n### ☑️ Self-Check before Merge\n\n⚠️ Please check all items below before review. ⚠️\n\n- [ ] Doc is updated/provided or not needed\n- [ ] Demo is updated/provided or not needed\n- [ ] TypeScript's definition is updated/provided or not needed\n- [ ] Changelog is provided or not needed\n"
  },
  {
    "path": ".github/workflows/build.yml",
    "content": "name: Build\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    branches: [ master ]\n\nenv:\n  IMAGE_NAME: registry.ap-northeast-1.aliyuncs.com/go-admin/go-admin-api # 镜像名称\n  TAG: ${{ github.sha }}\n  IMAGE_NAME_TAG: registry.ap-northeast-1.aliyuncs.com/go-admin/go-admin-api:${{ github.sha }}\n\njobs:\n\n  build:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions/checkout@v3\n\n      - name: Set up Go\n        uses: actions/setup-go@v3\n        with:\n          go-version: 1.24\n\n      - name: Tidy\n        run: go mod tidy\n\n      - name: Build\n        run: env CGO_ENABLED=1 GOOS=linux GOARCH=amd64 go build -tags \"sqlite3,json1\" --ldflags \"-extldflags -static\" -o main .\n\n      - name: Build the Docker image and push\n        run: |\n          docker login --username=${{ secrets.DOCKER_USERNAME }} registry.ap-northeast-1.aliyuncs.com --password=${{ secrets.DOCKER_PASSWORD }}\n          echo \"************ docker login end\"\n          docker build -t go-admin-api:latest .\n          echo \"************ docker build end\"\n          docker tag go-admin-api ${{ env.IMAGE_NAME_TAG }}\n          echo \"************ docker tag end\"\n          docker images\n          echo \"************ docker images end\"\n          docker push ${{ env.IMAGE_NAME_TAG }}  # 推送\n          echo \"************ docker push end\"\n\n      - name: Restart server   # 第五步，重启服务\n        uses: appleboy/ssh-action@master\n        env:\n          GITHUB_SHA_X: ${GITHUB_SHA}\n        with:\n          host: ${{ secrets.SSH_HOST }}  # 下面三个配置与上一步类似\n          username: ${{ secrets.SSH_USERNAME }}\n          key: ${{ secrets.DEPLOY_KEY }}\n          # 重启的脚本，根据自身情况做相应改动，一般要做的是migrate数据库以及重启服务器\n          script: |\n            sudo docker rm -f go-admin-api\n            sudo docker login --username=${{ secrets.DOCKER_USERNAME }} registry.ap-northeast-1.aliyuncs.com --password=${{ secrets.DOCKER_PASSWORD }}\n            sudo docker run -d -p 8000:8000 --name go-admin-api ${{ env.IMAGE_NAME_TAG }}\n"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "content": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [ master ]\n  pull_request:\n    # The branches below must be a subset of the branches above\n    branches: [ master ]\n\njobs:\n  analyze:\n    name: Analyze\n    runs-on: ubuntu-latest\n\n    strategy:\n      fail-fast: false\n      matrix:\n        language: [ 'go' ]\n\n    steps:\n    - name: Checkout repository\n      uses: actions/checkout@v2\n\n    # Initializes the CodeQL tools for scanning.\n    - name: Initialize CodeQL\n      uses: github/codeql-action/init@v1\n      with:\n        languages: ${{ matrix.language }}\n        # If you wish to specify custom queries, you can do so here or in a config file.\n        # By default, queries listed here will override any specified in a config file.\n        # Prefix the list here with \"+\" to use these queries and those in the config file.\n        # queries: ./path/to/local/query, your-org/your-repo/queries@main\n\n    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).\n    # If this step fails, then you should remove it and run the build manually (see below)\n    - name: Autobuild\n      uses: github/codeql-action/autobuild@v1\n\n    # ℹ️ Command-line programs to run using the OS shell.\n    # 📚 https://git.io/JvXDl\n\n    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines\n    #    and modify them (or add more) to build your code if your project\n    #    uses a compiled language\n\n    #- run: |\n    #   make bootstrap\n    #   make release\n\n    - name: Perform CodeQL Analysis\n      uses: github/codeql-action/analyze@v1\n"
  },
  {
    "path": ".github/workflows/go.yml",
    "content": "name: build\n\non:\n  push:\n    branches: [ master, dev ]\n  pull_request:\n    branches: [ master ]\nenv:\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:\n\n  build:\n    name: Build\n    runs-on: ubuntu-latest\n    steps:\n\n    - name: Set up Go 1.18\n      uses: actions/setup-go@v3\n      with:\n        go-version: 1.18\n      id: go\n\n    - name: Check out code into the Go module directory\n      uses: actions/checkout@v3\n\n    - name: Get dependencies\n      run: go mod tidy\n    - name: Build\n      run: make build\n\n    - name: Log in to the Container registry\n      uses: docker/login-action@v2\n      if: startsWith(${{github.ref}}, 'refs/tags/')\n      with:\n        registry: ${{ env.REGISTRY }}\n        username: ${{ github.actor }}\n        password: ${{ secrets.GITHUB_TOKEN }}\n\n    - name: Extract metadata (tags, labels) for Docker\n      id: meta\n      if: startsWith(${{github.ref}}, 'refs/tags/')\n      uses: docker/metadata-action@v4\n      with:\n        images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}\n        flavor: |\n          latest=auto\n        tags: |\n          type=schedule\n          type=ref,event=tag\n          type=sha,prefix=,format=long,enable=true,priority=100\n\n    - name: Build and push Docker image\n      uses: docker/build-push-action@v3\n      if: startsWith(${{github.ref}}, 'refs/tags/')\n      with:\n        context: .\n        file: scripts/Dockerfile\n        push: true\n        tags: ${{ steps.meta.outputs.tags }}\n        labels: ${{ steps.meta.outputs.labels }}\n"
  },
  {
    "path": ".github/workflows/issue-check-inactive.yml",
    "content": "name: Issue Check Inactive\n\non:\n  schedule:\n    - cron: \"0 0 */15 * *\"\n\npermissions:\n  contents: read\n\njobs:\n  issue-check-inactive:\n    permissions:\n      issues: write  # for actions-cool/issues-helper to update issues\n      pull-requests: write  # for actions-cool/issues-helper to update PRs\n    runs-on: ubuntu-latest\n    steps:\n      - name: check-inactive\n        uses: actions-cool/issues-helper@v3\n        with:\n          actions: 'check-inactive'\n          inactive-label: 'Inactive'\n          inactive-day: 30\n"
  },
  {
    "path": ".github/workflows/issue-close-require.yml",
    "content": "name: Issue Close Require\n\non:\n  schedule:\n    - cron: \"0 0 * * *\"\n\npermissions:\n  contents: read\n\njobs:\n  issue-close-require:\n    permissions:\n      issues: write  # for actions-cool/issues-helper to update issues\n      pull-requests: write  # for actions-cool/issues-helper to update PRs\n    runs-on: ubuntu-latest\n    steps:\n      - name: need reproduce\n        uses: actions-cool/issues-helper@v3\n        with:\n          actions: 'close-issues'\n          labels: '🤔 Need Reproduce'\n          inactive-day: 3\n\n      - name: needs more info\n        uses: actions-cool/issues-helper@v3\n        with:\n          actions: 'close-issues'\n          labels: 'needs-more-info'\n          inactive-day: 3\n          body: |\n            Since the issue was labeled with `needs-more-info`, but no response in 3 days. This issue will be closed. If you have any questions, you can comment and reply.\n            由于该 issue 被标记为需要更多信息，却 3 天未收到回应。现关闭 issue，若有任何问题，可评论回复。\n"
  },
  {
    "path": ".github/workflows/issue-labeled.yml",
    "content": "# Origin Source\n# https://github.com/ant-design/ant-design/blob/79f566b7f8abb1012ef55b0d2793bfdf5595b85d/.github/workflows/issue-reply.yml\nname: Issue Labeled\n\non:\n  issues:\n    types: [labeled]\n\npermissions:\n  contents: read\n\njobs:\n  issue-labeled:\n    permissions:\n      issues: write  # for actions-cool/issues-helper to update issues\n      pull-requests: write  # for actions-cool/issues-helper to update PRs\n    runs-on: ubuntu-latest\n    steps:\n      - name: help wanted\n        if: github.event.label.name == 'help wanted'\n        uses: actions-cool/issues-helper@v3\n        with:\n          actions: 'create-comment'\n          token: ${{ secrets.ADMIN_TOKEN }}\n          issue-number: ${{ github.event.issue.number }}\n          body: |\n            Hello @${{ github.event.issue.user.login }}. We totally like your proposal/feedback, welcome to [send us a Pull Request](https://help.github.com/en/articles/creating-a-pull-request) for it. Please send your Pull Request to proper branch (feature branch for the new feature, master for bugfix and other changes), fill the [Pull Request Template](https://github.com/go-admin-team/go-admin/blob/master/.github/PULL_REQUEST_TEMPLATE.md) here, provide changelog/TypeScript/documentation/test cases if needed and make sure CI passed, we will review it soon. We appreciate your effort in advance and looking forward to your contribution!\n            你好 @${{ github.event.issue.user.login }}，我们完全同意你的提议/反馈，欢迎直接在此仓库 [创建一个 Pull Request](https://help.github.com/en/articles/creating-a-pull-request) 来解决这个问题。请将 Pull Request 发到正确的分支（新特性发到 feature 分支，其他发到 master 分支），务必填写 Pull Request 内的[预设模板](https://github.com/go-admin-team/go-admin/blob/master/.github/PULL_REQUEST_TEMPLATE.md)，提供改动所需相应的 changelog、TypeScript 定义、测试用例、文档等，并确保 CI 通过，我们会尽快进行 Review，提前感谢和期待您的贡献。\n            ![giphy](https://user-images.githubusercontent.com/507615/62342668-4735dc00-b51a-11e9-92a7-d46fbb1cc0c7.gif)\n      - name: 🤔 Need Reproduce\n        if: github.event.label.name == '🤔 Need Reproduce'\n        uses: actions-cool/issues-helper@v3\n        with:\n          actions: 'create-comment'\n          token: ${{ secrets.ADMIN_TOKEN }}\n          issue-number: ${{ github.event.issue.number }}\n          body: |\n            Hello @${{ github.event.issue.user.login }}. Please provide a online reproduction by forking this link https://u.ant.design/codesandbox-repro or a minimal GitHub repository. Issues labeled by `Need Reproduce` will be closed if no activities in 3 days.\n            你好 @${{ github.event.issue.user.login }}, 我们需要你提供一个在线的重现实例以便于我们帮你排查问题。你可以通过点击 [此处](https://u.ant.design/codesandbox-repro) 创建一个 codesandbox 或者提供一个最小化的 GitHub 仓库。3 天内未跟进此 issue 将会被自动关闭。\n            ![](https://gw.alipayobjects.com/zos/antfincdn/y9kwg7DVCd/reproduce.gif)\n      - name: Usage\n        if: github.event.label.name == 'Usage' || github.event.label.name == 'Question'\n        uses: actions-cool/issues-helper@v3\n        with:\n          actions: 'create-comment,close-issue'\n          token: ${{ secrets.ADMIN_TOKEN }}\n          issue-number: ${{ github.event.issue.number }}\n          body: |\n            Hello @${{ github.event.issue.user.login }}, we use GitHub issues to trace bugs or discuss plans of Ant Design. So, please [don't ask usage questions](https://github.com/ant-design/ant-design/issues/2320) here. You can try to open a new discussion in [antd discussions](https://github.com/ant-design/ant-design/discussions), select `Q&A` to ask questions, also can ask questions on [Stack Overflow](https://stackoverflow.com/questions/tagged/antd) or [Segment Fault](https://segmentfault.com/t/antd), then apply tag `antd` and `react` to your question.\n            你好 @${{ github.event.issue.user.login }}，go-admin Issue 板块是用于 bug 反馈与需求讨论的地方。请[勿询问如何使用的问题](https://github.com/go-admin-te/ant-design/issues/699)，你可以试着在 [antd discussions](https://github.com/ant-design/ant-design/discussions) 新开一个 discussion，选择 `Q&A` 类别进行提问，也可以在 [Stack Overflow](https://stackoverflow.com/questions/tagged/antd) 或者 [Segment Fault](https://segmentfault.com/t/antd) 中提问（记得添加 `antd` 和 `react` 标签哦~）。\n      - name: 3.x\n        if: github.event.label.name == '3.x'\n        uses: actions-cool/issues-helper@v3\n        with:\n          actions: 'create-comment,close-issue'\n          token: ${{ secrets.ADMIN_TOKEN }}\n          issue-number: ${{ github.event.issue.number }}\n          body: |\n            Hi @${{ github.event.issue.user.login }}. Current version (3.x) is off the maintenance period. We may not accept pull request or fix bug with it anymore. This topic will be auto closed.\n            你好 @${{ github.event.issue.user.login }}，当前版本（3.x）已经过了维护期。我们不会再接受对其的相关 PR 与 issue。当前 topic 会被自动关闭。\n      - name: invalid\n        if: github.event.label.name == 'Invalid'\n        uses: actions-cool/issues-helper@v3\n        with:\n          actions: 'create-comment,close-issue'\n          token: ${{ secrets.ADMIN_TOKEN }}\n          issue-number: ${{ github.event.issue.number }}\n          body: |\n            Hello @${{ github.event.issue.user.login }}, your issue has been closed because it does not conform to our issue requirements. Please use the [Issue Helper](https://new-issue.go-admin.dev) to create an issue, thank you!\n            你好 @${{ github.event.issue.user.login }}，为了能够进行高效沟通，我们对 issue 有一定的格式要求，你的 issue 因为不符合要求而被自动关闭。你可以通过 [issue 助手](https://new-issue.go-admin.dev) 来创建 issue 以方便我们定位错误。谢谢配合！\n      - name: rtl\n        if: github.event.label.name == 'rtl'\n        uses: actions-cool/issues-helper@v3\n        with:\n          actions: 'add-assignees'\n          assignees: 'xrkffgg'\n"
  },
  {
    "path": ".github/workflows/mirror.yaml",
    "content": "name: 'GitHub Actions Mirror'\n\non: [push, delete]\n\njobs:\n  mirror_to_gitee:\n    runs-on: ubuntu-latest\n    steps:\n      - name: 'Checkout'\n        uses: actions/checkout@v1\n      - name: 'Mirror to gitee'\n        uses: pixta-dev/repository-mirroring-action@v1\n        with:\n          target_repo_url:\n            git@gitee.com:go-admin-team/go-admin.git\n          ssh_private_key:\n            ${{ secrets.GITEE_KEY }}\n  mirror_to_gitlab:\n    runs-on: ubuntu-latest\n    steps:\n      - name: 'Checkout'\n        uses: actions/checkout@v1\n      - name: 'Mirror to gitlab'\n        uses: pixta-dev/repository-mirroring-action@v1\n        with:\n          target_repo_url:\n            git@gitlab.com:go-admin-team/go-admin.git\n          ssh_private_key:\n            ${{ secrets.GITLAB_KEY }}\n"
  },
  {
    "path": ".gitignore",
    "content": ".idea\n.vscode\n*/.DS_Store\nstatic/uploadfile\nmain.exe\n*.exe\ngo-admin\ngo-admin.exe\ntemp/\n!temp\nvendor\nconfig/settings.dev.yml\nconfig/settings.dev.*.yml\nconfig/settings.dev.*.yml.log\ntemp/logs\nconfig/settings.dev.yml.log\nconfig/settings.b.dev.yml\ncmd/migrate/migration/version-local/*\n!cmd/migrate/migration/version-local/doc.go\n\n# go sum\ngo.sum\nconfig/settings.deva.yml\n"
  },
  {
    "path": "Dockerfile",
    "content": "FROM alpine\n\n# ENV GOPROXY https://goproxy.cn/\n\nRUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories\n\nRUN apk update --no-cache\nRUN apk add --update gcc g++ libc6-compat\nRUN apk add --no-cache ca-certificates\nRUN apk add --no-cache tzdata\nENV TZ Asia/Shanghai\n\nCOPY ./main /main\nCOPY ./config/settings.demo.yml /config/settings.yml\nCOPY ./go-admin-db.db /go-admin-db.db\nEXPOSE 8000\nRUN  chmod +x /main\nCMD [\"/main\",\"server\",\"-c\", \"/config/settings.yml\"]"
  },
  {
    "path": "Dockerfilebak",
    "content": "FROM golang:alpine as builder\n\nMAINTAINER lwnmengjing\n\nENV GOPROXY https://goproxy.cn/\n\nWORKDIR /go/release\n#RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories\nRUN apk update && apk add tzdata\n\nCOPY go.mod ./go.mod\nRUN go mod tidy\nCOPY . .\nRUN pwd && ls\n\nRUN CGO_ENABLED=0 GOOS=linux go build -ldflags=\"-w -s\" -a -installsuffix cgo -o go-admin .\n\nFROM alpine\n\nCOPY --from=builder /go/release/go-admin /\n\nCOPY --from=builder /go/release/config/settings.yml /config/settings.yml\n\nCOPY --from=builder /usr/share/zoneinfo/Asia/Shanghai /etc/localtime\n\nEXPOSE 8000\n\nCMD [\"/go-admin\",\"server\",\"-c\", \"/config/settings.yml\"]"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2020 go-admin-team\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Makefile",
    "content": "PROJECT:=go-admin\n\n.PHONY: build\nbuild:\n\tCGO_ENABLED=0 go build -ldflags=\"-w -s\" -a -installsuffix \"\" -o go-admin .\n\n# make build-linux\nbuild-linux:\n\t@docker build -t go-admin:latest .\n\t@echo \"build successful\"\n\nbuild-sqlite:\n\tgo build -tags sqlite3 -ldflags=\"-w -s\" -a -installsuffix -o go-admin .\n\n# make run\nrun:\n    # delete go-admin-api container\n\t@if [ $(shell docker ps -aq --filter name=go-admin --filter publish=8000) ]; then docker rm -f go-admin; fi\n\n    # 启动方法一 run go-admin-api container  docker-compose 启动方式\n    # 进入到项目根目录 执行 make run 命令\n\t@docker-compose up -d\n\n\t# 启动方式二 docker run  这里注意-v挂载的宿主机的地址改为部署时的实际决对路径\n    #@docker run --name=go-admin -p 8000:8000 -v /home/code/go/src/go-admin/go-admin/config:/go-admin-api/config  -v /home/code/go/src/go-admin/go-admin-api/static:/go-admin/static -v /home/code/go/src/go-admin/go-admin/temp:/go-admin-api/temp -d --restart=always go-admin:latest\n\n\t@echo \"go-admin service is running...\"\n\n\t# delete Tag=<none> 的镜像\n\t@docker image prune -f\n\t@docker ps -a | grep \"go-admin\"\n\nstop:\n    # delete go-admin-api container\n\t@if [ $(shell docker ps -aq --filter name=go-admin --filter publish=8000) ]; then docker-compose down; fi\n\t#@if [ $(shell docker ps -aq --filter name=go-admin --filter publish=8000) ]; then docker rm -f go-admin; fi\n\t#@echo \"go-admin stop success\"\n\n\n#.PHONY: test\n#test:\n#\tgo test -v ./... -cover\n\n#.PHONY: docker\n#docker:\n#\tdocker build . -t go-admin:latest\n\n# make deploy\ndeploy:\n\n\t#@git checkout master\n\t#@git pull origin master\n\tmake build-linux\n\tmake run\n"
  },
  {
    "path": "README.Zh-cn.md",
    "content": "# go-admin\n\n  <img align=\"right\" width=\"320\" src=\"https://doc-image.zhangwj.com/img/go-admin.svg\">\n\n\n[![Build Status](https://github.com/wenjianzhang/go-admin/workflows/build/badge.svg)](https://github.com/go-admin-team/go-admin)\n[![Release](https://img.shields.io/github/release/go-admin-team/go-admin.svg?style=flat-square)](https://github.com/go-admin-team/go-admin/releases)\n[![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/go-admin-team/go-admin)\n\n[English](https://github.com/go-admin-team/go-admin/blob/master/README.md) | 简体中文\n\n基于Gin + Vue + Element UI OR Arco Design OR Ant Design的前后端分离权限管理系统,系统初始化极度简单，只需要配置文件中，修改数据库连接，系统支持多指令操作，迁移指令可以让初始化数据库信息变得更简单，服务指令可以很简单的启动api服务\n\n[在线文档](https://www.go-admin.pro)\n\n[前端项目](https://github.com/go-admin-team/go-admin-ui)\n\n[视频教程](https://space.bilibili.com/565616721/channel/detail?cid=125737)\n\n## 🎬 在线体验\n\nElement UI vue体验：[https://vue2.go-admin.dev](https://vue2.go-admin.dev/#/login)\n> ⚠️⚠️⚠️ 账号 / 密码： admin / 123456\n\nArco Design vue3 demo：[https://vue3.go-admin.dev](https://vue3.go-admin.dev/#/login)\n> ⚠️⚠️⚠️ 账号 / 密码： admin / 123456\n\nantd体验：[https://antd.go-admin.pro](https://antd.go-admin.pro/)\n> ⚠️⚠️⚠️ 账号 / 密码： admin / 123456\n\n## ✨ 特性\n\n- 遵循 RESTful API 设计规范\n\n- 基于 GIN WEB API 框架，提供了丰富的中间件支持（用户认证、跨域、访问日志、追踪ID等）\n\n- 基于Casbin的 RBAC 访问控制模型\n\n- JWT 认证\n\n- 支持 Swagger 文档(基于swaggo)\n\n- 基于 GORM 的数据库存储，可扩展多种类型数据库\n\n- 配置文件简单的模型映射，快速能够得到想要的配置\n\n- 代码生成工具\n\n- 表单构建工具\n\n- 多指令模式\n\n- 多租户的支持\n\n- TODO: 单元测试\n\n## 🎁 内置\n\n1. 多租户：系统默认支持多租户，按库分离，一个库一个租户。\n1. 用户管理：用户是系统操作者，该功能主要完成系统用户配置。\n2. 部门管理：配置系统组织机构（公司、部门、小组），树结构展现支持数据权限。\n3. 岗位管理：配置系统用户所属担任职务。\n4. 菜单管理：配置系统菜单，操作权限，按钮权限标识，接口权限等。\n5. 角色管理：角色菜单权限分配、设置角色按机构进行数据范围权限划分。\n6. 字典管理：对系统中经常使用的一些较为固定的数据进行维护。\n7. 参数管理：对系统动态配置常用参数。\n8. 操作日志：系统正常操作日志记录和查询；系统异常信息日志记录和查询。\n9. 登录日志：系统登录日志记录查询包含登录异常。\n1. 接口文档：根据业务代码自动生成相关的api接口文档。\n1. 代码生成：根据数据表结构生成对应的增删改查相对应业务，全程可视化操作，让基本业务可以零代码实现。\n1. 表单构建：自定义页面样式，拖拉拽实现页面布局。\n1. 服务监控：查看一些服务器的基本信息。\n1. 内容管理：demo功能，下设分类管理、内容管理。可以参考使用方便快速入门。\n1. 定时任务：自动化任务，目前支持接口调用和函数调用。\n\n## 准备工作\n\n你需要在本地安装 [go] [gin] [node](http://nodejs.org/) 和 [git](https://git-scm.com/) \n\n同时配套了系列教程包含视频和文档，如何从下载完成到熟练使用，强烈建议大家先看完这些教程再来实践本项目！！！\n\n### 轻松实现go-admin写出第一个应用 - 文档教程\n\n[步骤一 - 基础内容介绍](https://doc.zhangwj.com/guide/intro/tutorial01.html)\n\n[步骤二 - 实际应用 - 编写增删改查](https://doc.zhangwj.com/guide/intro/tutorial02.html)\n\n### 手把手教你从入门到放弃 - 视频教程\n\n[如何启动go-admin](https://www.bilibili.com/video/BV1z5411x7JG)\n\n[使用生成工具轻松实现业务](https://www.bilibili.com/video/BV1Dg4y1i79D)\n\n[v1.1.0版本代码生成工具-释放双手](https://www.bilibili.com/video/BV1N54y1i71P) [进阶]\n\n[多命令启动方式讲解以及IDE配置](https://www.bilibili.com/video/BV1Fg4y1q7ph)\n\n[go-admin菜单的配置说明](https://www.bilibili.com/video/BV1Wp4y1D715) [必看]\n\n[如何配置菜单信息以及接口信息](https://www.bilibili.com/video/BV1zv411B7nG) [必看]\n\n[go-admin权限配置使用说明](https://www.bilibili.com/video/BV1rt4y197d3) [必看]\n\n[go-admin数据权限使用说明](https://www.bilibili.com/video/BV1LK4y1s71e) [必看]\n\n**如有问题请先看上述使用文档和文章，若不能满足，欢迎 issue 和 pr ，视频教程和文档持续更新中**\n\n## 📦 本地开发\n\n### 环境要求\n\ngo 1.18\n\nnode版本: v14.16.0\n\nnpm版本: 6.14.11\n\n### 开发目录创建\n\n```bash\n\n# 创建开发目录\nmkdir goadmin\ncd goadmin\n```\n\n### 获取代码\n\n> 重点注意：两个项目必须放在同一文件夹下；\n\n```bash\n# 获取后端代码\ngit clone https://github.com/go-admin-team/go-admin.git\n\n# 获取前端代码\ngit clone https://github.com/go-admin-team/go-admin-ui.git\n\n```\n\n### 启动说明\n\n#### 服务端启动说明\n\n```bash\n# 进入 go-admin 后端项目\ncd ./go-admin\n\n# 更新整理依赖\ngo mod tidy\n\n# 编译项目\ngo build\n\n# 修改配置 \n# 文件路径  go-admin/config/settings.yml\nvi ./config/settings.yml\n\n# 1. 配置文件中修改数据库信息 \n# 注意: settings.database 下对应的配置数据\n# 2. 确认log路径\n```\n\n⚠️注意 在windows环境如果没有安装中CGO，会出现这个问题；\n\n```bash\nE:\\go-admin>go build\n# github.com/mattn/go-sqlite3\ncgo: exec /missing-cc: exec: \"/missing-cc\": file does not exist\n```\n\nor\n\n```bash\nD:\\Code\\go-admin>go build\n# github.com/mattn/go-sqlite3\ncgo: exec gcc: exec: \"gcc\": executable file not found in %PATH%\n```\n\n[解决cgo问题进入](https://doc.go-admin.dev/zh-CN/guide/faq#cgo-%E7%9A%84%E9%97%AE%E9%A2%98)\n\n\n#### 初始化数据库，以及服务启动\n\n``` bash\n# 首次配置需要初始化数据库资源信息\n# macOS or linux 下使用\n$ ./go-admin migrate -c config/settings.dev.yml\n\n# ⚠️注意:windows 下使用\n$ go-admin.exe migrate -c config/settings.dev.yml\n\n\n# 启动项目，也可以用IDE进行调试\n# macOS or linux 下使用\n$ ./go-admin server -c config/settings.yml\n\n\n# ⚠️注意:windows 下使用\n$ go-admin.exe server -c config/settings.yml\n```\n\n#### sys_api 表的数据如何添加\n\n在项目启动时，使用`-a true` 系统会自动添加缺少的接口数据\n```bash\n./go-admin server -c config/settings.yml -a true\n```\n\n#### 使用docker 编译启动\n\n```shell\n# 编译镜像\ndocker build -t go-admin .\n\n# 启动容器，第一个go-admin是容器名字，第二个go-admin是镜像名称\n# -v 映射配置文件 本地路径：容器路径\ndocker run --name go-admin -p 8000:8000 -v /config/settings.yml:/config/settings.yml -d go-admin-server\n```\n\n#### 文档生成\n\n```bash\ngo generate\n```\n\n#### 交叉编译\n\n```bash\n# windows\nenv GOOS=windows GOARCH=amd64 go build main.go\n\n# or\n# linux\nenv GOOS=linux GOARCH=amd64 go build main.go\n```\n\n### UI交互端启动说明\n\n```bash\n# 安装依赖\nnpm install\n\n# 建议不要直接使用 cnpm 安装依赖，会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题\nnpm install --registry=https://registry.npmmirror.com\n\n# 启动服务\nnpm run dev\n```\n\n## 📨 互动\n\n<table>\n   <tr>\n    <td><img src=\"https://raw.githubusercontent.com/wenjianzhang/image/master/img/wx.png\" width=\"180px\"></td>\n    <td><img src=\"https://doc-image.zhangwj.com/img/qrcode_for_gh_b798dc7db30c_258.jpg\" width=\"180px\"></td>\n    <td><img src=\"https://raw.githubusercontent.com/wenjianzhang/image/master/img/qq2.png\" width=\"200px\"></td>\n    <td><a href=\"https://space.bilibili.com/565616721\">wenjianzhang</a></td>\n  </tr>\n  <tr>\n    <td>微信</td>\n    <td>公众号🔥🔥🔥</td>\n    <td><a target=\"_blank\" href=\"https://shang.qq.com/wpa/qunwpa?idkey=0f2bf59f5f2edec6a4550c364242c0641f870aa328e468c4ee4b7dbfb392627b\"><img border=\"0\" src=\"https://pub.idqqimg.com/wpa/images/group.png\" alt=\"go-admin技术交流乙号\" title=\"go-admin技术交流乙号\"></a></td>\n    <td>哔哩哔哩🔥🔥🔥</td>\n  </tr>\n</table>\n\n## 💎 贡献者\n\n\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/wenjianzhang\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/3890175?v=4&h=60&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/G-Akiraka\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/45746659?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/lwnmengjing\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/12806223?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/bing127\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/31166183?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/chengxiao\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/1379545?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/NightFire0307\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/19854086?v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/appleboy\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/21979?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/ninstein\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/580303?v=4&h=60&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/kikiyou\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/17959053?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/horizonzy\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/22524871?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/Cassuis\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/48005724?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/hqcchina\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/5179057?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/nodece\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/16235121?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/stephenzhang0713\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/18169290?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/zhouxixi-dev\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/100399679?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/Jalins\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/31172582?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/wkf928592\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/6063351?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/wxxiong6\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/6983441?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/Silicon-He\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/52478309?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/GizmoOAO\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/20385106?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/bestgopher\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/36840497?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/wxb1207\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/20775558?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/misakichan\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/16569274?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/zhuxuyang\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/19301024?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/mss-boot\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/109259065?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/AuroraV\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/37330199?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/Vingurzhou\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/57127283?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/haimait\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/40926384?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/zyd\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/3446278?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/infnan\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/38274826?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/d1y\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/45585937?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/qlijin\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/515900?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/logtous\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/88697234?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/stepway\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/9927079?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/NaturalGao\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/43291304?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/DemoLiang\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/23476007?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/jfcg\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/1410597?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/Nicole0724\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/10487328?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n\n## JetBrains 开源证书支持\n\n`go-admin` 项目一直以来都是在 JetBrains 公司旗下的 GoLand 集成开发环境中进行开发，基于 **free JetBrains Open Source license(s)** 正版免费授权，在此表达我的谢意。\n\n<a href=\"https://www.jetbrains.com/?from=kubeadm-ha\" target=\"_blank\"><img src=\"https://raw.githubusercontent.com/panjf2000/illustrations/master/jetbrains/jetbrains-variant-4.png\" width=\"250\" align=\"middle\"/></a>\n\n## 🤝 特别感谢\n\n1. [ant-design](https://github.com/ant-design/ant-design)\n2. [ant-design-pro](https://github.com/ant-design/ant-design-pro)\n2. [arco-design](https://github.com/arco-design/arco-design)\n2. [arco-design-pro](https://github.com/arco-design/arco-design-pro)\n4. [gin](https://github.com/gin-gonic/gin)\n5. [casbin](https://github.com/casbin/casbin)\n6. [spf13/viper](https://github.com/spf13/viper)\n7. [gorm](https://github.com/jinzhu/gorm)\n8. [gin-swagger](https://github.com/swaggo/gin-swagger)\n9. [jwt-go](https://github.com/dgrijalva/jwt-go)\n10. [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)\n11. [ruoyi-vue](https://gitee.com/y_project/RuoYi-Vue)\n12. [form-generator](https://github.com/JakHuang/form-generator)\n\n\n## 🤟 打赏\n\n> 如果你觉得这个项目帮助到了你，你可以帮作者买一杯果汁表示鼓励 :tropical_drink:\n\n<img class=\"no-margin\" src=\"https://raw.githubusercontent.com/wenjianzhang/image/master/img/pay.png\"  height=\"200px\" >\n\n## 🤝 链接\n\n[Go开发者成长线路图](http://www.golangroadmap.com/)\n\n## 🔑 License\n\n[MIT](https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md)\n\nCopyright (c) 2024 wenjianzhang\n"
  },
  {
    "path": "README.md",
    "content": "\n# go-admin\n\n<img align=\"right\" width=\"320\" src=\"https://doc-image.zhangwj.com/img/go-admin.svg\">\n\n\n[![Build Status](https://github.com/wenjianzhang/go-admin/workflows/build/badge.svg)](https://github.com/go-admin-team/go-admin)\n[![Release](https://img.shields.io/github/release/go-admin-team/go-admin.svg?style=flat-square)](https://github.com/go-admin-team/go-admin/releases)\n[![License](https://img.shields.io/github/license/mashape/apistatus.svg)](https://github.com/go-admin-team/go-admin)\n\nEnglish | [简体中文](https://github.com/go-admin-team/go-admin/blob/master/README.Zh-cn.md)\n\nThe front-end and back-end separation authority management system based on Gin + Vue + Element UI OR Arco Design is extremely simple to initialize the system. You only need to modify the database connection in the configuration file. The system supports multi-instruction operations. Migration instructions can make it easier to initialize database information. Service instructions It's easy to start the api service.\n\n[documentation](https://www.go-admin.dev)\n\n[Front-end project](https://github.com/go-admin-team/go-admin-ui)\n\n[Video tutorial](https://space.bilibili.com/565616721/channel/detail?cid=125737)\n\n## 🎬 Online Demo\n\nElement UI vue demo：[https://vue2.go-admin.dev](https://vue2.go-admin.dev/#/login)\n> 账号 / 密码： admin / 123456\n\nArco Design vue3 demo：[https://vue3.go-admin.dev](https://vue3.go-admin.dev/#/login)\n> 账号 / 密码： admin / 123456\n\nantd demo：[https://antd.go-admin.pro](https://antd.go-admin.pro/)\n> 账号 / 密码： admin / 123456\n> \n## ✨ Feature\n\n- Follow RESTful API design specifications\n\n- Based on the GIN WEB API framework, it provides rich middleware support (user authentication, cross-domain, access log, tracking ID, etc.)\n\n- RBAC access control model based on Casbin\n\n- JWT authentication\n\n- Support Swagger documents (based on swaggo)\n\n- Database storage based on GORM, which can expand multiple types of databases\n\n- Simple model mapping of configuration files to quickly get the desired configuration\n\n- Code generation tool\n\n- Form builder\n\n- Multi-command mode\n\n- TODO: unit test\n\n\n## 🎁 Internal\n\n1. User management: The user is the system operator, this function mainly completes the system user configuration.\n2. Department management: configure the system organization (company, department, group), and display the tree structure to support data permissions.\n3. Position management: configure the positions of system users.\n4. Menu management: configure the system menu, operation authority, button authority identification, interface authority, etc.\n5. Role management: Role menu permission assignment and role setting are divided into data scope permissions by organization.\n6. Dictionary management: Maintain some relatively fixed data frequently used in the system.\n7. Parameter management: dynamically configure common parameters for the system.\n8. Operation log: system normal operation log record and query; system abnormal information log record and query.\n9. Login log: The system login log record query contains login exceptions.\n1. Interface documentation: Automatically generate related api interface documents according to the business code.\n1. Code generation: According to the data table structure, generate the corresponding addition, deletion, modification, and check corresponding business, and the whole process of visual operation, so that the basic business can be implemented with zero code.\n1. Form construction: Customize the page style, drag and drop to realize the page layout.\n1. Service monitoring: View the basic information of some servers.\n1. Content management: demo function, including classification management and content management. You can refer to the easy to use quick start.\n\n## Ready to work\n\nYou need to install locally [go] [gin] [node](http://nodejs.org/) 和 [git](https://git-scm.com/)\n\nAt the same time, a series of tutorials including videos and documents are provided. How to complete the downloading to the proficient use, it is strongly recommended that you read these tutorials before you practice this project! ! !\n\n### Easily implement go-admin to write the first application-documentation tutorial\n\n[Step 1 - basic content introduction](https://doc.zhangwj.com/guide/intro/tutorial01.html)\n\n[Step 2 - Practical application - writing database operations](https://doc.zhangwj.com/guide/intro/tutorial02.html)\n\n### Teach you from getting started to giving up-video tutorial\n\n[How to start go-admin](https://www.bilibili.com/video/BV1z5411x7JG)\n\n[Easily implement business using build tools](https://www.bilibili.com/video/BV1Dg4y1i79D)\n\n[v1.1.0 version code generation tool-free your hands](https://www.bilibili.com/video/BV1N54y1i71P) [Advanced]\n\n[Explanation of multi-command startup mode and IDE configuration](https://www.bilibili.com/video/BV1Fg4y1q7ph)\n\n[Configuration instructions for go-admin menu](https://www.bilibili.com/video/BV1Wp4y1D715) [Must see]\n\n[How to configure menu information and interface information](https://www.bilibili.com/video/BV1zv411B7nG) [Must see]\n\n[go-admin permission configuration instructions](https://www.bilibili.com/video/BV1rt4y197d3) [Must see]\n\n[Instructions for use of go-admin data permissions](https://www.bilibili.com/video/BV1LK4y1s71e) [Must see]\n\n**If you have any questions, please read the above-mentioned usage documents and articles first. If you are not satisfied, welcome to issue and pr. Video tutorials and documents are being updated continuously.**\n\n## 📦 Local development\n\n### Environmental requirements\n\ngo 1.18\n\nnodejs: v14.16.0\n\nnpm: 6.14.11\n\n### Development directory creation\n\n```bash\n\n# Create a development directory\nmkdir goadmin\ncd goadmin\n```\n\n### Get the code\n\n> Important note: the two projects must be placed in the same folder;\n\n```bash\n# Get backend code\ngit clone https://github.com/go-admin-team/go-admin.git\n\n# Get the front-end code\ngit clone https://github.com/go-admin-team/go-admin-ui.git\n\n```\n\n### Startup instructions\n\n#### Server startup instructions\n\n```bash\n# Enter the go-admin backend project\ncd ./go-admin\n\n# Update dependencies\ngo mod tidy\n\n# Compile the project\ngo build\n\n# Change setting \n# File path go-admin/config/settings.yml\nvi ./config/settings.yml\n\n# 1. Modify the database information in the configuration file\n# Note: The corresponding configuration data under settings.database\n# 2. Confirm the log path\n```\n\n:::tip ⚠️Note that this problem will occur if CGO is not installed in the windows10+ environment;\n\n```bash\nE:\\go-admin>go build\n# github.com/mattn/go-sqlite3\ncgo: exec /missing-cc: exec: \"/missing-cc\": file does not exist\n```\n\nor\n\n```bash\nD:\\Code\\go-admin>go build\n# github.com/mattn/go-sqlite3\ncgo: exec gcc: exec: \"gcc\": executable file not found in %PATH%\n```\n\n[Solve the cgo problem and enter](https://doc.go-admin.dev/guide/faq#cgo-%E7%9A%84%E9%97%AE%E9%A2%98)\n\n:::\n\n#### Initialize the database, and start the service\n\n``` bash\n# The first configuration needs to initialize the database resource information\n# Use under macOS or linux\n$ ./go-admin migrate -c config/settings.dev.yml\n\n# ⚠️Note: Use under windows\n$ go-admin.exe migrate -c config/settings.dev.yml\n\n# Start the project, you can also use the IDE for debugging\n# Use under macOS or linux\n$ ./go-admin server -c config/settings.yml\n\n# ⚠️Note: Use under windows\n$ go-admin.exe server -c config/settings.yml\n```\n\n#### Use docker to compile and start\n\n```shell\n# Compile the image\ndocker build -t go-admin .\n\n\n# Start the container, the first go-admin is the container name, and the second go-admin is the image name\n# -v Mapping configuration file Local path: container path\ndocker run --name go-admin -p 8000:8000 -v /config/settings.yml:/config/settings.yml -d go-admin-server\n```\n\n\n\n#### Generation Document\n\n```bash\ngo generate\n```\n\n#### Cross compile\n```bash\n# windows\nenv GOOS=windows GOARCH=amd64 go build main.go\n\n# or\n# linux\nenv GOOS=linux GOARCH=amd64 go build main.go\n```\n\n### UI interactive terminal startup instructions\n\n```bash\n# Installation dependencies\nnpm install   # or cnpm install\n\n# Start service\nnpm run dev\n```\n\n## 📨 Interactive\n\n<table>\n  <tr>\n    <td><img src=\"https://raw.githubusercontent.com/wenjianzhang/image/master/img/wx.png\" width=\"180px\"></td>\n    <td><img src=\"https://doc-image.zhangwj.com/img/qrcode_for_gh_b798dc7db30c_258.jpg\" width=\"180px\"></td>\n    <td><img src=\"https://raw.githubusercontent.com/wenjianzhang/image/master/img/qq2.png\" width=\"200px\"></td>\n    <td><a href=\"https://space.bilibili.com/565616721\">wenjianzhang</a></td>\n  </tr>\n  <tr>\n    <td>Wechat</td>\n    <td>Wechat公众号🔥🔥🔥</td>\n    <td><a target=\"_blank\" href=\"https://shang.qq.com/wpa/qunwpa?idkey=0f2bf59f5f2edec6a4550c364242c0641f870aa328e468c4ee4b7dbfb392627b\"><img border=\"0\" src=\"https://pub.idqqimg.com/wpa/images/group.png\" alt=\"go-admin技术交流乙号\" title=\"go-admin技术交流乙号\"></a></td>\n    <td>bilibili🔥🔥🔥</td>\n  </tr>\n</table>\n\n## 💎 Contributors\n\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/wenjianzhang\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/3890175?v=4&h=60&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/G-Akiraka\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/45746659?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/lwnmengjing\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/12806223?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/bing127\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/31166183?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/chengxiao\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/1379545?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/NightFire0307\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/19854086?v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/appleboy\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/21979?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/ninstein\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/580303?v=4&h=60&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/kikiyou\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/17959053?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/horizonzy\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/22524871?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/Cassuis\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/48005724?s=64&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/hqcchina\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/5179057?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/nodece\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/16235121?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/stephenzhang0713\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/18169290?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/zhouxixi-dev\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/100399679?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/Jalins\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/31172582?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/wkf928592\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/6063351?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/wxxiong6\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/6983441?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/Silicon-He\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/52478309?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/GizmoOAO\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/20385106?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/bestgopher\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/36840497?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/wxb1207\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/20775558?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/misakichan\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/16569274?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/zhuxuyang\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/19301024?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/mss-boot\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/109259065?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/AuroraV\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/37330199?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/Vingurzhou\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/57127283?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/haimait\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/40926384?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/zyd\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/3446278?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/infnan\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/38274826?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/d1y\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/45585937?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/qlijin\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/515900?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/logtous\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/88697234?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/stepway\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/9927079?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/NaturalGao\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/43291304?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/DemoLiang\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/23476007?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/jfcg\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/1410597?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n<span style=\"margin: 0 5px;\" ><a href=\"https://github.com/Nicole0724\n\" ><img src=\"https://images.weserv.nl/?url=avatars.githubusercontent.com/u/10487328?s=60&v=4&w=60&fit=cover&mask=circle&maxage=7d\" /></a></span>\n\n\n\n## JetBrains open source certificate support\n\nThe `go-admin` project has always been developed in the GoLand integrated development environment under JetBrains, based on the **free JetBrains Open Source license(s)** genuine free license. I would like to express my gratitude.\n\n<a href=\"https://www.jetbrains.com/?from=kubeadm-ha\" target=\"_blank\"><img src=\"https://raw.githubusercontent.com/panjf2000/illustrations/master/jetbrains/jetbrains-variant-4.png\" width=\"250\" align=\"middle\"/></a>\n\n\n## 🤝 Thanks\n\n1. [ant-design](https://github.com/ant-design/ant-design)\n2. [ant-design-pro](https://github.com/ant-design/ant-design-pro)\n2. [arco-design](https://github.com/arco-design/arco-design)\n2. [arco-design-pro](https://github.com/arco-design/arco-design-pro)\n2. [gin](https://github.com/gin-gonic/gin)\n2. [casbin](https://github.com/casbin/casbin)\n2. [spf13/viper](https://github.com/spf13/viper)\n2. [gorm](https://github.com/jinzhu/gorm)\n2. [gin-swagger](https://github.com/swaggo/gin-swagger)\n2. [jwt-go](https://github.com/dgrijalva/jwt-go)\n2. [vue-element-admin](https://github.com/PanJiaChen/vue-element-admin)\n2. [ruoyi-vue](https://gitee.com/y_project/RuoYi-Vue)\n2. [form-generator](https://github.com/JakHuang/form-generator)\n\n## 🤟 Sponsor Us\n\n> If you think this project helped you, you can buy a glass of juice for the author to show encouragement :tropical_drink:\n\n<img class=\"no-margin\" src=\"https://raw.githubusercontent.com/wenjianzhang/image/master/img/pay.png\"  height=\"200px\" >\n\n## 🤝 Link\n- [Go developer growth roadmap](http://www.golangroadmap.com/)\n- [mss-boot-io](https://docs.mss-boot-io.top/)\n\n## 🔑 License\n\n[MIT](https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md)\n\nCopyright (c) 2022 wenjianzhang\n"
  },
  {
    "path": "_config.yml",
    "content": "theme: jekyll-theme-cayman"
  },
  {
    "path": "app/admin/apis/captcha.go",
    "content": "package apis\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/captcha\"\n)\n\ntype System struct {\n\tapi.Api\n}\n\n// GenerateCaptchaHandler 获取验证码\n// @Summary 获取验证码\n// @Description 获取验证码\n// @Tags 登陆\n// @Success 200 {object} response.Response{data=string,id=string,msg=string} \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/captcha [get]\nfunc (e System) GenerateCaptchaHandler(c *gin.Context) {\n\tif err := e.MakeContext(c).Errors; err != nil {\n\t\te.Error(500, err, \"服务初始化失败！\")\n\t\treturn\n\t}\n\tid, b64s, answer, err := captcha.DriverDigitFunc()\n\tif err != nil {\n\t\te.Logger.Errorf(\"DriverDigitFunc error, %s\", err.Error())\n\t\te.Error(500, err, \"验证码获取失败\")\n\t\treturn\n\t}\n\te.Logger.Infof(\"DriverDigitFunc answer: %s\", answer)\n\te.Custom(gin.H{\n\t\t\"code\": 200,\n\t\t\"data\": b64s,\n\t\t\"id\":   id,\n\t\t\"msg\":  \"success\",\n\t})\n}\n"
  },
  {
    "path": "app/admin/apis/go_admin.go",
    "content": "package apis\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n)\n\nconst INDEX = `\n<!DOCTYPE html>\n<html>\n<head>\n<meta charset=\"utf-8\">\n<title>GO-ADMIN欢迎您</title>\n<style>\nbody{\n  margin:0; \n  padding:0; \n  overflow-y:hidden\n}\n</style>\n<script src=\"https://libs.baidu.com/jquery/1.9.0/jquery.js\"></script>\n<script type=\"text/javascript\"> \nwindow.onerror=function(){return true;} \n$(function(){ \n  headerH = 0;  \n  var h=$(window).height();\n  $(\"#iframe\").height((h-headerH)+\"px\"); \n});\n</script>\n</head>\n<body>\n<iframe id=\"iframe\" frameborder=\"0\" src=\"https://www.go-admin.pro\" style=\"width:100%;\"></iframe>\n</body>\n</html>\n`\n\nfunc GoAdmin(c *gin.Context) {\n\tc.Header(\"Content-Type\", \"text/html; charset=utf-8\")\n\tc.String(200, INDEX)\n}\n"
  },
  {
    "path": "app/admin/apis/sys_api.go",
    "content": "package apis\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n\t\"go-admin/common/actions\"\n)\n\ntype SysApi struct {\n\tapi.Api\n}\n\n// GetPage 获取接口管理列表\n// @Summary 获取接口管理列表\n// @Description 获取接口管理列表\n// @Tags 接口管理\n// @Param name query string false \"名称\"\n// @Param title query string false \"标题\"\n// @Param path query string false \"地址\"\n// @Param action query string false \"类型\"\n// @Param pageSize query int false \"页条数\"\n// @Param pageIndex query int false \"页码\"\n// @Success 200 {object} response.Response{data=response.Page{list=[]models.SysApi}} \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-api [get]\n// @Security Bearer\nfunc (e SysApi) GetPage(c *gin.Context) {\n\ts := service.SysApi{}\n\treq := dto.SysApiGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\t//数据权限检查\n\tp := actions.GetPermissionFromContext(c)\n\tlist := make([]models.SysApi, 0)\n\tvar count int64\n\terr = s.GetPage(&req, p, &list, &count)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n}\n\n// Get 获取接口管理\n// @Summary 获取接口管理\n// @Description 获取接口管理\n// @Tags 接口管理\n// @Param id path string false \"id\"\n// @Success 200 {object} response.Response{data=models.SysApi} \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-api/{id} [get]\n// @Security Bearer\nfunc (e SysApi) Get(c *gin.Context) {\n\treq := dto.SysApiGetReq{}\n\ts := service.SysApi{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tp := actions.GetPermissionFromContext(c)\n\tvar object models.SysApi\n\terr = s.Get(&req, p, &object).Error\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.OK(object, \"查询成功\")\n}\n\n// Update 修改接口管理\n// @Summary 修改接口管理\n// @Description 修改接口管理\n// @Tags 接口管理\n// @Accept application/json\n// @Product application/json\n// @Param data body dto.SysApiUpdateReq true \"body\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"修改成功\"}\"\n// @Router /api/v1/sys-api/{id} [put]\n// @Security Bearer\nfunc (e SysApi) Update(c *gin.Context) {\n\treq := dto.SysApiUpdateReq{}\n\ts := service.SysApi{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\treq.SetUpdateBy(user.GetUserId(c))\n\tp := actions.GetPermissionFromContext(c)\n\terr = s.Update(&req, p)\n\tif err != nil {\n\t\te.Error(500, err, \"更新失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// DeleteSysApi 删除接口管理\n// @Summary 删除接口管理\n// @Description 删除接口管理\n// @Tags 接口管理\n// @Param data body dto.SysApiDeleteReq true \"body\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"删除成功\"}\"\n// @Router /api/v1/sys-api [delete]\n// @Security Bearer\nfunc (e SysApi) DeleteSysApi(c *gin.Context) {\n\treq := dto.SysApiDeleteReq{}\n\ts := service.SysApi{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\tp := actions.GetPermissionFromContext(c)\n\terr = s.Remove(&req, p)\n\tif err != nil {\n\t\te.Error(500, err, \"删除失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"删除成功\")\n}"
  },
  {
    "path": "app/admin/apis/sys_config.go",
    "content": "package apis\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n)\n\ntype SysConfig struct {\n\tapi.Api\n}\n\n// GetPage 获取配置管理列表\n// @Summary 获取配置管理列表\n// @Description 获取配置管理列表\n// @Tags 配置管理\n// @Param configName query string false \"名称\"\n// @Param configKey query string false \"key\"\n// @Param configType query string false \"类型\"\n// @Param isFrontend query int false \"是否前端\"\n// @Param pageSize query int false \"页条数\"\n// @Param pageIndex query int false \"页码\"\n// @Success 200 {object} response.Response{data=response.Page{list=[]models.SysApi}} \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-config [get]\n// @Security Bearer\nfunc (e SysConfig) GetPage(c *gin.Context) {\n\ts := service.SysConfig{}\n\treq := dto.SysConfigGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\n\tlist := make([]models.SysConfig, 0)\n\tvar count int64\n\terr = s.GetPage(&req, &list, &count)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n}\n\n// Get 获取配置管理\n// @Summary 获取配置管理\n// @Description 获取配置管理\n// @Tags 配置管理\n// @Param id path string false \"id\"\n// @Success 200 {object} response.Response{data=models.SysConfig} \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-config/{id} [get]\n// @Security Bearer\nfunc (e SysConfig) Get(c *gin.Context) {\n\treq := dto.SysConfigGetReq{}\n\ts := service.SysConfig{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tvar object models.SysConfig\n\n\terr = s.Get(&req, &object)\n\tif err != nil {\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\te.OK(object, \"查询成功\")\n}\n\n// Insert 创建配置管理\n// @Summary 创建配置管理\n// @Description 创建配置管理\n// @Tags 配置管理\n// @Accept application/json\n// @Product application/json\n// @Param data body dto.SysConfigControl true \"body\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"创建成功\"}\"\n// @Router /api/v1/sys-config [post]\n// @Security Bearer\nfunc (e SysConfig) Insert(c *gin.Context) {\n\ts := service.SysConfig{}\n\treq := dto.SysConfigControl{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetCreateBy(user.GetUserId(c))\n\n\terr = s.Insert(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"创建失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"创建成功\")\n}\n\n// Update 修改配置管理\n// @Summary 修改配置管理\n// @Description 修改配置管理\n// @Tags 配置管理\n// @Accept application/json\n// @Product application/json\n// @Param data body dto.SysConfigControl true \"body\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"修改成功\"}\"\n// @Router /api/v1/sys-config/{id} [put]\n// @Security Bearer\nfunc (e SysConfig) Update(c *gin.Context) {\n\ts := service.SysConfig{}\n\treq := dto.SysConfigControl{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetUpdateBy(user.GetUserId(c))\n\terr = s.Update(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"更新失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// Delete 删除配置管理\n// @Summary 删除配置管理\n// @Description 删除配置管理\n// @Tags 配置管理\n// @Param ids body []int false \"ids\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"删除成功\"}\"\n// @Router /api/v1/sys-config [delete]\n// @Security Bearer\nfunc (e SysConfig) Delete(c *gin.Context) {\n\ts := service.SysConfig{}\n\treq := dto.SysConfigDeleteReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetUpdateBy(user.GetUserId(c))\n\n\terr = s.Remove(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"删除失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"删除成功\")\n}\n\n// Get2SysApp 获取系统配置信息\n// @Summary 获取系统前台配置信息，主要注意这里不在验证权限\n// @Description 获取系统配置信息，主要注意这里不在验证权限\n// @Tags 配置管理\n// @Success 200 {object} response.Response{data=map[string]string} \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/app-config [get]\nfunc (e SysConfig) Get2SysApp(c *gin.Context) {\n\treq := dto.SysConfigGetToSysAppReq{}\n\ts := service.SysConfig{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\t// 控制只读前台的数据\n\treq.IsFrontend = \"1\"\n\tlist := make([]models.SysConfig, 0)\n\terr = s.GetWithKeyList(&req, &list)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\tmp := make(map[string]string)\n\tfor i := 0; i < len(list); i++ {\n\t\tkey := list[i].ConfigKey\n\t\tif key != \"\" {\n\t\t\tmp[key] = list[i].ConfigValue\n\t\t}\n\t}\n\te.OK(mp, \"查询成功\")\n}\n\n// Get2Set 获取配置\n// @Summary 获取配置\n// @Description 界面操作设置配置值的获取\n// @Tags 配置管理\n// @Accept application/json\n// @Product application/json\n// @Success 200 {object} response.Response{data=map[string]interface{}}\t\"{\"code\": 200, \"message\": \"修改成功\"}\"\n// @Router /api/v1/set-config [get]\n// @Security Bearer\nfunc (e SysConfig) Get2Set(c *gin.Context) {\n\ts := service.SysConfig{}\n\treq := make([]dto.GetSetSysConfigReq, 0)\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\terr = s.GetForSet(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\tm := make(map[string]interface{}, 0)\n\tfor _, v := range req {\n\t\tm[v.ConfigKey] = v.ConfigValue\n\t}\n\te.OK(m, \"查询成功\")\n}\n\n// Update2Set 设置配置\n// @Summary 设置配置\n// @Description 界面操作设置配置值\n// @Tags 配置管理\n// @Accept application/json\n// @Product application/json\n// @Param data body []dto.GetSetSysConfigReq true \"body\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"修改成功\"}\"\n// @Router /api/v1/set-config [put]\n// @Security Bearer\nfunc (e SysConfig) Update2Set(c *gin.Context) {\n\ts := service.SysConfig{}\n\treq := make([]dto.GetSetSysConfigReq, 0)\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\terr = s.UpdateForSet(&req)\n\tif err != nil {\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\te.OK(\"\", \"更新成功\")\n}\n\n// GetSysConfigByKEYForService 根据Key获取SysConfig的Service\n// @Summary 根据Key获取SysConfig的Service\n// @Description 根据Key获取SysConfig的Service\n// @Tags 配置管理\n// @Param configKey path string false \"configKey\"\n// @Success 200 {object} response.Response{data=dto.SysConfigByKeyReq} \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-config/{id} [get]\n// @Security Bearer\nfunc (e SysConfig) GetSysConfigByKEYForService(c *gin.Context) {\n\tvar s = new(service.SysConfig)\n\tvar req = new(dto.SysConfigByKeyReq)\n\tvar resp = new(dto.GetSysConfigByKEYForServiceResp)\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(req, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\terr = s.GetWithKey(req, resp)\n\tif err != nil {\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\te.OK(resp, s.Msg)\n}\n"
  },
  {
    "path": "app/admin/apis/sys_dept.go",
    "content": "package apis\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\t\"go-admin/app/admin/models\"\n\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n)\n\ntype SysDept struct {\n\tapi.Api\n}\n\n// GetPage\n// @Summary 分页部门列表数据\n// @Description 分页列表\n// @Tags 部门\n// @Param deptName query string false \"deptName\"\n// @Param deptId query string false \"deptId\"\n// @Param position query string false \"position\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dept [get]\n// @Security Bearer\nfunc (e SysDept) GetPage(c *gin.Context) {\n\ts := service.SysDept{}\n\treq := dto.SysDeptGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tlist := make([]models.SysDept, 0)\n\tlist, err = s.SetDeptPage(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.OK(list, \"查询成功\")\n}\n\n// Get\n// @Summary 获取部门数据\n// @Description 获取JSON\n// @Tags 部门\n// @Param deptId path string false \"deptId\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dept/{deptId} [get]\n// @Security Bearer\nfunc (e SysDept) Get(c *gin.Context) {\n\ts := service.SysDept{}\n\treq := dto.SysDeptGetReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tvar object models.SysDept\n\n\terr = s.Get(&req, &object)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\n\te.OK(object, \"查询成功\")\n}\n\n// Insert 添加部门\n// @Summary 添加部门\n// @Description 获取JSON\n// @Tags 部门\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysDeptInsertReq true \"data\"\n// @Success 200 {string} string\t\"{\"code\": 200, \"message\": \"添加成功\"}\"\n// @Success 200 {string} string\t\"{\"code\": -1, \"message\": \"添加失败\"}\"\n// @Router /api/v1/dept [post]\n// @Security Bearer\nfunc (e SysDept) Insert(c *gin.Context) {\n\ts := service.SysDept{}\n\treq := dto.SysDeptInsertReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\t// 设置创建人\n\treq.SetCreateBy(user.GetUserId(c))\n\terr = s.Insert(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"创建失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"创建成功\")\n}\n\n// Update\n// @Summary 修改部门\n// @Description 获取JSON\n// @Tags 部门\n// @Accept  application/json\n// @Product application/json\n// @Param id path int true \"id\"\n// @Param data body dto.SysDeptUpdateReq true \"body\"\n// @Success 200 {string} string\t\"{\"code\": 200, \"message\": \"添加成功\"}\"\n// @Success 200 {string} string\t\"{\"code\": -1, \"message\": \"添加失败\"}\"\n// @Router /api/v1/dept/{deptId} [put]\n// @Security Bearer\nfunc (e SysDept) Update(c *gin.Context) {\n\ts := service.SysDept{}\n\treq := dto.SysDeptUpdateReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetUpdateBy(user.GetUserId(c))\n\terr = s.Update(&req)\n\tif err != nil {\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// Delete\n// @Summary 删除部门\n// @Description 删除数据\n// @Tags 部门\n// @Param data body dto.SysDeptDeleteReq true \"body\"\n// @Success 200 {string} string\t\"{\"code\": 200, \"message\": \"删除成功\"}\"\n// @Success 200 {string} string\t\"{\"code\": -1, \"message\": \"删除失败\"}\"\n// @Router /api/v1/dept [delete]\n// @Security Bearer\nfunc (e SysDept) Delete(c *gin.Context) {\n\ts := service.SysDept{}\n\treq := dto.SysDeptDeleteReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\terr = s.Remove(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"删除失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"删除成功\")\n}\n\n// Get2Tree 用户管理 左侧部门树\nfunc (e SysDept) Get2Tree(c *gin.Context) {\n\ts := service.SysDept{}\n\treq := dto.SysDeptGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tlist := make([]dto.DeptLabel, 0)\n\tlist, err = s.SetDeptTree(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.OK(list, \"\")\n}\n\n// GetDeptTreeRoleSelect TODO: 此接口需要调整不应该将list和选中放在一起\nfunc (e SysDept) GetDeptTreeRoleSelect(c *gin.Context) {\n\ts := service.SysDept{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\tid, err := pkg.StringToInt(c.Param(\"roleId\"))\n\tresult, err := s.SetDeptLabel()\n\tif err != nil {\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tmenuIds := make([]int, 0)\n\tif id != 0 {\n\t\tmenuIds, err = s.GetWithRoleId(id)\n\t\tif err != nil {\n\t\t\te.Error(500, err, err.Error())\n\t\t\treturn\n\t\t}\n\t}\n\te.OK(gin.H{\n\t\t\"depts\":       result,\n\t\t\"checkedKeys\": menuIds,\n\t}, \"\")\n}\n"
  },
  {
    "path": "app/admin/apis/sys_dict_data.go",
    "content": "package apis\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\t\"go-admin/app/admin/models\"\n\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n)\n\ntype SysDictData struct {\n\tapi.Api\n}\n\n// GetPage\n// @Summary 字典数据列表\n// @Description 获取JSON\n// @Tags 字典数据\n// @Param status query string false \"status\"\n// @Param dictCode query string false \"dictCode\"\n// @Param dictType query string false \"dictType\"\n// @Param pageSize query int false \"页条数\"\n// @Param pageIndex query int false \"页码\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dict/data [get]\n// @Security Bearer\nfunc (e SysDictData) GetPage(c *gin.Context) {\n\ts := service.SysDictData{}\n\treq := dto.SysDictDataGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\tlist := make([]models.SysDictData, 0)\n\tvar count int64\n\terr = s.GetPage(&req, &list, &count)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\n\te.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n}\n\n// Get\n// @Summary 通过编码获取字典数据\n// @Description 获取JSON\n// @Tags 字典数据\n// @Param dictCode path int true \"字典编码\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dict/data/{dictCode} [get]\n// @Security Bearer\nfunc (e SysDictData) Get(c *gin.Context) {\n\ts := service.SysDictData{}\n\treq := dto.SysDictDataGetReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\tvar object models.SysDictData\n\n\terr = s.Get(&req, &object)\n\tif err != nil {\n\t\te.Logger.Warnf(\"Get error: %s\", err.Error())\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\n\te.OK(object, \"查询成功\")\n}\n\n// Insert\n// @Summary 添加字典数据\n// @Description 获取JSON\n// @Tags 字典数据\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysDictDataInsertReq true \"data\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"添加成功\"}\"\n// @Router /api/v1/dict/data [post]\n// @Security Bearer\nfunc (e SysDictData) Insert(c *gin.Context) {\n\ts := service.SysDictData{}\n\treq := dto.SysDictDataInsertReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetCreateBy(user.GetUserId(c))\n\terr = s.Insert(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"创建失败\")\n\t\treturn\n\t}\n\n\te.OK(req.GetId(), \"创建成功\")\n}\n\n// Update\n// @Summary 修改字典数据\n// @Description 获取JSON\n// @Tags 字典数据\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysDictDataUpdateReq true \"body\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"修改成功\"}\"\n// @Router /api/v1/dict/data/{dictCode} [put]\n// @Security Bearer\nfunc (e SysDictData) Update(c *gin.Context) {\n\ts := service.SysDictData{}\n\treq := dto.SysDictDataUpdateReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetUpdateBy(user.GetUserId(c))\n\terr = s.Update(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"更新失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// Delete\n// @Summary 删除字典数据\n// @Description 删除数据\n// @Tags 字典数据\n// @Param dictCode body dto.SysDictDataDeleteReq true \"body\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"删除成功\"}\"\n// @Router /api/v1/dict/data [delete]\n// @Security Bearer\nfunc (e SysDictData) Delete(c *gin.Context) {\n\ts := service.SysDictData{}\n\treq := dto.SysDictDataDeleteReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetUpdateBy(user.GetUserId(c))\n\terr = s.Remove(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"删除失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"删除成功\")\n}\n\n// GetAll 数据字典根据key获取 业务页面使用\n// @Summary 数据字典根据key获取\n// @Description 数据字典根据key获取\n// @Tags 字典数据\n// @Param dictType query int true \"dictType\"\n// @Success 200 {object} response.Response{data=[]dto.SysDictDataGetAllResp}  \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dict-data/option-select [get]\n// @Security Bearer\nfunc (e SysDictData) GetAll(c *gin.Context) {\n\ts := service.SysDictData{}\n\treq := dto.SysDictDataGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tlist := make([]models.SysDictData, 0)\n\terr = s.GetAll(&req, &list)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\tl := make([]dto.SysDictDataGetAllResp, 0)\n\tfor _, i := range list {\n\t\td := dto.SysDictDataGetAllResp{}\n\t\te.Translate(i, &d)\n\t\tl = append(l, d)\n\t}\n\n\te.OK(l,\"查询成功\")\n}\n"
  },
  {
    "path": "app/admin/apis/sys_dict_type.go",
    "content": "package apis\n\nimport (\n\t\"fmt\"\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\t\"go-admin/app/admin/models\"\n\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n)\n\ntype SysDictType struct {\n\tapi.Api\n}\n\n// GetPage 字典类型列表数据\n// @Summary 字典类型列表数据\n// @Description 获取JSON\n// @Tags 字典类型\n// @Param dictName query string false \"dictName\"\n// @Param dictId query string false \"dictId\"\n// @Param dictType query string false \"dictType\"\n// @Param pageSize query int false \"页条数\"\n// @Param pageIndex query int false \"页码\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dict/type [get]\n// @Security Bearer\nfunc (e SysDictType) GetPage(c *gin.Context) {\n\ts := service.SysDictType{}\n\treq :=dto.SysDictTypeGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tlist := make([]models.SysDictType, 0)\n\tvar count int64\n\terr = s.GetPage(&req, &list, &count)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n}\n\n// Get 字典类型通过字典id获取\n// @Summary 字典类型通过字典id获取\n// @Description 获取JSON\n// @Tags 字典类型\n// @Param dictId path int true \"字典类型编码\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dict/type/{dictId} [get]\n// @Security Bearer\nfunc (e SysDictType) Get(c *gin.Context) {\n\ts := service.SysDictType{}\n\treq :=dto.SysDictTypeGetReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tvar object models.SysDictType\n\terr = s.Get(&req, &object)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.OK(object, \"查询成功\")\n}\n\n//Insert 字典类型创建\n// @Summary 添加字典类型\n// @Description 获取JSON\n// @Tags 字典类型\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysDictTypeInsertReq true \"data\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dict/type [post]\n// @Security Bearer\nfunc (e SysDictType) Insert(c *gin.Context) {\n\ts := service.SysDictType{}\n\treq :=dto.SysDictTypeInsertReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetCreateBy(user.GetUserId(c))\n\terr = s.Insert(&req)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err,fmt.Sprintf(\" 创建字典类型失败，详情：%s\", err.Error()))\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"创建成功\")\n}\n\n// Update\n// @Summary 修改字典类型\n// @Description 获取JSON\n// @Tags 字典类型\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysDictTypeUpdateReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dict/type/{dictId} [put]\n// @Security Bearer\nfunc (e SysDictType) Update(c *gin.Context) {\n\ts := service.SysDictType{}\n\treq :=dto.SysDictTypeUpdateReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Error(500, err, err.Error())\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\treq.SetUpdateBy(user.GetUserId(c))\n\terr = s.Update(&req)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// Delete\n// @Summary 删除字典类型\n// @Description 删除数据\n// @Tags 字典类型\n// @Param dictCode body dto.SysDictTypeDeleteReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dict/type [delete]\n// @Security Bearer\nfunc (e SysDictType) Delete(c *gin.Context) {\n\ts := service.SysDictType{}\n\treq :=dto.SysDictTypeDeleteReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetUpdateBy(user.GetUserId(c))\n\terr = s.Remove(&req)\n\tif err != nil {\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"删除成功\")\n}\n\n// GetAll\n// @Summary 字典类型全部数据 代码生成使用接口\n// @Description 获取JSON\n// @Tags 字典类型\n// @Param dictName query string false \"dictName\"\n// @Param dictId query string false \"dictId\"\n// @Param dictType query string false \"dictType\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/dict/type-option-select [get]\n// @Security Bearer\nfunc (e SysDictType) GetAll(c *gin.Context) {\n\ts := service.SysDictType{}\n\treq :=dto.SysDictTypeGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tlist := make([]models.SysDictType, 0)\n\terr = s.GetAll(&req, &list)\n\tif err != nil {\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\te.OK(list, \"查询成功\")\n}"
  },
  {
    "path": "app/admin/apis/sys_login_log.go",
    "content": "package apis\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"go-admin/app/admin/models\"\n\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n)\n\ntype SysLoginLog struct {\n\tapi.Api\n}\n\n// GetPage 登录日志列表\n// @Summary 登录日志列表\n// @Description 获取JSON\n// @Tags 登录日志\n// @Param username query string false \"用户名\"\n// @Param ipaddr query string false \"ip地址\"\n// @Param loginLocation  query string false \"归属地\"\n// @Param status query string false \"状态\"\n// @Param beginTime query string false \"开始时间\"\n// @Param endTime query string false \"结束时间\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-login-log [get]\n// @Security Bearer\nfunc (e SysLoginLog) GetPage(c *gin.Context) {\n\ts := service.SysLoginLog{}\n\treq :=dto.SysLoginLogGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tlist := make([]models.SysLoginLog, 0)\n\tvar count int64\n\terr = s.GetPage(&req, &list, &count)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n}\n\n// Get 登录日志通过id获取\n// @Summary 登录日志通过id获取\n// @Description 获取JSON\n// @Tags 登录日志\n// @Param id path string false \"id\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-login-log/{id} [get]\n// @Security Bearer\nfunc (e SysLoginLog) Get(c *gin.Context) {\n\ts := service.SysLoginLog{}\n\treq :=dto.SysLoginLogGetReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tvar object models.SysLoginLog\n\terr = s.Get(&req, &object)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.OK(object, \"查询成功\")\n}\n\n// Delete 登录日志删除\n// @Summary 登录日志删除\n// @Description 登录日志删除\n// @Tags 登录日志\n// @Param data body dto.SysLoginLogDeleteReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-login-log [delete]\n// @Security Bearer\nfunc (e SysLoginLog) Delete(c *gin.Context) {\n\ts := service.SysLoginLog{}\n\treq :=dto.SysLoginLogDeleteReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\terr = s.Remove(&req)\n\tif err != nil {\n\t\te.Error(500, err, \"删除失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"删除成功\")\n}"
  },
  {
    "path": "app/admin/apis/sys_menu.go",
    "content": "package apis\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t\"go-admin/app/admin/models\"\n\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n)\n\ntype SysMenu struct {\n\tapi.Api\n}\n\n// GetPage Menu列表数据\n// @Summary Menu列表数据\n// @Description 获取JSON\n// @Tags 菜单\n// @Param menuName query string false \"menuName\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/menu [get]\n// @Security Bearer\nfunc (e SysMenu) GetPage(c *gin.Context) {\n\ts := service.SysMenu{}\n\treq := dto.SysMenuGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tvar list = make([]models.SysMenu, 0)\n\terr = s.GetPage(&req, &list).Error\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.OK(list, \"查询成功\")\n}\n\n// Get 获取菜单详情\n// @Summary Menu详情数据\n// @Description 获取JSON\n// @Tags 菜单\n// @Param id path string false \"id\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/menu/{id} [get]\n// @Security Bearer\nfunc (e SysMenu) Get(c *gin.Context) {\n\treq := dto.SysMenuGetReq{}\n\ts := new(service.SysMenu)\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tvar object = models.SysMenu{}\n\n\terr = s.Get(&req, &object).Error\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.OK(object, \"查询成功\")\n}\n\n// Insert 创建菜单\n// @Summary 创建菜单\n// @Description 获取JSON\n// @Tags 菜单\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysMenuInsertReq true \"data\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/menu [post]\n// @Security Bearer\nfunc (e SysMenu) Insert(c *gin.Context) {\n\treq := dto.SysMenuInsertReq{}\n\ts := new(service.SysMenu)\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\t// 设置创建人\n\treq.SetCreateBy(user.GetUserId(c))\n\terr = s.Insert(&req).Error\n\tif err != nil {\n\t\te.Error(500, err, \"创建失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"创建成功\")\n}\n\n// Update 修改菜单\n// @Summary 修改菜单\n// @Description 获取JSON\n// @Tags 菜单\n// @Accept  application/json\n// @Product application/json\n// @Param id path int true \"id\"\n// @Param data body dto.SysMenuUpdateReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/menu/{id} [put]\n// @Security Bearer\nfunc (e SysMenu) Update(c *gin.Context) {\n\treq := dto.SysMenuUpdateReq{}\n\ts := new(service.SysMenu)\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\treq.SetUpdateBy(user.GetUserId(c))\n\terr = s.Update(&req).Error\n\tif err != nil {\n\t\te.Error(500, err, \"更新失败\")\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// Delete 删除菜单\n// @Summary 删除菜单\n// @Description 删除数据\n// @Tags 菜单\n// @Param data body dto.SysMenuDeleteReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/menu [delete]\n// @Security Bearer\nfunc (e SysMenu) Delete(c *gin.Context) {\n\tcontrol := new(dto.SysMenuDeleteReq)\n\ts := new(service.SysMenu)\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(control, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\terr = s.Remove(control).Error\n\tif err != nil {\n\t\te.Logger.Errorf(\"RemoveSysMenu error, %s\", err)\n\t\te.Error(500, err, \"删除失败\")\n\t\treturn\n\t}\n\te.OK(control.GetId(), \"删除成功\")\n}\n\n// GetMenuRole 根据登录角色名称获取菜单列表数据（左菜单使用）\n// @Summary 根据登录角色名称获取菜单列表数据（左菜单使用）\n// @Description 获取JSON\n// @Tags 菜单\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/menurole [get]\n// @Security Bearer\nfunc (e SysMenu) GetMenuRole(c *gin.Context) {\n\ts := new(service.SysMenu)\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\tresult, err := s.SetMenuRole(user.GetRoleName(c))\n\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\n\te.OK(result, \"\")\n}\n\n// GetMenuTreeSelect 根据角色ID查询菜单下拉树结构\n// @Summary 角色修改使用的菜单列表\n// @Description 获取JSON\n// @Tags 菜单\n// @Accept  application/json\n// @Product application/json\n// @Param roleId path int true \"roleId\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/menuTreeselect/{roleId} [get]\n// @Security Bearer\nfunc (e SysMenu) GetMenuTreeSelect(c *gin.Context) {\n\tm := service.SysMenu{}\n\tr := service.SysRole{}\n\treq := dto.SelectRole{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tMakeService(&m.Service).\n\t\tMakeService(&r.Service).\n\t\tBind(&req, nil).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\tresult, err := m.SetLabel()\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\n\tmenuIds := make([]int, 0)\n\tif req.RoleId != 0 {\n\t\tmenuIds, err = r.GetRoleMenuId(req.RoleId)\n\t\tif err != nil {\n\t\t\te.Error(500, err, \"\")\n\t\t\treturn\n\t\t}\n\t}\n\te.OK(gin.H{\n\t\t\"menus\":       result,\n\t\t\"checkedKeys\": menuIds,\n\t}, \"获取成功\")\n}\n"
  },
  {
    "path": "app/admin/apis/sys_opera_log.go",
    "content": "package apis\n\nimport (\n\t\"fmt\"\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n)\n\ntype SysOperaLog struct {\n\tapi.Api\n}\n\n// GetPage 操作日志列表\n// @Summary 操作日志列表\n// @Description 获取JSON\n// @Tags 操作日志\n// @Param title query string false \"title\"\n// @Param method query string false \"method\"\n// @Param requestMethod  query string false \"requestMethod\"\n// @Param operUrl query string false \"operUrl\"\n// @Param operIp query string false \"operIp\"\n// @Param status query string false \"status\"\n// @Param beginTime query string false \"beginTime\"\n// @Param endTime query string false \"endTime\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-opera-log [get]\n// @Security Bearer\nfunc (e SysOperaLog) GetPage(c *gin.Context) {\n\ts := service.SysOperaLog{}\n\treq := new(dto.SysOperaLogGetPageReq)\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\tlist := make([]models.SysOperaLog, 0)\n\tvar count int64\n\n\terr = s.GetPage(req, &list, &count)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\n\te.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n}\n\n// Get 操作日志通过id获取\n// @Summary 操作日志通过id获取\n// @Description 获取JSON\n// @Tags 操作日志\n// @Param id path string false \"id\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-opera-log/{id} [get]\n// @Security Bearer\nfunc (e SysOperaLog) Get(c *gin.Context) {\n\ts := new(service.SysOperaLog)\n\treq :=dto.SysOperaLogGetReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tvar object models.SysOperaLog\n\terr = s.Get(&req, &object)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\te.OK(object, \"查询成功\")\n}\n\n// Delete 操作日志删除\n// DeleteSysMenu 操作日志删除\n// @Summary 删除操作日志\n// @Description 删除数据\n// @Tags 操作日志\n// @Param data body dto.SysOperaLogDeleteReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-opera-log [delete]\n// @Security Bearer\nfunc (e SysOperaLog) Delete(c *gin.Context) {\n\ts := new(service.SysOperaLog)\n\treq :=dto.SysOperaLogDeleteReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\terr = s.Remove(&req)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500,err, fmt.Sprintf(\"删除失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"删除成功\")\n}\n"
  },
  {
    "path": "app/admin/apis/sys_post.go",
    "content": "package apis\n\nimport (\n\t\"fmt\"\n\t\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n)\n\ntype SysPost struct {\n\tapi.Api\n}\n\n// GetPage\n// @Summary 岗位列表数据\n// @Description 获取JSON\n// @Tags 岗位\n// @Param postName query string false \"postName\"\n// @Param postCode query string false \"postCode\"\n// @Param postId query string false \"postId\"\n// @Param status query string false \"status\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/post [get]\n// @Security Bearer\nfunc (e SysPost) GetPage(c *gin.Context) {\n\ts := service.SysPost{}\n\treq :=dto.SysPostPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\tlist := make([]models.SysPost, 0)\n\tvar count int64\n\n\terr = s.GetPage(&req, &list, &count)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\n\te.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n}\n\n// Get\n// @Summary 获取岗位信息\n// @Description 获取JSON\n// @Tags 岗位\n// @Param id path int true \"编码\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/post/{postId} [get]\n// @Security Bearer\nfunc (e SysPost) Get(c *gin.Context) {\n\ts := service.SysPost{}\n\treq :=dto.SysPostGetReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tvar object models.SysPost\n\n\terr = s.Get(&req, &object)\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"岗位信息获取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\n\te.OK(object, \"查询成功\")\n}\n\n// Insert\n// @Summary 添加岗位\n// @Description 获取JSON\n// @Tags 岗位\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysPostInsertReq true \"data\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/post [post]\n// @Security Bearer\nfunc (e SysPost) Insert(c *gin.Context) {\n\ts := service.SysPost{}\n\treq :=dto.SysPostInsertReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetCreateBy(user.GetUserId(c))\n\terr = s.Insert(&req)\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"新建岗位失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"创建成功\")\n}\n\n// Update\n// @Summary 修改岗位\n// @Description 获取JSON\n// @Tags 岗位\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysPostUpdateReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/post/{id} [put]\n// @Security Bearer\nfunc (e SysPost) Update(c *gin.Context) {\n\ts := service.SysPost{}\n\treq :=dto.SysPostUpdateReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\treq.SetUpdateBy(user.GetUserId(c))\n\n\terr = s.Update(&req)\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"岗位更新失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// Delete\n// @Summary 删除岗位\n// @Description 删除数据\n// @Tags 岗位\n// @Param id body dto.SysPostDeleteReq true \"请求参数\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/post [delete]\n// @Security Bearer\nfunc (e SysPost) Delete(c *gin.Context) {\n\ts := service.SysPost{}\n\treq :=dto.SysPostDeleteReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\treq.SetUpdateBy(user.GetUserId(c))\n\terr = s.Remove(&req)\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"岗位删除失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"删除成功\")\n}"
  },
  {
    "path": "app/admin/apis/sys_role.go",
    "content": "package apis\n\nimport (\n\t\"fmt\"\n\t\"go-admin/common/global\"\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"go-admin/app/admin/models\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n)\n\ntype SysRole struct {\n\tapi.Api\n}\n\n// GetPage\n// @Summary 角色列表数据\n// @Description Get JSON\n// @Tags 角色/Role\n// @Param roleName query string false \"roleName\"\n// @Param status query string false \"status\"\n// @Param roleKey query string false \"roleKey\"\n// @Param pageSize query int false \"页条数\"\n// @Param pageIndex query int false \"页码\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/role [get]\n// @Security Bearer\nfunc (e SysRole) GetPage(c *gin.Context) {\n\ts := service.SysRole{}\n\treq := dto.SysRoleGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.Form).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\tlist := make([]models.SysRole, 0)\n\tvar count int64\n\n\terr = s.GetPage(&req, &list, &count)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\n\te.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n}\n\n// Get\n// @Summary 获取Role数据\n// @Description 获取JSON\n// @Tags 角色/Role\n// @Param roleId path string false \"roleId\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/role/{id} [get]\n// @Security Bearer\nfunc (e SysRole) Get(c *gin.Context) {\n\ts := service.SysRole{}\n\treq := dto.SysRoleGetReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\" %s \", err.Error()))\n\t\treturn\n\t}\n\n\tvar object models.SysRole\n\n\terr = s.Get(&req, &object)\n\tif err != nil {\n\t\te.Error(http.StatusUnprocessableEntity, err, \"查询失败\")\n\t\treturn\n\t}\n\n\te.OK(object, \"查询成功\")\n}\n\n// Insert\n// @Summary 创建角色\n// @Description 获取JSON\n// @Tags 角色/Role\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysRoleInsertReq true \"data\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/role [post]\n// @Security Bearer\nfunc (e SysRole) Insert(c *gin.Context) {\n\ts := service.SysRole{}\n\treq := dto.SysRoleInsertReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\t// 设置创建人\n\treq.CreateBy = user.GetUserId(c)\n\tif req.Status == \"\" {\n\t\treq.Status = \"2\"\n\t}\n\tcb := sdk.Runtime.GetCasbinKey(c.Request.Host)\n\terr = s.Insert(&req, cb)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, \"创建失败,\"+err.Error())\n\t\treturn\n\t}\n\t_, err = global.LoadPolicy(c)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, \"创建失败,\"+err.Error())\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"创建成功\")\n}\n\n// Update 修改用户角色\n// @Summary 修改用户角色\n// @Description 获取JSON\n// @Tags 角色/Role\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysRoleUpdateReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/role/{id} [put]\n// @Security Bearer\nfunc (e SysRole) Update(c *gin.Context) {\n\ts := service.SysRole{}\n\treq := dto.SysRoleUpdateReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, nil, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tcb := sdk.Runtime.GetCasbinKey(c.Request.Host)\n\n\treq.SetUpdateBy(user.GetUserId(c))\n\n\terr = s.Update(&req, cb)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\n\t_, err = global.LoadPolicy(c)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, \"更新失败,\"+err.Error())\n\t\treturn\n\t}\n\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// Delete\n// @Summary 删除用户角色\n// @Description 删除数据\n// @Tags 角色/Role\n// @Param data body dto.SysRoleDeleteReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/role [delete]\n// @Security Bearer\nfunc (e SysRole) Delete(c *gin.Context) {\n\ts := new(service.SysRole)\n\treq := dto.SysRoleDeleteReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"删除角色 %v 失败，\\r\\n失败信息 %s\", req.Ids, err.Error()))\n\t\treturn\n\t}\n\n\tcb := sdk.Runtime.GetCasbinKey(c.Request.Host)\n\terr = s.Remove(&req, cb)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, \"\")\n\t\treturn\n\t}\n\n\te.OK(req.GetId(), fmt.Sprintf(\"删除角色角色 %v 状态成功！\", req.GetId()))\n}\n\n// Update2Status 修改用户角色状态\n// @Summary 修改用户角色\n// @Description 获取JSON\n// @Tags 角色/Role\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.UpdateStatusReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/role-status/{id} [put]\n// @Security Bearer\nfunc (e SysRole) Update2Status(c *gin.Context) {\n\ts := service.SysRole{}\n\treq := dto.UpdateStatusReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"更新角色状态失败，失败原因：%s \", err.Error()))\n\t\treturn\n\t}\n\treq.SetUpdateBy(user.GetUserId(c))\n\terr = s.UpdateStatus(&req)\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"更新角色状态失败，失败原因：%s \", err.Error()))\n\t\treturn\n\t}\n\te.OK(req.GetId(), fmt.Sprintf(\"更新角色 %v 状态成功！\", req.GetId()))\n}\n\n// Update2DataScope 更新角色数据权限\n// @Summary 更新角色数据权限\n// @Description 获取JSON\n// @Tags 角色/Role\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.RoleDataScopeReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/role-status/{id} [put]\n// @Security Bearer\nfunc (e SysRole) Update2DataScope(c *gin.Context) {\n\ts := service.SysRole{}\n\treq := dto.RoleDataScopeReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tdata := &models.SysRole{\n\t\tRoleId:    req.RoleId,\n\t\tDataScope: req.DataScope,\n\t\tDeptIds:   req.DeptIds,\n\t}\n\tdata.UpdateBy = user.GetUserId(c)\n\terr = s.UpdateDataScope(&req).Error\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"更新角色数据权限失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\te.OK(nil, \"操作成功\")\n}\n"
  },
  {
    "path": "app/admin/apis/sys_user.go",
    "content": "package apis\n\nimport (\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"go-admin/app/admin/models\"\n\t\"golang.org/x/crypto/bcrypt\"\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\t\"github.com/google/uuid\"\n\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n\t\"go-admin/common/actions\"\n)\n\ntype SysUser struct {\n\tapi.Api\n}\n\n// GetPage\n// @Summary 列表用户信息数据\n// @Description 获取JSON\n// @Tags 用户\n// @Param username query string false \"username\"\n// @Success 200 {string} {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-user [get]\n// @Security Bearer\nfunc (e SysUser) GetPage(c *gin.Context) {\n\ts := service.SysUser{}\n\treq := dto.SysUserGetPageReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\t//数据权限检查\n\tp := actions.GetPermissionFromContext(c)\n\n\tlist := make([]models.SysUser, 0)\n\tvar count int64\n\n\terr = s.GetPage(&req, p, &list, &count)\n\tif err != nil {\n\t\te.Error(500, err, \"查询失败\")\n\t\treturn\n\t}\n\n\te.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n}\n\n// Get\n// @Summary 获取用户\n// @Description 获取JSON\n// @Tags 用户\n// @Param userId path int true \"用户编码\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-user/{userId} [get]\n// @Security Bearer\nfunc (e SysUser) Get(c *gin.Context) {\n\ts := service.SysUser{}\n\treq := dto.SysUserById{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tvar object models.SysUser\n\t//数据权限检查\n\tp := actions.GetPermissionFromContext(c)\n\terr = s.Get(&req, p, &object)\n\tif err != nil {\n\t\te.Error(http.StatusUnprocessableEntity, err, \"查询失败\")\n\t\treturn\n\t}\n\te.OK(object, \"查询成功\")\n}\n\n// Insert\n// @Summary 创建用户\n// @Description 获取JSON\n// @Tags 用户\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysUserInsertReq true \"用户数据\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-user [post]\n// @Security Bearer\nfunc (e SysUser) Insert(c *gin.Context) {\n\ts := service.SysUser{}\n\treq := dto.SysUserInsertReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\t// 设置创建人\n\treq.SetCreateBy(user.GetUserId(c))\n\terr = s.Insert(&req)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\te.OK(req.GetId(), \"创建成功\")\n}\n\n// Update\n// @Summary 修改用户数据\n// @Description 获取JSON\n// @Tags 用户\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.SysUserUpdateReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-user/{userId} [put]\n// @Security Bearer\nfunc (e SysUser) Update(c *gin.Context) {\n\ts := service.SysUser{}\n\treq := dto.SysUserUpdateReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\treq.SetUpdateBy(user.GetUserId(c))\n\n\t//数据权限检查\n\tp := actions.GetPermissionFromContext(c)\n\n\terr = s.Update(&req, p)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// Delete\n// @Summary 删除用户数据\n// @Description 删除数据\n// @Tags 用户\n// @Param userId path int true \"userId\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys-user/{userId} [delete]\n// @Security Bearer\nfunc (e SysUser) Delete(c *gin.Context) {\n\ts := service.SysUser{}\n\treq := dto.SysUserById{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\t// 设置编辑人\n\treq.SetUpdateBy(user.GetUserId(c))\n\n\t// 数据权限检查\n\tp := actions.GetPermissionFromContext(c)\n\n\terr = s.Remove(&req, p)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"删除成功\")\n}\n\n// InsetAvatar\n// @Summary 修改头像\n// @Description 获取JSON\n// @Tags 个人中心\n// @Accept multipart/form-data\n// @Param file formData file true \"file\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/user/avatar [post]\n// @Security Bearer\nfunc (e SysUser) InsetAvatar(c *gin.Context) {\n\ts := service.SysUser{}\n\treq := dto.UpdateSysUserAvatarReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\t// 数据权限检查\n\tp := actions.GetPermissionFromContext(c)\n\tform, _ := c.MultipartForm()\n\tfiles := form.File[\"upload[]\"]\n\tguid := uuid.New().String()\n\tfilPath := \"static/uploadfile/\" + guid + \".jpg\"\n\tfor _, file := range files {\n\t\te.Logger.Debugf(\"upload avatar file: %s\", file.Filename)\n\t\t// 上传文件至指定目录\n\t\terr = c.SaveUploadedFile(file, filPath)\n\t\tif err != nil {\n\t\t\te.Logger.Errorf(\"save file error, %s\", err.Error())\n\t\t\te.Error(500, err, \"\")\n\t\t\treturn\n\t\t}\n\t}\n\treq.UserId = p.UserId\n\treq.Avatar = \"/\" + filPath\n\n\terr = s.UpdateAvatar(&req, p)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\te.OK(filPath, \"修改成功\")\n}\n\n// UpdateStatus 修改用户状态\n// @Summary 修改用户状态\n// @Description 获取JSON\n// @Tags 用户\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.UpdateSysUserStatusReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/user/status [put]\n// @Security Bearer\nfunc (e SysUser) UpdateStatus(c *gin.Context) {\n\ts := service.SysUser{}\n\treq := dto.UpdateSysUserStatusReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON, nil).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\treq.SetUpdateBy(user.GetUserId(c))\n\n\t//数据权限检查\n\tp := actions.GetPermissionFromContext(c)\n\n\terr = s.UpdateStatus(&req, p)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// ResetPwd 重置用户密码\n// @Summary 重置用户密码\n// @Description 获取JSON\n// @Tags 用户\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.ResetSysUserPwdReq true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/user/pwd/reset [put]\n// @Security Bearer\nfunc (e SysUser) ResetPwd(c *gin.Context) {\n\ts := service.SysUser{}\n\treq := dto.ResetSysUserPwdReq{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req, binding.JSON).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\treq.SetUpdateBy(user.GetUserId(c))\n\n\t//数据权限检查\n\tp := actions.GetPermissionFromContext(c)\n\n\terr = s.ResetPwd(&req, p)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\te.OK(req.GetId(), \"更新成功\")\n}\n\n// UpdatePwd\n// @Summary 修改密码\n// @Description 获取JSON\n// @Tags 用户\n// @Accept  application/json\n// @Product application/json\n// @Param data body dto.PassWord true \"body\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/user/pwd/set [put]\n// @Security Bearer\nfunc (e SysUser) UpdatePwd(c *gin.Context) {\n\ts := service.SysUser{}\n\treq := dto.PassWord{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\t// 数据权限检查\n\tp := actions.GetPermissionFromContext(c)\n\tvar hash []byte\n\tif hash, err = bcrypt.GenerateFromPassword([]byte(req.NewPassword), bcrypt.DefaultCost); err != nil {\n\t\treq.NewPassword = string(hash)\n\t}\n\n\terr = s.UpdatePwd(user.GetUserId(c), req.OldPassword, req.NewPassword, p)\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(http.StatusForbidden, err, \"密码修改失败\")\n\t\treturn\n\t}\n\n\te.OK(nil, \"密码修改成功\")\n}\n\n// GetProfile\n// @Summary 获取个人中心用户\n// @Description 获取JSON\n// @Tags 个人中心\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/user/profile [get]\n// @Security Bearer\nfunc (e SysUser) GetProfile(c *gin.Context) {\n\ts := service.SysUser{}\n\treq := dto.SysUserById{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\treq.Id = user.GetUserId(c)\n\n\tsysUser := models.SysUser{}\n\troles := make([]models.SysRole, 0)\n\tposts := make([]models.SysPost, 0)\n\terr = s.GetProfile(&req, &sysUser, &roles, &posts)\n\tif err != nil {\n\t\te.Logger.Errorf(\"get user profile error, %s\", err.Error())\n\t\te.Error(500, err, \"获取用户信息失败\")\n\t\treturn\n\t}\n\te.OK(gin.H{\n\t\t\"user\":  sysUser,\n\t\t\"roles\": roles,\n\t\t\"posts\": posts,\n\t}, \"查询成功\")\n}\n\n// GetInfo\n// @Summary 获取个人信息\n// @Description 获取JSON\n// @Tags 个人中心\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/getinfo [get]\n// @Security Bearer\nfunc (e SysUser) GetInfo(c *gin.Context) {\n\treq := dto.SysUserById{}\n\ts := service.SysUser{}\n\tr := service.SysRole{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tMakeService(&r.Service).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tp := actions.GetPermissionFromContext(c)\n\tvar roles = make([]string, 1)\n\troles[0] = user.GetRoleName(c)\n\tvar permissions = make([]string, 1)\n\tpermissions[0] = \"*:*:*\"\n\tvar buttons = make([]string, 1)\n\tbuttons[0] = \"*:*:*\"\n\n\tvar mp = make(map[string]interface{})\n\tmp[\"roles\"] = roles\n\tif user.GetRoleName(c) == \"admin\" || user.GetRoleName(c) == \"系统管理员\" {\n\t\tmp[\"permissions\"] = permissions\n\t\tmp[\"buttons\"] = buttons\n\t} else {\n\t\tlist, _ := r.GetById(user.GetRoleId(c))\n\t\tmp[\"permissions\"] = list\n\t\tmp[\"buttons\"] = list\n\t}\n\tsysUser := models.SysUser{}\n\treq.Id = user.GetUserId(c)\n\terr = s.Get(&req, p, &sysUser)\n\tif err != nil {\n\t\te.Error(http.StatusUnauthorized, err, \"登录失败\")\n\t\treturn\n\t}\n\tmp[\"introduction\"] = \" am a super administrator\"\n\tmp[\"avatar\"] = \"https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif\"\n\tif sysUser.Avatar != \"\" {\n\t\tmp[\"avatar\"] = sysUser.Avatar\n\t}\n\tmp[\"userName\"] = sysUser.Username\n\tmp[\"userId\"] = sysUser.UserId\n\tmp[\"deptId\"] = sysUser.DeptId\n\tmp[\"name\"] = sysUser.NickName\n\tmp[\"code\"] = 200\n\te.OK(mp, \"\")\n}\n"
  },
  {
    "path": "app/admin/models/casbin_rule.go",
    "content": "package models\n\ntype CasbinRule struct {\n\tID    uint   `gorm:\"primaryKey;autoIncrement\"`\n\tPtype string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV0    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV1    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV2    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV3    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV4    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV5    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n}\n\nfunc (CasbinRule) TableName() string {\n\treturn \"sys_casbin_rule\"\n}\n"
  },
  {
    "path": "app/admin/models/datascope.go",
    "content": "package models\n\nimport (\n\t\"errors\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"gorm.io/gorm\"\n\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n)\n\ntype DataPermission struct {\n\tDataScope string\n\tUserId    int\n\tDeptId    int\n\tRoleId    int\n}\n\nfunc (e *DataPermission) GetDataScope(tableName string, db *gorm.DB) (*gorm.DB, error) {\n\n\tif !config.ApplicationConfig.EnableDP {\n\t\tusageStr := `数据权限已经为您` + pkg.Green(`关闭`) + `，如需开启请参考配置文件字段说明`\n\t\tlog.Debug(\"%s\\n\", usageStr)\n\t\treturn db, nil\n\t}\n\tuser := new(SysUser)\n\trole := new(SysRole)\n\terr := db.Find(user, e.UserId).Error\n\tif err != nil {\n\t\treturn nil, errors.New(\"获取用户数据出错 msg:\" + err.Error())\n\t}\n\terr = db.Find(role, user.RoleId).Error\n\tif err != nil {\n\t\treturn nil, errors.New(\"获取用户数据出错 msg:\" + err.Error())\n\t}\n\tif role.DataScope == \"2\" {\n\t\tdb = db.Where(tableName+\".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)\", user.RoleId)\n\t}\n\tif role.DataScope == \"3\" {\n\t\tdb = db.Where(tableName+\".create_by in (SELECT user_id from sys_user where dept_id = ? )\", user.DeptId)\n\t}\n\tif role.DataScope == \"4\" {\n\t\tdb = db.Where(tableName+\".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))\", \"%\"+pkg.IntToString(user.DeptId)+\"%\")\n\t}\n\tif role.DataScope == \"5\" || role.DataScope == \"\" {\n\t\tdb = db.Where(tableName+\".create_by = ?\", e.UserId)\n\t}\n\n\treturn db, nil\n}\n\n//func DataScopes(tableName string, userId int) func(db *gorm.DB) *gorm.DB {\n//\treturn func(db *gorm.DB) *gorm.DB {\n//\t\tuser := new(SysUser)\n//\t\trole := new(SysRole)\n//\t\tuser.UserId = userId\n//\t\terr := db.Find(user, userId).Error\n//\t\tif err != nil {\n//\t\t\tdb.Error = errors.New(\"获取用户数据出错 msg:\" + err.Error())\n//\t\t\treturn db\n//\t\t}\n//\t\terr = db.Find(role, user.RoleId).Error\n//\t\tif err != nil {\n//\t\t\tdb.Error = errors.New(\"获取用户数据出错 msg:\" + err.Error())\n//\t\t\treturn db\n//\t\t}\n//\t\tif role.DataScope == \"2\" {\n//\t\t\treturn db.Where(tableName+\".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)\", user.RoleId)\n//\t\t}\n//\t\tif role.DataScope == \"3\" {\n//\t\t\treturn db.Where(tableName+\".create_by in (SELECT user_id from sys_user where dept_id = ? )\", user.DeptId)\n//\t\t}\n//\t\tif role.DataScope == \"4\" {\n//\t\t\treturn db.Where(tableName+\".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))\", \"%\"+pkg.IntToString(user.DeptId)+\"%\")\n//\t\t}\n//\t\tif role.DataScope == \"5\" || role.DataScope == \"\" {\n//\t\t\treturn db.Where(tableName+\".create_by = ?\", userId)\n//\t\t}\n//\t\treturn db\n//\t}\n//}\n"
  },
  {
    "path": "app/admin/models/initdb.go",
    "content": "package models\n\nimport (\n\t\"fmt\"\n\t\"go-admin/common/global\"\n\t\"gorm.io/gorm\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"strings\"\n)\n\nfunc InitDb(db *gorm.DB) (err error) {\n\tfilePath := \"config/db.sql\"\n\terr = ExecSql(db, filePath)\n\tif global.Driver == \"postgres\" {\n\t\tfilePath = \"config/pg.sql\"\n\t\terr = ExecSql(db, filePath)\n\t}\n\treturn err\n}\n\nfunc ExecSql(db *gorm.DB, filePath string) error {\n\tsql, err := Ioutil(filePath)\n\tif err != nil {\n\t\tfmt.Println(\"数据库基础数据初始化脚本读取失败！原因:\", err.Error())\n\t\treturn err\n\t}\n\tsqlList := strings.Split(sql, \";\")\n\tfor i := 0; i < len(sqlList)-1; i++ {\n\t\tif strings.Contains(sqlList[i], \"--\") {\n\t\t\tfmt.Println(sqlList[i])\n\t\t\tcontinue\n\t\t}\n\t\tsql := strings.Replace(sqlList[i]+\";\", \"\\n\", \"\", -1)\n\t\tsql = strings.TrimSpace(sql)\n\t\tif err = db.Exec(sql).Error; err != nil {\n\t\t\tlog.Printf(\"error sql: %s\", sql)\n\t\t\tif !strings.Contains(err.Error(), \"Query was empty\") {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc Ioutil(filePath string) (string, error) {\n\tif contents, err := ioutil.ReadFile(filePath); err == nil {\n\t\t//因为contents是[]byte类型，直接转换成string类型后会多一行空格,需要使用strings.Replace替换换行符\n\t\tresult := strings.Replace(string(contents), \"\\n\", \"\", 1)\n\t\tfmt.Println(\"Use ioutil.ReadFile to read a file:\", result)\n\t\treturn result, nil\n\t} else {\n\t\treturn \"\", err\n\t}\n}\n"
  },
  {
    "path": "app/admin/models/sys_api.go",
    "content": "package models\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"regexp\"\n\t\"strings\"\n\n\t\"github.com/bitly/go-simplejson\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/runtime\"\n\t\"github.com/go-admin-team/go-admin-core/storage\"\n\n\t\"go-admin/common/models\"\n)\n\ntype SysApi struct {\n\tId     int    `json:\"id\" gorm:\"primaryKey;autoIncrement;comment:主键编码\"`\n\tHandle string `json:\"handle\" gorm:\"size:128;comment:handle\"`\n\tTitle  string `json:\"title\" gorm:\"size:128;comment:标题\"`\n\tPath   string `json:\"path\" gorm:\"size:128;comment:地址\"`\n\tAction string `json:\"action\" gorm:\"size:16;comment:请求类型\"`\n\tType   string `json:\"type\" gorm:\"size:16;comment:接口类型\"`\n\tmodels.ModelTime\n\tmodels.ControlBy\n}\n\nfunc (*SysApi) TableName() string {\n\treturn \"sys_api\"\n}\n\nfunc (e *SysApi) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysApi) GetId() interface{} {\n\treturn e.Id\n}\n\nfunc SaveSysApi(message storage.Messager) (err error) {\n\tvar rb []byte\n\trb, err = json.Marshal(message.GetValues())\n\tif err != nil {\n\t\terr = fmt.Errorf(\"json Marshal error, %v\", err.Error())\n\t\treturn err\n\t}\n\n\tvar l runtime.Routers\n\terr = json.Unmarshal(rb, &l)\n\tif err != nil {\n\t\terr = fmt.Errorf(\"json Unmarshal error, %s\", err.Error())\n\t\treturn err\n\t}\n\tdbList := sdk.Runtime.GetDb()\n\tfor _, d := range dbList {\n\t\tfor _, v := range l.List {\n\t\t\tif v.HttpMethod != \"HEAD\" ||\n\t\t\t\tstrings.Contains(v.RelativePath, \"/swagger/\") ||\n\t\t\t\tstrings.Contains(v.RelativePath, \"/static/\") ||\n\t\t\t\tstrings.Contains(v.RelativePath, \"/form-generator/\") ||\n\t\t\t\tstrings.Contains(v.RelativePath, \"/sys/tables\") {\n\n\t\t\t\t// 根据接口方法注释里的@Summary填充接口名称，适用于代码生成器\n\t\t\t\t// 可在此处增加配置路径前缀的if判断，只对代码生成的自建应用进行定向的接口名称填充\n\t\t\t\tjsonFile, _ := ioutil.ReadFile(\"docs/swagger.json\")\n\t\t\t\tjsonData, _ := simplejson.NewFromReader(bytes.NewReader(jsonFile))\n\t\t\t\turlPath := v.RelativePath\n\t\t\t\tidPatten := \"(.*)/:(\\\\w+)\" // 正则替换，把:id换成{id}\n\t\t\t\treg, _ := regexp.Compile(idPatten)\n\t\t\t\tif reg.MatchString(urlPath) {\n\t\t\t\t\turlPath = reg.ReplaceAllString(v.RelativePath, \"${1}/{${2}}\") // 把:id换成{id}\n\t\t\t\t}\n\t\t\t\tapiTitle, _ := jsonData.Get(\"paths\").Get(urlPath).Get(strings.ToLower(v.HttpMethod)).Get(\"summary\").String()\n\n\t\t\t\terr := d.Debug().Where(SysApi{Path: v.RelativePath, Action: v.HttpMethod}).\n\t\t\t\t\tAttrs(SysApi{Handle: v.Handler, Title: apiTitle}).\n\t\t\t\t\tFirstOrCreate(&SysApi{}).\n\t\t\t\t\t//Update(\"handle\", v.Handler).\n\t\t\t\t\tError\n\t\t\t\tif err != nil {\n\t\t\t\t\terr := fmt.Errorf(\"Models SaveSysApi error: %s \\r\\n \", err.Error())\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/models/sys_config.go",
    "content": "package models\n\nimport (\n\t\"go-admin/common/models\"\n)\n\ntype SysConfig struct {\n\tmodels.Model\n\tConfigName  string `json:\"configName\" gorm:\"size:128;comment:ConfigName\"`   //\n\tConfigKey   string `json:\"configKey\" gorm:\"size:128;comment:ConfigKey\"`     //\n\tConfigValue string `json:\"configValue\" gorm:\"size:255;comment:ConfigValue\"` //\n\tConfigType  string `json:\"configType\" gorm:\"size:64;comment:ConfigType\"`\n\tIsFrontend  string `json:\"isFrontend\" gorm:\"size:64;comment:是否前台\"` //\n\tRemark      string `json:\"remark\" gorm:\"size:128;comment:Remark\"`  //\n\tmodels.ControlBy\n\tmodels.ModelTime\n}\n\nfunc (*SysConfig) TableName() string {\n\treturn \"sys_config\"\n}\n\nfunc (e *SysConfig) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysConfig) GetId() interface{} {\n\treturn e.Id\n}\n"
  },
  {
    "path": "app/admin/models/sys_dept.go",
    "content": "package models\n\nimport \"go-admin/common/models\"\n\ntype SysDept struct {\n\tDeptId   int    `json:\"deptId\" gorm:\"primaryKey;autoIncrement;\"` //部门编码\n\tParentId int    `json:\"parentId\" gorm:\"\"`                        //上级部门\n\tDeptPath string `json:\"deptPath\" gorm:\"size:255;\"`               //\n\tDeptName string `json:\"deptName\"  gorm:\"size:128;\"`              //部门名称\n\tSort     int    `json:\"sort\" gorm:\"size:4;\"`                     //排序\n\tLeader   string `json:\"leader\" gorm:\"size:128;\"`                 //负责人\n\tPhone    string `json:\"phone\" gorm:\"size:11;\"`                   //手机\n\tEmail    string `json:\"email\" gorm:\"size:64;\"`                   //邮箱\n\tStatus   int    `json:\"status\" gorm:\"size:4;\"`                   //状态\n\tmodels.ControlBy\n\tmodels.ModelTime\n\tDataScope string    `json:\"dataScope\" gorm:\"-\"`\n\tParams    string    `json:\"params\" gorm:\"-\"`\n\tChildren  []SysDept `json:\"children\" gorm:\"-\"`\n}\n\nfunc (*SysDept) TableName() string {\n\treturn \"sys_dept\"\n}\n\nfunc (e *SysDept) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysDept) GetId() interface{} {\n\treturn e.DeptId\n}\n"
  },
  {
    "path": "app/admin/models/sys_dict_data.go",
    "content": "package models\n\nimport (\n\t\"go-admin/common/models\"\n)\n\ntype SysDictData struct {\n\tDictCode  int    `json:\"dictCode\" gorm:\"primaryKey;column:dict_code;autoIncrement;comment:主键编码\"`\n\tDictSort  int    `json:\"dictSort\" gorm:\"size:20;comment:DictSort\"`\n\tDictLabel string `json:\"dictLabel\" gorm:\"size:128;comment:DictLabel\"`\n\tDictValue string `json:\"dictValue\" gorm:\"size:255;comment:DictValue\"`\n\tDictType  string `json:\"dictType\" gorm:\"size:64;comment:DictType\"`\n\tCssClass  string `json:\"cssClass\" gorm:\"size:128;comment:CssClass\"`\n\tListClass string `json:\"listClass\" gorm:\"size:128;comment:ListClass\"`\n\tIsDefault string `json:\"isDefault\" gorm:\"size:8;comment:IsDefault\"`\n\tStatus    int    `json:\"status\" gorm:\"size:4;comment:Status\"`\n\tDefault   string `json:\"default\" gorm:\"size:8;comment:Default\"`\n\tRemark    string `json:\"remark\" gorm:\"size:255;comment:Remark\"`\n\tmodels.ControlBy\n\tmodels.ModelTime\n}\n\nfunc (*SysDictData) TableName() string {\n\treturn \"sys_dict_data\"\n}\n\nfunc (e *SysDictData) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysDictData) GetId() interface{} {\n\treturn e.DictCode\n}\n"
  },
  {
    "path": "app/admin/models/sys_dict_type.go",
    "content": "package models\n\nimport (\n\t\"go-admin/common/models\"\n)\n\ntype SysDictType struct {\n\tID       int    `json:\"id\" gorm:\"primaryKey;column:dict_id;autoIncrement;comment:主键编码\"`\n\tDictName string `json:\"dictName\" gorm:\"size:128;comment:DictName\"`\n\tDictType string `json:\"dictType\" gorm:\"size:128;comment:DictType\"`\n\tStatus   int    `json:\"status\" gorm:\"size:4;comment:Status\"`\n\tRemark   string `json:\"remark\" gorm:\"size:255;comment:Remark\"`\n\tmodels.ControlBy\n\tmodels.ModelTime\n}\n\nfunc (*SysDictType) TableName() string {\n\treturn \"sys_dict_type\"\n}\n\nfunc (e *SysDictType) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysDictType) GetId() interface{} {\n\treturn e.ID\n}\n"
  },
  {
    "path": "app/admin/models/sys_login_log.go",
    "content": "package models\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"time\"\n\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/storage\"\n\n\t\"go-admin/common/models\"\n)\n\ntype SysLoginLog struct {\n\tmodels.Model\n\tUsername      string    `json:\"username\" gorm:\"size:128;comment:用户名\"`\n\tStatus        string    `json:\"status\" gorm:\"size:4;comment:状态\"`\n\tIpaddr        string    `json:\"ipaddr\" gorm:\"size:255;comment:ip地址\"`\n\tLoginLocation string    `json:\"loginLocation\" gorm:\"size:255;comment:归属地\"`\n\tBrowser       string    `json:\"browser\" gorm:\"size:255;comment:浏览器\"`\n\tOs            string    `json:\"os\" gorm:\"size:255;comment:系统\"`\n\tPlatform      string    `json:\"platform\" gorm:\"size:255;comment:固件\"`\n\tLoginTime     time.Time `json:\"loginTime\" gorm:\"comment:登录时间\"`\n\tRemark        string    `json:\"remark\" gorm:\"size:255;comment:备注\"`\n\tMsg           string    `json:\"msg\" gorm:\"size:255;comment:信息\"`\n\tCreatedAt     time.Time `json:\"createdAt\" gorm:\"comment:创建时间\"`\n\tUpdatedAt     time.Time `json:\"updatedAt\" gorm:\"comment:最后更新时间\"`\n\tmodels.ControlBy\n}\n\nfunc (*SysLoginLog) TableName() string {\n\treturn \"sys_login_log\"\n}\n\nfunc (e *SysLoginLog) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysLoginLog) GetId() interface{} {\n\treturn e.Id\n}\n\n// SaveLoginLog 从队列中获取登录日志\nfunc SaveLoginLog(message storage.Messager) (err error) {\n\t//准备db\n\tdb := sdk.Runtime.GetDbByKey(message.GetPrefix())\n\tif db == nil {\n\t\terr = errors.New(\"db not exist\")\n\t\tlog.Errorf(\"host[%s]'s %s\", message.GetPrefix(), err.Error())\n\t\treturn err\n\t}\n\tvar rb []byte\n\trb, err = json.Marshal(message.GetValues())\n\tif err != nil {\n\t\tlog.Errorf(\"json Marshal error, %s\", err.Error())\n\t\treturn err\n\t}\n\tvar l SysLoginLog\n\terr = json.Unmarshal(rb, &l)\n\tif err != nil {\n\t\tlog.Errorf(\"json Unmarshal error, %s\", err.Error())\n\t\treturn err\n\t}\n\terr = db.Create(&l).Error\n\tif err != nil {\n\t\tlog.Errorf(\"db create error, %s\", err.Error())\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/models/sys_menu.go",
    "content": "package models\n\nimport \"go-admin/common/models\"\n\ntype SysMenu struct {\n\tMenuId     int       `json:\"menuId\" gorm:\"primaryKey;autoIncrement\"`\n\tMenuName   string    `json:\"menuName\" gorm:\"size:128;\"`\n\tTitle      string    `json:\"title\" gorm:\"size:128;\"`\n\tIcon       string    `json:\"icon\" gorm:\"size:128;\"`\n\tPath       string    `json:\"path\" gorm:\"size:128;\"`\n\tPaths      string    `json:\"paths\" gorm:\"size:128;\"`\n\tMenuType   string    `json:\"menuType\" gorm:\"size:1;\"`\n\tAction     string    `json:\"action\" gorm:\"size:16;\"`\n\tPermission string    `json:\"permission\" gorm:\"size:255;\"`\n\tParentId   int       `json:\"parentId\" gorm:\"size:11;\"`\n\tNoCache    bool      `json:\"noCache\" gorm:\"size:8;\"`\n\tBreadcrumb string    `json:\"breadcrumb\" gorm:\"size:255;\"`\n\tComponent  string    `json:\"component\" gorm:\"size:255;\"`\n\tSort       int       `json:\"sort\" gorm:\"size:4;\"`\n\tVisible    string    `json:\"visible\" gorm:\"size:1;\"`\n\tIsFrame    string    `json:\"isFrame\" gorm:\"size:1;DEFAULT:0;\"`\n\tSysApi     []SysApi  `json:\"sysApi\" gorm:\"many2many:sys_menu_api_rule\"`\n\tApis       []int     `json:\"apis\" gorm:\"-\"`\n\tDataScope  string    `json:\"dataScope\" gorm:\"-\"`\n\tParams     string    `json:\"params\" gorm:\"-\"`\n\tRoleId     int       `gorm:\"-\"`\n\tChildren   []SysMenu `json:\"children,omitempty\" gorm:\"-\"`\n\tIsSelect   bool      `json:\"is_select\" gorm:\"-\"`\n\tmodels.ControlBy\n\tmodels.ModelTime\n}\n\ntype SysMenuSlice []SysMenu\n\nfunc (x SysMenuSlice) Len() int           { return len(x) }\nfunc (x SysMenuSlice) Less(i, j int) bool { return x[i].Sort < x[j].Sort }\nfunc (x SysMenuSlice) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }\n\nfunc (*SysMenu) TableName() string {\n\treturn \"sys_menu\"\n}\n\nfunc (e *SysMenu) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysMenu) GetId() interface{} {\n\treturn e.MenuId\n}\n"
  },
  {
    "path": "app/admin/models/sys_opera_log.go",
    "content": "package models\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"time\"\n\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/storage\"\n\n\t\"go-admin/common/models\"\n)\n\ntype SysOperaLog struct {\n\tmodels.Model\n\tTitle         string    `json:\"title\" gorm:\"size:255;comment:操作模块\"`\n\tBusinessType  string    `json:\"businessType\" gorm:\"size:128;comment:操作类型\"`\n\tBusinessTypes string    `json:\"businessTypes\" gorm:\"size:128;comment:BusinessTypes\"`\n\tMethod        string    `json:\"method\" gorm:\"size:128;comment:函数\"`\n\tRequestMethod string    `json:\"requestMethod\" gorm:\"size:128;comment:请求方式 GET POST PUT DELETE\"`\n\tOperatorType  string    `json:\"operatorType\" gorm:\"size:128;comment:操作类型\"`\n\tOperName      string    `json:\"operName\" gorm:\"size:128;comment:操作者\"`\n\tDeptName      string    `json:\"deptName\" gorm:\"size:128;comment:部门名称\"`\n\tOperUrl       string    `json:\"operUrl\" gorm:\"size:255;comment:访问地址\"`\n\tOperIp        string    `json:\"operIp\" gorm:\"size:128;comment:客户端ip\"`\n\tOperLocation  string    `json:\"operLocation\" gorm:\"size:128;comment:访问位置\"`\n\tOperParam     string    `json:\"operParam\" gorm:\"text;comment:请求参数\"`\n\tStatus        string    `json:\"status\" gorm:\"size:4;comment:操作状态 1:正常 2:关闭\"`\n\tOperTime      time.Time `json:\"operTime\" gorm:\"comment:操作时间\"`\n\tJsonResult    string    `json:\"jsonResult\" gorm:\"size:255;comment:返回数据\"`\n\tRemark        string    `json:\"remark\" gorm:\"size:255;comment:备注\"`\n\tLatencyTime   string    `json:\"latencyTime\" gorm:\"size:128;comment:耗时\"`\n\tUserAgent     string    `json:\"userAgent\" gorm:\"size:255;comment:ua\"`\n\tCreatedAt     time.Time `json:\"createdAt\" gorm:\"comment:创建时间\"`\n\tUpdatedAt     time.Time `json:\"updatedAt\" gorm:\"comment:最后更新时间\"`\n\tmodels.ControlBy\n}\n\nfunc (*SysOperaLog) TableName() string {\n\treturn \"sys_opera_log\"\n}\n\nfunc (e *SysOperaLog) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysOperaLog) GetId() interface{} {\n\treturn e.Id\n}\n\n// SaveOperaLog 从队列中获取操作日志\nfunc SaveOperaLog(message storage.Messager) (err error) {\n\t//准备db\n\tdb := sdk.Runtime.GetDbByKey(message.GetPrefix())\n\tif db == nil {\n\t\terr = errors.New(\"db not exist\")\n\t\tlog.Errorf(\"host[%s]'s %s\", message.GetPrefix(), err.Error())\n\t\t// Log writing to the database ignores error\n\t\treturn nil\n\t}\n\tvar rb []byte\n\trb, err = json.Marshal(message.GetValues())\n\tif err != nil {\n\t\tlog.Errorf(\"json Marshal error, %s\", err.Error())\n\t\t// Log writing to the database ignores error\n\t\treturn nil\n\t}\n\tvar l SysOperaLog\n\terr = json.Unmarshal(rb, &l)\n\tif err != nil {\n\t\tlog.Errorf(\"json Unmarshal error, %s\", err.Error())\n\t\t// Log writing to the database ignores error\n\t\treturn nil\n\t}\n\t// 超出100个字符返回值截断\n\tif len(l.JsonResult) > 100 {\n\t\tl.JsonResult = l.JsonResult[:100]\n\t}\n\terr = db.Create(&l).Error\n\tif err != nil {\n\t\tlog.Errorf(\"db create error, %s\", err.Error())\n\t\t// Log writing to the database ignores error\n\t\treturn nil\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/models/sys_post.go",
    "content": "package models\n\nimport \"go-admin/common/models\"\n\ntype SysPost struct {\n\tPostId   int    `gorm:\"primaryKey;autoIncrement\" json:\"postId\"` //岗位编号\n\tPostName string `gorm:\"size:128;\" json:\"postName\"`              //岗位名称\n\tPostCode string `gorm:\"size:128;\" json:\"postCode\"`              //岗位代码\n\tSort     int    `gorm:\"size:4;\" json:\"sort\"`                    //岗位排序\n\tStatus   int    `gorm:\"size:4;\" json:\"status\"`                  //状态\n\tRemark   string `gorm:\"size:255;\" json:\"remark\"`                //描述\n\tmodels.ControlBy\n\tmodels.ModelTime\n\n\tDataScope string `gorm:\"-\" json:\"dataScope\"`\n\tParams    string `gorm:\"-\" json:\"params\"`\n}\n\nfunc (*SysPost) TableName() string {\n\treturn \"sys_post\"\n}\n\nfunc (e *SysPost) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysPost) GetId() interface{} {\n\treturn e.PostId\n}\n"
  },
  {
    "path": "app/admin/models/sys_role.go",
    "content": "package models\n\nimport \"go-admin/common/models\"\n\ntype SysRole struct {\n\tRoleId    int        `json:\"roleId\" gorm:\"primaryKey;autoIncrement\"` // 角色编码\n\tRoleName  string     `json:\"roleName\" gorm:\"size:128;\"`              // 角色名称\n\tStatus    string     `json:\"status\" gorm:\"size:4;\"`                  // 状态 1禁用 2正常\n\tRoleKey   string     `json:\"roleKey\" gorm:\"size:128;\"`               //角色代码\n\tRoleSort  int        `json:\"roleSort\" gorm:\"\"`                       //角色排序\n\tFlag      string     `json:\"flag\" gorm:\"size:128;\"`                  //\n\tRemark    string     `json:\"remark\" gorm:\"size:255;\"`                //备注\n\tAdmin     bool       `json:\"admin\" gorm:\"size:4;\"`\n\tDataScope string     `json:\"dataScope\" gorm:\"size:128;\"`\n\tParams    string     `json:\"params\" gorm:\"-\"`\n\tMenuIds   []int      `json:\"menuIds\" gorm:\"-\"`\n\tDeptIds   []int      `json:\"deptIds\" gorm:\"-\"`\n\tSysDept   []SysDept  `json:\"sysDept\" gorm:\"many2many:sys_role_dept;foreignKey:RoleId;joinForeignKey:role_id;references:DeptId;joinReferences:dept_id;\"`\n\tSysMenu   *[]SysMenu `json:\"sysMenu\" gorm:\"many2many:sys_role_menu;foreignKey:RoleId;joinForeignKey:role_id;references:MenuId;joinReferences:menu_id;\"`\n\tmodels.ControlBy\n\tmodels.ModelTime\n}\n\nfunc (*SysRole) TableName() string {\n\treturn \"sys_role\"\n}\n\nfunc (e *SysRole) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysRole) GetId() interface{} {\n\treturn e.RoleId\n}\n"
  },
  {
    "path": "app/admin/models/sys_user.go",
    "content": "package models\n\nimport (\n\t\"go-admin/common/models\"\n\t\"golang.org/x/crypto/bcrypt\"\n\t\"gorm.io/gorm\"\n)\n\ntype SysUser struct {\n\tUserId   int      `gorm:\"primaryKey;autoIncrement;comment:编码\"  json:\"userId\"`\n\tUsername string   `json:\"username\" gorm:\"size:64;comment:用户名\"`\n\tPassword string   `json:\"-\" gorm:\"size:128;comment:密码\"`\n\tNickName string   `json:\"nickName\" gorm:\"size:128;comment:昵称\"`\n\tPhone    string   `json:\"phone\" gorm:\"size:11;comment:手机号\"`\n\tRoleId   int      `json:\"roleId\" gorm:\"size:20;comment:角色ID\"`\n\tSalt     string   `json:\"-\" gorm:\"size:255;comment:加盐\"`\n\tAvatar   string   `json:\"avatar\" gorm:\"size:255;comment:头像\"`\n\tSex      string   `json:\"sex\" gorm:\"size:255;comment:性别\"`\n\tEmail    string   `json:\"email\" gorm:\"size:128;comment:邮箱\"`\n\tDeptId   int      `json:\"deptId\" gorm:\"size:20;comment:部门\"`\n\tPostId   int      `json:\"postId\" gorm:\"size:20;comment:岗位\"`\n\tRemark   string   `json:\"remark\" gorm:\"size:255;comment:备注\"`\n\tStatus   string   `json:\"status\" gorm:\"size:4;comment:状态\"`\n\tDeptIds  []int    `json:\"deptIds\" gorm:\"-\"`\n\tPostIds  []int    `json:\"postIds\" gorm:\"-\"`\n\tRoleIds  []int    `json:\"roleIds\" gorm:\"-\"`\n\tDept     *SysDept `json:\"dept\"`\n\tmodels.ControlBy\n\tmodels.ModelTime\n}\n\nfunc (*SysUser) TableName() string {\n\treturn \"sys_user\"\n}\n\nfunc (e *SysUser) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysUser) GetId() interface{} {\n\treturn e.UserId\n}\n\n// Encrypt 加密\nfunc (e *SysUser) Encrypt() (err error) {\n\tif e.Password == \"\" {\n\t\treturn\n\t}\n\n\tvar hash []byte\n\tif hash, err = bcrypt.GenerateFromPassword([]byte(e.Password), bcrypt.DefaultCost); err != nil {\n\t\treturn\n\t} else {\n\t\te.Password = string(hash)\n\t\treturn\n\t}\n}\n\nfunc (e *SysUser) BeforeCreate(_ *gorm.DB) error {\n\treturn e.Encrypt()\n}\n\nfunc (e *SysUser) BeforeUpdate(_ *gorm.DB) error {\n\tvar err error\n\tif e.Password != \"\" {\n\t\terr = e.Encrypt()\n\t}\n\treturn err\n}\n\nfunc (e *SysUser) AfterFind(_ *gorm.DB) error {\n\te.DeptIds = []int{e.DeptId}\n\te.PostIds = []int{e.PostId}\n\te.RoleIds = []int{e.RoleId}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/router/init_router.go",
    "content": "package router\n\nimport (\n\t\"os\"\n\n\t\"github.com/gin-gonic/gin\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\tcommon \"go-admin/common/middleware\"\n)\n\n// InitRouter 路由初始化，不要怀疑，这里用到了\nfunc InitRouter() {\n\tvar r *gin.Engine\n\th := sdk.Runtime.GetEngine()\n\tif h == nil {\n\t\tlog.Fatal(\"not found engine...\")\n\t\tos.Exit(-1)\n\t}\n\tswitch h.(type) {\n\tcase *gin.Engine:\n\t\tr = h.(*gin.Engine)\n\tdefault:\n\t\tlog.Fatal(\"not support other engine\")\n\t\tos.Exit(-1)\n\t}\n\n\t// the jwt middleware\n\tauthMiddleware, err := common.AuthInit()\n\tif err != nil {\n\t\tlog.Fatalf(\"JWT Init Error, %s\", err.Error())\n\t}\n\n\t// 注册系统路由\n\tInitSysRouter(r, authMiddleware)\n\n\t// 注册业务路由\n\t// TODO: 这里可存放业务路由，里边并无实际路由只有演示代码\n\tInitExamplesRouter(r, authMiddleware)\n}\n"
  },
  {
    "path": "app/admin/router/router.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t_ \"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n)\n\nvar (\n\trouterNoCheckRole = make([]func(*gin.RouterGroup), 0)\n\trouterCheckRole   = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0)\n)\n\nfunc InitExamplesRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine {\n\n\t// 无需认证的路由\n\texamplesNoCheckRoleRouter(r)\n\t// 需要认证的路由\n\texamplesCheckRoleRouter(r, authMiddleware)\n\n\treturn r\n}\n\n// 无需认证的路由示例\nfunc examplesNoCheckRoleRouter(r *gin.Engine) {\n\t// 可根据业务需求来设置接口版本\n\tv1 := r.Group(\"/api/v1\")\n\tfor _, f := range routerNoCheckRole {\n\t\tf(v1)\n\t}\n}\n\n// 需要认证的路由示例\nfunc examplesCheckRoleRouter(r *gin.Engine, authMiddleware *jwtauth.GinJWTMiddleware) {\n\t// 可根据业务需求来设置接口版本\n\tv1 := r.Group(\"/api/v1\")\n\tfor _, f := range routerCheckRole {\n\t\tf(v1, authMiddleware)\n\t}\n}\n"
  },
  {
    "path": "app/admin/router/sys_api.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSysApiRouter)\n}\n\n// registerSysApiRouter\nfunc registerSysApiRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.SysApi{}\n\tr := v1.Group(\"/sys-api\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tr.GET(\"\", api.GetPage)\n\t\tr.GET(\"/:id\", api.Get)\n\t\tr.PUT(\"/:id\", api.Update)\n\t}\n}\n"
  },
  {
    "path": "app/admin/router/sys_config.go",
    "content": "package router\n\nimport (\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/common/middleware\"\n\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSysConfigRouter)\n}\n\n// 需认证的路由代码\nfunc registerSysConfigRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.SysConfig{}\n\tr := v1.Group(\"/config\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tr.GET(\"\", api.GetPage)\n\t\tr.GET(\"/:id\", api.Get)\n\t\tr.POST(\"\", api.Insert)\n\t\tr.PUT(\"/:id\", api.Update)\n\t\tr.DELETE(\"\", api.Delete)\n\t}\n\n\tr1 := v1.Group(\"/configKey\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\tr1.GET(\"/:configKey\", api.GetSysConfigByKEYForService)\n\t}\n\n\tr2 := v1.Group(\"/app-config\")\n\t{\n\t\tr2.GET(\"\", api.Get2SysApp)\n\t}\n\n\tr3 := v1.Group(\"/set-config\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\tr3.PUT(\"\", api.Update2Set)\n\t\tr3.GET(\"\", api.Get2Set)\n\t}\n\n}\n"
  },
  {
    "path": "app/admin/router/sys_dept.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSysDeptRouter)\n}\n\n// 需认证的路由代码\nfunc registerSysDeptRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.SysDept{}\n\n\tr := v1.Group(\"/dept\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tr.GET(\"\", api.GetPage)\n\t\tr.GET(\"/:id\", api.Get)\n\t\tr.POST(\"\", api.Insert)\n\t\tr.PUT(\"/:id\", api.Update)\n\t\tr.DELETE(\"\", api.Delete)\n\t}\n\n\tr1 := v1.Group(\"\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\tr1.GET(\"/deptTree\", api.Get2Tree)\n\t}\n\n}"
  },
  {
    "path": "app/admin/router/sys_dict.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerDictRouter)\n}\n\nfunc registerDictRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tdictApi := apis.SysDictType{}\n\tdataApi := apis.SysDictData{}\n\tdicts := v1.Group(\"/dict\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\n\t\tdicts.GET(\"/data\", dataApi.GetPage)\n\t\tdicts.GET(\"/data/:dictCode\", dataApi.Get)\n\t\tdicts.POST(\"/data\", dataApi.Insert)\n\t\tdicts.PUT(\"/data/:dictCode\", dataApi.Update)\n\t\tdicts.DELETE(\"/data\", dataApi.Delete)\n\n\t\tdicts.GET(\"/type-option-select\", dictApi.GetAll)\n\t\tdicts.GET(\"/type\", dictApi.GetPage)\n\t\tdicts.GET(\"/type/:id\", dictApi.Get)\n\t\tdicts.POST(\"/type\", dictApi.Insert)\n\t\tdicts.PUT(\"/type/:id\", dictApi.Update)\n\t\tdicts.DELETE(\"/type\", dictApi.Delete)\n\t}\n\topSelect := v1.Group(\"/dict-data\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\topSelect.GET(\"/option-select\", dataApi.GetAll)\n\t}\n}\n"
  },
  {
    "path": "app/admin/router/sys_login_log.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSysLoginLogRouter)\n}\n\n// 需认证的路由代码\nfunc registerSysLoginLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.SysLoginLog{}\n\n\tr := v1.Group(\"/sys-login-log\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tr.GET(\"\", api.GetPage)\n\t\tr.GET(\"/:id\", api.Get)\n\t\tr.DELETE(\"\", api.Delete)\n\t}\n}"
  },
  {
    "path": "app/admin/router/sys_menu.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSysMenuRouter)\n}\n\n// 需认证的路由代码\nfunc registerSysMenuRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.SysMenu{}\n\n\tr := v1.Group(\"/menu\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tr.GET(\"\", api.GetPage)\n\t\tr.GET(\"/:id\", api.Get)\n\t\tr.POST(\"\", api.Insert)\n\t\tr.PUT(\"/:id\", api.Update)\n\t\tr.DELETE(\"\", api.Delete)\n\t}\n\n\tr1 := v1.Group(\"\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\tr1.GET(\"/menurole\", api.GetMenuRole)\n\t\t//r1.GET(\"/menuids\", api.GetMenuIDS)\n\t}\n\n}"
  },
  {
    "path": "app/admin/router/sys_opera_log.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSysOperaLogRouter)\n}\n\n// 需认证的路由代码\nfunc registerSysOperaLogRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.SysOperaLog{}\n\tr := v1.Group(\"/sys-opera-log\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tr.GET(\"\", api.GetPage)\n\t\tr.GET(\"/:id\", api.Get)\n\t\tr.DELETE(\"\", api.Delete)\n\t}\n}"
  },
  {
    "path": "app/admin/router/sys_post.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSyPostRouter)\n}\n\n// 需认证的路由代码\nfunc registerSyPostRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.SysPost{}\n\tr := v1.Group(\"/post\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tr.GET(\"\", api.GetPage)\n\t\tr.GET(\"/:id\", api.Get)\n\t\tr.POST(\"\", api.Insert)\n\t\tr.PUT(\"/:id\", api.Update)\n\t\tr.DELETE(\"\", api.Delete)\n\t}\n}"
  },
  {
    "path": "app/admin/router/sys_role.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSysRoleRouter)\n}\n\n// 需认证的路由代码\nfunc registerSysRoleRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.SysRole{}\n\tr := v1.Group(\"/role\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tr.GET(\"\", api.GetPage)\n\t\tr.GET(\"/:id\", api.Get)\n\t\tr.POST(\"\", api.Insert)\n\t\tr.PUT(\"/:id\", api.Update)\n\t\tr.DELETE(\"\", api.Delete)\n\t}\n\tr1 := v1.Group(\"\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\tr1.PUT(\"/role-status\", api.Update2Status)\n\t\tr1.PUT(\"/roledatascope\", api.Update2DataScope)\n\t}\n}\n"
  },
  {
    "path": "app/admin/router/sys_router.go",
    "content": "package router\n\nimport (\n\t\"go-admin/app/admin/apis\"\n\t\"mime\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/ws\"\n\tginSwagger \"github.com/swaggo/gin-swagger\"\n\n\tswaggerfiles \"github.com/swaggo/files\"\n\n\t\"go-admin/common/middleware\"\n\t\"go-admin/common/middleware/handler\"\n\t_ \"go-admin/docs/admin\"\n)\n\nfunc InitSysRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.RouterGroup {\n\tg := r.Group(\"\")\n\tsysBaseRouter(g)\n\t// 静态文件\n\tsysStaticFileRouter(g)\n\t// swagger；注意：生产环境可以注释掉\n\tif config.ApplicationConfig.Mode != \"prod\" {\n\t\tsysSwaggerRouter(g)\n\t}\n\t// 需要认证\n\tsysCheckRoleRouterInit(g, authMiddleware)\n\treturn g\n}\n\nfunc sysBaseRouter(r *gin.RouterGroup) {\n\n\tgo ws.WebsocketManager.Start()\n\tgo ws.WebsocketManager.SendService()\n\tgo ws.WebsocketManager.SendAllService()\n\n\tif config.ApplicationConfig.Mode != \"prod\" {\n\t\tr.GET(\"/\", apis.GoAdmin)\n\t}\n\tr.GET(\"/info\", handler.Ping)\n}\n\nfunc sysStaticFileRouter(r *gin.RouterGroup) {\n\terr := mime.AddExtensionType(\".js\", \"application/javascript\")\n\tif err != nil {\n\t\treturn\n\t}\n\tr.Static(\"/static\", \"./static\")\n\tif config.ApplicationConfig.Mode != \"prod\" {\n\t\tr.Static(\"/form-generator\", \"./static/form-generator\")\n\t}\n}\n\nfunc sysSwaggerRouter(r *gin.RouterGroup) {\n\tr.GET(\"/swagger/admin/*any\", ginSwagger.WrapHandler(swaggerfiles.NewHandler(), ginSwagger.InstanceName(\"admin\")))\n}\n\nfunc sysCheckRoleRouterInit(r *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\twss := r.Group(\"\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\twss.GET(\"/ws/:id/:channel\", ws.WebsocketManager.WsClient)\n\t\twss.GET(\"/wslogout/:id/:channel\", ws.WebsocketManager.UnWsClient)\n\t}\n\n\tv1 := r.Group(\"/api/v1\")\n\t{\n\t\tv1.POST(\"/login\", authMiddleware.LoginHandler)\n\t\t// Refresh time can be longer than token timeout\n\t\tv1.GET(\"/refresh_token\", authMiddleware.RefreshHandler)\n\t}\n\tregisterBaseRouter(v1, authMiddleware)\n}\n\nfunc registerBaseRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.SysMenu{}\n\tapi2 := apis.SysDept{}\n\tv1auth := v1.Group(\"\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tv1auth.GET(\"/roleMenuTreeselect/:roleId\", api.GetMenuTreeSelect)\n\t\t//v1.GET(\"/menuTreeselect\", api.GetMenuTreeSelect)\n\t\tv1auth.GET(\"/roleDeptTreeselect/:roleId\", api2.GetDeptTreeRoleSelect)\n\t\tv1auth.POST(\"/logout\", handler.LogOut)\n\t}\n}\n"
  },
  {
    "path": "app/admin/router/sys_user.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/common/actions\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSysUserRouter)\n}\n\n// 需认证的路由代码\nfunc registerSysUserRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.SysUser{}\n\tr := v1.Group(\"/sys-user\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()).Use(actions.PermissionAction())\n\t{\n\t\tr.GET(\"\", api.GetPage)\n\t\tr.GET(\"/:id\", api.Get)\n\t\tr.POST(\"\", api.Insert)\n\t\tr.PUT(\"\", api.Update)\n\t\tr.DELETE(\"\", api.Delete)\n\t}\n\n\tuser := v1.Group(\"/user\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole()).Use(actions.PermissionAction())\n\t{\n\t\tuser.GET(\"/profile\", api.GetProfile)\n\t\tuser.POST(\"/avatar\", api.InsetAvatar)\n\t\tuser.PUT(\"/pwd/set\", api.UpdatePwd)\n\t\tuser.PUT(\"/pwd/reset\", api.ResetPwd)\n\t\tuser.PUT(\"/status\", api.UpdateStatus)\n\t}\n\tv1auth := v1.Group(\"\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\tv1auth.GET(\"/getinfo\", api.GetInfo)\n\t}\n}"
  },
  {
    "path": "app/admin/service/dto/sys_api.go",
    "content": "package dto\n\nimport (\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/common/dto\"\n\tcommon \"go-admin/common/models\"\n)\n\n// SysApiGetPageReq 功能列表请求参数\ntype SysApiGetPageReq struct {\n\tdto.Pagination `search:\"-\"`\n\tTitle          string `form:\"title\"  search:\"type:contains;column:title;table:sys_api\" comment:\"标题\"`\n\tPath           string `form:\"path\"  search:\"type:contains;column:path;table:sys_api\" comment:\"地址\"`\n\tAction         string `form:\"action\"  search:\"type:exact;column:action;table:sys_api\" comment:\"请求方式\"`\n\tParentId       string `form:\"parentId\"  search:\"type:exact;column:parent_id;table:sys_api\" comment:\"按钮id\"`\n\tType           string `form:\"type\" search:\"-\" comment:\"类型\"`\n\tSysApiOrder\n}\n\ntype SysApiOrder struct {\n\tTitleOrder     string `search:\"type:order;column:title;table:sys_api\" form:\"titleOrder\"`\n\tPathOrder      string `search:\"type:order;column:path;table:sys_api\" form:\"pathOrder\"`\n\tCreatedAtOrder string `search:\"type:order;column:created_at;table:sys_api\" form:\"createdAtOrder\"`\n}\n\nfunc (m *SysApiGetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\n// SysApiInsertReq 功能创建请求参数\ntype SysApiInsertReq struct {\n\tId     int    `json:\"-\" comment:\"编码\"` // 编码\n\tHandle string `json:\"handle\" comment:\"handle\"`\n\tTitle  string `json:\"title\" comment:\"标题\"`\n\tPath   string `json:\"path\" comment:\"地址\"`\n\tType   string `json:\"type\" comment:\"\"`\n\tAction string `json:\"action\" comment:\"类型\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysApiInsertReq) Generate(model *models.SysApi) {\n\tmodel.Handle = s.Handle\n\tmodel.Title = s.Title\n\tmodel.Path = s.Path\n\tmodel.Type = s.Type\n\tmodel.Action = s.Action\n}\n\nfunc (s *SysApiInsertReq) GetId() interface{} {\n\treturn s.Id\n}\n\n// SysApiUpdateReq 功能更新请求参数\ntype SysApiUpdateReq struct {\n\tId     int    `uri:\"id\" comment:\"编码\"` // 编码\n\tHandle string `json:\"handle\" comment:\"handle\"`\n\tTitle  string `json:\"title\" comment:\"标题\"`\n\tPath   string `json:\"path\" comment:\"地址\"`\n\tType   string `json:\"type\" comment:\"\"`\n\tAction string `json:\"action\" comment:\"类型\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysApiUpdateReq) Generate(model *models.SysApi) {\n\tif s.Id != 0 {\n\t\tmodel.Id = s.Id\n\t}\n\tmodel.Handle = s.Handle\n\tmodel.Title = s.Title\n\tmodel.Path = s.Path\n\tmodel.Type = s.Type\n\tmodel.Action = s.Action\n}\n\nfunc (s *SysApiUpdateReq) GetId() interface{} {\n\treturn s.Id\n}\n\n// SysApiGetReq 功能获取请求参数\ntype SysApiGetReq struct {\n\tId int `uri:\"id\"`\n}\n\nfunc (s *SysApiGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\n// SysApiDeleteReq 功能删除请求参数\ntype SysApiDeleteReq struct {\n\tIds []int `json:\"ids\"`\n}\n\nfunc (s *SysApiDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n"
  },
  {
    "path": "app/admin/service/dto/sys_config.go",
    "content": "package dto\n\nimport (\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/common/dto\"\n\tcommon \"go-admin/common/models\"\n)\n\n// SysConfigGetPageReq 列表或者搜索使用结构体\ntype SysConfigGetPageReq struct {\n\tdto.Pagination `search:\"-\"`\n\tConfigName     string `form:\"configName\" search:\"type:contains;column:config_name;table:sys_config\"`\n\tConfigKey      string `form:\"configKey\" search:\"type:contains;column:config_key;table:sys_config\"`\n\tConfigType     string `form:\"configType\" search:\"type:exact;column:config_type;table:sys_config\"`\n\tIsFrontend     string `form:\"isFrontend\" search:\"type:exact;column:is_frontend;table:sys_config\"`\n\tSysConfigOrder\n}\n\ntype SysConfigOrder struct {\n\tIdOrder         string `search:\"type:order;column:id;table:sys_config\" form:\"idOrder\"`\n\tConfigNameOrder string `search:\"type:order;column:config_name;table:sys_config\" form:\"configNameOrder\"`\n\tConfigKeyOrder  string `search:\"type:order;column:config_key;table:sys_config\" form:\"configKeyOrder\"`\n\tConfigTypeOrder string `search:\"type:order;column:config_type;table:sys_config\" form:\"configTypeOrder\"`\n\tCreatedAtOrder  string `search:\"type:order;column:created_at;table:sys_config\" form:\"createdAtOrder\"`\n}\n\nfunc (m *SysConfigGetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype SysConfigGetToSysAppReq struct {\n\tIsFrontend string `form:\"isFrontend\" search:\"type:exact;column:is_frontend;table:sys_config\"`\n}\n\nfunc (m *SysConfigGetToSysAppReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\n// SysConfigControl 增、改使用的结构体\ntype SysConfigControl struct {\n\tId          int    `uri:\"Id\" comment:\"编码\"` // 编码\n\tConfigName  string `json:\"configName\" comment:\"\"`\n\tConfigKey   string `uri:\"configKey\" json:\"configKey\" comment:\"\"`\n\tConfigValue string `json:\"configValue\" comment:\"\"`\n\tConfigType  string `json:\"configType\" comment:\"\"`\n\tIsFrontend  string `json:\"isFrontend\"`\n\tRemark      string `json:\"remark\" comment:\"\"`\n\tcommon.ControlBy\n}\n\n// Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型\nfunc (s *SysConfigControl) Generate(model *models.SysConfig) {\n\tif s.Id == 0 {\n\t\tmodel.Model = common.Model{Id: s.Id}\n\t}\n\tmodel.ConfigName = s.ConfigName\n\tmodel.ConfigKey = s.ConfigKey\n\tmodel.ConfigValue = s.ConfigValue\n\tmodel.ConfigType = s.ConfigType\n\tmodel.IsFrontend = s.IsFrontend\n\tmodel.Remark = s.Remark\n\n}\n\n// GetId 获取数据对应的ID\nfunc (s *SysConfigControl) GetId() interface{} {\n\treturn s.Id\n}\n\n// GetSetSysConfigReq 增、改使用的结构体\ntype GetSetSysConfigReq struct {\n\tConfigKey   string `json:\"configKey\" comment:\"\"`\n\tConfigValue string `json:\"configValue\" comment:\"\"`\n}\n\n// Generate 结构体数据转化 从 SysConfigControl 至 system.SysConfig 对应的模型\nfunc (s *GetSetSysConfigReq) Generate(model *models.SysConfig) {\n\tmodel.ConfigValue = s.ConfigValue\n}\n\ntype UpdateSetSysConfigReq map[string]string\n\n// SysConfigByKeyReq 根据Key获取配置\ntype SysConfigByKeyReq struct {\n\tConfigKey string `uri:\"configKey\" search:\"type:contains;column:config_key;table:sys_config\"`\n}\n\nfunc (m *SysConfigByKeyReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype GetSysConfigByKEYForServiceResp struct {\n\tConfigKey   string `json:\"configKey\" comment:\"\"`\n\tConfigValue string `json:\"configValue\" comment:\"\"`\n}\n\ntype SysConfigGetReq struct {\n\tId int `uri:\"id\"`\n}\n\nfunc (s *SysConfigGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype SysConfigDeleteReq struct {\n\tIds []int `json:\"ids\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysConfigDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n"
  },
  {
    "path": "app/admin/service/dto/sys_dept.go",
    "content": "package dto\n\nimport (\n\t\"go-admin/app/admin/models\"\n\tcommon \"go-admin/common/models\"\n)\n\n// SysDeptGetPageReq 列表或者搜索使用结构体\ntype SysDeptGetPageReq struct {\n\tDeptId         int    `form:\"deptId\" search:\"type:exact;column:dept_id;table:sys_dept\" comment:\"id\"`       //id\n\tParentId       int    `form:\"parentId\" search:\"type:exact;column:parent_id;table:sys_dept\" comment:\"上级部门\"` //上级部门\n\tDeptPath       string `form:\"deptPath\" search:\"type:exact;column:dept_path;table:sys_dept\" comment:\"\"`     //路径\n\tDeptName       string `form:\"deptName\" search:\"type:exact;column:dept_name;table:sys_dept\" comment:\"部门名称\"` //部门名称\n\tSort           int    `form:\"sort\" search:\"type:exact;column:sort;table:sys_dept\" comment:\"排序\"`            //排序\n\tLeader         string `form:\"leader\" search:\"type:exact;column:leader;table:sys_dept\" comment:\"负责人\"`       //负责人\n\tPhone          string `form:\"phone\" search:\"type:exact;column:phone;table:sys_dept\" comment:\"手机\"`          //手机\n\tEmail          string `form:\"email\" search:\"type:exact;column:email;table:sys_dept\" comment:\"邮箱\"`          //邮箱\n\tStatus         string `form:\"status\" search:\"type:exact;column:status;table:sys_dept\" comment:\"状态\"`        //状态\n}\n\nfunc (m *SysDeptGetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype SysDeptInsertReq struct {\n\tDeptId   int    `uri:\"id\" comment:\"编码\"`                                         // 编码\n\tParentId int    `json:\"parentId\" comment:\"上级部门\" vd:\"?\"`                         //上级部门\n\tDeptPath string `json:\"deptPath\" comment:\"\"`                                    //路径\n\tDeptName string `json:\"deptName\" comment:\"部门名称\" vd:\"len($)>0\"`                  //部门名称\n\tSort     int    `json:\"sort\" comment:\"排序\" vd:\"?\"`                               //排序\n\tLeader   string `json:\"leader\" comment:\"负责人\" vd:\"@:len($)>0; msg:'leader不能为空'\"` //负责人\n\tPhone    string `json:\"phone\" comment:\"手机\" vd:\"?\"`                              //手机\n\tEmail    string `json:\"email\" comment:\"邮箱\" vd:\"?\"`                              //邮箱\n\tStatus   int    `json:\"status\" comment:\"状态\" vd:\"$>0\"`                           //状态\n\tcommon.ControlBy\n}\n\nfunc (s *SysDeptInsertReq) Generate(model *models.SysDept) {\n\tif s.DeptId != 0 {\n\t\tmodel.DeptId = s.DeptId\n\t}\n\tmodel.DeptName = s.DeptName\n\tmodel.ParentId = s.ParentId\n\tmodel.DeptPath = s.DeptPath\n\tmodel.Sort = s.Sort\n\tmodel.Leader = s.Leader\n\tmodel.Phone = s.Phone\n\tmodel.Email = s.Email\n\tmodel.Status = s.Status\n}\n\n// GetId 获取数据对应的ID\nfunc (s *SysDeptInsertReq) GetId() interface{} {\n\treturn s.DeptId\n}\n\ntype SysDeptUpdateReq struct {\n\tDeptId   int    `uri:\"id\" comment:\"编码\"`                                         // 编码\n\tParentId int    `json:\"parentId\" comment:\"上级部门\" vd:\"?\"`                         //上级部门\n\tDeptPath string `json:\"deptPath\" comment:\"\"`                                    //路径\n\tDeptName string `json:\"deptName\" comment:\"部门名称\" vd:\"len($)>0\"`                  //部门名称\n\tSort     int    `json:\"sort\" comment:\"排序\" vd:\"?\"`                               //排序\n\tLeader   string `json:\"leader\" comment:\"负责人\" vd:\"@:len($)>0; msg:'leader不能为空'\"` //负责人\n\tPhone    string `json:\"phone\" comment:\"手机\" vd:\"?\"`                              //手机\n\tEmail    string `json:\"email\" comment:\"邮箱\" vd:\"?\"`                              //邮箱\n\tStatus   int    `json:\"status\" comment:\"状态\" vd:\"$>0\"`                           //状态\n\tcommon.ControlBy\n}\n\n// Generate 结构体数据转化 从 SysDeptControl 至 SysDept 对应的模型\nfunc (s *SysDeptUpdateReq) Generate(model *models.SysDept) {\n\tif s.DeptId != 0 {\n\t\tmodel.DeptId = s.DeptId\n\t}\n\tmodel.DeptName = s.DeptName\n\tmodel.ParentId = s.ParentId\n\tmodel.DeptPath = s.DeptPath\n\tmodel.Sort = s.Sort\n\tmodel.Leader = s.Leader\n\tmodel.Phone = s.Phone\n\tmodel.Email = s.Email\n\tmodel.Status = s.Status\n}\n\n// GetId 获取数据对应的ID\nfunc (s *SysDeptUpdateReq) GetId() interface{} {\n\treturn s.DeptId\n}\n\ntype SysDeptGetReq struct {\n\tId int `uri:\"id\"`\n}\n\nfunc (s *SysDeptGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype SysDeptDeleteReq struct {\n\tIds []int `json:\"ids\"`\n}\n\nfunc (s *SysDeptDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n\ntype DeptLabel struct {\n\tId       int         `gorm:\"-\" json:\"id\"`\n\tLabel    string      `gorm:\"-\" json:\"label\"`\n\tChildren []DeptLabel `gorm:\"-\" json:\"children\"`\n}\n"
  },
  {
    "path": "app/admin/service/dto/sys_dict_data.go",
    "content": "package dto\n\nimport (\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/common/dto\"\n\tcommon \"go-admin/common/models\"\n)\n\ntype SysDictDataGetPageReq struct {\n\tdto.Pagination `search:\"-\"`\n\tId             int    `form:\"id\" search:\"type:exact;column:dict_code;table:sys_dict_data\" comment:\"\"`\n\tDictLabel      string `form:\"dictLabel\" search:\"type:contains;column:dict_label;table:sys_dict_data\" comment:\"\"`\n\tDictValue      string `form:\"dictValue\" search:\"type:contains;column:dict_value;table:sys_dict_data\" comment:\"\"`\n\tDictType       string `form:\"dictType\" search:\"type:contains;column:dict_type;table:sys_dict_data\" comment:\"\"`\n\tStatus         string `form:\"status\" search:\"type:exact;column:status;table:sys_dict_data\" comment:\"\"`\n}\n\nfunc (m *SysDictDataGetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype SysDictDataGetAllResp struct {\n\tDictLabel string `json:\"label\"`\n\tDictValue string `json:\"value\"`\n}\n\ntype SysDictDataInsertReq struct {\n\tId        int    `json:\"-\" comment:\"\"`\n\tDictSort  int    `json:\"dictSort\" comment:\"\"`\n\tDictLabel string `json:\"dictLabel\" comment:\"\"`\n\tDictValue string `json:\"dictValue\" comment:\"\"`\n\tDictType  string `json:\"dictType\" comment:\"\"`\n\tCssClass  string `json:\"cssClass\" comment:\"\"`\n\tListClass string `json:\"listClass\" comment:\"\"`\n\tIsDefault string `json:\"isDefault\" comment:\"\"`\n\tStatus    int    `json:\"status\" comment:\"\"`\n\tDefault   string `json:\"default\" comment:\"\"`\n\tRemark    string `json:\"remark\" comment:\"\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysDictDataInsertReq) Generate(model *models.SysDictData) {\n\tmodel.DictCode = s.Id\n\tmodel.DictSort = s.DictSort\n\tmodel.DictLabel = s.DictLabel\n\tmodel.DictValue = s.DictValue\n\tmodel.DictType = s.DictType\n\tmodel.CssClass = s.CssClass\n\tmodel.ListClass = s.ListClass\n\tmodel.IsDefault = s.IsDefault\n\tmodel.Status = s.Status\n\tmodel.Default = s.Default\n\tmodel.Remark = s.Remark\n}\n\nfunc (s *SysDictDataInsertReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype SysDictDataUpdateReq struct {\n\tId        int    `uri:\"dictCode\" comment:\"\"`\n\tDictSort  int    `json:\"dictSort\" comment:\"\"`\n\tDictLabel string `json:\"dictLabel\" comment:\"\"`\n\tDictValue string `json:\"dictValue\" comment:\"\"`\n\tDictType  string `json:\"dictType\" comment:\"\"`\n\tCssClass  string `json:\"cssClass\" comment:\"\"`\n\tListClass string `json:\"listClass\" comment:\"\"`\n\tIsDefault string `json:\"isDefault\" comment:\"\"`\n\tStatus    int    `json:\"status\" comment:\"\"`\n\tDefault   string `json:\"default\" comment:\"\"`\n\tRemark    string `json:\"remark\" comment:\"\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysDictDataUpdateReq) Generate(model *models.SysDictData) {\n\tmodel.DictCode = s.Id\n\tmodel.DictSort = s.DictSort\n\tmodel.DictLabel = s.DictLabel\n\tmodel.DictValue = s.DictValue\n\tmodel.DictType = s.DictType\n\tmodel.CssClass = s.CssClass\n\tmodel.ListClass = s.ListClass\n\tmodel.IsDefault = s.IsDefault\n\tmodel.Status = s.Status\n\tmodel.Default = s.Default\n\tmodel.Remark = s.Remark\n}\n\nfunc (s *SysDictDataUpdateReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype SysDictDataGetReq struct {\n\tId int `uri:\"dictCode\"`\n}\n\nfunc (s *SysDictDataGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype SysDictDataDeleteReq struct {\n\tIds              []int `json:\"ids\"`\n\tcommon.ControlBy `json:\"-\"`\n}\n\nfunc (s *SysDictDataDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n"
  },
  {
    "path": "app/admin/service/dto/sys_dict_type.go",
    "content": "package dto\n\nimport (\n\t\"go-admin/app/admin/models\"\n\n\t\"go-admin/common/dto\"\n\tcommon \"go-admin/common/models\"\n)\n\ntype SysDictTypeGetPageReq struct {\n\tdto.Pagination `search:\"-\"`\n\tDictId         []int  `form:\"dictId\" search:\"type:in;column:dict_id;table:sys_dict_type\"`\n\tDictName       string `form:\"dictName\" search:\"type:icontains;column:dict_name;table:sys_dict_type\"`\n\tDictType       string `form:\"dictType\" search:\"type:icontains;column:dict_type;table:sys_dict_type\"`\n\tStatus         int    `form:\"status\" search:\"type:exact;column:status;table:sys_dict_type\"`\n}\n\ntype SysDictTypeOrder struct {\n\tDictIdOrder string `search:\"type:order;column:dict_id;table:sys_dict_type\" form:\"dictIdOrder\"`\n}\n\nfunc (m *SysDictTypeGetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype SysDictTypeInsertReq struct {\n\tId       int    `uri:\"id\"`\n\tDictName string `json:\"dictName\"`\n\tDictType string `json:\"dictType\"`\n\tStatus   int    `json:\"status\"`\n\tRemark   string `json:\"remark\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysDictTypeInsertReq) Generate(model *models.SysDictType) {\n\tif s.Id != 0 {\n\t\tmodel.ID = s.Id\n\t}\n\tmodel.DictName = s.DictName\n\tmodel.DictType = s.DictType\n\tmodel.Status = s.Status\n\tmodel.Remark = s.Remark\n\n}\n\nfunc (s *SysDictTypeInsertReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype SysDictTypeUpdateReq struct {\n\tId       int    `uri:\"id\"`\n\tDictName string `json:\"dictName\"`\n\tDictType string `json:\"dictType\"`\n\tStatus   int    `json:\"status\"`\n\tRemark   string `json:\"remark\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysDictTypeUpdateReq) Generate(model *models.SysDictType) {\n\tif s.Id != 0 {\n\t\tmodel.ID = s.Id\n\t}\n\tmodel.DictName = s.DictName\n\tmodel.DictType = s.DictType\n\tmodel.Status = s.Status\n\tmodel.Remark = s.Remark\n\n}\n\nfunc (s *SysDictTypeUpdateReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype SysDictTypeGetReq struct {\n\tId int `uri:\"id\"`\n}\n\nfunc (s *SysDictTypeGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype SysDictTypeDeleteReq struct {\n\tIds []int `json:\"ids\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysDictTypeDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n"
  },
  {
    "path": "app/admin/service/dto/sys_login_log.go",
    "content": "package dto\n\nimport (\n\t\"time\"\n\n\t\"go-admin/common/dto\"\n)\n\ntype SysLoginLogGetPageReq struct {\n\tdto.Pagination `search:\"-\"`\n\tUsername       string `form:\"username\" search:\"type:exact;column:username;table:sys_login_log\" comment:\"用户名\"`\n\tStatus         string `form:\"status\" search:\"type:exact;column:status;table:sys_login_log\" comment:\"状态\"`\n\tIpaddr         string `form:\"ipaddr\" search:\"type:exact;column:ipaddr;table:sys_login_log\" comment:\"ip地址\"`\n\tLoginLocation  string `form:\"loginLocation\" search:\"type:exact;column:login_location;table:sys_login_log\" comment:\"归属地\"`\n\tBeginTime      string `form:\"beginTime\" search:\"type:gte;column:ctime;table:sys_login_log\" comment:\"创建时间\"`\n\tEndTime        string `form:\"endTime\" search:\"type:lte;column:ctime;table:sys_login_log\" comment:\"创建时间\"`\n\tSysLoginLogOrder\n}\n\ntype SysLoginLogOrder struct {\n\tCreatedAtOrder string `search:\"type:order;column:created_at;table:sys_login_log\" form:\"createdAtOrder\"`\n}\n\nfunc (m *SysLoginLogGetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype SysLoginLogControl struct {\n\tID            int       `uri:\"Id\" comment:\"主键\"` // 主键\n\tUsername      string    `json:\"username\" comment:\"用户名\"`\n\tStatus        string    `json:\"status\" comment:\"状态\"`\n\tIpaddr        string    `json:\"ipaddr\" comment:\"ip地址\"`\n\tLoginLocation string    `json:\"loginLocation\" comment:\"归属地\"`\n\tBrowser       string    `json:\"browser\" comment:\"浏览器\"`\n\tOs            string    `json:\"os\" comment:\"系统\"`\n\tPlatform      string    `json:\"platform\" comment:\"固件\"`\n\tLoginTime     time.Time `json:\"loginTime\" comment:\"登录时间\"`\n\tRemark        string    `json:\"remark\" comment:\"备注\"`\n\tMsg           string    `json:\"msg\" comment:\"信息\"`\n}\n\ntype SysLoginLogGetReq struct {\n\tId int `uri:\"id\"`\n}\n\nfunc (s *SysLoginLogGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\n// SysLoginLogDeleteReq 功能删除请求参数\ntype SysLoginLogDeleteReq struct {\n\tIds []int `json:\"ids\"`\n}\n\nfunc (s *SysLoginLogDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}"
  },
  {
    "path": "app/admin/service/dto/sys_menu.go",
    "content": "package dto\n\nimport (\n\t\"go-admin/app/admin/models\"\n\tcommon \"go-admin/common/models\"\n\n\t\"go-admin/common/dto\"\n)\n\n// SysMenuGetPageReq 列表或者搜索使用结构体\ntype SysMenuGetPageReq struct {\n\tdto.Pagination `search:\"-\"`\n\tTitle          string `form:\"title\" search:\"type:contains;column:title;table:sys_menu\" comment:\"菜单名称\"`  // 菜单名称\n\tVisible        int    `form:\"visible\" search:\"type:exact;column:visible;table:sys_menu\" comment:\"显示状态\"` // 显示状态\n}\n\nfunc (m *SysMenuGetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype SysMenuInsertReq struct {\n\tMenuId     int             `uri:\"id\" comment:\"编码\"`            // 编码\n\tMenuName   string          `form:\"menuName\" comment:\"菜单name\"` //菜单name\n\tTitle      string          `form:\"title\" comment:\"显示名称\"`      //显示名称\n\tIcon       string          `form:\"icon\" comment:\"图标\"`         //图标\n\tPath       string          `form:\"path\" comment:\"路径\"`         //路径\n\tPaths      string          `form:\"paths\" comment:\"id路径\"`      //id路径\n\tMenuType   string          `form:\"menuType\" comment:\"菜单类型\"`   //菜单类型\n\tSysApi     []models.SysApi `form:\"sysApi\"`\n\tApis       []int           `form:\"apis\"`\n\tAction     string          `form:\"action\" comment:\"请求方式\"`      //请求方式\n\tPermission string          `form:\"permission\" comment:\"权限编码\"`  //权限编码\n\tParentId   int             `form:\"parentId\" comment:\"上级菜单\"`    //上级菜单\n\tNoCache    bool            `form:\"noCache\" comment:\"是否缓存\"`     //是否缓存\n\tBreadcrumb string          `form:\"breadcrumb\" comment:\"是否面包屑\"` //是否面包屑\n\tComponent  string          `form:\"component\" comment:\"组件\"`     //组件\n\tSort       int             `form:\"sort\" comment:\"排序\"`          //排序\n\tVisible    string          `form:\"visible\" comment:\"是否显示\"`     //是否显示\n\tIsFrame    string          `form:\"isFrame\" comment:\"是否frame\"`  //是否frame\n\tcommon.ControlBy\n}\n\nfunc (s *SysMenuInsertReq) Generate(model *models.SysMenu) {\n\tif s.MenuId != 0 {\n\t\tmodel.MenuId = s.MenuId\n\t}\n\tmodel.MenuName = s.MenuName\n\tmodel.Title = s.Title\n\tmodel.Icon = s.Icon\n\tmodel.Path = s.Path\n\tmodel.Paths = s.Paths\n\tmodel.MenuType = s.MenuType\n\tmodel.Action = s.Action\n\tmodel.SysApi = s.SysApi\n\tmodel.Permission = s.Permission\n\tmodel.ParentId = s.ParentId\n\tmodel.NoCache = s.NoCache\n\tmodel.Breadcrumb = s.Breadcrumb\n\tmodel.Component = s.Component\n\tmodel.Sort = s.Sort\n\tmodel.Visible = s.Visible\n\tmodel.IsFrame = s.IsFrame\n\tif s.CreateBy != 0 {\n\t\tmodel.CreateBy = s.CreateBy\n\t}\n\tif s.UpdateBy != 0 {\n\t\tmodel.UpdateBy = s.UpdateBy\n\t}\n}\n\nfunc (s *SysMenuInsertReq) GetId() interface{} {\n\treturn s.MenuId\n}\n\ntype SysMenuUpdateReq struct {\n\tMenuId     int             `uri:\"id\" comment:\"编码\"`            // 编码\n\tMenuName   string          `form:\"menuName\" comment:\"菜单name\"` //菜单name\n\tTitle      string          `form:\"title\" comment:\"显示名称\"`      //显示名称\n\tIcon       string          `form:\"icon\" comment:\"图标\"`         //图标\n\tPath       string          `form:\"path\" comment:\"路径\"`         //路径\n\tPaths      string          `form:\"paths\" comment:\"id路径\"`      //id路径\n\tMenuType   string          `form:\"menuType\" comment:\"菜单类型\"`   //菜单类型\n\tSysApi     []models.SysApi `form:\"sysApi\"`\n\tApis       []int           `form:\"apis\"`\n\tAction     string          `form:\"action\" comment:\"请求方式\"`      //请求方式\n\tPermission string          `form:\"permission\" comment:\"权限编码\"`  //权限编码\n\tParentId   int             `form:\"parentId\" comment:\"上级菜单\"`    //上级菜单\n\tNoCache    bool            `form:\"noCache\" comment:\"是否缓存\"`     //是否缓存\n\tBreadcrumb string          `form:\"breadcrumb\" comment:\"是否面包屑\"` //是否面包屑\n\tComponent  string          `form:\"component\" comment:\"组件\"`     //组件\n\tSort       int             `form:\"sort\" comment:\"排序\"`          //排序\n\tVisible    string          `form:\"visible\" comment:\"是否显示\"`     //是否显示\n\tIsFrame    string          `form:\"isFrame\" comment:\"是否frame\"`  //是否frame\n\tcommon.ControlBy\n}\n\nfunc (s *SysMenuUpdateReq) Generate(model *models.SysMenu) {\n\tif s.MenuId != 0 {\n\t\tmodel.MenuId = s.MenuId\n\t}\n\tmodel.MenuName = s.MenuName\n\tmodel.Title = s.Title\n\tmodel.Icon = s.Icon\n\tmodel.Path = s.Path\n\tmodel.Paths = s.Paths\n\tmodel.MenuType = s.MenuType\n\tmodel.Action = s.Action\n\tmodel.SysApi = s.SysApi\n\tmodel.Permission = s.Permission\n\tmodel.ParentId = s.ParentId\n\tmodel.NoCache = s.NoCache\n\tmodel.Breadcrumb = s.Breadcrumb\n\tmodel.Component = s.Component\n\tmodel.Sort = s.Sort\n\tmodel.Visible = s.Visible\n\tmodel.IsFrame = s.IsFrame\n\tif s.CreateBy != 0 {\n\t\tmodel.CreateBy = s.CreateBy\n\t}\n\tif s.UpdateBy != 0 {\n\t\tmodel.UpdateBy = s.UpdateBy\n\t}\n}\n\nfunc (s *SysMenuUpdateReq) GetId() interface{} {\n\treturn s.MenuId\n}\n\ntype SysMenuGetReq struct {\n\tId int `uri:\"id\"`\n}\n\nfunc (s *SysMenuGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype SysMenuDeleteReq struct {\n\tIds []int `json:\"ids\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysMenuDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n\ntype MenuLabel struct {\n\tId       int         `json:\"id,omitempty\" gorm:\"-\"`\n\tLabel    string      `json:\"label,omitempty\" gorm:\"-\"`\n\tChildren []MenuLabel `json:\"children,omitempty\" gorm:\"-\"`\n}\n\ntype MenuRole struct {\n\tmodels.SysMenu\n\tIsSelect bool `json:\"is_select\" gorm:\"-\"`\n}\n\ntype SelectRole struct {\n\tRoleId int `uri:\"roleId\"`\n}\n"
  },
  {
    "path": "app/admin/service/dto/sys_opera_log.go",
    "content": "package dto\n\nimport (\n\t\"time\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/common/dto\"\n\tcommon \"go-admin/common/models\"\n)\n\nconst (\n\tOperaStatusEnabel  = \"1\" // 状态-正常\n\tOperaStatusDisable = \"2\" // 状态-关闭\n)\n\ntype SysOperaLogGetPageReq struct {\n\tdto.Pagination `search:\"-\"`\n\tTitle          string `form:\"title\" search:\"type:contains;column:title;table:sys_opera_log\" comment:\"操作模块\"`\n\tMethod         string `form:\"method\" search:\"type:contains;column:method;table:sys_opera_log\" comment:\"函数\"`\n\tRequestMethod  string `form:\"requestMethod\" search:\"type:contains;column:request_method;table:sys_opera_log\" comment:\"请求方式: GET POST PUT DELETE\"`\n\tOperUrl        string `form:\"operUrl\" search:\"type:contains;column:oper_url;table:sys_opera_log\" comment:\"访问地址\"`\n\tOperIp         string `form:\"operIp\" search:\"type:exact;column:oper_ip;table:sys_opera_log\" comment:\"客户端ip\"`\n\tStatus         int    `form:\"status\" search:\"type:exact;column:status;table:sys_opera_log\" comment:\"状态 1:正常 2:关闭\"`\n\tBeginTime      string `form:\"beginTime\" search:\"type:gte;column:created_at;table:sys_opera_log\" comment:\"创建时间\"`\n\tEndTime        string `form:\"endTime\" search:\"type:lte;column:created_at;table:sys_opera_log\" comment:\"更新时间\"`\n\tSysOperaLogOrder\n}\n\ntype SysOperaLogOrder struct {\n\tCreatedAtOrder string `search:\"type:order;column:created_at;table:sys_opera_log\" form:\"createdAtOrder\"`\n}\n\nfunc (m *SysOperaLogGetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype SysOperaLogControl struct {\n\tID            int       `uri:\"Id\" comment:\"编码\"` // 编码\n\tTitle         string    `json:\"title\" comment:\"操作模块\"`\n\tBusinessType  string    `json:\"businessType\" comment:\"操作类型\"`\n\tBusinessTypes string    `json:\"businessTypes\" comment:\"\"`\n\tMethod        string    `json:\"method\" comment:\"函数\"`\n\tRequestMethod string    `json:\"requestMethod\" comment:\"请求方式\"`\n\tOperatorType  string    `json:\"operatorType\" comment:\"操作类型\"`\n\tOperName      string    `json:\"operName\" comment:\"操作者\"`\n\tDeptName      string    `json:\"deptName\" comment:\"部门名称\"`\n\tOperUrl       string    `json:\"operUrl\" comment:\"访问地址\"`\n\tOperIp        string    `json:\"operIp\" comment:\"客户端ip\"`\n\tOperLocation  string    `json:\"operLocation\" comment:\"访问位置\"`\n\tOperParam     string    `json:\"operParam\" comment:\"请求参数\"`\n\tStatus        string    `json:\"status\" comment:\"操作状态\"`\n\tOperTime      time.Time `json:\"operTime\" comment:\"操作时间\"`\n\tJsonResult    string    `json:\"jsonResult\" comment:\"返回数据\"`\n\tRemark        string    `json:\"remark\" comment:\"备注\"`\n\tLatencyTime   string    `json:\"latencyTime\" comment:\"耗时\"`\n\tUserAgent     string    `json:\"userAgent\" comment:\"ua\"`\n}\n\nfunc (s *SysOperaLogControl) Generate() (*models.SysOperaLog, error) {\n\treturn &models.SysOperaLog{\n\t\tModel:         common.Model{Id: s.ID},\n\t\tTitle:         s.Title,\n\t\tBusinessType:  s.BusinessType,\n\t\tBusinessTypes: s.BusinessTypes,\n\t\tMethod:        s.Method,\n\t\tRequestMethod: s.RequestMethod,\n\t\tOperatorType:  s.OperatorType,\n\t\tOperName:      s.OperName,\n\t\tDeptName:      s.DeptName,\n\t\tOperUrl:       s.OperUrl,\n\t\tOperIp:        s.OperIp,\n\t\tOperLocation:  s.OperLocation,\n\t\tOperParam:     s.OperParam,\n\t\tStatus:        s.Status,\n\t\tOperTime:      s.OperTime,\n\t\tJsonResult:    s.JsonResult,\n\t\tRemark:        s.Remark,\n\t\tLatencyTime:   s.LatencyTime,\n\t\tUserAgent:     s.UserAgent,\n\t}, nil\n}\n\nfunc (s *SysOperaLogControl) GetId() interface{} {\n\treturn s.ID\n}\n\ntype SysOperaLogGetReq struct {\n\tId int `uri:\"id\"`\n}\n\nfunc (s *SysOperaLogGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\n// SysOperaLogDeleteReq 功能删除请求参数\ntype SysOperaLogDeleteReq struct {\n\tIds []int `json:\"ids\"`\n}\n\nfunc (s *SysOperaLogDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n"
  },
  {
    "path": "app/admin/service/dto/sys_post.go",
    "content": "package dto\n\nimport (\n\t\"go-admin/app/admin/models\"\n\tcommon \"go-admin/common/models\"\n\n\t\"go-admin/common/dto\"\n)\n\n// SysPostPageReq 列表或者搜索使用结构体\ntype SysPostPageReq struct {\n\tdto.Pagination `search:\"-\"`\n\tPostId         int    `form:\"postId\" search:\"type:exact;column:post_id;table:sys_post\" comment:\"id\"`        // id\n\tPostName       string `form:\"postName\" search:\"type:contains;column:post_name;table:sys_post\" comment:\"名称\"` // 名称\n\tPostCode       string `form:\"postCode\" search:\"type:contains;column:post_code;table:sys_post\" comment:\"编码\"` // 编码\n\tSort           int    `form:\"sort\" search:\"type:exact;column:sort;table:sys_post\" comment:\"排序\"`             // 排序\n\tStatus         int    `form:\"status\" search:\"type:exact;column:status;table:sys_post\" comment:\"状态\"`         // 状态\n\tRemark         string `form:\"remark\" search:\"type:exact;column:remark;table:sys_post\" comment:\"备注\"`         // 备注\n}\n\nfunc (m *SysPostPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\n// SysPostInsertReq 增使用的结构体\ntype SysPostInsertReq struct {\n\tPostId   int    `uri:\"id\"  comment:\"id\"`\n\tPostName string `form:\"postName\"  comment:\"名称\"`\n\tPostCode string `form:\"postCode\" comment:\"编码\"`\n\tSort     int    `form:\"sort\" comment:\"排序\"`\n\tStatus   int    `form:\"status\"   comment:\"状态\"`\n\tRemark   string `form:\"remark\"   comment:\"备注\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysPostInsertReq) Generate(model *models.SysPost) {\n\tmodel.PostName = s.PostName\n\tmodel.PostCode = s.PostCode\n\tmodel.Sort = s.Sort\n\tmodel.Status = s.Status\n\tmodel.Remark = s.Remark\n\tif s.ControlBy.UpdateBy != 0 {\n\t\tmodel.UpdateBy = s.UpdateBy\n\t}\n\tif s.ControlBy.CreateBy != 0 {\n\t\tmodel.CreateBy = s.CreateBy\n\t}\n}\n\n// GetId 获取数据对应的ID\nfunc (s *SysPostInsertReq) GetId() interface{} {\n\treturn s.PostId\n}\n\n// SysPostUpdateReq 改使用的结构体\ntype SysPostUpdateReq struct {\n\tPostId   int    `uri:\"id\"  comment:\"id\"`\n\tPostName string `form:\"postName\"  comment:\"名称\"`\n\tPostCode string `form:\"postCode\" comment:\"编码\"`\n\tSort     int    `form:\"sort\" comment:\"排序\"`\n\tStatus   int    `form:\"status\"   comment:\"状态\"`\n\tRemark   string `form:\"remark\"   comment:\"备注\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysPostUpdateReq) Generate(model *models.SysPost) {\n\tmodel.PostId = s.PostId\n\tmodel.PostName = s.PostName\n\tmodel.PostCode = s.PostCode\n\tmodel.Sort = s.Sort\n\tmodel.Status = s.Status\n\tmodel.Remark = s.Remark\n\tif s.ControlBy.UpdateBy != 0 {\n\t\tmodel.UpdateBy = s.UpdateBy\n\t}\n\tif s.ControlBy.CreateBy != 0 {\n\t\tmodel.CreateBy = s.CreateBy\n\t}\n}\n\nfunc (s *SysPostUpdateReq) GetId() interface{} {\n\treturn s.PostId\n}\n\n// SysPostGetReq 获取单个的结构体\ntype SysPostGetReq struct {\n\tId int `uri:\"id\"`\n}\n\nfunc (s *SysPostGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\n// SysPostDeleteReq 删除的结构体\ntype SysPostDeleteReq struct {\n\tIds []int `json:\"ids\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysPostDeleteReq) Generate(model *models.SysPost) {\n\tif s.ControlBy.UpdateBy != 0 {\n\t\tmodel.UpdateBy = s.UpdateBy\n\t}\n\tif s.ControlBy.CreateBy != 0 {\n\t\tmodel.CreateBy = s.CreateBy\n\t}\n}\n\nfunc (s *SysPostDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n"
  },
  {
    "path": "app/admin/service/dto/sys_role.go",
    "content": "package dto\n\nimport (\n\t\"go-admin/app/admin/models\"\n\tcommon \"go-admin/common/models\"\n\n\t\"go-admin/common/dto\"\n)\n\ntype SysRoleGetPageReq struct {\n\tdto.Pagination `search:\"-\"`\n\n\tRoleId    int    `form:\"roleId\" search:\"type:exact;column:role_id;table:sys_role\" comment:\"角色编码\"`     // 角色编码\n\tRoleName  string `form:\"roleName\" search:\"type:exact;column:role_name;table:sys_role\" comment:\"角色名称\"` // 角色名称\n\tStatus    string `form:\"status\" search:\"type:exact;column:status;table:sys_role\" comment:\"状态\"`        // 状态\n\tRoleKey   string `form:\"roleKey\" search:\"type:exact;column:role_key;table:sys_role\" comment:\"角色代码\"`   // 角色代码\n\tRoleSort  int    `form:\"roleSort\" search:\"type:exact;column:role_sort;table:sys_role\" comment:\"角色排序\"` // 角色排序\n\tFlag      string `form:\"flag\" search:\"type:exact;column:flag;table:sys_role\" comment:\"标记\"`            // 标记\n\tRemark    string `form:\"remark\" search:\"type:exact;column:remark;table:sys_role\" comment:\"备注\"`        // 备注\n\tAdmin     bool   `form:\"admin\" search:\"type:exact;column:admin;table:sys_role\" comment:\"是否管理员\"`\n\tDataScope string `form:\"dataScope\" search:\"type:exact;column:data_scope;table:sys_role\" comment:\"是否管理员\"`\n}\n\ntype SysRoleOrder struct {\n\tRoleIdOrder    string `search:\"type:order;column:role_id;table:sys_role\" form:\"roleIdOrder\"`\n\tRoleNameOrder  string `search:\"type:order;column:role_name;table:sys_role\" form:\"roleNameOrder\"`\n\tRoleSortOrder  string `search:\"type:order;column:role_sort;table:sys_role\" form:\"usernameOrder\"`\n\tStatusOrder    string `search:\"type:order;column:status;table:sys_role\" form:\"statusOrder\"`\n\tCreatedAtOrder string `search:\"type:order;column:created_at;table:sys_role\" form:\"createdAtOrder\"`\n}\n\nfunc (m *SysRoleGetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype SysRoleInsertReq struct {\n\tRoleId    int              `uri:\"id\" comment:\"角色编码\"`        // 角色编码\n\tRoleName  string           `form:\"roleName\" comment:\"角色名称\"` // 角色名称\n\tStatus    string           `form:\"status\" comment:\"状态\"`     // 状态 1禁用 2正常\n\tRoleKey   string           `form:\"roleKey\" comment:\"角色代码\"`  // 角色代码\n\tRoleSort  int              `form:\"roleSort\" comment:\"角色排序\"` // 角色排序\n\tFlag      string           `form:\"flag\" comment:\"标记\"`       // 标记\n\tRemark    string           `form:\"remark\" comment:\"备注\"`     // 备注\n\tAdmin     bool             `form:\"admin\" comment:\"是否管理员\"`\n\tDataScope string           `form:\"dataScope\"`\n\tSysMenu   []models.SysMenu `form:\"sysMenu\"`\n\tMenuIds   []int            `form:\"menuIds\"`\n\tSysDept   []models.SysDept `form:\"sysDept\"`\n\tDeptIds   []int            `form:\"deptIds\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysRoleInsertReq) Generate(model *models.SysRole) {\n\tif s.RoleId != 0 {\n\t\tmodel.RoleId = s.RoleId\n\t}\n\tmodel.RoleName = s.RoleName\n\tmodel.Status = s.Status\n\tmodel.RoleKey = s.RoleKey\n\tmodel.RoleSort = s.RoleSort\n\tmodel.Flag = s.Flag\n\tmodel.Remark = s.Remark\n\tmodel.Admin = s.Admin\n\tmodel.DataScope = s.DataScope\n\tmodel.SysMenu = &s.SysMenu\n\tmodel.SysDept = s.SysDept\n}\n\nfunc (s *SysRoleInsertReq) GetId() interface{} {\n\treturn s.RoleId\n}\n\ntype SysRoleUpdateReq struct {\n\tRoleId    int              `uri:\"id\" comment:\"角色编码\"`        // 角色编码\n\tRoleName  string           `form:\"roleName\" comment:\"角色名称\"` // 角色名称\n\tStatus    string           `form:\"status\" comment:\"状态\"`     // 状态\n\tRoleKey   string           `form:\"roleKey\" comment:\"角色代码\"`  // 角色代码\n\tRoleSort  int              `form:\"roleSort\" comment:\"角色排序\"` // 角色排序\n\tFlag      string           `form:\"flag\" comment:\"标记\"`       // 标记\n\tRemark    string           `form:\"remark\" comment:\"备注\"`     // 备注\n\tAdmin     bool             `form:\"admin\" comment:\"是否管理员\"`\n\tDataScope string           `form:\"dataScope\"`\n\tSysMenu   []models.SysMenu `form:\"sysMenu\"`\n\tMenuIds   []int            `form:\"menuIds\"`\n\tSysDept   []models.SysDept `form:\"sysDept\"`\n\tDeptIds   []int            `form:\"deptIds\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysRoleUpdateReq) Generate(model *models.SysRole) {\n\tif s.RoleId != 0 {\n\t\tmodel.RoleId = s.RoleId\n\t}\n\tmodel.RoleName = s.RoleName\n\tmodel.Status = s.Status\n\tmodel.RoleKey = s.RoleKey\n\tmodel.RoleSort = s.RoleSort\n\tmodel.Flag = s.Flag\n\tmodel.Remark = s.Remark\n\tmodel.Admin = s.Admin\n\tmodel.DataScope = s.DataScope\n\tmodel.SysMenu = &s.SysMenu\n\tmodel.SysDept = s.SysDept\n}\n\nfunc (s *SysRoleUpdateReq) GetId() interface{} {\n\treturn s.RoleId\n}\n\ntype UpdateStatusReq struct {\n\tRoleId int    `form:\"roleId\" comment:\"角色编码\"` // 角色编码\n\tStatus string `form:\"status\" comment:\"状态\"`   // 状态\n\tcommon.ControlBy\n}\n\nfunc (s *UpdateStatusReq) Generate(model *models.SysRole) {\n\tif s.RoleId != 0 {\n\t\tmodel.RoleId = s.RoleId\n\t}\n\tmodel.Status = s.Status\n}\n\nfunc (s *UpdateStatusReq) GetId() interface{} {\n\treturn s.RoleId\n}\n\ntype SysRoleByName struct {\n\tRoleName string `form:\"role\"` // 角色编码\n}\n\ntype SysRoleGetReq struct {\n\tId int `uri:\"id\"`\n}\n\nfunc (s *SysRoleGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype SysRoleDeleteReq struct {\n\tIds []int `json:\"ids\"`\n}\n\nfunc (s *SysRoleDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n\n// RoleDataScopeReq 角色数据权限修改\ntype RoleDataScopeReq struct {\n\tRoleId    int    `json:\"roleId\" binding:\"required\"`\n\tDataScope string `json:\"dataScope\" binding:\"required\"`\n\tDeptIds   []int  `json:\"deptIds\"`\n}\n\nfunc (s *RoleDataScopeReq) Generate(model *models.SysRole) {\n\tif s.RoleId != 0 {\n\t\tmodel.RoleId = s.RoleId\n\t}\n\tmodel.DataScope = s.DataScope\n\tmodel.DeptIds = s.DeptIds\n}\n\ntype DeptIdList struct {\n\tDeptId int `json:\"DeptId\"`\n}\n"
  },
  {
    "path": "app/admin/service/dto/sys_user.go",
    "content": "package dto\n\nimport (\n\t\"go-admin/app/admin/models\"\n\n\t\"go-admin/common/dto\"\n\tcommon \"go-admin/common/models\"\n)\n\ntype SysUserGetPageReq struct {\n\tdto.Pagination `search:\"-\"`\n\tUserId         int    `form:\"userId\" search:\"type:exact;column:user_id;table:sys_user\" comment:\"用户ID\"`\n\tUsername       string `form:\"username\" search:\"type:contains;column:username;table:sys_user\" comment:\"用户名\"`\n\tNickName       string `form:\"nickName\" search:\"type:contains;column:nick_name;table:sys_user\" comment:\"昵称\"`\n\tPhone          string `form:\"phone\" search:\"type:contains;column:phone;table:sys_user\" comment:\"手机号\"`\n\tRoleId         string `form:\"roleId\" search:\"type:exact;column:role_id;table:sys_user\" comment:\"角色ID\"`\n\tSex            string `form:\"sex\" search:\"type:exact;column:sex;table:sys_user\" comment:\"性别\"`\n\tEmail          string `form:\"email\" search:\"type:contains;column:email;table:sys_user\" comment:\"邮箱\"`\n\tPostId         string `form:\"postId\" search:\"type:exact;column:post_id;table:sys_user\" comment:\"岗位\"`\n\tStatus         string `form:\"status\" search:\"type:exact;column:status;table:sys_user\" comment:\"状态\"`\n\tDeptJoin       `search:\"type:left;on:dept_id:dept_id;table:sys_user;join:sys_dept\"`\n\tSysUserOrder\n}\n\ntype SysUserOrder struct {\n\tUserIdOrder    string `search:\"type:order;column:user_id;table:sys_user\" form:\"userIdOrder\"`\n\tUsernameOrder  string `search:\"type:order;column:username;table:sys_user\" form:\"usernameOrder\"`\n\tStatusOrder    string `search:\"type:order;column:status;table:sys_user\" form:\"statusOrder\"`\n\tCreatedAtOrder string `search:\"type:order;column:created_at;table:sys_user\" form:\"createdAtOrder\"`\n}\n\ntype DeptJoin struct {\n\tDeptId string `search:\"type:contains;column:dept_path;table:sys_dept\" form:\"deptId\"`\n}\n\nfunc (m *SysUserGetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype ResetSysUserPwdReq struct {\n\tUserId   int    `json:\"userId\" comment:\"用户ID\" vd:\"$>0\"` // 用户ID\n\tPassword string `json:\"password\" comment:\"密码\" vd:\"len($)>0\"`\n\tcommon.ControlBy\n}\n\nfunc (s *ResetSysUserPwdReq) GetId() interface{} {\n\treturn s.UserId\n}\n\nfunc (s *ResetSysUserPwdReq) Generate(model *models.SysUser) {\n\tif s.UserId != 0 {\n\t\tmodel.UserId = s.UserId\n\t}\n\tmodel.Password = s.Password\n}\n\ntype UpdateSysUserAvatarReq struct {\n\tUserId int    `json:\"userId\" comment:\"用户ID\" vd:\"len($)>0\"` // 用户ID\n\tAvatar string `json:\"avatar\" comment:\"头像\" vd:\"len($)>0\"`\n\tcommon.ControlBy\n}\n\nfunc (s *UpdateSysUserAvatarReq) GetId() interface{} {\n\treturn s.UserId\n}\n\nfunc (s *UpdateSysUserAvatarReq) Generate(model *models.SysUser) {\n\tif s.UserId != 0 {\n\t\tmodel.UserId = s.UserId\n\t}\n\tmodel.Avatar = s.Avatar\n}\n\ntype UpdateSysUserStatusReq struct {\n\tUserId int    `json:\"userId\" comment:\"用户ID\" vd:\"$>0\"` // 用户ID\n\tStatus string `json:\"status\" comment:\"状态\" vd:\"len($)>0\"`\n\tcommon.ControlBy\n}\n\nfunc (s *UpdateSysUserStatusReq) GetId() interface{} {\n\treturn s.UserId\n}\n\nfunc (s *UpdateSysUserStatusReq) Generate(model *models.SysUser) {\n\tif s.UserId != 0 {\n\t\tmodel.UserId = s.UserId\n\t}\n\tmodel.Status = s.Status\n}\n\ntype SysUserInsertReq struct {\n\tUserId   int    `json:\"userId\" comment:\"用户ID\"` // 用户ID\n\tUsername string `json:\"username\" comment:\"用户名\" vd:\"len($)>0\"`\n\tPassword string `json:\"password\" comment:\"密码\"`\n\tNickName string `json:\"nickName\" comment:\"昵称\" vd:\"len($)>0\"`\n\tPhone    string `json:\"phone\" comment:\"手机号\" vd:\"len($)>0\"`\n\tRoleId   int    `json:\"roleId\" comment:\"角色ID\"`\n\tAvatar   string `json:\"avatar\" comment:\"头像\"`\n\tSex      string `json:\"sex\" comment:\"性别\"`\n\tEmail    string `json:\"email\" comment:\"邮箱\" vd:\"len($)>0,email\"`\n\tDeptId   int    `json:\"deptId\" comment:\"部门\" vd:\"$>0\"`\n\tPostId   int    `json:\"postId\" comment:\"岗位\"`\n\tRemark   string `json:\"remark\" comment:\"备注\"`\n\tStatus   string `json:\"status\" comment:\"状态\" vd:\"len($)>0\" default:\"1\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysUserInsertReq) Generate(model *models.SysUser) {\n\tif s.UserId != 0 {\n\t\tmodel.UserId = s.UserId\n\t}\n\tmodel.Username = s.Username\n\tmodel.Password = s.Password\n\tmodel.NickName = s.NickName\n\tmodel.Phone = s.Phone\n\tmodel.RoleId = s.RoleId\n\tmodel.Avatar = s.Avatar\n\tmodel.Sex = s.Sex\n\tmodel.Email = s.Email\n\tmodel.DeptId = s.DeptId\n\tmodel.PostId = s.PostId\n\tmodel.Remark = s.Remark\n\tmodel.Status = s.Status\n\tmodel.CreateBy = s.CreateBy\n}\n\nfunc (s *SysUserInsertReq) GetId() interface{} {\n\treturn s.UserId\n}\n\ntype SysUserUpdateReq struct {\n\tUserId   int    `json:\"userId\" comment:\"用户ID\"` // 用户ID\n\tUsername string `json:\"username\" comment:\"用户名\" vd:\"len($)>0\"`\n\tNickName string `json:\"nickName\" comment:\"昵称\" vd:\"len($)>0\"`\n\tPhone    string `json:\"phone\" comment:\"手机号\" vd:\"len($)>0\"`\n\tRoleId   int    `json:\"roleId\" comment:\"角色ID\"`\n\tAvatar   string `json:\"avatar\" comment:\"头像\"`\n\tSex      string `json:\"sex\" comment:\"性别\"`\n\tEmail    string `json:\"email\" comment:\"邮箱\" vd:\"len($)>0,email\"`\n\tDeptId   int    `json:\"deptId\" comment:\"部门\" vd:\"$>0\"`\n\tPostId   int    `json:\"postId\" comment:\"岗位\"`\n\tRemark   string `json:\"remark\" comment:\"备注\"`\n\tStatus   string `json:\"status\" comment:\"状态\" default:\"1\"`\n\tcommon.ControlBy\n}\n\nfunc (s *SysUserUpdateReq) Generate(model *models.SysUser) {\n\tif s.UserId != 0 {\n\t\tmodel.UserId = s.UserId\n\t}\n\tmodel.Username = s.Username\n\tmodel.NickName = s.NickName\n\tmodel.Phone = s.Phone\n\tmodel.RoleId = s.RoleId\n\tmodel.Avatar = s.Avatar\n\tmodel.Sex = s.Sex\n\tmodel.Email = s.Email\n\tmodel.DeptId = s.DeptId\n\tmodel.PostId = s.PostId\n\tmodel.Remark = s.Remark\n\tmodel.Status = s.Status\n}\n\nfunc (s *SysUserUpdateReq) GetId() interface{} {\n\treturn s.UserId\n}\n\ntype SysUserById struct {\n\tdto.ObjectById\n\tcommon.ControlBy\n}\n\nfunc (s *SysUserById) GetId() interface{} {\n\tif len(s.Ids) > 0 {\n\t\ts.Ids = append(s.Ids, s.Id)\n\t\treturn s.Ids\n\t}\n\treturn s.Id\n}\n\nfunc (s *SysUserById) GenerateM() (common.ActiveRecord, error) {\n\treturn &models.SysUser{}, nil\n}\n\n// PassWord 密码\ntype PassWord struct {\n\tNewPassword string `json:\"newPassword\" vd:\"len($)>0\"`\n\tOldPassword string `json:\"oldPassword\" vd:\"len($)>0\"`\n}\n"
  },
  {
    "path": "app/admin/service/sys_api.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/runtime\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service/dto\"\n\t\"go-admin/common/actions\"\n\tcDto \"go-admin/common/dto\"\n\t\"go-admin/common/global\"\n)\n\ntype SysApi struct {\n\tservice.Service\n}\n\n// GetPage 获取SysApi列表\nfunc (e *SysApi) GetPage(c *dto.SysApiGetPageReq, p *actions.DataPermission, list *[]models.SysApi, count *int64) error {\n\tvar err error\n\tvar data models.SysApi\n\n\torm := e.Orm.Debug().Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t\tcDto.Paginate(c.GetPageSize(), c.GetPageIndex()),\n\t\t\tactions.Permission(data.TableName(), p),\n\t\t)\n\tif c.Type != \"\" {\n\t\tqType := c.Type\n\t\tif qType == \"暂无\" {\n\t\t\tqType = \"\"\n\t\t}\n\t\tif global.Driver == \"postgres\" {\n\t\t\torm = orm.Where(\"type = ?\", qType)\n\t\t} else {\n\t\t\torm = orm.Where(\"`type` = ?\", qType)\n\t\t}\n\n\t}\n\terr = orm.Find(list).Limit(-1).Offset(-1).\n\t\tCount(count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"Service GetSysApiPage error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Get 获取SysApi对象with id\nfunc (e *SysApi) Get(d *dto.SysApiGetReq, p *actions.DataPermission, model *models.SysApi) *SysApi {\n\tvar data models.SysApi\n\terr := e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tactions.Permission(data.TableName(), p),\n\t\t).\n\t\tFirstOrInit(model, d.GetId()).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\tif model.Id == 0 {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"Service GetSysApi error: %s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\treturn e\n}\n\n// Update 修改SysApi对象\nfunc (e *SysApi) Update(c *dto.SysApiUpdateReq, p *actions.DataPermission) error {\n\tvar model = models.SysApi{}\n\tdb := e.Orm.Debug().First(&model, c.GetId())\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\t}\n\tc.Generate(&model)\n\tdb = e.Orm.Save(&model)\n\tif err := db.Error; err != nil {\n\t\te.Log.Errorf(\"Service UpdateSysApi error:%s\", err)\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Remove 删除SysApi\nfunc (e *SysApi) Remove(d *dto.SysApiDeleteReq, p *actions.DataPermission) error {\n\tvar data models.SysApi\n\n\tdb := e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tactions.Permission(data.TableName(), p),\n\t\t).Delete(&data, d.GetId())\n\tif err := db.Error; err != nil {\n\t\te.Log.Errorf(\"Service RemoveSysApi error:%s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权删除该数据\")\n\t}\n\treturn nil\n}\n\n// CheckStorageSysApi 创建SysApi对象\nfunc (e *SysApi) CheckStorageSysApi(c *[]runtime.Router) error {\n\tfor _, v := range *c {\n\t\terr := e.Orm.Debug().Where(models.SysApi{Path: v.RelativePath, Action: v.HttpMethod}).\n\t\t\tAttrs(models.SysApi{Handle: v.Handler}).\n\t\t\tFirstOrCreate(&models.SysApi{}).Error\n\t\tif err != nil {\n\t\t\terr := fmt.Errorf(\"Service CheckStorageSysApi error: %s \\r\\n \", err.Error())\n\t\t\treturn err\n\t\t}\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/service/sys_config.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service/dto\"\n\tcDto \"go-admin/common/dto\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n)\n\ntype SysConfig struct {\n\tservice.Service\n}\n\n// GetPage 获取SysConfig列表\nfunc (e *SysConfig) GetPage(c *dto.SysConfigGetPageReq, list *[]models.SysConfig, count *int64) error {\n\terr := e.Orm.\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t\tcDto.Paginate(c.GetPageSize(), c.GetPageIndex()),\n\t\t).\n\t\tFind(list).Limit(-1).Offset(-1).\n\t\tCount(count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"Service GetSysConfigPage error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Get 获取SysConfig对象\nfunc (e *SysConfig) Get(d *dto.SysConfigGetReq, model *models.SysConfig) error {\n\terr := e.Orm.\n\t\tFirstOrInit(model, d.GetId()).\n\t\tError\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn err\n\t}\n\tif model.Id == 0 {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"Service GetSysApi error: %s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Insert 创建SysConfig对象\nfunc (e *SysConfig) Insert(c *dto.SysConfigControl) error {\n\tvar err error\n\tvar data models.SysConfig\n\tc.Generate(&data)\n\terr = e.Orm.Create(&data).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"Service InsertSysConfig error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Update 修改SysConfig对象\nfunc (e *SysConfig) Update(c *dto.SysConfigControl) error {\n\tvar err error\n\tvar model = models.SysConfig{}\n\te.Orm.First(&model, c.GetId())\n\tc.Generate(&model)\n\tdb := e.Orm.Save(&model)\n\terr = db.Error\n\tif err != nil {\n\t\te.Log.Errorf(\"Service UpdateSysConfig error:%s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\n\t}\n\treturn nil\n}\n\n// SetSysConfig 修改SysConfig对象\nfunc (e *SysConfig) SetSysConfig(c *[]dto.GetSetSysConfigReq) error {\n\tvar err error\n\tfor _, req := range *c {\n\t\tvar model = models.SysConfig{}\n\t\te.Orm.Where(\"config_key = ?\", req.ConfigKey).First(&model)\n\t\tif model.Id != 0 {\n\t\t\treq.Generate(&model)\n\t\t\tdb := e.Orm.Save(&model)\n\t\t\terr = db.Error\n\t\t\tif err != nil {\n\t\t\t\te.Log.Errorf(\"Service SetSysConfig error:%s\", err)\n\t\t\t\treturn err\n\t\t\t}\n\t\t\tif db.RowsAffected == 0 {\n\t\t\t\treturn errors.New(\"无权更新该数据\")\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (e *SysConfig) GetForSet(c *[]dto.GetSetSysConfigReq) error {\n\tvar err error\n\tvar data models.SysConfig\n\n\terr = e.Orm.Model(&data).\n\t\tFind(c).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"Service GetSysConfigPage error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (e *SysConfig) UpdateForSet(c *[]dto.GetSetSysConfigReq) error {\n\tm := *c\n\tfor _, req := range m {\n\t\tvar data models.SysConfig\n\t\tif err := e.Orm.Where(\"config_key = ?\", req.ConfigKey).\n\t\t\tFirst(&data).Error; err != nil {\n\t\t\te.Log.Errorf(\"Service GetSysConfigPage error:%s\", err)\n\t\t\treturn err\n\t\t}\n\t\tif data.ConfigValue != req.ConfigValue {\n\t\t\tdata.ConfigValue = req.ConfigValue\n\n\t\t\tif err := e.Orm.Save(&data).Error; err != nil {\n\t\t\t\te.Log.Errorf(\"Service GetSysConfigPage error:%s\", err)\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\n\t}\n\n\treturn nil\n}\n\n// Remove 删除SysConfig\nfunc (e *SysConfig) Remove(d *dto.SysConfigDeleteReq) error {\n\tvar err error\n\tvar data models.SysConfig\n\n\tdb := e.Orm.Delete(&data, d.Ids)\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Service RemoveSysConfig error:%s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\terr = errors.New(\"无权删除该数据\")\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// GetWithKey 根据Key获取SysConfig\nfunc (e *SysConfig) GetWithKey(c *dto.SysConfigByKeyReq, resp *dto.GetSysConfigByKEYForServiceResp) error {\n\tvar err error\n\tvar data models.SysConfig\n\terr = e.Orm.Table(data.TableName()).Where(\"config_key = ?\", c.ConfigKey).First(resp).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"At Service GetSysConfigByKEY Error:%s\", err)\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\nfunc (e *SysConfig) GetWithKeyList(c *dto.SysConfigGetToSysAppReq, list *[]models.SysConfig) error {\n\terr := e.Orm.\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t).\n\t\tFind(list).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"Service GetSysConfigByKey error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/service/sys_dept.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\t\"go-admin/app/admin/models\"\n\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\n\t\"go-admin/app/admin/service/dto\"\n\tcDto \"go-admin/common/dto\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n)\n\ntype SysDept struct {\n\tservice.Service\n}\n\n// GetPage 获取SysDept列表\n//func (e *SysDept) GetPage(c *dto.SysDeptGetPageReq, list *[]models.SysDept) error {\n//\tvar err error\n//\tvar data models.SysDept\n//\n//\terr = e.Orm.Model(&data).\n//\t\tScopes(\n//\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n//\t\t).\n//\t\tFind(list).Error\n//\tif err != nil {\n//\t\te.Log.Errorf(\"db error:%s\", err)\n//\t\treturn err\n//\t}\n//\treturn nil\n//}\n\n// Get 获取SysDept对象\nfunc (e *SysDept) Get(d *dto.SysDeptGetReq, model *models.SysDept) error {\n\tvar err error\n\tvar data models.SysDept\n\n\terr = e.Orm.Model(&data).\n\t\tFirstOrInit(model, d.GetId()).\n\t\tError\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn err\n\t}\n\tif model.DeptId == 0 {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"Service GetSysApi error: %s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Insert 创建SysDept对象\nfunc (e *SysDept) Insert(c *dto.SysDeptInsertReq) error {\n\tvar err error\n\tvar data models.SysDept\n\tc.Generate(&data)\n\ttx := e.Orm.Debug().Begin()\n\tdefer func() {\n\t\tif err != nil {\n\t\t\ttx.Rollback()\n\t\t} else {\n\t\t\ttx.Commit()\n\t\t}\n\t}()\n\terr = tx.Create(&data).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\tdeptPath := pkg.IntToString(data.DeptId) + \"/\"\n\tif data.ParentId != 0 {\n\t\tvar deptP models.SysDept\n\t\ttx.First(&deptP, data.ParentId)\n\t\tdeptPath = deptP.DeptPath + deptPath\n\t} else {\n\t\tdeptPath = \"/0/\" + deptPath\n\t}\n\tvar mp = map[string]string{}\n\tmp[\"dept_path\"] = deptPath\n\tif err = tx.Model(&data).Update(\"dept_path\", deptPath).Error; err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Update 修改SysDept对象\nfunc (e *SysDept) Update(c *dto.SysDeptUpdateReq) error {\n\tvar err error\n\tvar model = models.SysDept{}\n\ttx := e.Orm.Debug().Begin()\n\tdefer func() {\n\t\tif err != nil {\n\t\t\ttx.Rollback()\n\t\t} else {\n\t\t\ttx.Commit()\n\t\t}\n\t}()\n\ttx.First(&model, c.GetId())\n\tc.Generate(&model)\n\n\tdeptPath := pkg.IntToString(model.DeptId) + \"/\"\n\tif model.ParentId != 0 {\n\t\tvar deptP models.SysDept\n\t\ttx.First(&deptP, model.ParentId)\n\t\tdeptPath = deptP.DeptPath + deptPath\n\t} else {\n\t\tdeptPath = \"/0/\" + deptPath\n\t}\n\tmodel.DeptPath = deptPath\n\tdb := tx.Save(&model)\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"UpdateSysDept error:%s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\t}\n\treturn nil\n}\n\n// Remove 删除SysDept\nfunc (e *SysDept) Remove(d *dto.SysDeptDeleteReq) error {\n\tvar err error\n\tvar data models.SysDept\n\n\tdb := e.Orm.Model(&data).Delete(&data, d.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Delete error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\terr = errors.New(\"无权删除该数据\")\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// GetSysDeptList 获取组织数据\nfunc (e *SysDept) getList(c *dto.SysDeptGetPageReq, list *[]models.SysDept) error {\n\tvar err error\n\tvar data models.SysDept\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t).\n\t\tFind(list).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// SetDeptTree 设置组织数据\nfunc (e *SysDept) SetDeptTree(c *dto.SysDeptGetPageReq) (m []dto.DeptLabel, err error) {\n\tvar list []models.SysDept\n\terr = e.getList(c, &list)\n\n\tm = make([]dto.DeptLabel, 0)\n\tfor i := 0; i < len(list); i++ {\n\t\tif list[i].ParentId != 0 {\n\t\t\tcontinue\n\t\t}\n\t\te := dto.DeptLabel{}\n\t\te.Id = list[i].DeptId\n\t\te.Label = list[i].DeptName\n\t\tdeptsInfo := deptTreeCall(&list, e)\n\n\t\tm = append(m, deptsInfo)\n\t}\n\treturn\n}\n\n// Call 递归构造组织数据\nfunc deptTreeCall(deptList *[]models.SysDept, dept dto.DeptLabel) dto.DeptLabel {\n\tlist := *deptList\n\tchildrenList := make([]dto.DeptLabel, 0)\n\tfor j := 0; j < len(list); j++ {\n\t\tif dept.Id != list[j].ParentId {\n\t\t\tcontinue\n\t\t}\n\t\tmi := dto.DeptLabel{Id: list[j].DeptId, Label: list[j].DeptName, Children: []dto.DeptLabel{}}\n\t\tms := deptTreeCall(deptList, mi)\n\t\tchildrenList = append(childrenList, ms)\n\t}\n\tdept.Children = childrenList\n\treturn dept\n}\n\n// SetDeptPage 设置dept页面数据\nfunc (e *SysDept) SetDeptPage(c *dto.SysDeptGetPageReq) (m []models.SysDept, err error) {\n\tvar list []models.SysDept\n\terr = e.getList(c, &list)\n\tfor i := 0; i < len(list); i++ {\n\t\tif list[i].ParentId != 0 {\n\t\t\tcontinue\n\t\t}\n\t\tinfo := e.deptPageCall(&list, list[i])\n\t\tm = append(m, info)\n\t}\n\treturn\n}\n\nfunc (e *SysDept) deptPageCall(deptlist *[]models.SysDept, menu models.SysDept) models.SysDept {\n\tlist := *deptlist\n\tchildrenList := make([]models.SysDept, 0)\n\tfor j := 0; j < len(list); j++ {\n\t\tif menu.DeptId != list[j].ParentId {\n\t\t\tcontinue\n\t\t}\n\t\tmi := models.SysDept{}\n\t\tmi.DeptId = list[j].DeptId\n\t\tmi.ParentId = list[j].ParentId\n\t\tmi.DeptPath = list[j].DeptPath\n\t\tmi.DeptName = list[j].DeptName\n\t\tmi.Sort = list[j].Sort\n\t\tmi.Leader = list[j].Leader\n\t\tmi.Phone = list[j].Phone\n\t\tmi.Email = list[j].Email\n\t\tmi.Status = list[j].Status\n\t\tmi.CreatedAt = list[j].CreatedAt\n\t\tmi.Children = []models.SysDept{}\n\t\tms := e.deptPageCall(deptlist, mi)\n\t\tchildrenList = append(childrenList, ms)\n\t}\n\tmenu.Children = childrenList\n\treturn menu\n}\n\n// GetWithRoleId 获取角色的部门ID集合\nfunc (e *SysDept) GetWithRoleId(roleId int) ([]int, error) {\n\tdeptIds := make([]int, 0)\n\tdeptList := make([]dto.DeptIdList, 0)\n\tif err := e.Orm.Table(\"sys_role_dept\").\n\t\tSelect(\"sys_role_dept.dept_id\").\n\t\tJoins(\"LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id\").\n\t\tWhere(\"role_id = ? \", roleId).\n\t\tWhere(\" sys_role_dept.dept_id not in(select sys_dept.parent_id from sys_role_dept LEFT JOIN sys_dept on sys_dept.dept_id=sys_role_dept.dept_id where role_id =? )\", roleId).\n\t\tFind(&deptList).Error; err != nil {\n\t\treturn nil, err\n\t}\n\tfor i := 0; i < len(deptList); i++ {\n\t\tdeptIds = append(deptIds, deptList[i].DeptId)\n\t}\n\treturn deptIds, nil\n}\n\nfunc (e *SysDept) SetDeptLabel() (m []dto.DeptLabel, err error) {\n\tlist := make([]models.SysDept, 0)\n\terr = e.Orm.Find(&list).Error\n\tif err != nil {\n\t\tlog.Error(\"find dept list error, %s\", err.Error())\n\t\treturn\n\t}\n\tm = make([]dto.DeptLabel, 0)\n\tvar item dto.DeptLabel\n\tfor i := range list {\n\t\tif list[i].ParentId != 0 {\n\t\t\tcontinue\n\t\t}\n\t\titem = dto.DeptLabel{}\n\t\titem.Id = list[i].DeptId\n\t\titem.Label = list[i].DeptName\n\t\tdeptInfo := deptLabelCall(&list, item)\n\t\tm = append(m, deptInfo)\n\t}\n\treturn\n}\n\n// deptLabelCall\nfunc deptLabelCall(deptList *[]models.SysDept, dept dto.DeptLabel) dto.DeptLabel {\n\tlist := *deptList\n\tvar mi dto.DeptLabel\n\tchildrenList := make([]dto.DeptLabel, 0)\n\tfor j := 0; j < len(list); j++ {\n\t\tif dept.Id != list[j].ParentId {\n\t\t\tcontinue\n\t\t}\n\t\tmi = dto.DeptLabel{Id: list[j].DeptId, Label: list[j].DeptName, Children: []dto.DeptLabel{}}\n\t\tms := deptLabelCall(deptList, mi)\n\t\tchildrenList = append(childrenList, ms)\n\t}\n\tdept.Children = childrenList\n\treturn dept\n}\n"
  },
  {
    "path": "app/admin/service/sys_dict_data.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service/dto\"\n\tcDto \"go-admin/common/dto\"\n)\n\ntype SysDictData struct {\n\tservice.Service\n}\n\n// GetPage 获取列表\nfunc (e *SysDictData) GetPage(c *dto.SysDictDataGetPageReq, list *[]models.SysDictData, count *int64) error {\n\tvar err error\n\tvar data models.SysDictData\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t\tcDto.Paginate(c.GetPageSize(), c.GetPageIndex()),\n\t\t).\n\t\tFind(list).Limit(-1).Offset(-1).\n\t\tCount(count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Get 获取对象\nfunc (e *SysDictData) Get(d *dto.SysDictDataGetReq, model *models.SysDictData) error {\n\tvar err error\n\tvar data models.SysDictData\n\n\tdb := e.Orm.Model(&data).\n\t\tFirst(model, d.GetId())\n\terr = db.Error\n\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Insert 创建对象\nfunc (e *SysDictData) Insert(c *dto.SysDictDataInsertReq) error {\n\tvar err error\n\tvar data = new(models.SysDictData)\n\tc.Generate(data)\n\terr = e.Orm.Create(data).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Update 修改对象\nfunc (e *SysDictData) Update(c *dto.SysDictDataUpdateReq) error {\n\tvar err error\n\tvar model = models.SysDictData{}\n\te.Orm.First(&model, c.GetId())\n\tc.Generate(&model)\n\tdb := e.Orm.Save(model)\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\n\t}\n\treturn nil\n}\n\n// Remove 删除\nfunc (e *SysDictData) Remove(c *dto.SysDictDataDeleteReq) error {\n\tvar err error\n\tvar data models.SysDictData\n\n\tdb := e.Orm.Delete(&data, c.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Delete error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\terr = errors.New(\"无权删除该数据\")\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// GetAll 获取所有\nfunc (e *SysDictData) GetAll(c *dto.SysDictDataGetPageReq, list *[]models.SysDictData) error {\n\tvar err error\n\tvar data models.SysDictData\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t).\n\t\tFind(list).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/service/sys_dict_type.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service/dto\"\n\tcDto \"go-admin/common/dto\"\n)\n\ntype SysDictType struct {\n\tservice.Service\n}\n\n// GetPage 获取列表\nfunc (e *SysDictType) GetPage(c *dto.SysDictTypeGetPageReq, list *[]models.SysDictType, count *int64) error {\n\tvar err error\n\tvar data models.SysDictType\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t\tcDto.Paginate(c.GetPageSize(), c.GetPageIndex()),\n\t\t).\n\t\tFind(list).Limit(-1).Offset(-1).\n\t\tCount(count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Get 获取对象\nfunc (e *SysDictType) Get(d *dto.SysDictTypeGetReq, model *models.SysDictType) error {\n\tvar err error\n\n\tdb := e.Orm.First(model, d.GetId())\n\terr = db.Error\n\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Insert 创建对象\nfunc (e *SysDictType) Insert(c *dto.SysDictTypeInsertReq) error {\n\tvar err error\n\tvar data models.SysDictType\n\tc.Generate(&data)\n\tvar count int64\n\te.Orm.Model(&data).Where(\"dict_type = ?\", data.DictType).Count(&count)\n\tif count > 0 {\n\t\treturn fmt.Errorf(\"当前字典类型[%s]已经存在！\", data.DictType)\n\t}\n\terr = e.Orm.Create(&data).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Update 修改对象\nfunc (e *SysDictType) Update(c *dto.SysDictTypeUpdateReq) error {\n\tvar err error\n\tvar model = models.SysDictType{}\n\te.Orm.First(&model, c.GetId())\n\tc.Generate(&model)\n\tdb := e.Orm.Save(&model)\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\n\t}\n\treturn nil\n}\n\n// Remove 删除\nfunc (e *SysDictType) Remove(d *dto.SysDictTypeDeleteReq) error {\n\tvar err error\n\tvar data models.SysDictType\n\n\tdb := e.Orm.Delete(&data, d.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Delete error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\terr = errors.New(\"无权删除该数据\")\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// GetAll 获取所有\nfunc (e *SysDictType) GetAll(c *dto.SysDictTypeGetPageReq, list *[]models.SysDictType) error {\n\tvar err error\n\tvar data models.SysDictType\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t).\n\t\tFind(list).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/service/sys_login_log.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service/dto\"\n\tcDto \"go-admin/common/dto\"\n)\n\ntype SysLoginLog struct {\n\tservice.Service\n}\n\n// GetPage 获取SysLoginLog列表\nfunc (e *SysLoginLog) GetPage(c *dto.SysLoginLogGetPageReq, list *[]models.SysLoginLog, count *int64) error {\n\tvar err error\n\tvar data models.SysLoginLog\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t\tcDto.Paginate(c.GetPageSize(), c.GetPageIndex()),\n\t\t).\n\t\tFind(list).Limit(-1).Offset(-1).\n\t\tCount(count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Get 获取SysLoginLog对象\nfunc (e *SysLoginLog) Get(d *dto.SysLoginLogGetReq, model *models.SysLoginLog) error {\n\tvar err error\n\tdb := e.Orm.First(model, d.GetId())\n\terr = db.Error\n\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Remove 删除SysLoginLog\nfunc (e *SysLoginLog) Remove(c *dto.SysLoginLogDeleteReq) error {\n\tvar err error\n\tvar data models.SysLoginLog\n\n\tdb := e.Orm.Delete(&data, c.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Delete error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\terr = errors.New(\"无权删除该数据\")\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/service/sys_menu.go",
    "content": "package service\n\nimport (\n\t\"fmt\"\n\t\"sort\"\n\t\"strings\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/pkg/errors\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service/dto\"\n\tcDto \"go-admin/common/dto\"\n\tcModels \"go-admin/common/models\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n)\n\ntype SysMenu struct {\n\tservice.Service\n}\n\n// GetPage 获取SysMenu列表\nfunc (e *SysMenu) GetPage(c *dto.SysMenuGetPageReq, menus *[]models.SysMenu) *SysMenu {\n\tvar menu = make([]models.SysMenu, 0)\n\terr := e.getPage(c, &menu).Error\n\tif err != nil {\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\tfor i := 0; i < len(menu); i++ {\n\t\tif menu[i].ParentId != 0 {\n\t\t\tcontinue\n\t\t}\n\t\tmenusInfo := menuCall(&menu, menu[i])\n\t\t*menus = append(*menus, menusInfo)\n\t}\n\treturn e\n}\n\n// getPage 菜单分页列表\nfunc (e *SysMenu) getPage(c *dto.SysMenuGetPageReq, list *[]models.SysMenu) *SysMenu {\n\tvar err error\n\tvar data models.SysMenu\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.OrderDest(\"sort\", false),\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t).Preload(\"SysApi\").\n\t\tFind(list).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"getSysMenuPage error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\treturn e\n}\n\n// Get 获取SysMenu对象\nfunc (e *SysMenu) Get(d *dto.SysMenuGetReq, model *models.SysMenu) *SysMenu {\n\tvar err error\n\tvar data models.SysMenu\n\n\tdb := e.Orm.Model(&data).Preload(\"SysApi\").\n\t\tFirst(model, d.GetId())\n\terr = db.Error\n\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"GetSysMenu error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\tapis := make([]int, 0)\n\tfor _, v := range model.SysApi {\n\t\tapis = append(apis, v.Id)\n\t}\n\tmodel.Apis = apis\n\treturn e\n}\n\n// Insert 创建SysMenu对象\nfunc (e *SysMenu) Insert(c *dto.SysMenuInsertReq) *SysMenu {\n\tvar err error\n\tvar data models.SysMenu\n\tc.Generate(&data)\n\ttx := e.Orm.Debug().Begin()\n\tdefer func() {\n\t\tif err != nil {\n\t\t\ttx.Rollback()\n\t\t} else {\n\t\t\ttx.Commit()\n\t\t}\n\t}()\n\terr = tx.Where(\"id in ?\", c.Apis).Find(&data.SysApi).Error\n\tif err != nil {\n\t\ttx.Rollback()\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t}\n\terr = tx.Create(&data).Error\n\tif err != nil {\n\t\ttx.Rollback()\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t}\n\tc.MenuId = data.MenuId\n\terr = e.initPaths(tx, &data)\n\tif err != nil {\n\t\ttx.Rollback()\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t}\n\ttx.Commit()\n\treturn e\n}\n\nfunc (e *SysMenu) initPaths(tx *gorm.DB, menu *models.SysMenu) error {\n\tvar err error\n\tvar data models.SysMenu\n\tparentMenu := new(models.SysMenu)\n\tif menu.ParentId != 0 {\n\t\terr = tx.Model(&data).First(parentMenu, menu.ParentId).Error\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif parentMenu.Paths == \"\" {\n\t\t\terr = errors.New(\"父级paths异常，请尝试对当前节点父级菜单进行更新操作！\")\n\t\t\treturn err\n\t\t}\n\t\tmenu.Paths = parentMenu.Paths + \"/\" + pkg.IntToString(menu.MenuId)\n\t} else {\n\t\tmenu.Paths = \"/0/\" + pkg.IntToString(menu.MenuId)\n\t}\n\terr = tx.Model(&data).Where(\"menu_id = ?\", menu.MenuId).Update(\"paths\", menu.Paths).Error\n\treturn err\n}\n\n// Update 修改SysMenu对象\nfunc (e *SysMenu) Update(c *dto.SysMenuUpdateReq) *SysMenu {\n\tvar err error\n\ttx := e.Orm.Debug().Begin()\n\tdefer func() {\n\t\tif err != nil {\n\t\t\ttx.Rollback()\n\t\t} else {\n\t\t\ttx.Commit()\n\t\t}\n\t}()\n\tvar alist = make([]models.SysApi, 0)\n\tvar model = models.SysMenu{}\n\ttx.Preload(\"SysApi\").First(&model, c.GetId())\n\toldPath := model.Paths\n\ttx.Where(\"id in ?\", c.Apis).Find(&alist)\n\terr = tx.Model(&model).Association(\"SysApi\").Delete(model.SysApi)\n\tif err != nil {\n\t\te.Log.Errorf(\"delete policy error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\tc.Generate(&model)\n\tmodel.SysApi = alist\n\tdb := tx.Model(&model).Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\tif db.RowsAffected == 0 {\n\t\t_ = e.AddError(errors.New(\"无权更新该数据\"))\n\t\treturn e\n\t}\n\tvar menuList []models.SysMenu\n\ttx.Where(\"paths like ?\", oldPath+\"%\").Find(&menuList)\n\tfor _, v := range menuList {\n\t\tv.Paths = strings.Replace(v.Paths, oldPath, model.Paths, 1)\n\t\ttx.Model(&v).Update(\"paths\", v.Paths)\n\t}\n\treturn e\n}\n\n// Remove 删除SysMenu\nfunc (e *SysMenu) Remove(d *dto.SysMenuDeleteReq) *SysMenu {\n\tvar err error\n\tvar data models.SysMenu\n\n\tdb := e.Orm.Model(&data).Delete(&data, d.Ids)\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Delete error: %s\", err)\n\t\t_ = e.AddError(err)\n\t}\n\tif db.RowsAffected == 0 {\n\t\terr = errors.New(\"无权删除该数据\")\n\t\t_ = e.AddError(err)\n\t}\n\treturn e\n}\n\n// GetList 获取菜单数据\nfunc (e *SysMenu) GetList(c *dto.SysMenuGetPageReq, list *[]models.SysMenu) error {\n\tvar err error\n\tvar data models.SysMenu\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t).\n\t\tFind(list).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// SetLabel 修改角色中 设置菜单基础数据\nfunc (e *SysMenu) SetLabel() (m []dto.MenuLabel, err error) {\n\tvar list []models.SysMenu\n\terr = e.GetList(&dto.SysMenuGetPageReq{}, &list)\n\n\tm = make([]dto.MenuLabel, 0)\n\tfor i := 0; i < len(list); i++ {\n\t\tif list[i].ParentId != 0 {\n\t\t\tcontinue\n\t\t}\n\t\te := dto.MenuLabel{}\n\t\te.Id = list[i].MenuId\n\t\te.Label = list[i].Title\n\t\tdeptsInfo := menuLabelCall(&list, e)\n\n\t\tm = append(m, deptsInfo)\n\t}\n\treturn\n}\n\n// GetSysMenuByRoleName 左侧菜单\nfunc (e *SysMenu) GetSysMenuByRoleName(roleName ...string) ([]models.SysMenu, error) {\n\tvar MenuList []models.SysMenu\n\tvar role models.SysRole\n\tvar err error\n\tadmin := false\n\tfor _, s := range roleName {\n\t\tif s == \"admin\" {\n\t\t\tadmin = true\n\t\t}\n\t}\n\n\tif len(roleName) > 0 && admin {\n\t\tvar data []models.SysMenu\n\t\terr = e.Orm.Where(\" menu_type in ('M','C')\").\n\t\t\tOrder(\"sort\").\n\t\t\tFind(&data).\n\t\t\tError\n\t\tMenuList = data\n\t} else {\n\t\terr = e.Orm.Model(&role).Preload(\"SysMenu\", func(db *gorm.DB) *gorm.DB {\n\t\t\treturn db.Where(\" menu_type in ('M','C')\").Order(\"sort\")\n\t\t}).Where(\"role_name in ?\", roleName).Find(&role).\n\t\t\tError\n\t\tMenuList = *role.SysMenu\n\t}\n\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t}\n\treturn MenuList, err\n}\n\n// menuLabelCall 递归构造组织数据\nfunc menuLabelCall(eList *[]models.SysMenu, dept dto.MenuLabel) dto.MenuLabel {\n\tlist := *eList\n\n\tmin := make([]dto.MenuLabel, 0)\n\tfor j := 0; j < len(list); j++ {\n\n\t\tif dept.Id != list[j].ParentId {\n\t\t\tcontinue\n\t\t}\n\t\tmi := dto.MenuLabel{}\n\t\tmi.Id = list[j].MenuId\n\t\tmi.Label = list[j].Title\n\t\tmi.Children = []dto.MenuLabel{}\n\t\tif list[j].MenuType != \"F\" {\n\t\t\tms := menuLabelCall(eList, mi)\n\t\t\tmin = append(min, ms)\n\t\t} else {\n\t\t\tmin = append(min, mi)\n\t\t}\n\t}\n\tif len(min) > 0 {\n\t\tdept.Children = min\n\t} else {\n\t\tdept.Children = nil\n\t}\n\treturn dept\n}\n\n// menuCall 构建菜单树\nfunc menuCall(menuList *[]models.SysMenu, menu models.SysMenu) models.SysMenu {\n\tlist := *menuList\n\n\tmin := make([]models.SysMenu, 0)\n\tfor j := 0; j < len(list); j++ {\n\n\t\tif menu.MenuId != list[j].ParentId {\n\t\t\tcontinue\n\t\t}\n\t\tmi := models.SysMenu{}\n\t\tmi.MenuId = list[j].MenuId\n\t\tmi.MenuName = list[j].MenuName\n\t\tmi.Title = list[j].Title\n\t\tmi.Icon = list[j].Icon\n\t\tmi.Path = list[j].Path\n\t\tmi.MenuType = list[j].MenuType\n\t\tmi.Action = list[j].Action\n\t\tmi.Permission = list[j].Permission\n\t\tmi.ParentId = list[j].ParentId\n\t\tmi.NoCache = list[j].NoCache\n\t\tmi.Breadcrumb = list[j].Breadcrumb\n\t\tmi.Component = list[j].Component\n\t\tmi.Sort = list[j].Sort\n\t\tmi.Visible = list[j].Visible\n\t\tmi.CreatedAt = list[j].CreatedAt\n\t\tmi.SysApi = list[j].SysApi\n\t\tmi.Children = []models.SysMenu{}\n\n\t\tif mi.MenuType != cModels.Button {\n\t\t\tms := menuCall(menuList, mi)\n\t\t\tmin = append(min, ms)\n\t\t} else {\n\t\t\tmin = append(min, mi)\n\t\t}\n\t}\n\tmenu.Children = min\n\treturn menu\n}\n\nfunc menuDistinct(menuList []models.SysMenu) (result []models.SysMenu) {\n\tdistinctMap := make(map[int]struct{}, len(menuList))\n\tfor _, menu := range menuList {\n\t\tif _, ok := distinctMap[menu.MenuId]; !ok {\n\t\t\tdistinctMap[menu.MenuId] = struct{}{}\n\t\t\tresult = append(result, menu)\n\t\t}\n\t}\n\treturn result\n}\n\nfunc recursiveSetMenu(orm *gorm.DB, mIds []int, menus *[]models.SysMenu) error {\n\tif len(mIds) == 0 || menus == nil {\n\t\treturn nil\n\t}\n\tvar subMenus []models.SysMenu\n\terr := orm.Where(fmt.Sprintf(\" menu_type in ('%s', '%s', '%s') and menu_id in ?\",\n\t\tcModels.Directory, cModels.Menu, cModels.Button), mIds).Order(\"sort\").Find(&subMenus).Error\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tsubIds := make([]int, 0)\n\tfor _, menu := range subMenus {\n\t\tif menu.ParentId != 0 {\n\t\t\tsubIds = append(subIds, menu.ParentId)\n\t\t}\n\t\tif menu.MenuType != cModels.Button {\n\t\t\t*menus = append(*menus, menu)\n\t\t}\n\t}\n\treturn recursiveSetMenu(orm, subIds, menus)\n}\n\n// SetMenuRole 获取左侧菜单树使用\nfunc (e *SysMenu) SetMenuRole(roleName string) (m []models.SysMenu, err error) {\n\tmenus, err := e.getByRoleName(roleName)\n\tm = make([]models.SysMenu, 0)\n\tfor i := 0; i < len(menus); i++ {\n\t\tif menus[i].ParentId != 0 {\n\t\t\tcontinue\n\t\t}\n\t\tmenusInfo := menuCall(&menus, menus[i])\n\t\tm = append(m, menusInfo)\n\t}\n\treturn\n}\n\nfunc (e *SysMenu) getByRoleName(roleName string) ([]models.SysMenu, error) {\n\tvar role models.SysRole\n\tvar err error\n\tdata := make([]models.SysMenu, 0)\n\n\tif roleName == \"admin\" {\n\t\terr = e.Orm.Where(\" menu_type in ('M','C') and deleted_at is null\").\n\t\t\tOrder(\"sort\").\n\t\t\tFind(&data).\n\t\t\tError\n\t\terr = errors.WithStack(err)\n\t} else {\n\t\trole.RoleKey = roleName\n\t\terr = e.Orm.Model(&role).Where(\"role_key = ? \", roleName).Preload(\"SysMenu\").First(&role).Error\n\n\t\tif role.SysMenu != nil {\n\t\t\tmIds := make([]int, 0)\n\t\t\tfor _, menu := range *role.SysMenu {\n\t\t\t\tmIds = append(mIds, menu.MenuId)\n\t\t\t}\n\t\t\tif err := recursiveSetMenu(e.Orm, mIds, &data); err != nil {\n\t\t\t\treturn nil, err\n\t\t\t}\n\n\t\t\tdata = menuDistinct(data)\n\t\t}\n\t}\n\n\tsort.Sort(models.SysMenuSlice(data))\n\treturn data, err\n}\n"
  },
  {
    "path": "app/admin/service/sys_opera_log.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service/dto\"\n\tcDto \"go-admin/common/dto\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n\t\"gorm.io/gorm\"\n)\n\ntype SysOperaLog struct {\n\tservice.Service\n}\n\n// GetPage 获取SysOperaLog列表\nfunc (e *SysOperaLog) GetPage(c *dto.SysOperaLogGetPageReq, list *[]models.SysOperaLog, count *int64) error {\n\tvar err error\n\tvar data models.SysOperaLog\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t\tcDto.Paginate(c.GetPageSize(), c.GetPageIndex()),\n\t\t).\n\t\tFind(list).Limit(-1).Offset(-1).\n\t\tCount(count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"Service GetSysOperaLogPage error:%s\", err.Error())\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Get 获取SysOperaLog对象\nfunc (e *SysOperaLog) Get(d *dto.SysOperaLogGetReq, model *models.SysOperaLog) error {\n\tvar data models.SysOperaLog\n\n\terr := e.Orm.Model(&data).\n\t\tFirst(model, d.GetId()).Error\n\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"Service GetSysOperaLog error:%s\", err.Error())\n\t\treturn err\n\t}\n\tif err != nil {\n\t\te.Log.Errorf(\"Service GetSysOperaLog error:%s\", err.Error())\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Insert 创建SysOperaLog对象\nfunc (e *SysOperaLog) Insert(model *models.SysOperaLog) error {\n\tvar err error\n\tvar data models.SysOperaLog\n\n\terr = e.Orm.Model(&data).\n\t\tCreate(model).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"Service InsertSysOperaLog error:%s\", err.Error())\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Remove 删除SysOperaLog\nfunc (e *SysOperaLog) Remove(d *dto.SysOperaLogDeleteReq) error {\n\tvar err error\n\tvar data models.SysOperaLog\n\n\tdb := e.Orm.Model(&data).Delete(&data, d.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Service RemoveSysOperaLog error:%s\", err.Error())\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权删除该数据\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/service/sys_post.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service/dto\"\n\tcDto \"go-admin/common/dto\"\n)\n\ntype SysPost struct {\n\tservice.Service\n}\n\n// GetPage 获取SysPost列表\nfunc (e *SysPost) GetPage(c *dto.SysPostPageReq, list *[]models.SysPost, count *int64) error {\n\tvar err error\n\tvar data models.SysPost\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t\tcDto.Paginate(c.GetPageSize(), c.GetPageIndex()),\n\t\t).\n\t\tFind(list).Limit(-1).Offset(-1).\n\t\tCount(count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s \\r\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Get 获取SysPost对象\nfunc (e *SysPost) Get(d *dto.SysPostGetReq, model *models.SysPost) error {\n\tvar err error\n\tvar data models.SysPost\n\n\tdb := e.Orm.Model(&data).\n\t\tFirst(model, d.GetId())\n\terr = db.Error\n\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Insert 创建SysPost对象\nfunc (e *SysPost) Insert(c *dto.SysPostInsertReq) error {\n\tvar err error\n\tvar data models.SysPost\n\tc.Generate(&data)\n\terr = e.Orm.Create(&data).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Update 修改SysPost对象\nfunc (e *SysPost) Update(c *dto.SysPostUpdateReq) error {\n\tvar err error\n\tvar model = models.SysPost{}\n\te.Orm.First(&model, c.GetId())\n\tc.Generate(&model)\n\n\tdb := e.Orm.Save(&model)\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\n\t}\n\treturn nil\n}\n\n// Remove 删除SysPost\nfunc (e *SysPost) Remove(d *dto.SysPostDeleteReq) error {\n\tvar err error\n\tvar data models.SysPost\n\n\tdb := e.Orm.Model(&data).Delete(&data, d.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Delete error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\terr = errors.New(\"无权删除该数据\")\n\t\treturn err\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "app/admin/service/sys_role.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"gorm.io/gorm/clause\"\n\n\t\"github.com/casbin/casbin/v2\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service/dto\"\n\tcDto \"go-admin/common/dto\"\n)\n\ntype SysRole struct {\n\tservice.Service\n}\n\n// GetPage 获取SysRole列表\nfunc (e *SysRole) GetPage(c *dto.SysRoleGetPageReq, list *[]models.SysRole, count *int64) error {\n\tvar err error\n\tvar data models.SysRole\n\n\terr = e.Orm.Model(&data).Preload(\"SysMenu\").\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t\tcDto.Paginate(c.GetPageSize(), c.GetPageIndex()),\n\t\t).\n\t\tFind(list).Limit(-1).Offset(-1).\n\t\tCount(count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Get 获取SysRole对象\nfunc (e *SysRole) Get(d *dto.SysRoleGetReq, model *models.SysRole) error {\n\tvar err error\n\tdb := e.Orm.First(model, d.GetId())\n\terr = db.Error\n\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\tmodel.MenuIds, err = e.GetRoleMenuId(model.RoleId)\n\tif err != nil {\n\t\te.Log.Errorf(\"get menuIds error, %s\", err.Error())\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Insert 创建SysRole对象\nfunc (e *SysRole) Insert(c *dto.SysRoleInsertReq, cb *casbin.SyncedEnforcer) error {\n\tvar err error\n\tvar data models.SysRole\n\tvar dataMenu []models.SysMenu\n\terr = e.Orm.Preload(\"SysApi\").Where(\"menu_id in ?\", c.MenuIds).Find(&dataMenu).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\tc.SysMenu = dataMenu\n\tc.Generate(&data)\n\ttx := e.Orm\n\tif config.DatabaseConfig.Driver != \"sqlite3\" {\n\t\ttx = e.Orm.Begin()\n\t\tdefer func() {\n\t\t\tif err != nil {\n\t\t\t\ttx.Rollback()\n\t\t\t} else {\n\t\t\t\ttx.Commit()\n\t\t\t}\n\t\t}()\n\t}\n\tvar count int64\n\terr = tx.Model(&data).Where(\"role_key = ?\", c.RoleKey).Count(&count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\n\tif count > 0 {\n\t\terr = errors.New(\"roleKey已存在，需更换在提交！\")\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\n\terr = tx.Create(&data).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\n\tmp := make(map[string]interface{}, 0)\n\tpolices := make([][]string, 0)\n\tfor _, menu := range dataMenu {\n\t\tfor _, api := range menu.SysApi {\n\t\t\tif mp[data.RoleKey+\"-\"+api.Path+\"-\"+api.Action] != \"\" {\n\t\t\t\tmp[data.RoleKey+\"-\"+api.Path+\"-\"+api.Action] = \"\"\n\t\t\t\tpolices = append(polices, []string{data.RoleKey, api.Path, api.Action})\n\t\t\t}\n\t\t}\n\t}\n\n\tif len(polices) <= 0 {\n\t\treturn nil\n\t}\n\n\t// 写入 sys_casbin_rule 权限表里 当前角色数据的记录\n\t_, err = cb.AddNamedPolicies(\"p\", polices)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n\n// Update 修改SysRole对象\nfunc (e *SysRole) Update(c *dto.SysRoleUpdateReq, cb *casbin.SyncedEnforcer) error {\n\tvar err error\n\ttx := e.Orm\n\tif config.DatabaseConfig.Driver != \"sqlite3\" {\n\t\ttx = e.Orm.Begin()\n\t\tdefer func() {\n\t\t\tif err != nil {\n\t\t\t\ttx.Rollback()\n\t\t\t} else {\n\t\t\t\ttx.Commit()\n\t\t\t}\n\t\t}()\n\t}\n\tvar model = models.SysRole{}\n\tvar mlist = make([]models.SysMenu, 0)\n\ttx.Preload(\"SysMenu\").First(&model, c.GetId())\n\ttx.Preload(\"SysApi\").Where(\"menu_id in ?\", c.MenuIds).Find(&mlist)\n\terr = tx.Model(&model).Association(\"SysMenu\").Delete(model.SysMenu)\n\tif err != nil {\n\t\te.Log.Errorf(\"delete policy error:%s\", err)\n\t\treturn err\n\t}\n\tc.Generate(&model)\n\tmodel.SysMenu = &mlist\n\t// 更新关联的数据，使用 FullSaveAssociations 模式\n\tdb := tx.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)\n\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\t}\n\n\t// 清除 sys_casbin_rule 权限表里 当前角色的所有记录\n\t_, err = cb.RemoveFilteredPolicy(0, model.RoleKey)\n\tif err != nil {\n\t\te.Log.Errorf(\"delete policy error:%s\", err)\n\t\treturn err\n\t}\n\tmp := make(map[string]interface{}, 0)\n\tpolices := make([][]string, 0)\n\tfor _, menu := range mlist {\n\t\tfor _, api := range menu.SysApi {\n\t\t\tif mp[model.RoleKey+\"-\"+api.Path+\"-\"+api.Action] != \"\" {\n\t\t\t\tmp[model.RoleKey+\"-\"+api.Path+\"-\"+api.Action] = \"\"\n\t\t\t\t//_, err = cb.AddNamedPolicy(\"p\", model.RoleKey, api.Path, api.Action)\n\t\t\t\tpolices = append(polices, []string{model.RoleKey, api.Path, api.Action})\n\t\t\t}\n\t\t}\n\t}\n\tif len(polices) <= 0 {\n\t\treturn nil\n\t}\n\n\t// 写入 sys_casbin_rule 权限表里 当前角色数据的记录\n\t_, err = cb.AddNamedPolicies(\"p\", polices)\n\tif err != nil {\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Remove 删除SysRole\nfunc (e *SysRole) Remove(c *dto.SysRoleDeleteReq, cb *casbin.SyncedEnforcer) error {\n\tvar err error\n\ttx := e.Orm\n\tif config.DatabaseConfig.Driver != \"sqlite3\" {\n\t\ttx = e.Orm.Begin()\n\t\tdefer func() {\n\t\t\tif err != nil {\n\t\t\t\ttx.Rollback()\n\t\t\t} else {\n\t\t\t\ttx.Commit()\n\t\t\t}\n\t\t}()\n\t}\n\tvar model = models.SysRole{}\n\ttx.Preload(\"SysMenu\").Preload(\"SysDept\").First(&model, c.GetId())\n\t//删除 SysRole 时，同时删除角色所有 关联其它表 记录 (SysMenu 和 SysMenu)\n\tdb := tx.Select(clause.Associations).Delete(&model)\n\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\t}\n\n\t// 清除 sys_casbin_rule 权限表里 当前角色的所有记录\n\t_, _ = cb.RemoveFilteredPolicy(0, model.RoleKey)\n\n\treturn nil\n}\n\n// GetRoleMenuId 获取角色对应的菜单ids\nfunc (e *SysRole) GetRoleMenuId(roleId int) ([]int, error) {\n\tmenuIds := make([]int, 0)\n\tmodel := models.SysRole{}\n\tmodel.RoleId = roleId\n\tif err := e.Orm.Model(&model).Preload(\"SysMenu\").First(&model).Error; err != nil {\n\t\treturn nil, err\n\t}\n\tl := *model.SysMenu\n\tfor i := 0; i < len(l); i++ {\n\t\tmenuIds = append(menuIds, l[i].MenuId)\n\t}\n\treturn menuIds, nil\n}\n\nfunc (e *SysRole) UpdateDataScope(c *dto.RoleDataScopeReq) *SysRole {\n\tvar err error\n\ttx := e.Orm\n\tif config.DatabaseConfig.Driver != \"sqlite3\" {\n\t\ttx = e.Orm.Begin()\n\t\tdefer func() {\n\t\t\tif err != nil {\n\t\t\t\ttx.Rollback()\n\t\t\t} else {\n\t\t\t\ttx.Commit()\n\t\t\t}\n\t\t}()\n\t}\n\tvar dlist = make([]models.SysDept, 0)\n\tvar model = models.SysRole{}\n\ttx.Preload(\"SysDept\").First(&model, c.RoleId)\n\ttx.Where(\"dept_id in ?\", c.DeptIds).Find(&dlist)\n\t// 删除SysRole 和 SysDept 的关联关系\n\terr = tx.Model(&model).Association(\"SysDept\").Delete(model.SysDept)\n\tif err != nil {\n\t\te.Log.Errorf(\"delete SysDept error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\tc.Generate(&model)\n\tmodel.SysDept = dlist\n\t// 更新关联的数据，使用 FullSaveAssociations 模式\n\tdb := tx.Model(&model).Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\tif db.RowsAffected == 0 {\n\t\t_ = e.AddError(errors.New(\"无权更新该数据\"))\n\t\treturn e\n\t}\n\treturn e\n}\n\n// UpdateStatus 修改SysRole对象status\nfunc (e *SysRole) UpdateStatus(c *dto.UpdateStatusReq) error {\n\tvar err error\n\ttx := e.Orm\n\tif config.DatabaseConfig.Driver != \"sqlite3\" {\n\t\ttx = e.Orm.Begin()\n\t\tdefer func() {\n\t\t\tif err != nil {\n\t\t\t\ttx.Rollback()\n\t\t\t} else {\n\t\t\t\ttx.Commit()\n\t\t\t}\n\t\t}()\n\t}\n\tvar model = models.SysRole{}\n\ttx.First(&model, c.GetId())\n\tc.Generate(&model)\n\t// 更新关联的数据，使用 FullSaveAssociations 模式\n\tdb := tx.Session(&gorm.Session{FullSaveAssociations: true}).Debug().Save(&model)\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\t}\n\treturn nil\n}\n\n// GetWithName 获取SysRole对象\nfunc (e *SysRole) GetWithName(d *dto.SysRoleByName, model *models.SysRole) *SysRole {\n\tvar err error\n\tdb := e.Orm.Where(\"role_name = ?\", d.RoleName).First(model)\n\terr = db.Error\n\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\tmodel.MenuIds, err = e.GetRoleMenuId(model.RoleId)\n\tif err != nil {\n\t\te.Log.Errorf(\"get menuIds error, %s\", err.Error())\n\t\t_ = e.AddError(err)\n\t\treturn e\n\t}\n\treturn e\n}\n\n// GetById 获取SysRole对象\nfunc (e *SysRole) GetById(roleId int) ([]string, error) {\n\tpermissions := make([]string, 0)\n\tmodel := models.SysRole{}\n\tmodel.RoleId = roleId\n\tif err := e.Orm.Model(&model).Preload(\"SysMenu\").First(&model).Error; err != nil {\n\t\treturn nil, err\n\t}\n\tl := *model.SysMenu\n\tfor i := 0; i < len(l); i++ {\n\t\tif l[i].Permission != \"\" {\n\t\t\tpermissions = append(permissions, l[i].Permission)\n\t\t}\n\t}\n\treturn permissions, nil\n}\n"
  },
  {
    "path": "app/admin/service/sys_role_menu.go",
    "content": "package service\n\nimport (\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n)\n\n// SysRoleMenu 即将弃用结构体\ntype SysRoleMenu struct {\n\tservice.Service\n}\n\n//func (e *SysRoleMenu) ReloadRule(tx *gorm.DB, roleId int, menuId []int) (err error) {\n//\tvar role models.SysRole\n//\n//\tmsgID := e.MsgID\n//\n//\tmenu := make([]models.Menu, 0)\n//\troleMenu := make([]models.RoleMenu, len(menuId))\n//\tcasbinRule := make([]models.CasbinRule, 0)\n//\t//先删除所有的\n//\terr = e.DeleteRoleMenu(tx, roleId)\n//\tif err != nil {\n//\t\treturn\n//\t}\n//\n//\t// 在事务中做一些数据库操作（从这一点使用'tx'，而不是'db'）\n//\terr = tx.Where(\"role_id = ?\", roleId).First(&role).Error\n//\tif err != nil {\n//\t\tlog.Errorf(\"msgID[%s] get role error, %s\", msgID, err.Error())\n//\t\treturn\n//\t}\n//\terr = tx.Where(\"menu_id in (?)\", menuId).\n//\t\t//Select(\"path, action, menu_id, menu_type\").\n//\t\tFind(&menu).Error\n//\tif err != nil {\n//\t\tlog.Errorf(\"msgID[%s] get menu error, %s\", msgID, err.Error())\n//\t\treturn\n//\t}\n//\tfor i := range menu {\n//\t\troleMenu[i] = models.RoleMenu{\n//\t\t\tRoleId:   role.RoleId,\n//\t\t\tMenuId:   menu[i].MenuId,\n//\t\t\tRoleName: role.RoleKey,\n//\t\t}\n//\t\tif menu[i].MenuType == \"A\" {\n//\t\t\tcasbinRule = append(casbinRule, models.CasbinRule{\n//\t\t\t\tPType: \"p\",\n//\t\t\t\tV0:    role.RoleKey,\n//\t\t\t\tV1:    menu[i].Path,\n//\t\t\t\tV2:    menu[i].Action,\n//\t\t\t})\n//\t\t}\n//\t}\n//\terr = tx.Create(&roleMenu).Error\n//\tif err != nil {\n//\t\tlog.Errorf(\"msgID[%s] batch create role's menu error, %s\", msgID, err.Error())\n//\t\treturn\n//\t}\n//\tif len(casbinRule) > 0 {\n//\t\terr = tx.Create(&casbinRule).Error\n//\t\tif err != nil {\n//\t\t\tlog.Errorf(\"msgID[%s] batch create casbin rule error, %s\", msgID, err.Error())\n//\t\t\treturn\n//\t\t}\n//\t}\n//\n//\treturn\n//}\n\n//func (e *SysRoleMenu) DeleteRoleMenu(tx *gorm.DB, roleId int) (err error) {\n//\tmsgID := e.MsgID\n//\terr = tx.Where(\"role_id = ?\", roleId).\n//\t\tDelete(&models.SysRoleDept{}).Error\n//\tif err != nil {\n//\t\tlog.Errorf(\"msgID[%s] delete role's dept error, %s\", msgID, err.Error())\n//\t\treturn\n//\t}\n//\terr = tx.Where(\"role_id = ?\", roleId).\n//\t\tDelete(&models.RoleMenu{}).Error\n//\tif err != nil {\n//\t\tlog.Errorf(\"msgID[%s] delete role's menu error, %s\", msgID, err.Error())\n//\t\treturn\n//\t}\n//\tvar role models.SysRole\n//\terr = tx.Where(\"role_id = ?\", roleId).\n//\t\tFirst(&role).Error\n//\tif err != nil {\n//\t\tlog.Errorf(\"msgID[%s] get role error, %s\", msgID, err.Error())\n//\t\treturn\n//\t}\n//\terr = tx.Where(\"v0 = ?\", role.RoleKey).\n//\t\tDelete(&models.CasbinRule{}).Error\n//\tif err != nil {\n//\t\tlog.Errorf(\"msgID[%s] delete casbin rule error, %s\", msgID, err.Error())\n//\t\treturn\n//\t}\n//\treturn\n//}\n//\n//func (e *SysRoleMenu) GetIDS(tx *gorm.DB, roleName string) ([]models.MenuPath, error) {\n//\tvar r []models.MenuPath\n//\ttable := tx.Select(\"sys_menu.path\").Table(\"sys_role_menu\")\n//\ttable = table.Joins(\"left join sys_role on sys_role.role_id=sys_role_menu.role_id\")\n//\ttable = table.Joins(\"left join sys_menu on sys_menu.id=sys_role_menu.menu_id\")\n//\ttable = table.Where(\"sys_role.role_name = ? and sys_menu.type=1\", roleName)\n//\tif err := table.Find(&r).Error; err != nil {\n//\t\treturn nil, err\n//\t}\n//\treturn r, nil\n//}"
  },
  {
    "path": "app/admin/service/sys_user.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/service/dto\"\n\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/common/actions\"\n\tcDto \"go-admin/common/dto\"\n)\n\ntype SysUser struct {\n\tservice.Service\n}\n\n// GetPage 获取SysUser列表\nfunc (e *SysUser) GetPage(c *dto.SysUserGetPageReq, p *actions.DataPermission, list *[]models.SysUser, count *int64) error {\n\tvar err error\n\tvar data models.SysUser\n\n\terr = e.Orm.Debug().Preload(\"Dept\").\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t\tcDto.Paginate(c.GetPageSize(), c.GetPageIndex()),\n\t\t\tactions.Permission(data.TableName(), p),\n\t\t).\n\t\tFind(list).Limit(-1).Offset(-1).\n\t\tCount(count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Get 获取SysUser对象\nfunc (e *SysUser) Get(d *dto.SysUserById, p *actions.DataPermission, model *models.SysUser) error {\n\tvar data models.SysUser\n\n\terr := e.Orm.Model(&data).Debug().\n\t\tScopes(\n\t\t\tactions.Permission(data.TableName(), p),\n\t\t).\n\t\tFirst(model, d.GetId()).Error\n\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Insert 创建SysUser对象\nfunc (e *SysUser) Insert(c *dto.SysUserInsertReq) error {\n\tvar err error\n\tvar data models.SysUser\n\tvar i int64\n\terr = e.Orm.Model(&data).Where(\"username = ?\", c.Username).Count(&i).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tif i > 0 {\n\t\terr := errors.New(\"用户名已存在！\")\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tc.Generate(&data)\n\terr = e.Orm.Create(&data).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Update 修改SysUser对象\nfunc (e *SysUser) Update(c *dto.SysUserUpdateReq, p *actions.DataPermission) error {\n\tvar err error\n\tvar model models.SysUser\n\tdb := e.Orm.Scopes(\n\t\tactions.Permission(model.TableName(), p),\n\t).First(&model, c.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Service UpdateSysUser error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\n\t}\n\tc.Generate(&model)\n\tupdate := e.Orm.Model(&model).Where(\"user_id = ?\", &model.UserId).Omit(\"password\", \"salt\").Updates(&model)\n\tif err = update.Error; err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tif update.RowsAffected == 0 {\n\t\terr = errors.New(\"update userinfo error\")\n\t\tlog.Warnf(\"db update error\")\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// UpdateAvatar 更新用户头像\nfunc (e *SysUser) UpdateAvatar(c *dto.UpdateSysUserAvatarReq, p *actions.DataPermission) error {\n\tvar err error\n\tvar model models.SysUser\n\tdb := e.Orm.Scopes(\n\t\tactions.Permission(model.TableName(), p),\n\t).First(&model, c.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Service UpdateSysUser error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\n\t}\n\terr = e.Orm.Table(model.TableName()).Where(\"user_id =? \", c.UserId).Updates(c).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"Service UpdateSysUser error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// UpdateStatus 更新用户状态\nfunc (e *SysUser) UpdateStatus(c *dto.UpdateSysUserStatusReq, p *actions.DataPermission) error {\n\tvar err error\n\tvar model models.SysUser\n\tdb := e.Orm.Scopes(\n\t\tactions.Permission(model.TableName(), p),\n\t).First(&model, c.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Service UpdateSysUser error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\n\t}\n\terr = e.Orm.Table(model.TableName()).Where(\"user_id =? \", c.UserId).Updates(c).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"Service UpdateSysUser error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// ResetPwd 重置用户密码\nfunc (e *SysUser) ResetPwd(c *dto.ResetSysUserPwdReq, p *actions.DataPermission) error {\n\tvar err error\n\tvar model models.SysUser\n\tdb := e.Orm.Scopes(\n\t\tactions.Permission(model.TableName(), p),\n\t).First(&model, c.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"At Service ResetSysUserPwd error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权更新该数据\")\n\t}\n\tc.Generate(&model)\n\terr = e.Orm.Omit(\"username\", \"nick_name\", \"phone\", \"role_id\", \"avatar\", \"sex\").Save(&model).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"At Service ResetSysUserPwd error: %s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Remove 删除SysUser\nfunc (e *SysUser) Remove(c *dto.SysUserById, p *actions.DataPermission) error {\n\tvar err error\n\tvar data models.SysUser\n\n\tdb := e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tactions.Permission(data.TableName(), p),\n\t\t).Delete(&data, c.GetId())\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"Error found in  RemoveSysUser : %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\treturn errors.New(\"无权删除该数据\")\n\t}\n\treturn nil\n}\n\n// UpdatePwd 修改SysUser对象密码\nfunc (e *SysUser) UpdatePwd(id int, oldPassword, newPassword string, p *actions.DataPermission) error {\n\tvar err error\n\n\tif newPassword == \"\" {\n\t\treturn nil\n\t}\n\tc := &models.SysUser{}\n\n\terr = e.Orm.Model(c).\n\t\tScopes(\n\t\t\tactions.Permission(c.TableName(), p),\n\t\t).Select(\"UserId\", \"Password\", \"Salt\").\n\t\tFirst(c, id).Error\n\tif err != nil {\n\t\tif errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\treturn errors.New(\"无权更新该数据\")\n\t\t}\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tvar ok bool\n\tok, err = pkg.CompareHashAndPassword(c.Password, oldPassword)\n\tif err != nil {\n\t\te.Log.Errorf(\"CompareHashAndPassword error, %s\", err.Error())\n\t\treturn err\n\t}\n\tif !ok {\n\t\terr = errors.New(\"incorrect Password\")\n\t\te.Log.Warnf(\"user[%d] %s\", id, err.Error())\n\t\treturn err\n\t}\n\tc.Password = newPassword\n\tdb := e.Orm.Model(c).Where(\"user_id = ?\", id).\n\t\tSelect(\"Password\", \"Salt\").\n\t\tUpdates(c)\n\tif err = db.Error; err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tif db.RowsAffected == 0 {\n\t\terr = errors.New(\"set password error\")\n\t\tlog.Warnf(\"db update error\")\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (e *SysUser) GetProfile(c *dto.SysUserById, user *models.SysUser, roles *[]models.SysRole, posts *[]models.SysPost) error {\n\terr := e.Orm.Preload(\"Dept\").First(user, c.GetId()).Error\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = e.Orm.Find(roles, user.RoleId).Error\n\tif err != nil {\n\t\treturn err\n\t}\n\terr = e.Orm.Find(posts, user.PostIds).Error\n\tif err != nil {\n\t\treturn err\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "app/jobs/apis/sys_job.go",
    "content": "package apis\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\n\t\"go-admin/app/jobs/service\"\n\t\"go-admin/common/dto\"\n)\n\ntype SysJob struct {\n\tapi.Api\n}\n\n// RemoveJobForService 调用service实现\nfunc (e SysJob) RemoveJobForService(c *gin.Context) {\n\tv := dto.GeneralDelDto{}\n\ts := service.SysJob{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&v).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\treturn\n\t}\n\n\ts.Cron = sdk.Runtime.GetCrontabKey(c.Request.Host)\n\terr = s.RemoveJob(&v)\n\tif err != nil {\n\t\te.Logger.Errorf(\"RemoveJob error, %s\", err.Error())\n\t\te.Error(500, err, \"\")\n\t\treturn\n\t}\n\te.OK(nil, s.Msg)\n}\n\n// StartJobForService 启动job service实现\nfunc (e SysJob) StartJobForService(c *gin.Context) {\n\te.MakeContext(c)\n\tlog := e.GetLogger()\n\tdb, err := e.GetOrm()\n\tif err != nil {\n\t\tlog.Error(err)\n\t\treturn\n\t}\n\tvar v dto.GeneralGetDto\n\terr = c.BindUri(&v)\n\tif err != nil {\n\t\tlog.Warnf(\"参数验证错误, error: %s\", err)\n\t\te.Error(http.StatusUnprocessableEntity, err, \"参数验证失败\")\n\t\treturn\n\t}\n\ts := service.SysJob{}\n\ts.Orm = db\n\ts.Log = log\n\ts.Cron = sdk.Runtime.GetCrontabKey(c.Request.Host)\n\terr = s.StartJob(&v)\n\tif err != nil {\n\t\tlog.Errorf(\"GetCrontabKey error, %s\", err.Error())\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\te.OK(nil, s.Msg)\n}\n"
  },
  {
    "path": "app/jobs/examples.go",
    "content": "package jobs\n\nimport (\n\t\"fmt\"\n\t\"time\"\n)\n\n// InitJob\n// 需要将定义的struct 添加到字典中；\n// 字典 key 可以配置到 自动任务 调用目标 中；\nfunc InitJob() {\n\tjobList = map[string]JobExec{\n\t\t\"ExamplesOne\": ExamplesOne{},\n\t\t// ...\n\t}\n}\n\n// ExamplesOne\n// 新添加的job 必须按照以下格式定义，并实现Exec函数\ntype ExamplesOne struct {\n}\n\nfunc (t ExamplesOne) Exec(arg interface{}) error {\n\tstr := time.Now().Format(timeFormat) + \" [INFO] JobCore ExamplesOne exec success\"\n\t// TODO: 这里需要注意 Examples 传入参数是 string 所以 arg.(string)；请根据对应的类型进行转化；\n\tswitch arg.(type) {\n\n\tcase string:\n\t\tif arg.(string) != \"\" {\n\t\t\tfmt.Println(\"string\", arg.(string))\n\t\t\tfmt.Println(str, arg.(string))\n\t\t} else {\n\t\t\tfmt.Println(\"arg is nil\")\n\t\t\tfmt.Println(str, \"arg is nil\")\n\t\t}\n\t\tbreak\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "app/jobs/jobbase.go",
    "content": "package jobs\n\nimport (\n\t\"fmt\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\tmodels2 \"go-admin/app/jobs/models\"\n\t\"gorm.io/gorm\"\n\t\"time\"\n\n\t\"github.com/robfig/cron/v3\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/cronjob\"\n)\n\nvar timeFormat = \"2006-01-02 15:04:05\"\nvar retryCount = 3\n\nvar jobList map[string]JobExec\n\n//var lock sync.Mutex\n\ntype JobCore struct {\n\tInvokeTarget   string\n\tName           string\n\tJobId          int\n\tEntryId        int\n\tCronExpression string\n\tArgs           string\n}\n\n// HttpJob 任务类型 http\ntype HttpJob struct {\n\tJobCore\n}\n\ntype ExecJob struct {\n\tJobCore\n}\n\nfunc (e *ExecJob) Run() {\n\tstartTime := time.Now()\n\tvar obj = jobList[e.InvokeTarget]\n\tif obj == nil {\n\t\tlog.Warn(\"[Job] ExecJob Run job nil\")\n\t\treturn\n\t}\n\terr := CallExec(obj.(JobExec), e.Args)\n\tif err != nil {\n\t\t// 如果失败暂停一段时间重试\n\t\tfmt.Println(time.Now().Format(timeFormat), \" [ERROR] mission failed! \", err)\n\t}\n\t// 结束时间\n\tendTime := time.Now()\n\n\t// 执行时间\n\tlatencyTime := endTime.Sub(startTime)\n\t//TODO: 待完善部分\n\t//str := time.Now().Format(timeFormat) + \" [INFO] JobCore \" + string(e.EntryId) + \"exec success , spend :\" + latencyTime.String()\n\t//ws.SendAll(str)\n\tlog.Infof(\"[Job] JobCore %s exec success , spend :%v\", e.Name, latencyTime)\n\treturn\n}\n\n// Run http 任务接口\nfunc (h *HttpJob) Run() {\n\n\tstartTime := time.Now()\n\tvar count = 0\n\tvar err error\n\tvar str string\n\t/* 循环 */\nLOOP:\n\tif count < retryCount {\n\t\t/* 跳过迭代 */\n\t\tstr, err = pkg.Get(h.InvokeTarget)\n\t\tif err != nil {\n\t\t\t// 如果失败暂停一段时间重试\n\t\t\tlog.Warnf(\"[Job] mission failed! %v\", err)\n\t\t\tlog.Warnf(\"[Job] Retry after the task fails %d seconds! %s \\n\", (count+1)*5, str)\n\t\t\ttime.Sleep(time.Duration(count+1) * 5 * time.Second)\n\t\t\tcount = count + 1\n\t\t\tgoto LOOP\n\t\t}\n\t}\n\t// 结束时间\n\tendTime := time.Now()\n\n\t// 执行时间\n\tlatencyTime := endTime.Sub(startTime)\n\t//TODO: 待完善部分\n\n\tlog.Infof(\"[Job] JobCore %s exec success , spend :%v\", h.Name, latencyTime)\n\treturn\n}\n\n// Setup 初始化\nfunc Setup(dbs map[string]*gorm.DB) {\n\n\tfmt.Println(time.Now().Format(timeFormat), \" [INFO] JobCore Starting...\")\n\n\tfor k, db := range dbs {\n\t\tsdk.Runtime.SetCrontab(k, cronjob.NewWithSeconds())\n\t\tsetup(k, db)\n\t}\n}\n\nfunc setup(key string, db *gorm.DB) {\n\tcrontab := sdk.Runtime.GetCrontabKey(key)\n\tsysJob := models2.SysJob{}\n\tjobList := make([]models2.SysJob, 0)\n\terr := sysJob.GetList(db, &jobList)\n\tif err != nil {\n\t\tfmt.Println(time.Now().Format(timeFormat), \" [ERROR] JobCore init error\", err)\n\t}\n\tif len(jobList) == 0 {\n\t\tfmt.Println(time.Now().Format(timeFormat), \" [INFO] JobCore total:0\")\n\t}\n\n\t_, err = sysJob.RemoveAllEntryID(db)\n\tif err != nil {\n\t\tfmt.Println(time.Now().Format(timeFormat), \" [ERROR] JobCore remove entry_id error\", err)\n\t}\n\n\tfor i := 0; i < len(jobList); i++ {\n\t\tif jobList[i].JobType == 1 {\n\t\t\tj := &HttpJob{}\n\t\t\tj.InvokeTarget = jobList[i].InvokeTarget\n\t\t\tj.CronExpression = jobList[i].CronExpression\n\t\t\tj.JobId = jobList[i].JobId\n\t\t\tj.Name = jobList[i].JobName\n\n\t\t\tsysJob.EntryId, err = AddJob(crontab, j)\n\t\t} else if jobList[i].JobType == 2 {\n\t\t\tj := &ExecJob{}\n\t\t\tj.InvokeTarget = jobList[i].InvokeTarget\n\t\t\tj.CronExpression = jobList[i].CronExpression\n\t\t\tj.JobId = jobList[i].JobId\n\t\t\tj.Name = jobList[i].JobName\n\t\t\tj.Args = jobList[i].Args\n\t\t\tsysJob.EntryId, err = AddJob(crontab, j)\n\t\t}\n\t\terr = sysJob.Update(db, jobList[i].JobId)\n\t}\n\n\t// 其中任务\n\tcrontab.Start()\n\tfmt.Println(time.Now().Format(timeFormat), \" [INFO] JobCore start success.\")\n\t// 关闭任务\n\tdefer crontab.Stop()\n\tselect {}\n}\n\n// AddJob 添加任务 AddJob(invokeTarget string, jobId int, jobName string, cronExpression string)\nfunc AddJob(c *cron.Cron, job Job) (int, error) {\n\tif job == nil {\n\t\tfmt.Println(\"unknown\")\n\t\treturn 0, nil\n\t}\n\treturn job.addJob(c)\n}\n\nfunc (h *HttpJob) addJob(c *cron.Cron) (int, error) {\n\tid, err := c.AddJob(h.CronExpression, h)\n\tif err != nil {\n\t\tfmt.Println(time.Now().Format(timeFormat), \" [ERROR] JobCore AddJob error\", err)\n\t\treturn 0, err\n\t}\n\tEntryId := int(id)\n\treturn EntryId, nil\n}\n\nfunc (e *ExecJob) addJob(c *cron.Cron) (int, error) {\n\tid, err := c.AddJob(e.CronExpression, e)\n\tif err != nil {\n\t\tfmt.Println(time.Now().Format(timeFormat), \" [ERROR] JobCore AddJob error\", err)\n\t\treturn 0, err\n\t}\n\tEntryId := int(id)\n\treturn EntryId, nil\n}\n\n// Remove 移除任务\nfunc Remove(c *cron.Cron, entryID int) chan bool {\n\tch := make(chan bool)\n\tgo func() {\n\t\tc.Remove(cron.EntryID(entryID))\n\t\tfmt.Println(time.Now().Format(timeFormat), \" [INFO] JobCore Remove success ,info entryID :\", entryID)\n\t\tch <- true\n\t}()\n\treturn ch\n}\n\n// 任务停止\n//func Stop() chan bool {\n//\tch := make(chan bool)\n//\tgo func() {\n//\t\tglobal.GADMCron.Stop()\n//\t\tch <- true\n//\t}()\n//\treturn ch\n//}\n"
  },
  {
    "path": "app/jobs/models/sys_job.go",
    "content": "package models\n\nimport (\n\t\"go-admin/common/models\"\n\t\"gorm.io/gorm\"\n)\n\ntype SysJob struct {\n\tJobId          int    `json:\"jobId\" gorm:\"primaryKey;autoIncrement\"` // 编码\n\tJobName        string `json:\"jobName\" gorm:\"size:255;\"`              // 名称\n\tJobGroup       string `json:\"jobGroup\" gorm:\"size:255;\"`             // 任务分组\n\tJobType        int    `json:\"jobType\" gorm:\"size:1;\"`                // 任务类型\n\tCronExpression string `json:\"cronExpression\" gorm:\"size:255;\"`       // cron表达式\n\tInvokeTarget   string `json:\"invokeTarget\" gorm:\"size:255;\"`         // 调用目标\n\tArgs           string `json:\"args\" gorm:\"size:255;\"`                 // 目标参数\n\tMisfirePolicy  int    `json:\"misfirePolicy\" gorm:\"size:255;\"`        // 执行策略\n\tConcurrent     int    `json:\"concurrent\" gorm:\"size:1;\"`             // 是否并发\n\tStatus         int    `json:\"status\" gorm:\"size:1;\"`                 // 状态\n\tEntryId        int    `json:\"entry_id\" gorm:\"size:11;\"`              // job启动时返回的id\n\tmodels.ControlBy\n\tmodels.ModelTime\n\n\tDataScope string `json:\"dataScope\" gorm:\"-\"`\n}\n\nfunc (*SysJob) TableName() string {\n\treturn \"sys_job\"\n}\n\nfunc (e *SysJob) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *SysJob) GetId() interface{} {\n\treturn e.JobId\n}\n\nfunc (e *SysJob) SetCreateBy(createBy int) {\n\te.CreateBy = createBy\n}\n\nfunc (e *SysJob) SetUpdateBy(updateBy int) {\n\te.UpdateBy = updateBy\n}\n\nfunc (e *SysJob) GetList(tx *gorm.DB, list interface{}) (err error) {\n\treturn tx.Table(e.TableName()).Where(\"status = ?\", 2).Find(list).Error\n}\n\n// Update 更新SysJob\nfunc (e *SysJob) Update(tx *gorm.DB, id interface{}) (err error) {\n\treturn tx.Table(e.TableName()).Where(id).Updates(&e).Error\n}\n\nfunc (e *SysJob) RemoveAllEntryID(tx *gorm.DB) (update SysJob, err error) {\n\tif err = tx.Table(e.TableName()).Where(\"entry_id > ?\", 0).Update(\"entry_id\", 0).Error; err != nil {\n\t\treturn\n\t}\n\treturn\n}\n"
  },
  {
    "path": "app/jobs/router/int_router.go",
    "content": "package router\n\nimport (\n\t//\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"os\"\n\n\t\"github.com/gin-gonic/gin\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\tcommon \"go-admin/common/middleware\"\n)\n\n// InitRouter 路由初始化，不要怀疑，这里用到了\nfunc InitRouter() {\n\tvar r *gin.Engine\n\th := sdk.Runtime.GetEngine()\n\tif h == nil {\n\t\tlog.Fatal(\"not found engine...\")\n\t\tos.Exit(-1)\n\t}\n\tswitch h.(type) {\n\tcase *gin.Engine:\n\t\tr = h.(*gin.Engine)\n\tdefault:\n\t\tlog.Fatal(\"not support other engine\")\n\t\tos.Exit(-1)\n\t}\n\n\tauthMiddleware, err := common.AuthInit()\n\tif err != nil {\n\t\tlog.Fatalf(\"JWT Init Error, %s\", err.Error())\n\t}\n\n\t// 注册业务路由\n\tinitRouter(r, authMiddleware)\n}\n"
  },
  {
    "path": "app/jobs/router/router.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n)\n\nvar (\n\trouterNoCheckRole = make([]func(*gin.RouterGroup), 0)\n\trouterCheckRole   = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0)\n)\n\n// initRouter 路由示例\nfunc initRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine {\n\n\t// 无需认证的路由\n\tnoCheckRoleRouter(r)\n\t// 需要认证的路由\n\tcheckRoleRouter(r, authMiddleware)\n\n\treturn r\n}\n\n// noCheckRoleRouter 无需认证的路由示例\nfunc noCheckRoleRouter(r *gin.Engine) {\n\t// 可根据业务需求来设置接口版本\n\tv1 := r.Group(\"/api/v1\")\n\n\tfor _, f := range routerNoCheckRole {\n\t\tf(v1)\n\t}\n}\n\n// checkRoleRouter 需要认证的路由示例\nfunc checkRoleRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) {\n\t// 可根据业务需求来设置接口版本\n\tv1 := r.Group(\"/api/v1\")\n\n\tfor _, f := range routerCheckRole {\n\t\tf(v1, authMiddleware)\n\t}\n}\n"
  },
  {
    "path": "app/jobs/router/sys_job.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/jobs/apis\"\n\tmodels2 \"go-admin/app/jobs/models\"\n\tdto2 \"go-admin/app/jobs/service/dto\"\n\t\"go-admin/common/actions\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSysJobRouter)\n}\n\n// 需认证的路由代码\nfunc registerSysJobRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\n\tr := v1.Group(\"/sysjob\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tsysJob := &models2.SysJob{}\n\t\tr.GET(\"\", actions.PermissionAction(), actions.IndexAction(sysJob, new(dto2.SysJobSearch), func() interface{} {\n\t\t\tlist := make([]models2.SysJob, 0)\n\t\t\treturn &list\n\t\t}))\n\t\tr.GET(\"/:id\", actions.PermissionAction(), actions.ViewAction(new(dto2.SysJobById), func() interface{} {\n\t\t\treturn &dto2.SysJobItem{}\n\t\t}))\n\t\tr.POST(\"\", actions.CreateAction(new(dto2.SysJobControl)))\n\t\tr.PUT(\"\", actions.PermissionAction(), actions.UpdateAction(new(dto2.SysJobControl)))\n\t\tr.DELETE(\"\", actions.PermissionAction(), actions.DeleteAction(new(dto2.SysJobById)))\n\t}\n\tsysJob := apis.SysJob{}\n\n\tv1.GET(\"/job/remove/:id\", sysJob.RemoveJobForService)\n\tv1.GET(\"/job/start/:id\", sysJob.StartJobForService)\n}\n"
  },
  {
    "path": "app/jobs/service/dto/sys_job.go",
    "content": "package dto\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"go-admin/app/jobs/models\"\n\n\t\"go-admin/common/dto\"\n\tcommon \"go-admin/common/models\"\n)\n\ntype SysJobSearch struct {\n\tdto.Pagination `search:\"-\"`\n\tJobId          int    `form:\"jobId\" search:\"type:exact;column:job_id;table:sys_job\"`\n\tJobName        string `form:\"jobName\" search:\"type:icontains;column:job_name;table:sys_job\"`\n\tJobGroup       string `form:\"jobGroup\" search:\"type:exact;column:job_group;table:sys_job\"`\n\tCronExpression string `form:\"cronExpression\" search:\"type:exact;column:cron_expression;table:sys_job\"`\n\tInvokeTarget   string `form:\"invokeTarget\" search:\"type:exact;column:invoke_target;table:sys_job\"`\n\tStatus         int    `form:\"status\" search:\"type:exact;column:status;table:sys_job\"`\n}\n\nfunc (m *SysJobSearch) GetNeedSearch() interface{} {\n\treturn *m\n}\n\nfunc (m *SysJobSearch) Bind(ctx *gin.Context) error {\n\tlog := api.GetRequestLogger(ctx)\n\terr := ctx.ShouldBind(m)\n\tif err != nil {\n\t\tlog.Errorf(\"Bind error: %s\", err)\n\t}\n\treturn err\n}\n\nfunc (m *SysJobSearch) Generate() dto.Index {\n\to := *m\n\treturn &o\n}\n\ntype SysJobControl struct {\n\tJobId          int    `json:\"jobId\"`\n\tJobName        string `json:\"jobName\" validate:\"required\"` // 名称\n\tJobGroup       string `json:\"jobGroup\"`                    // 任务分组\n\tJobType        int    `json:\"jobType\"`                     // 任务类型\n\tCronExpression string `json:\"cronExpression\"`              // cron表达式\n\tInvokeTarget   string `json:\"invokeTarget\"`                // 调用目标\n\tArgs           string `json:\"args\"`                        // 目标参数\n\tMisfirePolicy  int    `json:\"misfirePolicy\"`               // 执行策略\n\tConcurrent     int    `json:\"concurrent\"`                  // 是否并发\n\tStatus         int    `json:\"status\"`                      // 状态\n\tEntryId        int    `json:\"entryId\"`                     // job启动时返回的id\n}\n\nfunc (s *SysJobControl) Bind(ctx *gin.Context) error {\n\treturn ctx.ShouldBind(s)\n}\n\nfunc (s *SysJobControl) Generate() dto.Control {\n\tcp := *s\n\treturn &cp\n}\n\nfunc (s *SysJobControl) GenerateM() (common.ActiveRecord, error) {\n\treturn &models.SysJob{\n\t\tJobId:          s.JobId,\n\t\tJobName:        s.JobName,\n\t\tJobGroup:       s.JobGroup,\n\t\tJobType:        s.JobType,\n\t\tCronExpression: s.CronExpression,\n\t\tInvokeTarget:   s.InvokeTarget,\n\t\tArgs:           s.Args,\n\t\tMisfirePolicy:  s.MisfirePolicy,\n\t\tConcurrent:     s.Concurrent,\n\t\tStatus:         s.Status,\n\t\tEntryId:        s.EntryId,\n\t}, nil\n}\n\nfunc (s *SysJobControl) GetId() interface{} {\n\treturn s.JobId\n}\n\ntype SysJobById struct {\n\tdto.ObjectById\n}\n\nfunc (s *SysJobById) Generate() dto.Control {\n\tcp := *s\n\treturn &cp\n}\n\nfunc (s *SysJobById) GenerateM() (common.ActiveRecord, error) {\n\treturn &models.SysJob{}, nil\n}\n\ntype SysJobItem struct {\n\tJobId          int    `json:\"jobId\"`\n\tJobName        string `json:\"jobName\" validate:\"required\"` // 名称\n\tJobGroup       string `json:\"jobGroup\"`                    // 任务分组\n\tJobType        int    `json:\"jobType\"`                     // 任务类型\n\tCronExpression string `json:\"cronExpression\"`              // cron表达式\n\tInvokeTarget   string `json:\"invokeTarget\"`                // 调用目标\n\tArgs           string `json:\"args\"`                        // 目标参数\n\tMisfirePolicy  int    `json:\"misfirePolicy\"`               // 执行策略\n\tConcurrent     int    `json:\"concurrent\"`                  // 是否并发\n\tStatus         int    `json:\"status\"`                      // 状态\n\tEntryId        int    `json:\"entryId\"`                     // job启动时返回的id\n}\n"
  },
  {
    "path": "app/jobs/service/sys_job.go",
    "content": "package service\n\nimport (\n\t\"errors\"\n\t\"time\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/service\"\n\t\"github.com/robfig/cron/v3\"\n\n\t\"go-admin/app/jobs\"\n\t\"go-admin/app/jobs/models\"\n\t\"go-admin/common/dto\"\n)\n\ntype SysJob struct {\n\tservice.Service\n\tCron *cron.Cron\n}\n\n// RemoveJob 删除job\nfunc (e *SysJob) RemoveJob(c *dto.GeneralDelDto) error {\n\tvar err error\n\tvar data models.SysJob\n\terr = e.Orm.Table(data.TableName()).First(&data, c.Id).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\tcn := jobs.Remove(e.Cron, data.EntryId)\n\n\tselect {\n\tcase res := <-cn:\n\t\tif res {\n\t\t\terr = e.Orm.Table(data.TableName()).Where(\"entry_id = ?\", data.EntryId).Update(\"entry_id\", 0).Error\n\t\t\tif err != nil {\n\t\t\t\te.Log.Errorf(\"db error: %s\", err)\n\t\t\t}\n\t\t\treturn err\n\t\t}\n\tcase <-time.After(time.Second * 1):\n\t\te.Msg = \"操作超时！\"\n\t\treturn nil\n\t}\n\treturn nil\n}\n\n// StartJob 启动任务\nfunc (e *SysJob) StartJob(c *dto.GeneralGetDto) error {\n\tvar data models.SysJob\n\tvar err error\n\terr = e.Orm.Table(data.TableName()).First(&data, c.Id).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t\treturn err\n\t}\n\n\tif data.Status == 1 {\n\t\terr = errors.New(\"当前Job是关闭状态不能被启动，请先启用。\")\n\t\treturn err\n\t}\n\n\tif data.JobType == 1 {\n\t\tvar j = &jobs.HttpJob{}\n\t\tj.InvokeTarget = data.InvokeTarget\n\t\tj.CronExpression = data.CronExpression\n\t\tj.JobId = data.JobId\n\t\tj.Name = data.JobName\n\t\tdata.EntryId, err = jobs.AddJob(e.Cron, j)\n\t\tif err != nil {\n\t\t\te.Log.Errorf(\"jobs AddJob[HttpJob] error: %s\", err)\n\t\t}\n\t} else {\n\t\tvar j = &jobs.ExecJob{}\n\t\tj.InvokeTarget = data.InvokeTarget\n\t\tj.CronExpression = data.CronExpression\n\t\tj.JobId = data.JobId\n\t\tj.Name = data.JobName\n\t\tj.Args = data.Args\n\t\tdata.EntryId, err = jobs.AddJob(e.Cron, j)\n\t\tif err != nil {\n\t\t\te.Log.Errorf(\"jobs AddJob[ExecJob] error: %s\", err)\n\t\t}\n\t}\n\tif err != nil {\n\t\treturn err\n\t}\n\n\terr = e.Orm.Table(data.TableName()).Where(c.Id).Updates(&data).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"db error: %s\", err)\n\t}\n\treturn err\n}\n"
  },
  {
    "path": "app/jobs/type.go",
    "content": "package jobs\n\nimport \"github.com/robfig/cron/v3\"\n\ntype Job interface {\n\tRun()\n\taddJob(*cron.Cron) (int, error)\n}\n\ntype JobExec interface {\n\tExec(arg interface{}) error\n}\n\nfunc CallExec(e JobExec, arg interface{}) error {\n\treturn e.Exec(arg)\n}\n"
  },
  {
    "path": "app/other/apis/file.go",
    "content": "package apis\n\nimport (\n\t\"encoding/base64\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"strings\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/utils\"\n\t\"github.com/google/uuid\"\n\n\t\"go-admin/common/file_store\"\n)\n\ntype FileResponse struct {\n\tSize     int64  `json:\"size\"`\n\tPath     string `json:\"path\"`\n\tFullPath string `json:\"full_path\"`\n\tName     string `json:\"name\"`\n\tType     string `json:\"type\"`\n}\n\nconst path = \"static/uploadfile/\"\n\ntype File struct {\n\tapi.Api\n}\n\n// UploadFile 上传图片\n// @Summary 上传图片\n// @Description 获取JSON\n// @Tags 公共接口\n// @Accept multipart/form-data\n// @Param type query string true \"type\" (1：单图，2：多图, 3：base64图片)\n// @Param file formData file true \"file\"\n// @Success 200 {string} string\t\"{\"code\": 200, \"message\": \"添加成功\"}\"\n// @Success 200 {string} string\t\"{\"code\": -1, \"message\": \"添加失败\"}\"\n// @Router /api/v1/public/uploadFile [post]\n// @Security Bearer\nfunc (e File) UploadFile(c *gin.Context) {\n\te.MakeContext(c)\n\ttag, _ := c.GetPostForm(\"type\")\n\turlPrefix := fmt.Sprintf(\"%s://%s/\", \"http\", c.Request.Host)\n\n\tswitch tag {\n\tcase \"1\": // 单图\n\t\te.handleSingleFile(c, urlPrefix)\n\tcase \"2\": // 多图\n\t\te.handleMultipleFiles(c, urlPrefix)\n\tcase \"3\": // base64\n\t\te.handleBase64File(c, urlPrefix)\n\tdefault:\n\t\te.handleSingleFile(c, urlPrefix)\n\t}\n}\n\nfunc (e File) handleSingleFile(c *gin.Context, urlPrefix string) {\n\tfileResponse, done := e.singleFile(c, FileResponse{}, urlPrefix)\n\tif done {\n\t\treturn\n\t}\n\te.OK(fileResponse, \"上传成功\")\n}\n\nfunc (e File) handleMultipleFiles(c *gin.Context, urlPrefix string) {\n\tmultipartFile := e.multipleFile(c, urlPrefix)\n\te.OK(multipartFile, \"上传成功\")\n}\n\nfunc (e File) handleBase64File(c *gin.Context, urlPrefix string) {\n\tfileResponse := e.baseImg(c, FileResponse{}, urlPrefix)\n\te.OK(fileResponse, \"上传成功\")\n}\n\nfunc (e File) baseImg(c *gin.Context, fileResponse FileResponse, urlPrefix string) FileResponse {\n\tfiles, _ := c.GetPostForm(\"file\")\n\tfile2list := strings.Split(files, \",\")\n\tdecodedData, _ := base64.StdEncoding.DecodeString(file2list[1])\n\tfileName := uuid.New().String() + \".jpg\"\n\n\tif err := utils.IsNotExistMkDir(path); err != nil {\n\t\te.Error(500, errors.New(\"\"), \"初始化文件路径失败\")\n\t\treturn fileResponse\n\t}\n\n\tbase64File := path + fileName\n\t_ = ioutil.WriteFile(base64File, decodedData, 0666)\n\ttypeStr := strings.Replace(strings.Replace(file2list[0], \"data:\", \"\", -1), \";base64\", \"\", -1)\n\n\tfileResponse = e.buildFileResponse(base64File, urlPrefix, \"\", typeStr)\n\tsource, _ := c.GetPostForm(\"source\")\n\n\tif err := thirdUpload(source, fileName, base64File); err != nil {\n\t\te.Error(200, errors.New(\"\"), \"上传第三方失败\")\n\t\treturn fileResponse\n\t}\n\n\tif source != \"1\" {\n\t\tfileResponse.Path = \"/static/uploadfile/\" + fileName\n\t\tfileResponse.FullPath = \"/static/uploadfile/\" + fileName\n\t}\n\treturn fileResponse\n}\n\nfunc (e File) multipleFile(c *gin.Context, urlPrefix string) []FileResponse {\n\tfiles := c.Request.MultipartForm.File[\"file\"]\n\tsource, _ := c.GetPostForm(\"source\")\n\tvar multipartFile []FileResponse\n\n\tfor _, f := range files {\n\t\tfileName := uuid.New().String() + utils.GetExt(f.Filename)\n\n\t\tif err := utils.IsNotExistMkDir(path); err != nil {\n\t\t\te.Error(500, errors.New(\"\"), \"初始化文件路径失败\")\n\t\t\tcontinue\n\t\t}\n\n\t\tmultipartFileName := path + fileName\n\t\tif err := c.SaveUploadedFile(f, multipartFileName); err != nil {\n\t\t\tcontinue\n\t\t}\n\n\t\tfileType, _ := utils.GetType(multipartFileName)\n\t\tif err := thirdUpload(source, fileName, multipartFileName); err != nil {\n\t\t\te.Error(500, errors.New(\"\"), \"上传第三方失败\")\n\t\t\tcontinue\n\t\t}\n\n\t\tfileResponse := e.buildFileResponse(multipartFileName, urlPrefix, f.Filename, fileType)\n\t\tif source != \"1\" {\n\t\t\tfileResponse.Path = \"/static/uploadfile/\" + fileName\n\t\t\tfileResponse.FullPath = \"/static/uploadfile/\" + fileName\n\t\t}\n\t\tmultipartFile = append(multipartFile, fileResponse)\n\t}\n\treturn multipartFile\n}\n\nfunc (e File) singleFile(c *gin.Context, fileResponse FileResponse, urlPrefix string) (FileResponse, bool) {\n\tfiles, err := c.FormFile(\"file\")\n\tif err != nil {\n\t\te.Error(200, errors.New(\"\"), \"图片不能为空\")\n\t\treturn FileResponse{}, true\n\t}\n\n\tfileName := uuid.New().String() + utils.GetExt(files.Filename)\n\tif err := utils.IsNotExistMkDir(path); err != nil {\n\t\te.Error(500, errors.New(\"\"), \"初始化文件路径失败\")\n\t\treturn FileResponse{}, true\n\t}\n\n\tsingleFile := path + fileName\n\tif err := c.SaveUploadedFile(files, singleFile); err != nil {\n\t\te.Error(500, errors.New(\"\"), \"文件保存失败\")\n\t\treturn FileResponse{}, true\n\t}\n\n\tfileType, _ := utils.GetType(singleFile)\n\tfileResponse = e.buildFileResponse(singleFile, urlPrefix, files.Filename, fileType)\n\tfileResponse.Path = \"/static/uploadfile/\" + fileName\n\tfileResponse.FullPath = \"/static/uploadfile/\" + fileName\n\treturn fileResponse, false\n}\n\nfunc (e File) buildFileResponse(filePath, urlPrefix, fileName, fileType string) FileResponse {\n\treturn FileResponse{\n\t\tSize:     pkg.GetFileSize(filePath),\n\t\tPath:     filePath,\n\t\tFullPath: urlPrefix + filePath,\n\t\tName:     fileName,\n\t\tType:     fileType,\n\t}\n}\n\nfunc thirdUpload(source string, name string, path string) error {\n\tswitch source {\n\tcase \"2\":\n\t\treturn ossUpload(\"img/\"+name, path)\n\tcase \"3\":\n\t\treturn qiniuUpload(\"img/\"+name, path)\n\t}\n\treturn nil\n}\n\nfunc ossUpload(name string, path string) error {\n\toss := file_store.ALiYunOSS{}\n\treturn oss.UpLoad(name, path)\n}\n\nfunc qiniuUpload(name string, path string) error {\n\toss := file_store.ALiYunOSS{}\n\treturn oss.UpLoad(name, path)\n}\n"
  },
  {
    "path": "app/other/apis/sys_server_monitor.go",
    "content": "package apis\n\nimport (\n\t\"fmt\"\n\t\"github.com/shirou/gopsutil/v3/net\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/shirou/gopsutil/v3/cpu\"\n\t\"github.com/shirou/gopsutil/v3/disk\"\n\t\"github.com/shirou/gopsutil/v3/host\"\n\t\"github.com/shirou/gopsutil/v3/mem\"\n)\n\nconst (\n\tB  = 1\n\tKB = 1024 * B\n\tMB = 1024 * KB\n\tGB = 1024 * MB\n)\n\nvar excludeNetInterfaces = []string{\n\t\"lo\", \"tun\", \"docker\", \"veth\", \"br-\", \"vmbr\", \"vnet\", \"kube\",\n}\n\ntype ServerMonitor struct {\n\tapi.Api\n}\n\n// GetHourDiffer 获取相差时间\nfunc GetHourDiffer(startTime, endTime string) int64 {\n\tt1, err1 := time.ParseInLocation(\"2006-01-02 15:04:05\", startTime, time.Local)\n\tt2, err2 := time.ParseInLocation(\"2006-01-02 15:04:05\", endTime, time.Local)\n\tif err1 != nil || err2 != nil || !t1.Before(t2) {\n\t\treturn 0\n\t}\n\treturn (t2.Unix() - t1.Unix()) / 3600\n}\n\n// ServerInfo 获取系统信息\nfunc (e ServerMonitor) ServerInfo(c *gin.Context) {\n\te.Context = c\n\n\tosInfo := getOSInfo()\n\tmemInfo := getMemoryInfo()\n\tswapInfo := getSwapInfo()\n\tcpuInfo := getCPUInfo()\n\tdiskInfo := getDiskInfo()\n\tnetInfo := getNetworkInfo()\n\n\tbootTime, _ := host.BootTime()\n\tcachedBootTime := time.Unix(int64(bootTime), 0)\n\n\te.Custom(gin.H{\n\t\t\"code\":     200,\n\t\t\"os\":       osInfo,\n\t\t\"mem\":      memInfo,\n\t\t\"cpu\":      cpuInfo,\n\t\t\"disk\":     diskInfo,\n\t\t\"net\":      netInfo,\n\t\t\"swap\":     swapInfo,\n\t\t\"location\": \"Aliyun\",\n\t\t\"bootTime\": GetHourDiffer(cachedBootTime.Format(\"2006-01-02 15:04:05\"), time.Now().Format(\"2006-01-02 15:04:05\")),\n\t})\n}\n\nfunc getOSInfo() map[string]interface{} {\n\tsysInfo, _ := host.Info()\n\treturn map[string]interface{}{\n\t\t\"goOs\":         runtime.GOOS,\n\t\t\"arch\":         runtime.GOARCH,\n\t\t\"mem\":          runtime.MemProfileRate,\n\t\t\"compiler\":     runtime.Compiler,\n\t\t\"version\":      runtime.Version(),\n\t\t\"numGoroutine\": runtime.NumGoroutine(),\n\t\t\"ip\":           pkg.GetLocalHost(),\n\t\t\"projectDir\":   pkg.GetCurrentPath(),\n\t\t\"hostName\":     sysInfo.Hostname,\n\t\t\"time\":         time.Now().Format(\"2006-01-02 15:04:05\"),\n\t}\n}\n\nfunc getMemoryInfo() map[string]interface{} {\n\tmemory, _ := mem.VirtualMemory()\n\treturn map[string]interface{}{\n\t\t\"used\":    memory.Used / MB,\n\t\t\"total\":   memory.Total / MB,\n\t\t\"percent\": pkg.Round(memory.UsedPercent, 2),\n\t}\n}\n\nfunc getSwapInfo() map[string]interface{} {\n\tmemory, _ := mem.VirtualMemory()\n\treturn map[string]interface{}{\n\t\t\"used\":  memory.SwapTotal - memory.SwapFree,\n\t\t\"total\": memory.SwapTotal,\n\t}\n}\n\nfunc getCPUInfo() map[string]interface{} {\n\tcpuInfo, _ := cpu.Info()\n\tpercent, _ := cpu.Percent(0, false)\n\tcpuNum, _ := cpu.Counts(false)\n\treturn map[string]interface{}{\n\t\t\"cpuInfo\": cpuInfo,\n\t\t\"percent\": pkg.Round(percent[0], 2),\n\t\t\"cpuNum\":  cpuNum,\n\t}\n}\n\nfunc getDiskInfo() map[string]interface{} {\n\tvar diskTotal, diskUsed, diskUsedPercent float64\n\tdiskList := make([]disk.UsageStat, 0)\n\n\tdiskInfo, err := disk.Partitions(true)\n\tif err == nil {\n\t\tfor _, p := range diskInfo {\n\t\t\tdiskDetail, err := disk.Usage(p.Mountpoint)\n\t\t\tif err == nil {\n\t\t\t\tdiskDetail.UsedPercent, _ = strconv.ParseFloat(fmt.Sprintf(\"%.2f\", diskDetail.UsedPercent), 64)\n\t\t\t\tdiskDetail.Total /= MB\n\t\t\t\tdiskDetail.Used /= MB\n\t\t\t\tdiskDetail.Free /= MB\n\t\t\t\tdiskList = append(diskList, *diskDetail)\n\t\t\t}\n\t\t}\n\t}\n\n\td, _ := disk.Usage(\"/\")\n\tdiskTotal = float64(d.Total / GB)\n\tdiskUsed = float64(d.Used / GB)\n\tdiskUsedPercent, _ = strconv.ParseFloat(fmt.Sprintf(\"%.2f\", d.UsedPercent), 64)\n\n\treturn map[string]interface{}{\n\t\t\"total\":   diskTotal,\n\t\t\"used\":    diskUsed,\n\t\t\"percent\": diskUsedPercent,\n\t}\n}\n\nfunc getNetworkInfo() map[string]interface{} {\n\tnetInSpeed, netOutSpeed := trackNetworkSpeed()\n\treturn map[string]interface{}{\n\t\t\"in\":  pkg.Round(float64(netInSpeed/KB), 2),\n\t\t\"out\": pkg.Round(float64(netOutSpeed/KB), 2),\n\t}\n}\n\nfunc trackNetworkSpeed() (uint64, uint64) {\n\tvar netInSpeed, netOutSpeed, netInTransfer, netOutTransfer, lastUpdateNetStats uint64\n\tnc, err := net.IOCounters(true)\n\tif err == nil {\n\t\tfor _, v := range nc {\n\t\t\tif isListContainsStr(excludeNetInterfaces, v.Name) {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tnetInTransfer += v.BytesRecv\n\t\t\tnetOutTransfer += v.BytesSent\n\t\t}\n\t\tnow := uint64(time.Now().Unix())\n\t\tdiff := now - lastUpdateNetStats\n\t\tif diff > 0 {\n\t\t\tnetInSpeed = (netInTransfer - netInTransfer) / diff\n\t\t\tnetOutSpeed = (netOutTransfer - netOutTransfer) / diff\n\t\t}\n\t\tlastUpdateNetStats = now\n\t}\n\treturn netInSpeed, netOutSpeed\n}\n\nfunc isListContainsStr(list []string, str string) bool {\n\tfor _, item := range list {\n\t\tif strings.Contains(str, item) {\n\t\t\treturn true\n\t\t}\n\t}\n\treturn false\n}\n"
  },
  {
    "path": "app/other/apis/tools/db_columns.go",
    "content": "package tools\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\n\t\"go-admin/app/other/models/tools\"\n)\n\n// GetDBColumnList 分页列表数据\n// @Summary 分页列表数据 / page list data\n// @Description 数据库表列分页列表 / database table column page list\n// @Tags 工具 / 生成工具\n// @Param tableName query string false \"tableName / 数据表名称\"\n// @Param pageSize query int false \"pageSize / 页条数\"\n// @Param pageIndex query int false \"pageIndex / 页码\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/db/columns/page [get]\nfunc (e Gen) GetDBColumnList(c *gin.Context) {\n\te.Context = c\n\tlog := e.GetLogger()\n\tvar data tools.DBColumns\n\tvar err error\n\tvar pageSize = 10\n\tvar pageIndex = 1\n\n\tif size := c.Request.FormValue(\"pageSize\"); size != \"\" {\n\t\tpageSize, err = pkg.StringToInt(size)\n\t}\n\n\tif index := c.Request.FormValue(\"pageIndex\"); index != \"\" {\n\t\tpageIndex, err = pkg.StringToInt(index)\n\t}\n\n\tdb, err := pkg.GetOrm(c)\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, \"数据库连接获取失败\")\n\t\treturn\n\t}\n\n\tdata.TableName = c.Request.FormValue(\"tableName\")\n\tpkg.Assert(data.TableName == \"\", \"table name cannot be empty！\", 500)\n\tresult, count, err := data.GetPage(db, pageSize, pageIndex)\n\tif err != nil {\n\t\tlog.Errorf(\"GetPage error, %s\", err.Error())\n\t\te.Error(500, err, \"\")\n\t\treturn\n\t}\n\te.PageOK(result, count, pageIndex, pageSize, \"查询成功\")\n}\n"
  },
  {
    "path": "app/other/apis/tools/db_tables.go",
    "content": "package tools\n\nimport (\n\t\"errors\"\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\n\t\"go-admin/app/other/models/tools\"\n)\n\n// GetDBTableList 分页列表数据\n// @Summary 分页列表数据 / page list data\n// @Description 数据库表分页列表 / database table page list\n// @Tags 工具 / 生成工具\n// @Param tableName query string false \"tableName / 数据表名称\"\n// @Param pageSize query int false \"pageSize / 页条数\"\n// @Param pageIndex query int false \"pageIndex / 页码\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/db/tables/page [get]\nfunc (e Gen) GetDBTableList(c *gin.Context) {\n\t//var res response.Response\n\tvar data tools.DBTables\n\tvar err error\n\tvar pageSize = 10\n\tvar pageIndex = 1\n\te.Context = c\n\tlog := e.GetLogger()\n\tif config.DatabaseConfig.Driver == \"sqlite3\" || config.DatabaseConfig.Driver == \"postgres\" {\n\t\terr = errors.New(\"对不起，sqlite3 或 postgres 不支持代码生成！\")\n\t\tlog.Warn(err)\n\t\te.Error(403, err, \"\")\n\t\treturn\n\t}\n\n\tif size := c.Request.FormValue(\"pageSize\"); size != \"\" {\n\t\tpageSize, err = pkg.StringToInt(size)\n\t}\n\n\tif index := c.Request.FormValue(\"pageIndex\"); index != \"\" {\n\t\tpageIndex, err = pkg.StringToInt(index)\n\t}\n\n\tdb, err := pkg.GetOrm(c)\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, \"数据库连接获取失败\")\n\t\treturn\n\t}\n\n\tdata.TableName = c.Request.FormValue(\"tableName\")\n\tresult, count, err := data.GetPage(db, pageSize, pageIndex)\n\tif err != nil {\n\t\tlog.Errorf(\"GetPage error, %s\", err.Error())\n\t\te.Error(500, err, \"\")\n\t\treturn\n\t}\n\te.PageOK(result, count, pageIndex, pageSize, \"查询成功\")\n}\n"
  },
  {
    "path": "app/other/apis/tools/gen.go",
    "content": "package tools\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"go-admin/app/admin/service\"\n\t\"go-admin/app/admin/service/dto\"\n\t\"strconv\"\n\t\"strings\"\n\t\"text/template\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\n\t\"go-admin/app/other/models/tools\"\n)\n\ntype Gen struct {\n\tapi.Api\n}\n\nfunc (e Gen) Preview(c *gin.Context) {\n\te.Context = c\n\tlog := e.GetLogger()\n\ttable := tools.SysTables{}\n\tid, err := pkg.StringToInt(c.Param(\"tableId\"))\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"tableId接收失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\ttable.TableId = id\n\tt1, err := template.ParseFiles(\"template/v4/model.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"model模版读取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt2, err := template.ParseFiles(\"template/v4/no_actions/apis.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"api模版读取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt3, err := template.ParseFiles(\"template/v4/js.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"js模版读取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt4, err := template.ParseFiles(\"template/v4/vue.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"vue模版读取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt5, err := template.ParseFiles(\"template/v4/no_actions/router_check_role.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"路由模版读取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt6, err := template.ParseFiles(\"template/v4/dto.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"dto模版读取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt7, err := template.ParseFiles(\"template/v4/no_actions/service.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"service模版读取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\n\tdb, err := pkg.GetOrm(c)\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, fmt.Sprintf(\"数据库链接获取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\n\ttab, _ := table.Get(db,false)\n\tvar b1 bytes.Buffer\n\terr = t1.Execute(&b1, tab)\n\tvar b2 bytes.Buffer\n\terr = t2.Execute(&b2, tab)\n\tvar b3 bytes.Buffer\n\terr = t3.Execute(&b3, tab)\n\tvar b4 bytes.Buffer\n\terr = t4.Execute(&b4, tab)\n\tvar b5 bytes.Buffer\n\terr = t5.Execute(&b5, tab)\n\tvar b6 bytes.Buffer\n\terr = t6.Execute(&b6, tab)\n\tvar b7 bytes.Buffer\n\terr = t7.Execute(&b7, tab)\n\n\tmp := make(map[string]interface{})\n\tmp[\"template/model.go.template\"] = b1.String()\n\tmp[\"template/api.go.template\"] = b2.String()\n\tmp[\"template/js.go.template\"] = b3.String()\n\tmp[\"template/vue.go.template\"] = b4.String()\n\tmp[\"template/router.go.template\"] = b5.String()\n\tmp[\"template/dto.go.template\"] = b6.String()\n\tmp[\"template/service.go.template\"] = b7.String()\n\te.OK(mp, \"\")\n}\n\nfunc (e Gen) GenCode(c *gin.Context) {\n\te.Context = c\n\tlog := e.GetLogger()\n\ttable := tools.SysTables{}\n\tid, err := pkg.StringToInt(c.Param(\"tableId\"))\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"tableId参数接收失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\n\tdb, err := pkg.GetOrm(c)\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, fmt.Sprintf(\"数据库链接获取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\n\ttable.TableId = id\n\ttab, _ := table.Get(db,false)\n\n\te.NOActionsGen(c, tab)\n\n\te.OK(\"\", \"Code generated successfully！\")\n}\n\nfunc (e Gen) GenApiToFile(c *gin.Context) {\n\te.Context = c\n\tlog := e.GetLogger()\n\ttable := tools.SysTables{}\n\tid, err := pkg.StringToInt(c.Param(\"tableId\"))\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"tableId参数获取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\n\tdb, err := pkg.GetOrm(c)\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, fmt.Sprintf(\"数据库链接获取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\n\ttable.TableId = id\n\ttab, _ := table.Get(db,false)\n\te.genApiToFile(c, tab)\n\n\te.OK(\"\", \"Code generated successfully！\")\n}\n\nfunc (e Gen) NOActionsGen(c *gin.Context, tab tools.SysTables) {\n\te.Context = c\n\tlog := e.GetLogger()\n\ttab.MLTBName = strings.Replace(tab.TBName, \"_\", \"-\", -1)\n\n\tbasePath := \"template/v4/\"\n\trouterFile := basePath + \"no_actions/router_check_role.go.template\"\n\n\tif tab.IsAuth == 2 {\n\t\trouterFile = basePath + \"no_actions/router_no_check_role.go.template\"\n\t}\n\n\tt1, err := template.ParseFiles(basePath + \"model.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"model模版读取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt2, err := template.ParseFiles(basePath + \"no_actions/apis.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"api模版读取失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt3, err := template.ParseFiles(routerFile)\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"路由模版失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt4, err := template.ParseFiles(basePath + \"js.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"js模版解析失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt5, err := template.ParseFiles(basePath + \"vue.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"vue模版解析失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt6, err := template.ParseFiles(basePath + \"dto.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"dto模版解析失败失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\tt7, err := template.ParseFiles(basePath + \"no_actions/service.go.template\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"service模版失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\n\t_ = pkg.PathCreate(\"./app/\" + tab.PackageName + \"/apis/\")\n\t_ = pkg.PathCreate(\"./app/\" + tab.PackageName + \"/models/\")\n\t_ = pkg.PathCreate(\"./app/\" + tab.PackageName + \"/router/\")\n\t_ = pkg.PathCreate(\"./app/\" + tab.PackageName + \"/service/dto/\")\n\t_ = pkg.PathCreate(config.GenConfig.FrontPath + \"/api/\" + tab.PackageName + \"/\")\n\terr = pkg.PathCreate(config.GenConfig.FrontPath + \"/views/\" + tab.PackageName + \"/\" + tab.MLTBName + \"/\")\n\tif err != nil {\n\t\tlog.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"views目录创建失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\n\tvar b1 bytes.Buffer\n\terr = t1.Execute(&b1, tab)\n\tvar b2 bytes.Buffer\n\terr = t2.Execute(&b2, tab)\n\tvar b3 bytes.Buffer\n\terr = t3.Execute(&b3, tab)\n\tvar b4 bytes.Buffer\n\terr = t4.Execute(&b4, tab)\n\tvar b5 bytes.Buffer\n\terr = t5.Execute(&b5, tab)\n\tvar b6 bytes.Buffer\n\terr = t6.Execute(&b6, tab)\n\tvar b7 bytes.Buffer\n\terr = t7.Execute(&b7, tab)\n\tpkg.FileCreate(b1, \"./app/\"+tab.PackageName+\"/models/\"+tab.TBName+\".go\")\n\tpkg.FileCreate(b2, \"./app/\"+tab.PackageName+\"/apis/\"+tab.TBName+\".go\")\n\tpkg.FileCreate(b3, \"./app/\"+tab.PackageName+\"/router/\"+tab.TBName+\".go\")\n\tpkg.FileCreate(b4, config.GenConfig.FrontPath+\"/api/\"+tab.PackageName+\"/\"+tab.MLTBName+\".js\")\n\tpkg.FileCreate(b5, config.GenConfig.FrontPath+\"/views/\"+tab.PackageName+\"/\"+tab.MLTBName+\"/index.vue\")\n\tpkg.FileCreate(b6, \"./app/\"+tab.PackageName+\"/service/dto/\"+tab.TBName+\".go\")\n\tpkg.FileCreate(b7, \"./app/\"+tab.PackageName+\"/service/\"+tab.TBName+\".go\")\n\n}\n\nfunc (e Gen) genApiToFile(c *gin.Context, tab tools.SysTables) {\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\tbasePath := \"template/\"\n\n\tt1, err := template.ParseFiles(basePath + \"api_migrate.template\")\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"数据迁移模版解析失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\ti := strconv.FormatInt(time.Now().UnixNano()/1e6, 10)\n\tvar b1 bytes.Buffer\n\terr = t1.Execute(&b1, struct {\n\t\ttools.SysTables\n\t\tGenerateTime string\n\t}{tab, i})\n\n\tpkg.FileCreate(b1, \"./cmd/migrate/migration/version-local/\"+i+\"_migrate.go\")\n\n}\n\nfunc (e Gen) GenMenuAndApi(c *gin.Context) {\n\ts := service.SysMenu{}\n\terr := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\n\ttable := tools.SysTables{}\n\tid, err := pkg.StringToInt(c.Param(\"tableId\"))\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, fmt.Sprintf(\"tableId参数解析失败！错误详情：%s\", err.Error()))\n\t\treturn\n\t}\n\n\ttable.TableId = id\n\ttab, _ := table.Get(e.Orm,true)\n\ttab.MLTBName = strings.Replace(tab.TBName, \"_\", \"-\", -1)\n\n\tMmenu := dto.SysMenuInsertReq{}\n\tMmenu.Title = tab.TableComment\n\tMmenu.Icon = \"pass\"\n\tMmenu.Path = \"/\" + tab.MLTBName\n\tMmenu.MenuType = \"M\"\n\tMmenu.Action = \"无\"\n\tMmenu.ParentId = 0\n\tMmenu.NoCache = false\n\tMmenu.Component = \"Layout\"\n\tMmenu.Sort = 0\n\tMmenu.Visible = \"0\"\n\tMmenu.IsFrame = \"0\"\n\tMmenu.CreateBy = 1\n\ts.Insert(&Mmenu)\n\n\tCmenu := dto.SysMenuInsertReq{}\n\tCmenu.MenuName = tab.ClassName + \"Manage\"\n\tCmenu.Title = tab.TableComment\n\tCmenu.Icon = \"pass\"\n\tCmenu.Path = \"/\" + tab.PackageName + \"/\" + tab.MLTBName\n\tCmenu.MenuType = \"C\"\n\tCmenu.Action = \"无\"\n\tCmenu.Permission = tab.PackageName + \":\" + tab.BusinessName + \":list\"\n\tCmenu.ParentId = Mmenu.MenuId\n\tCmenu.NoCache = false\n\tCmenu.Component = \"/\" + tab.PackageName + \"/\" + tab.MLTBName + \"/index\"\n\tCmenu.Sort = 0\n\tCmenu.Visible = \"0\"\n\tCmenu.IsFrame = \"0\"\n\tCmenu.CreateBy = 1\n\tCmenu.UpdateBy = 1\n\ts.Insert(&Cmenu)\n\n\tMList := dto.SysMenuInsertReq{}\n\tMList.MenuName = \"\"\n\tMList.Title = \"分页获取\" + tab.TableComment\n\tMList.Icon = \"\"\n\tMList.Path = tab.TBName\n\tMList.MenuType = \"F\"\n\tMList.Action = \"无\"\n\tMList.Permission = tab.PackageName + \":\" + tab.BusinessName + \":query\"\n\tMList.ParentId = Cmenu.MenuId\n\tMList.NoCache = false\n\tMList.Sort = 0\n\tMList.Visible = \"0\"\n\tMList.IsFrame = \"0\"\n\tMList.CreateBy = 1\n\tMList.UpdateBy = 1\n\ts.Insert(&MList)\n\n\tMCreate := dto.SysMenuInsertReq{}\n\tMCreate.MenuName = \"\"\n\tMCreate.Title = \"创建\" + tab.TableComment\n\tMCreate.Icon = \"\"\n\tMCreate.Path = tab.TBName\n\tMCreate.MenuType = \"F\"\n\tMCreate.Action = \"无\"\n\tMCreate.Permission = tab.PackageName + \":\" + tab.BusinessName + \":add\"\n\tMCreate.ParentId = Cmenu.MenuId\n\tMCreate.NoCache = false\n\tMCreate.Sort = 0\n\tMCreate.Visible = \"0\"\n\tMCreate.IsFrame = \"0\"\n\tMCreate.CreateBy = 1\n\tMCreate.UpdateBy = 1\n\ts.Insert(&MCreate)\n\n\tMUpdate := dto.SysMenuInsertReq{}\n\tMUpdate.MenuName = \"\"\n\tMUpdate.Title = \"修改\" + tab.TableComment\n\tMUpdate.Icon = \"\"\n\tMUpdate.Path = tab.TBName\n\tMUpdate.MenuType = \"F\"\n\tMUpdate.Action = \"无\"\n\tMUpdate.Permission = tab.PackageName + \":\" + tab.BusinessName + \":edit\"\n\tMUpdate.ParentId = Cmenu.MenuId\n\tMUpdate.NoCache = false\n\tMUpdate.Sort = 0\n\tMUpdate.Visible = \"0\"\n\tMUpdate.IsFrame = \"0\"\n\tMUpdate.CreateBy = 1\n\tMUpdate.UpdateBy = 1\n\ts.Insert(&MUpdate)\n\n\tMDelete := dto.SysMenuInsertReq{}\n\tMDelete.MenuName = \"\"\n\tMDelete.Title = \"删除\" + tab.TableComment\n\tMDelete.Icon = \"\"\n\tMDelete.Path = tab.TBName\n\tMDelete.MenuType = \"F\"\n\tMDelete.Action = \"无\"\n\tMDelete.Permission = tab.PackageName + \":\" + tab.BusinessName + \":remove\"\n\tMDelete.ParentId = Cmenu.MenuId\n\tMDelete.NoCache = false\n\tMDelete.Sort = 0\n\tMDelete.Visible = \"0\"\n\tMDelete.IsFrame = \"0\"\n\tMDelete.CreateBy = 1\n\tMDelete.UpdateBy = 1\n\ts.Insert(&MDelete)\n\n\te.OK(\"\", \"数据生成成功！\")\n}\n"
  },
  {
    "path": "app/other/apis/tools/sys_tables.go",
    "content": "package tools\n\nimport (\n\t\"strings\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/app/other/models/tools\"\n)\n\ntype SysTable struct {\n\tapi.Api\n}\n\n// GetPage 分页列表数据\n// @Summary 分页列表数据\n// @Description 生成表分页列表\n// @Tags 工具 / 生成工具\n// @Param tableName query string false \"tableName / 数据表名称\"\n// @Param pageSize query int false \"pageSize / 页条数\"\n// @Param pageIndex query int false \"pageIndex / 页码\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys/tables/page [get]\nfunc (e SysTable) GetPage(c *gin.Context) {\n\te.Context = c\n\tlog := e.GetLogger()\n\tvar data tools.SysTables\n\tvar err error\n\tvar pageSize = 10\n\tvar pageIndex = 1\n\n\tif size := c.Request.FormValue(\"pageSize\"); size != \"\" {\n\t\tpageSize, err = pkg.StringToInt(size)\n\t}\n\n\tif index := c.Request.FormValue(\"pageIndex\"); index != \"\" {\n\t\tpageIndex, err = pkg.StringToInt(index)\n\t}\n\n\tdb, err := e.GetOrm()\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, \"数据库连接获取失败\")\n\t\treturn\n\t}\n\n\tdata.TBName = c.Request.FormValue(\"tableName\")\n\tdata.TableComment = c.Request.FormValue(\"tableComment\")\n\tresult, count, err := data.GetPage(db, pageSize, pageIndex)\n\tif err != nil {\n\t\tlog.Errorf(\"GetPage error, %s\", err.Error())\n\t\te.Error(500, err, \"\")\n\t\treturn\n\t}\n\te.PageOK(result, count, pageIndex, pageSize, \"查询成功\")\n}\n\n// Get\n// @Summary 获取配置\n// @Description 获取JSON\n// @Tags 工具 / 生成工具\n// @Param configKey path int true \"configKey\"\n// @Success 200 {object} response.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/sys/tables/info/{tableId} [get]\n// @Security Bearer\nfunc (e SysTable) Get(c *gin.Context) {\n\te.Context = c\n\tlog := e.GetLogger()\n\tdb, err := e.GetOrm()\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, \"数据库连接获取失败\")\n\t\treturn\n\t}\n\n\tvar data tools.SysTables\n\tdata.TableId, _ = pkg.StringToInt(c.Param(\"tableId\"))\n\tresult, err := data.Get(db,true)\n\tif err != nil {\n\t\tlog.Errorf(\"Get error, %s\", err.Error())\n\t\te.Error(500, err, \"\")\n\t\treturn\n\t}\n\n\tmp := make(map[string]interface{})\n\tmp[\"list\"] = result.Columns\n\tmp[\"info\"] = result\n\te.OK(mp, \"\")\n}\n\nfunc (e SysTable) GetSysTablesInfo(c *gin.Context) {\n\te.Context = c\n\tlog := e.GetLogger()\n\tdb, err := e.GetOrm()\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, \"数据库连接获取失败\")\n\t\treturn\n\t}\n\n\tvar data tools.SysTables\n\tif c.Request.FormValue(\"tableName\") != \"\" {\n\t\tdata.TBName = c.Request.FormValue(\"tableName\")\n\t}\n\tresult, err := data.Get(db,true)\n\tif err != nil {\n\t\tlog.Errorf(\"Get error, %s\", err.Error())\n\t\te.Error(500, err, \"抱歉未找到相关信息\")\n\t\treturn\n\t}\n\n\tmp := make(map[string]interface{})\n\tmp[\"list\"] = result.Columns\n\tmp[\"info\"] = result\n\te.OK(mp, \"\")\n\t//res.Data = mp\n\t//c.JSON(http.StatusOK, res.ReturnOK())\n}\n\nfunc (e SysTable) GetSysTablesTree(c *gin.Context) {\n\te.Context = c\n\tlog := e.GetLogger()\n\tdb, err := e.GetOrm()\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, \"数据库连接获取失败\")\n\t\treturn\n\t}\n\n\tvar data tools.SysTables\n\tresult, err := data.GetTree(db)\n\tif err != nil {\n\t\tlog.Errorf(\"GetTree error, %s\", err.Error())\n\t\te.Error(500, err, \"抱歉未找到相关信息\")\n\t\treturn\n\t}\n\n\te.OK(result, \"\")\n}\n\n// Insert\n// @Summary 添加表结构\n// @Description 添加表结构\n// @Tags 工具 / 生成工具\n// @Accept  application/json\n// @Product application/json\n// @Param tables query string false \"tableName / 数据表名称\"\n// @Success 200 {string} string\t\"{\"code\": 200, \"message\": \"添加成功\"}\"\n// @Success 200 {string} string\t\"{\"code\": -1, \"message\": \"添加失败\"}\"\n// @Router /api/v1/sys/tables/info [post]\n// @Security Bearer\nfunc (e SysTable) Insert(c *gin.Context) {\n\te.Context = c\n\tlog := e.GetLogger()\n\tdb, err := e.GetOrm()\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, \"数据库连接获取失败\")\n\t\treturn\n\t}\n\n\ttablesList := strings.Split(c.Request.FormValue(\"tables\"), \",\")\n\tfor i := 0; i < len(tablesList); i++ {\n\n\t\tdata, err := genTableInit(db, tablesList, i, c)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"genTableInit error, %s\", err.Error())\n\t\t\te.Error(500, err, \"\")\n\t\t\treturn\n\t\t}\n\n\t\t_, err = data.Create(db)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Create error, %s\", err.Error())\n\t\t\te.Error(500, err, \"\")\n\t\t\treturn\n\t\t}\n\t}\n\te.OK(nil, \"添加成功\")\n\n}\n\nfunc genTableInit(tx *gorm.DB, tablesList []string, i int, c *gin.Context) (tools.SysTables, error) {\n\tvar data tools.SysTables\n\tvar dbTable tools.DBTables\n\tvar dbColumn tools.DBColumns\n\tdata.TBName = tablesList[i]\n\tdata.CreateBy = 0\n\n\tdbTable.TableName = data.TBName\n\tdbtable, err := dbTable.Get(tx)\n\tif err != nil {\n\t\treturn data, err\n\t}\n\n\tdbColumn.TableName = data.TBName\n\ttablenamelist := strings.Split(dbColumn.TableName, \"_\")\n\tfor i := 0; i < len(tablenamelist); i++ {\n\t\tstrStart := string([]byte(tablenamelist[i])[:1])\n\t\tstrend := string([]byte(tablenamelist[i])[1:])\n\t\t// 大驼峰表名 结构体使用\n\t\tdata.ClassName += strings.ToUpper(strStart) + strend\n\t\t// 小驼峰表名 js函数名和权限标识使用\n\t\tif i == 0 {\n\t\t\tdata.BusinessName += strings.ToLower(strStart) + strend\n\t\t} else {\n\t\t\tdata.BusinessName += strings.ToUpper(strStart) + strend\n\t\t}\n\t\t//data.PackageName += strings.ToLower(strStart) + strings.ToLower(strend)\n\t\t//data.ModuleName += strings.ToLower(strStart) + strings.ToLower(strend)\n\t}\n\t//data.ModuleFrontName = strings.ReplaceAll(data.ModuleName, \"_\", \"-\")\n\tdata.PackageName = \"admin\"\n\tdata.TplCategory = \"crud\"\n\tdata.Crud = true\n\t// 中横线表名称，接口路径、前端文件夹名称和js名称使用\n\tdata.ModuleName = strings.Replace(data.TBName, \"_\", \"-\", -1)\n\tdbcolumn, err := dbColumn.GetList(tx)\n\tdata.CreateBy = 0\n\tdata.TableComment = dbtable.TableComment\n\tif dbtable.TableComment == \"\" {\n\t\tdata.TableComment = data.ClassName\n\t}\n\n\tdata.FunctionName = data.TableComment\n\t//data.BusinessName = data.ModuleName\n\tdata.IsLogicalDelete = \"1\"\n\tdata.LogicalDelete = true\n\tdata.LogicalDeleteColumn = \"is_del\"\n\tdata.IsActions = 2\n\tdata.IsDataScope = 1\n\tdata.IsAuth = 1\n\n\tdata.FunctionAuthor = \"wenjianzhang\"\n\tfor i := 0; i < len(dbcolumn); i++ {\n\t\tvar column tools.SysColumns\n\t\tcolumn.ColumnComment = dbcolumn[i].ColumnComment\n\t\tcolumn.ColumnName = dbcolumn[i].ColumnName\n\t\tcolumn.ColumnType = dbcolumn[i].ColumnType\n\t\tcolumn.Sort = i + 1\n\t\tcolumn.Insert = true\n\t\tcolumn.IsInsert = \"1\"\n\t\tcolumn.QueryType = \"EQ\"\n\t\tcolumn.IsPk = \"0\"\n\n\t\tnamelist := strings.Split(dbcolumn[i].ColumnName, \"_\")\n\t\tfor i := 0; i < len(namelist); i++ {\n\t\t\tstrStart := string([]byte(namelist[i])[:1])\n\t\t\tstrend := string([]byte(namelist[i])[1:])\n\t\t\tcolumn.GoField += strings.ToUpper(strStart) + strend\n\t\t\tif i == 0 {\n\t\t\t\tcolumn.JsonField = strings.ToLower(strStart) + strend\n\t\t\t} else {\n\t\t\t\tcolumn.JsonField += strings.ToUpper(strStart) + strend\n\t\t\t}\n\t\t}\n\t\tif strings.Contains(dbcolumn[i].ColumnKey, \"PR\") {\n\t\t\tcolumn.IsPk = \"1\"\n\t\t\tcolumn.Pk = true\n\t\t\tdata.PkColumn = dbcolumn[i].ColumnName\n\t\t\t//column.GoField = strings.ToUpper(column.GoField)\n\t\t\t//column.JsonField = strings.ToUpper(column.JsonField)\n\t\t\tdata.PkGoField = column.GoField\n\t\t\tdata.PkJsonField = column.JsonField\n\t\t}\n\t\tcolumn.IsRequired = \"0\"\n\t\tif strings.Contains(dbcolumn[i].IsNullable, \"NO\") {\n\t\t\tcolumn.IsRequired = \"1\"\n\t\t\tcolumn.Required = true\n\t\t}\n\n\t\tif strings.Contains(dbcolumn[i].ColumnType, \"int\") {\n\t\t\tif strings.Contains(dbcolumn[i].ColumnKey, \"PR\") {\n\t\t\t\tcolumn.GoType = \"int\"\n\t\t\t} else {\n\t\t\t\tcolumn.GoType = \"string\"\n\t\t\t}\n\t\t\tcolumn.HtmlType = \"input\"\n\t\t} else if strings.Contains(dbcolumn[i].ColumnType, \"timestamp\") {\n\t\t\tcolumn.GoType = \"time.Time\"\n\t\t\tcolumn.HtmlType = \"datetime\"\n\t\t} else if strings.Contains(dbcolumn[i].ColumnType, \"datetime\") {\n\t\t\tcolumn.GoType = \"time.Time\"\n\t\t\tcolumn.HtmlType = \"datetime\"\n\t\t} else {\n\t\t\tcolumn.GoType = \"string\"\n\t\t\tcolumn.HtmlType = \"input\"\n\t\t}\n\n\t\tdata.Columns = append(data.Columns, column)\n\t}\n\treturn data, err\n}\n\n// Update\n// @Summary 修改表结构\n// @Description 修改表结构\n// @Tags 工具 / 生成工具\n// @Accept  application/json\n// @Product application/json\n// @Param data body tools.SysTables true \"body\"\n// @Success 200 {string} string\t\"{\"code\": 200, \"message\": \"添加成功\"}\"\n// @Success 200 {string} string\t\"{\"code\": -1, \"message\": \"添加失败\"}\"\n// @Router /api/v1/sys/tables/info [put]\n// @Security Bearer\nfunc (e SysTable) Update(c *gin.Context) {\n\tvar data tools.SysTables\n\terr := c.Bind(&data)\n\tpkg.HasError(err, \"数据解析失败\", 500)\n\n\te.Context = c\n\tlog := e.GetLogger()\n\tdb, err := e.GetOrm()\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, \"数据库连接获取失败\")\n\t\treturn\n\t}\n\n\tdata.UpdateBy = 0\n\tresult, err := data.Update(db)\n\tif err != nil {\n\t\tlog.Errorf(\"Update error, %s\", err.Error())\n\t\te.Error(500, err, \"\")\n\t\treturn\n\t}\n\te.OK(result, \"修改成功\")\n}\n\n// Delete\n// @Summary 删除表结构\n// @Description 删除表结构\n// @Tags 工具 / 生成工具\n// @Param tableId path int true \"tableId\"\n// @Success 200 {string} string\t\"{\"code\": 200, \"message\": \"删除成功\"}\"\n// @Success 200 {string} string\t\"{\"code\": -1, \"message\": \"删除失败\"}\"\n// @Router /api/v1/sys/tables/info/{tableId} [delete]\nfunc (e SysTable) Delete(c *gin.Context) {\n\te.Context = c\n\tlog := e.GetLogger()\n\tdb, err := e.GetOrm()\n\tif err != nil {\n\t\tlog.Errorf(\"get db connection error, %s\", err.Error())\n\t\te.Error(500, err, \"数据库连接获取失败\")\n\t\treturn\n\t}\n\n\tvar data tools.SysTables\n\tIDS := pkg.IdsStrToIdsIntGroup(\"tableId\", c)\n\t_, err = data.BatchDelete(db, IDS)\n\tif err != nil {\n\t\tlog.Errorf(\"BatchDelete error, %s\", err.Error())\n\t\te.Error(500, err, \"删除失败\")\n\t\treturn\n\t}\n\te.OK(nil, \"删除成功\")\n}\n"
  },
  {
    "path": "app/other/models/tools/db_columns.go",
    "content": "package tools\n\nimport (\n\t\"errors\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"gorm.io/gorm\"\n)\n\ntype DBColumns struct {\n\tTableSchema            string `gorm:\"column:TABLE_SCHEMA\" json:\"tableSchema\"`\n\tTableName              string `gorm:\"column:TABLE_NAME\" json:\"tableName\"`\n\tColumnName             string `gorm:\"column:COLUMN_NAME\" json:\"columnName\"`\n\tColumnDefault          string `gorm:\"column:COLUMN_DEFAULT\" json:\"columnDefault\"`\n\tIsNullable             string `gorm:\"column:IS_NULLABLE\" json:\"isNullable\"`\n\tDataType               string `gorm:\"column:DATA_TYPE\" json:\"dataType\"`\n\tCharacterMaximumLength string `gorm:\"column:CHARACTER_MAXIMUM_LENGTH\" json:\"characterMaximumLength\"`\n\tCharacterSetName       string `gorm:\"column:CHARACTER_SET_NAME\" json:\"characterSetName\"`\n\tColumnType             string `gorm:\"column:COLUMN_TYPE\" json:\"columnType\"`\n\tColumnKey              string `gorm:\"column:COLUMN_KEY\" json:\"columnKey\"`\n\tExtra                  string `gorm:\"column:EXTRA\" json:\"extra\"`\n\tColumnComment          string `gorm:\"column:COLUMN_COMMENT\" json:\"columnComment\"`\n}\n\nfunc (e *DBColumns) GetPage(tx *gorm.DB, pageSize int, pageIndex int) ([]DBColumns, int, error) {\n\tvar doc []DBColumns\n\tvar count int64\n\ttable := new(gorm.DB)\n\n\tif config.DatabaseConfig.Driver == \"mysql\" {\n\t\ttable = tx.Table(\"information_schema.`COLUMNS`\")\n\t\ttable = table.Where(\"table_schema= ? \", config.GenConfig.DBName)\n\n\t\tif e.TableName != \"\" {\n\t\t\treturn nil, 0, errors.New(\"table name cannot be empty！\")\n\t\t}\n\n\t\ttable = table.Where(\"TABLE_NAME = ?\", e.TableName)\n\t}\n\n\tif err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {\n\t\treturn nil, 0, err\n\t}\n\t//table.Count(&count)\n\treturn doc, int(count), nil\n\n}\n\nfunc (e *DBColumns) GetList(tx *gorm.DB) ([]DBColumns, error) {\n\tvar doc []DBColumns\n\ttable := new(gorm.DB)\n\n\tif e.TableName == \"\" {\n\t\treturn nil, errors.New(\"table name cannot be empty！\")\n\t}\n\n\tif config.DatabaseConfig.Driver == \"mysql\" {\n\t\ttable = tx.Table(\"information_schema.columns\")\n\t\ttable = table.Where(\"table_schema= ? \", config.GenConfig.DBName)\n\n\t\ttable = table.Where(\"TABLE_NAME = ?\", e.TableName).Order(\"ORDINAL_POSITION asc\")\n\t} else {\n\t\tpkg.Assert(true, \"目前只支持mysql数据库\", 500)\n\t}\n\tif err := table.Find(&doc).Error; err != nil {\n\t\treturn doc, err\n\t}\n\treturn doc, nil\n}"
  },
  {
    "path": "app/other/models/tools/db_tables.go",
    "content": "package tools\n\nimport (\n\t\"errors\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\n\t\"gorm.io/gorm\"\n\n\tconfig2 \"github.com/go-admin-team/go-admin-core/sdk/config\"\n)\n\ntype DBTables struct {\n\tTableName      string `gorm:\"column:TABLE_NAME\" json:\"tableName\"`\n\tEngine         string `gorm:\"column:ENGINE\" json:\"engine\"`\n\tTableRows      string `gorm:\"column:TABLE_ROWS\" json:\"tableRows\"`\n\tTableCollation string `gorm:\"column:TABLE_COLLATION\" json:\"tableCollation\"`\n\tCreateTime     string `gorm:\"column:CREATE_TIME\" json:\"createTime\"`\n\tUpdateTime     string `gorm:\"column:UPDATE_TIME\" json:\"updateTime\"`\n\tTableComment   string `gorm:\"column:TABLE_COMMENT\" json:\"tableComment\"`\n}\n\nfunc (e *DBTables) GetPage(tx *gorm.DB, pageSize int, pageIndex int) ([]DBTables, int, error) {\n\tvar doc []DBTables\n\ttable := new(gorm.DB)\n\tvar count int64\n\n\tif config2.DatabaseConfig.Driver == \"mysql\" {\n\t\ttable = tx.Table(\"information_schema.tables\")\n\t\ttable = table.Where(\"TABLE_NAME not in (select table_name from `\" + config2.GenConfig.DBName + \"`.sys_tables) \")\n\t\ttable = table.Where(\"table_schema= ? \", config2.GenConfig.DBName)\n\n\t\tif e.TableName != \"\" {\n\t\t\ttable = table.Where(\"TABLE_NAME = ?\", e.TableName)\n\t\t}\n\t\tif err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {\n\t\t\treturn nil, 0, err\n\t\t}\n\t} else {\n\t\tpkg.Assert(true, \"目前只支持mysql数据库\", 500)\n\t}\n\n\t//table.Count(&count)\n\treturn doc, int(count), nil\n}\n\nfunc (e *DBTables) Get(tx *gorm.DB) (DBTables, error) {\n\tvar doc DBTables\n\tif config2.DatabaseConfig.Driver == \"mysql\" {\n\t\ttable := tx.Table(\"information_schema.tables\")\n\t\ttable = table.Where(\"table_schema= ? \", config2.GenConfig.DBName)\n\t\tif e.TableName == \"\" {\n\t\t\treturn doc, errors.New(\"table name cannot be empty！\")\n\t\t}\n\t\ttable = table.Where(\"TABLE_NAME = ?\", e.TableName)\n\t\tif err := table.First(&doc).Error; err != nil {\n\t\t\treturn doc, err\n\t\t}\n\t} else {\n\t\tpkg.Assert(true, \"目前只支持mysql数据库\", 500)\n\t}\n\treturn doc, nil\n}\n"
  },
  {
    "path": "app/other/models/tools/sys_columns.go",
    "content": "package tools\n\nimport (\n\tcommon \"go-admin/common/models\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype SysColumns struct {\n\tColumnId           int          `gorm:\"primaryKey;autoIncrement\" json:\"columnId\"`\n\tTableId            int          `gorm:\"\" json:\"tableId\"`\n\tColumnName         string       `gorm:\"size:128;\" json:\"columnName\"`\n\tColumnComment      string       `gorm:\"column:column_comment;size:128;\" json:\"columnComment\"`\n\tColumnType         string       `gorm:\"column:column_type;size:128;\" json:\"columnType\"`\n\tGoType             string       `gorm:\"column:go_type;size:128;\" json:\"goType\"`\n\tGoField            string       `gorm:\"column:go_field;size:128;\" json:\"goField\"`\n\tJsonField          string       `gorm:\"column:json_field;size:128;\" json:\"jsonField\"`\n\tIsPk               string       `gorm:\"column:is_pk;size:4;\" json:\"isPk\"`\n\tIsIncrement        string       `gorm:\"column:is_increment;size:4;\" json:\"isIncrement\"`\n\tIsRequired         string       `gorm:\"column:is_required;size:4;\" json:\"isRequired\"`\n\tIsInsert           string       `gorm:\"column:is_insert;size:4;\" json:\"isInsert\"`\n\tIsEdit             string       `gorm:\"column:is_edit;size:4;\" json:\"isEdit\"`\n\tIsList             string       `gorm:\"column:is_list;size:4;\" json:\"isList\"`\n\tIsQuery            string       `gorm:\"column:is_query;size:4;\" json:\"isQuery\"`\n\tQueryType          string       `gorm:\"column:query_type;size:128;\" json:\"queryType\"`\n\tHtmlType           string       `gorm:\"column:html_type;size:128;\" json:\"htmlType\"`\n\tDictType           string       `gorm:\"column:dict_type;size:128;\" json:\"dictType\"`\n\tSort               int          `gorm:\"column:sort;\" json:\"sort\"`\n\tList               string       `gorm:\"column:list;size:1;\" json:\"list\"`\n\tPk                 bool         `gorm:\"column:pk;size:1;\" json:\"pk\"`\n\tRequired           bool         `gorm:\"column:required;size:1;\" json:\"required\"`\n\tSuperColumn        bool         `gorm:\"column:super_column;size:1;\" json:\"superColumn\"`\n\tUsableColumn       bool         `gorm:\"column:usable_column;size:1;\" json:\"usableColumn\"`\n\tIncrement          bool         `gorm:\"column:increment;size:1;\" json:\"increment\"`\n\tInsert             bool         `gorm:\"column:insert;size:1;\" json:\"insert\"`\n\tEdit               bool         `gorm:\"column:edit;size:1;\" json:\"edit\"`\n\tQuery              bool         `gorm:\"column:query;size:1;\" json:\"query\"`\n\tRemark             string       `gorm:\"column:remark;size:255;\" json:\"remark\"`\n\tFkTableName        string       `gorm:\"\" json:\"fkTableName\"`\n\tFkTableNameClass   string       `gorm:\"\" json:\"fkTableNameClass\"`\n\tFkTableNamePackage string       `gorm:\"\" json:\"fkTableNamePackage\"`\n\tFkCol              []SysColumns `gorm:\"-\" json:\"fkCol\"`\n\tFkLabelId          string       `gorm:\"\" json:\"fkLabelId\"`\n\tFkLabelName        string       `gorm:\"size:255;\" json:\"fkLabelName\"`\n\tCreateBy           int          `gorm:\"column:create_by;size:20;\" json:\"createBy\"`\n\tUpdateBy           int          `gorm:\"column:update_By;size:20;\" json:\"updateBy\"`\n\n\tcommon.ModelTime\n}\n\nfunc (*SysColumns) TableName() string {\n\treturn \"sys_columns\"\n}\n\nfunc (e *SysColumns) GetList(tx *gorm.DB, exclude bool) ([]SysColumns, error) {\n\tvar doc []SysColumns\n\ttable := tx.Table(\"sys_columns\")\n\ttable = table.Where(\"table_id = ? \", e.TableId)\n\tif exclude {\n\t\tnotIn := make([]string, 0, 6)\n\t\tnotIn = append(notIn, \"id\")\n\t\tnotIn = append(notIn, \"create_by\")\n\t\tnotIn = append(notIn, \"update_by\")\n\t\tnotIn = append(notIn, \"created_at\")\n\t\tnotIn = append(notIn, \"updated_at\")\n\t\tnotIn = append(notIn, \"deleted_at\")\n\t\ttable = table.Where(\" column_name not in(?)\", notIn)\n\t}\n\n\tif err := table.Find(&doc).Error; err != nil {\n\t\treturn nil, err\n\t}\n\treturn doc, nil\n}\n\nfunc (e *SysColumns) Create(tx *gorm.DB) (SysColumns, error) {\n\tvar doc SysColumns\n\te.CreateBy = 0\n\tresult := tx.Table(\"sys_columns\").Create(&e)\n\tif result.Error != nil {\n\t\terr := result.Error\n\t\treturn doc, err\n\t}\n\tdoc = *e\n\treturn doc, nil\n}\n\nfunc (e *SysColumns) Update(tx *gorm.DB) (update SysColumns, err error) {\n\tif err = tx.Table(\"sys_columns\").First(&update, e.ColumnId).Error; err != nil {\n\t\treturn\n\t}\n\n\t//参数1:是要修改的数据\n\t//参数2:是修改的数据\n\te.UpdateBy = 0\n\tif err = tx.Table(\"sys_columns\").Model(&update).Updates(&e).Error; err != nil {\n\t\treturn\n\t}\n\n\treturn\n}\n"
  },
  {
    "path": "app/other/models/tools/sys_tables.go",
    "content": "package tools\n\nimport (\n\tcommon \"go-admin/common/models\"\n\t\"strings\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype SysTables struct {\n\tTableId             int    `gorm:\"primaryKey;autoIncrement\" json:\"tableId\"`        //表编码\n\tTBName              string `gorm:\"column:table_name;size:255;\" json:\"tableName\"`   //表名称\n\tMLTBName            string `gorm:\"-\" json:\"-\"`                                     //表名称\n\tTableComment        string `gorm:\"size:255;\" json:\"tableComment\"`                  //表备注\n\tClassName           string `gorm:\"size:255;\" json:\"className\"`                     //类名\n\tTplCategory         string `gorm:\"size:255;\" json:\"tplCategory\"`                   //\n\tPackageName         string `gorm:\"size:255;\" json:\"packageName\"`                   //包名\n\tModuleName          string `gorm:\"size:255;\" json:\"moduleName\"`                    //go文件名\n\tModuleFrontName     string `gorm:\"size:255;comment:前端文件名;\" json:\"moduleFrontName\"` //前端文件名\n\tBusinessName        string `gorm:\"size:255;\" json:\"businessName\"`                  //\n\tFunctionName        string `gorm:\"size:255;\" json:\"functionName\"`                  //功能名称\n\tFunctionAuthor      string `gorm:\"size:255;\" json:\"functionAuthor\"`                //功能作者\n\tPkColumn            string `gorm:\"size:255;\" json:\"pkColumn\"`\n\tPkGoField           string `gorm:\"size:255;\" json:\"pkGoField\"`\n\tPkJsonField         string `gorm:\"size:255;\" json:\"pkJsonField\"`\n\tOptions             string `gorm:\"size:255;\" json:\"options\"`\n\tTreeCode            string `gorm:\"size:255;\" json:\"treeCode\"`\n\tTreeParentCode      string `gorm:\"size:255;\" json:\"treeParentCode\"`\n\tTreeName            string `gorm:\"size:255;\" json:\"treeName\"`\n\tTree                bool   `gorm:\"size:1;default:0;\" json:\"tree\"`\n\tCrud                bool   `gorm:\"size:1;default:1;\" json:\"crud\"`\n\tRemark              string `gorm:\"size:255;\" json:\"remark\"`\n\tIsDataScope         int    `gorm:\"size:1;\" json:\"isDataScope\"`\n\tIsActions           int    `gorm:\"size:1;\" json:\"isActions\"`\n\tIsAuth              int    `gorm:\"size:1;\" json:\"isAuth\"`\n\tIsLogicalDelete     string `gorm:\"size:1;\" json:\"isLogicalDelete\"`\n\tLogicalDelete       bool   `gorm:\"size:1;\" json:\"logicalDelete\"`\n\tLogicalDeleteColumn string `gorm:\"size:128;\" json:\"logicalDeleteColumn\"`\n\tcommon.ModelTime\n\tcommon.ControlBy\n\tDataScope string       `gorm:\"-\" json:\"dataScope\"`\n\tParams    Params       `gorm:\"-\" json:\"params\"`\n\tColumns   []SysColumns `gorm:\"-\" json:\"columns\"`\n}\n\nfunc (*SysTables) TableName() string {\n\treturn \"sys_tables\"\n}\n\ntype Params struct {\n\tTreeCode       string `gorm:\"-\" json:\"treeCode\"`\n\tTreeParentCode string `gorm:\"-\" json:\"treeParentCode\"`\n\tTreeName       string `gorm:\"-\" json:\"treeName\"`\n}\n\nfunc (e *SysTables) GetPage(tx *gorm.DB, pageSize int, pageIndex int) ([]SysTables, int, error) {\n\tvar doc []SysTables\n\n\ttable := tx.Table(\"sys_tables\")\n\n\tif e.TBName != \"\" {\n\t\ttable = table.Where(\"table_name = ?\", e.TBName)\n\t}\n\tif e.TableComment != \"\" {\n\t\ttable = table.Where(\"table_comment = ?\", e.TableComment)\n\t}\n\n\tvar count int64\n\n\tif err := table.Offset((pageIndex - 1) * pageSize).Limit(pageSize).Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {\n\t\treturn nil, 0, err\n\t}\n\t//table.Where(\"`deleted_at` IS NULL\").Count(&count)\n\treturn doc, int(count), nil\n}\n\nfunc (e *SysTables) Get(tx *gorm.DB, exclude bool) (SysTables, error) {\n\tvar doc SysTables\n\tvar err error\n\ttable := tx.Table(\"sys_tables\")\n\n\tif e.TBName != \"\" {\n\t\ttable = table.Where(\"table_name = ?\", e.TBName)\n\t}\n\tif e.TableId != 0 {\n\t\ttable = table.Where(\"table_id = ?\", e.TableId)\n\t}\n\tif e.TableComment != \"\" {\n\t\ttable = table.Where(\"table_comment = ?\", e.TableComment)\n\t}\n\n\tif err := table.First(&doc).Error; err != nil {\n\t\treturn doc, err\n\t}\n\tvar col SysColumns\n\tcol.TableId = doc.TableId\n\tif doc.Columns, err = col.GetList(tx, exclude); err != nil {\n\t\treturn doc, err\n\t}\n\n\treturn doc, nil\n}\n\nfunc (e *SysTables) GetTree(tx *gorm.DB) ([]SysTables, error) {\n\tvar doc []SysTables\n\tvar err error\n\ttable := tx.Table(\"sys_tables\")\n\n\tif e.TBName != \"\" {\n\t\ttable = table.Where(\"table_name = ?\", e.TBName)\n\t}\n\tif e.TableId != 0 {\n\t\ttable = table.Where(\"table_id = ?\", e.TableId)\n\t}\n\tif e.TableComment != \"\" {\n\t\ttable = table.Where(\"table_comment = ?\", e.TableComment)\n\t}\n\n\tif err := table.Find(&doc).Error; err != nil {\n\t\treturn doc, err\n\t}\n\tfor i := 0; i < len(doc); i++ {\n\t\tvar col SysColumns\n\t\t//col.FkCol = append(col.FkCol, SysColumns{ColumnId: 0, ColumnName: \"请选择\"})\n\t\tcol.TableId = doc[i].TableId\n\t\tif doc[i].Columns, err = col.GetList(tx, false); err != nil {\n\t\t\treturn doc, err\n\t\t}\n\n\t}\n\n\treturn doc, nil\n}\n\nfunc (e *SysTables) Create(tx *gorm.DB) (SysTables, error) {\n\tvar doc SysTables\n\te.CreateBy = 0\n\tresult := tx.Table(\"sys_tables\").Create(&e)\n\tif result.Error != nil {\n\t\terr := result.Error\n\t\treturn doc, err\n\t}\n\tdoc = *e\n\tfor i := 0; i < len(e.Columns); i++ {\n\t\te.Columns[i].TableId = doc.TableId\n\n\t\t_, _ = e.Columns[i].Create(tx)\n\t}\n\n\treturn doc, nil\n}\n\nfunc (e *SysTables) Update(tx *gorm.DB) (update SysTables, err error) {\n\t//if err = orm.Eloquent.Table(\"sys_tables\").First(&update, e.TableId).Error; err != nil {\n\t//\treturn\n\t//}\n\n\t//参数1:是要修改的数据\n\t//参数2:是修改的数据\n\te.UpdateBy = 0\n\tif err = tx.Table(\"sys_tables\").Where(\"table_id = ?\", e.TableId).Updates(&e).Error; err != nil {\n\t\treturn\n\t}\n\n\ttableNames := make([]string, 0)\n\tfor i := range e.Columns {\n\t\tif e.Columns[i].FkTableName != \"\" {\n\t\t\ttableNames = append(tableNames, e.Columns[i].FkTableName)\n\t\t}\n\t}\n\n\ttables := make([]SysTables, 0)\n\ttableMap := make(map[string]*SysTables)\n\tif len(tableNames) > 0 {\n\t\tif err = tx.Table(\"sys_tables\").Where(\"table_name in (?)\", tableNames).Find(&tables).Error; err != nil {\n\t\t\treturn\n\t\t}\n\t\tfor i := range tables {\n\t\t\ttableMap[tables[i].TBName] = &tables[i]\n\t\t}\n\t}\n\n\tfor i := 0; i < len(e.Columns); i++ {\n\t\tif e.Columns[i].FkTableName != \"\" {\n\t\t\tt, ok := tableMap[e.Columns[i].FkTableName]\n\t\t\tif ok {\n\t\t\t\te.Columns[i].FkTableNameClass = t.ClassName\n\t\t\t\tt.MLTBName = strings.Replace(t.TBName, \"_\", \"-\", -1)\n\t\t\t\te.Columns[i].FkTableNamePackage = t.MLTBName\n\t\t\t} else {\n\t\t\t\ttableNameList := strings.Split(e.Columns[i].FkTableName, \"_\")\n\t\t\t\te.Columns[i].FkTableNameClass = \"\"\n\t\t\t\t//e.Columns[i].FkTableNamePackage = \"\"\n\t\t\t\tfor a := 0; a < len(tableNameList); a++ {\n\t\t\t\t\tstrStart := string([]byte(tableNameList[a])[:1])\n\t\t\t\t\tstrEnd := string([]byte(tableNameList[a])[1:])\n\t\t\t\t\te.Columns[i].FkTableNameClass += strings.ToUpper(strStart) + strEnd\n\t\t\t\t\t//e.Columns[i].FkTableNamePackage += strings.ToLower(strStart) + strings.ToLower(strEnd)\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_, _ = e.Columns[i].Update(tx)\n\t}\n\treturn\n}\n\nfunc (e *SysTables) Delete(db *gorm.DB) (success bool, err error) {\n\ttx := db.Begin()\n\tdefer func() {\n\t\tif err != nil {\n\t\t\ttx.Rollback()\n\t\t} else {\n\t\t\ttx.Commit()\n\t\t}\n\t}()\n\tif err = tx.Table(\"sys_tables\").Delete(SysTables{}, \"table_id = ?\", e.TableId).Error; err != nil {\n\t\tsuccess = false\n\t\treturn\n\t}\n\tif err = tx.Table(\"sys_columns\").Delete(SysColumns{}, \"table_id = ?\", e.TableId).Error; err != nil {\n\t\tsuccess = false\n\t\treturn\n\t}\n\tsuccess = true\n\treturn\n}\n\nfunc (e *SysTables) BatchDelete(tx *gorm.DB, id []int) (Result bool, err error) {\n\tif err = tx.Unscoped().Table(e.TableName()).Where(\" table_id in (?)\", id).Delete(&SysColumns{}).Error; err != nil {\n\t\treturn\n\t}\n\tResult = true\n\treturn\n}\n"
  },
  {
    "path": "app/other/router/file.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/other/apis\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerFileRouter)\n}\n\n// 需认证的路由代码\nfunc registerFileRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tvar api = apis.File{}\n\tr := v1.Group(\"\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\tr.POST(\"/public/uploadFile\", api.UploadFile)\n\t}\n}\n"
  },
  {
    "path": "app/other/router/gen_router.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/admin/apis\"\n\t\"go-admin/app/other/apis/tools\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, sysNoCheckRoleRouter, registerDBRouter, registerSysTableRouter)\n}\n\nfunc sysNoCheckRoleRouter(v1 *gin.RouterGroup ,authMiddleware *jwt.GinJWTMiddleware) {\n\tr1 := v1.Group(\"\")\n\t{\n\t\tsys := apis.System{}\n\t\tr1.GET(\"/captcha\", sys.GenerateCaptchaHandler)\n\t}\n\n\tr := v1.Group(\"\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\tgen := tools.Gen{}\n\t\tr.GET(\"/gen/preview/:tableId\", gen.Preview)\n\t\tr.GET(\"/gen/toproject/:tableId\", gen.GenCode)\n\t\tr.GET(\"/gen/apitofile/:tableId\", gen.GenApiToFile)\n\t\tr.GET(\"/gen/todb/:tableId\", gen.GenMenuAndApi)\n\t\tsysTable := tools.SysTable{}\n\t\tr.GET(\"/gen/tabletree\", sysTable.GetSysTablesTree)\n\t}\n}\n\nfunc registerDBRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tdb := v1.Group(\"/db\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\tgen := tools.Gen{}\n\t\tdb.GET(\"/tables/page\", gen.GetDBTableList)\n\t\tdb.GET(\"/columns/page\", gen.GetDBColumnList)\n\t}\n}\n\nfunc registerSysTableRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\ttables := v1.Group(\"/sys/tables\")\n\t{\n\t\tsysTable := tools.SysTable{}\n\t\ttables.Group(\"\").Use(authMiddleware.MiddlewareFunc()).GET(\"/page\", sysTable.GetPage)\n\t\ttablesInfo := tables.Group(\"/info\").Use(authMiddleware.MiddlewareFunc())\n\t\t{\n\t\t\ttablesInfo.POST(\"\", sysTable.Insert)\n\t\t\ttablesInfo.PUT(\"\", sysTable.Update)\n\t\t\ttablesInfo.DELETE(\"/:tableId\", sysTable.Delete)\n\t\t\ttablesInfo.GET(\"/:tableId\", sysTable.Get)\n\t\t\ttablesInfo.GET(\"\", sysTable.GetSysTablesInfo)\n\t\t}\n\t}\n}"
  },
  {
    "path": "app/other/router/init_router.go",
    "content": "package router\n\nimport (\n\t\"os\"\n\n\t\"github.com/gin-gonic/gin\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\tcommon \"go-admin/common/middleware\"\n)\n\n// InitRouter 路由初始化，不要怀疑，这里用到了\nfunc InitRouter() {\n\tvar r *gin.Engine\n\th := sdk.Runtime.GetEngine()\n\tif h == nil {\n\t\tlog.Fatal(\"not found engine...\")\n\t\tos.Exit(-1)\n\t}\n\tswitch h.(type) {\n\tcase *gin.Engine:\n\t\tr = h.(*gin.Engine)\n\tdefault:\n\t\tlog.Fatal(\"not support other engine\")\n\t\tos.Exit(-1)\n\t}\n\t// the jwt middleware\n\tauthMiddleware, err := common.AuthInit()\n\tif err != nil {\n\t\tlog.Fatalf(\"JWT Init Error, %s\", err.Error())\n\t}\n\n\t// 注册业务路由\n\t// TODO: 这里可存放业务路由，里边并无实际路由只有演示代码\n\tinitRouter(r, authMiddleware)\n}\n"
  },
  {
    "path": "app/other/router/monitor.go",
    "content": "package router\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/tools/transfer\"\n\t\"github.com/prometheus/client_golang/prometheus/promhttp\"\n)\n\nfunc init() {\n\trouterNoCheckRole = append(routerNoCheckRole, registerMonitorRouter)\n}\n\n// 需认证的路由代码\nfunc registerMonitorRouter(v1 *gin.RouterGroup) {\n\tv1.GET(\"/metrics\", transfer.Handler(promhttp.Handler()))\n\t//健康检查\n\tv1.GET(\"/health\", func(c *gin.Context) {\n\t\tc.Status(http.StatusOK)\n\t})\n\n}"
  },
  {
    "path": "app/other/router/router.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n)\n\nvar (\n\trouterNoCheckRole = make([]func(*gin.RouterGroup), 0)\n\trouterCheckRole   = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0)\n)\n\n// initRouter 路由示例\nfunc initRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine {\n\n\t// 无需认证的路由\n\tnoCheckRoleRouter(r)\n\t// 需要认证的路由\n\tcheckRoleRouter(r, authMiddleware)\n\n\treturn r\n}\n\n// noCheckRoleRouter 无需认证的路由示例\nfunc noCheckRoleRouter(r *gin.Engine) {\n\t// 可根据业务需求来设置接口版本\n\tv1 := r.Group(\"/api/v1\")\n\n\tfor _, f := range routerNoCheckRole {\n\t\tf(v1)\n\t}\n}\n\n// checkRoleRouter 需要认证的路由示例\nfunc checkRoleRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) {\n\t// 可根据业务需求来设置接口版本\n\tv1 := r.Group(\"/api/v1\")\n\n\tfor _, f := range routerCheckRole {\n\t\tf(v1, authMiddleware)\n\t}\n}\n"
  },
  {
    "path": "app/other/router/sys_server_monitor.go",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/app/other/apis\"\n\t\"go-admin/common/middleware\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, registerSysServerMonitorRouter)\n}\n\n// 需认证的路由代码\nfunc registerSysServerMonitorRouter(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.ServerMonitor{}\n\tr := v1.Group(\"/server-monitor\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tr.GET(\"\", api.ServerInfo)\n\t}\n}\n"
  },
  {
    "path": "app/other/service/dto/sys_tables.go",
    "content": "package dto\n\ntype SysTableSearch struct {\n\tTBName       string `form:\"tableName\" search:\"type:exact;column:table_name;table:table_name\"`\n\tTableComment string `form:\"tableComment\" search:\"type:icontains;column:table_comment;table:table_comment\"`\n}\n"
  },
  {
    "path": "cmd/api/jobs.go",
    "content": "package api\n\nimport \"go-admin/app/jobs/router\"\n\nfunc init() {\n\t//注册路由 fixme 其他应用的路由，在本目录新建文件放在init方法\n\tAppRouters = append(AppRouters, router.InitRouter)\n}\n"
  },
  {
    "path": "cmd/api/other.go",
    "content": "package api\n\nimport \"go-admin/app/other/router\"\n\nfunc init() {\n\t//注册路由 fixme 其他应用的路由，在本目录新建文件放在init方法\n\tAppRouters = append(AppRouters, router.InitRouter)\n}\n"
  },
  {
    "path": "cmd/api/server.go",
    "content": "package api\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"net/http\"\n\t\"os\"\n\t\"os/signal\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/config/source/file\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/pkg/errors\"\n\t\"github.com/spf13/cobra\"\n\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/app/admin/router\"\n\t\"go-admin/app/jobs\"\n\t\"go-admin/common/database\"\n\t\"go-admin/common/global\"\n\tcommon \"go-admin/common/middleware\"\n\t\"go-admin/common/middleware/handler\"\n\t\"go-admin/common/storage\"\n\text \"go-admin/config\"\n)\n\nvar (\n\tconfigYml string\n\tapiCheck  bool\n\tStartCmd  = &cobra.Command{\n\t\tUse:          \"server\",\n\t\tShort:        \"Start API server\",\n\t\tExample:      \"go-admin server -c config/settings.yml\",\n\t\tSilenceUsage: true,\n\t\tPreRun: func(cmd *cobra.Command, args []string) {\n\t\t\tsetup()\n\t\t},\n\t\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\t\treturn run()\n\t\t},\n\t}\n)\n\nvar AppRouters = make([]func(), 0)\n\nfunc init() {\n\tStartCmd.PersistentFlags().StringVarP(&configYml, \"config\", \"c\", \"config/settings.yml\", \"Start server with provided configuration file\")\n\tStartCmd.PersistentFlags().BoolVarP(&apiCheck, \"api\", \"a\", false, \"Start server with check api data\")\n\n\t//注册路由 fixme 其他应用的路由，在本目录新建文件放在init方法\n\tAppRouters = append(AppRouters, router.InitRouter)\n}\n\nfunc setup() {\n\t// 注入配置扩展项\n\tconfig.ExtendConfig = &ext.ExtConfig\n\t//1. 读取配置\n\tconfig.Setup(\n\t\tfile.NewSource(file.WithPath(configYml)),\n\t\tdatabase.Setup,\n\t\tstorage.Setup,\n\t)\n\t//注册监听函数\n\tqueue := sdk.Runtime.GetMemoryQueue(\"\")\n\tqueue.Register(global.LoginLog, models.SaveLoginLog)\n\tqueue.Register(global.OperateLog, models.SaveOperaLog)\n\tqueue.Register(global.ApiCheck, models.SaveSysApi)\n\tgo queue.Run()\n\n\tusageStr := `starting api server...`\n\tlog.Info(usageStr)\n}\n\nfunc run() error {\n\tif config.ApplicationConfig.Mode == pkg.ModeProd.String() {\n\t\tgin.SetMode(gin.ReleaseMode)\n\t}\n\tinitRouter()\n\n\tfor _, f := range AppRouters {\n\t\tf()\n\t}\n\n\tsrv := &http.Server{\n\t\tAddr:    fmt.Sprintf(\"%s:%d\", config.ApplicationConfig.Host, config.ApplicationConfig.Port),\n\t\tHandler: sdk.Runtime.GetEngine(),\n\t\tReadTimeout:  time.Duration(config.ApplicationConfig.ReadTimeout) * time.Second,\n\t\tWriteTimeout: time.Duration(config.ApplicationConfig.WriterTimeout) * time.Second,\n\t}\n\n\tgo func() {\n\t\tjobs.InitJob()\n\t\tjobs.Setup(sdk.Runtime.GetDb())\n\n\t}()\n\n\tif apiCheck {\n\t\tvar routers = sdk.Runtime.GetRouter()\n\t\tq := sdk.Runtime.GetMemoryQueue(\"\")\n\t\tmp := make(map[string]interface{})\n\t\tmp[\"List\"] = routers\n\t\tmessage, err := sdk.Runtime.GetStreamMessage(\"\", global.ApiCheck, mp)\n\t\tif err != nil {\n\t\t\tlog.Infof(\"GetStreamMessage error, %s \\n\", err.Error())\n\t\t\t//日志报错错误，不中断请求\n\t\t} else {\n\t\t\terr = q.Append(message)\n\t\t\tif err != nil {\n\t\t\t\tlog.Infof(\"Append message error, %s \\n\", err.Error())\n\t\t\t}\n\t\t}\n\t}\n\n\tgo func() {\n\t\t// 服务连接\n\t\tif config.SslConfig.Enable {\n\t\t\tif err := srv.ListenAndServeTLS(config.SslConfig.Pem, config.SslConfig.KeyStr); err != nil && !errors.Is(err, http.ErrServerClosed) {\n\t\t\t\tlog.Fatal(\"listen: \", err)\n\t\t\t}\n\t\t} else {\n\t\t\tif err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {\n\t\t\t\tlog.Fatal(\"listen: \", err)\n\t\t\t}\n\t\t}\n\t}()\n\tfmt.Println(pkg.Red(string(global.LogoContent)))\n\ttip()\n\tfmt.Println(pkg.Green(\"Server run at:\"))\n\tfmt.Printf(\"-  Local:   %s://localhost:%d/ \\r\\n\", \"http\", config.ApplicationConfig.Port)\n\tfmt.Printf(\"-  Network: %s://%s:%d/ \\r\\n\", \"http\", pkg.GetLocalHost(), config.ApplicationConfig.Port)\n\tfmt.Println(pkg.Green(\"Swagger run at:\"))\n\tfmt.Printf(\"-  Local:   http://localhost:%d/swagger/admin/index.html \\r\\n\", config.ApplicationConfig.Port)\n\tfmt.Printf(\"-  Network: %s://%s:%d/swagger/admin/index.html \\r\\n\", \"http\", pkg.GetLocalHost(), config.ApplicationConfig.Port)\n\tfmt.Printf(\"%s Enter Control + C Shutdown Server \\r\\n\", pkg.GetCurrentTimeStr())\n\t// 等待中断信号以优雅地关闭服务器（设置 5 秒的超时时间）\n\tquit := make(chan os.Signal, 1)\n\tsignal.Notify(quit, os.Interrupt)\n\t<-quit\n\n\tctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\n\tdefer cancel()\n\tlog.Info(\"Shutdown Server ... \")\n\n\tif err := srv.Shutdown(ctx); err != nil {\n\t\tlog.Fatal(\"Server Shutdown:\", err)\n\t}\n\tlog.Info(\"Server exiting\")\n\n\treturn nil\n}\n\n//var Router runtime.Router\n\nfunc tip() {\n\tusageStr := `欢迎使用 ` + pkg.Green(`go-admin `+global.Version) + ` 可以使用 ` + pkg.Red(`-h`) + ` 查看命令`\n\tfmt.Printf(\"%s \\n\\n\", usageStr)\n}\n\nfunc initRouter() {\n\tvar r *gin.Engine\n\th := sdk.Runtime.GetEngine()\n\tif h == nil {\n\t\th = gin.New()\n\t\tsdk.Runtime.SetEngine(h)\n\t}\n\tswitch h.(type) {\n\tcase *gin.Engine:\n\t\tr = h.(*gin.Engine)\n\tdefault:\n\t\tlog.Fatal(\"not support other engine\")\n\t\t//os.Exit(-1)\n\t}\n\tif config.SslConfig.Enable {\n\t\tr.Use(handler.TlsHandler())\n\t}\n\t//r.Use(middleware.Metrics())\n\tr.Use(common.Sentinel()).\n\t\tUse(common.RequestId(pkg.TrafficKey)).\n\t\tUse(api.SetRequestLogger)\n\n\tcommon.InitMiddleware(r)\n\n}\n"
  },
  {
    "path": "cmd/app/server.go",
    "content": "package app\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/utils\"\n\t\"github.com/spf13/cobra\"\n\t\"text/template\"\n)\n\nvar (\n\tappName  string\n\tStartCmd = &cobra.Command{\n\t\tUse:     \"app\",\n\t\tShort:   \"Create a new app\",\n\t\tLong:    \"Use when you need to create a new app\",\n\t\tExample: \"go-admin app -n admin\",\n\t\tRun: func(cmd *cobra.Command, args []string) {\n\t\t\trun()\n\t\t},\n\t}\n)\n\nfunc init() {\n\tStartCmd.PersistentFlags().StringVarP(&appName, \"name\", \"n\", \"\", \"Start server with provided configuration file\")\n}\n\nfunc run() {\n\n\tfmt.Println(`start init`)\n\t//1. 读取配置\n\n\tfmt.Println(`generate migration file`)\n\t_ = genFile()\n\n}\n\nfunc genFile() error {\n\tif appName == \"\" {\n\t\treturn errors.New(\"arg `name` invalid ：name is empty\")\n\t}\n\tpath := \"app/\"\n\tappPath := path + appName\n\terr := utils.IsNotExistMkDir(appPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tapiPath := appPath + \"/apis/\"\n\terr = utils.IsNotExistMkDir(apiPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tmodelsPath := appPath + \"/models/\"\n\terr = utils.IsNotExistMkDir(modelsPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\trouterPath := appPath + \"/router/\"\n\terr = utils.IsNotExistMkDir(routerPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tservicePath := appPath + \"/service/\"\n\terr = utils.IsNotExistMkDir(servicePath)\n\tif err != nil {\n\t\treturn err\n\t}\n\tdtoPath := appPath + \"/service/dto/\"\n\terr = utils.IsNotExistMkDir(dtoPath)\n\tif err != nil {\n\t\treturn err\n\t}\n\n\tt1, err := template.ParseFiles(\"template/cmd_api.template\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tm := map[string]string{}\n\tm[\"appName\"] = appName\n\tvar b1 bytes.Buffer\n\terr = t1.Execute(&b1, m)\n\tpkg.FileCreate(b1, \"./cmd/api/\"+appName+\".go\")\n\tt2, err := template.ParseFiles(\"template/router.template\")\n\tvar b2 bytes.Buffer\n\terr = t2.Execute(&b2, nil)\n\tpkg.FileCreate(b2, appPath+\"/router/router.go\")\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/cobra.go",
    "content": "package cmd\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"go-admin/cmd/app\"\n\t\"go-admin/common/global\"\n\t\"os\"\n\n\t\"github.com/spf13/cobra\"\n\n\t\"go-admin/cmd/api\"\n\t\"go-admin/cmd/config\"\n\t\"go-admin/cmd/migrate\"\n\t\"go-admin/cmd/version\"\n)\n\nvar rootCmd = &cobra.Command{\n\tUse:          \"go-admin\",\n\tShort:        \"go-admin\",\n\tSilenceUsage: true,\n\tLong:         `go-admin`,\n\tArgs: func(cmd *cobra.Command, args []string) error {\n\t\tif len(args) < 1 {\n\t\t\ttip()\n\t\t\treturn errors.New(pkg.Red(\"requires at least one arg\"))\n\t\t}\n\t\treturn nil\n\t},\n\tPersistentPreRunE: func(*cobra.Command, []string) error { return nil },\n\tRun: func(cmd *cobra.Command, args []string) {\n\t\ttip()\n\t},\n}\n\nfunc tip() {\n\tusageStr := `欢迎使用 ` + pkg.Green(`go-admin `+global.Version) + ` 可以使用 ` + pkg.Red(`-h`) + ` 查看命令`\n\tusageStr1 := `也可以参考 https://doc.go-admin.dev/guide/ksks 的相关内容`\n\tfmt.Printf(\"%s\\n\", usageStr)\n\tfmt.Printf(\"%s\\n\", usageStr1)\n}\n\nfunc init() {\n\trootCmd.AddCommand(api.StartCmd)\n\trootCmd.AddCommand(migrate.StartCmd)\n\trootCmd.AddCommand(version.StartCmd)\n\trootCmd.AddCommand(config.StartCmd)\n\trootCmd.AddCommand(app.StartCmd)\n}\n\n//Execute : apply commands\nfunc Execute() {\n\tif err := rootCmd.Execute(); err != nil {\n\t\tos.Exit(-1)\n\t}\n}\n"
  },
  {
    "path": "cmd/config/server.go",
    "content": "package config\n\nimport (\n\t\"encoding/json\"\n\t\"fmt\"\n\n\t\"github.com/go-admin-team/go-admin-core/config/source/file\"\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n)\n\nvar (\n\tconfigYml string\n\tStartCmd  = &cobra.Command{\n\t\tUse:     \"config\",\n\t\tShort:   \"Get Application config info\",\n\t\tExample: \"go-admin config -c config/settings.yml\",\n\t\tRun: func(cmd *cobra.Command, args []string) {\n\t\t\trun()\n\t\t},\n\t}\n)\n\nfunc init() {\n\tStartCmd.PersistentFlags().StringVarP(&configYml, \"config\", \"c\", \"config/settings.yml\", \"Start server with provided configuration file\")\n}\n\nfunc run() {\n\tconfig.Setup(file.NewSource(file.WithPath(configYml)))\n\n\tapplication, errs := json.MarshalIndent(config.ApplicationConfig, \"\", \"   \") //转换成JSON返回的是byte[]\n\tif errs != nil {\n\t\tfmt.Println(errs.Error())\n\t}\n\tfmt.Println(\"application:\", string(application))\n\n\tjwt, errs := json.MarshalIndent(config.JwtConfig, \"\", \"   \") //转换成JSON返回的是byte[]\n\tif errs != nil {\n\t\tfmt.Println(errs.Error())\n\t}\n\tfmt.Println(\"jwt:\", string(jwt))\n\n\t// todo 需要兼容\n\tdatabase, errs := json.MarshalIndent(config.DatabasesConfig, \"\", \"   \") //转换成JSON返回的是byte[]\n\tif errs != nil {\n\t\tfmt.Println(errs.Error())\n\t}\n\tfmt.Println(\"database:\", string(database))\n\n\tgen, errs := json.MarshalIndent(config.GenConfig, \"\", \"   \") //转换成JSON返回的是byte[]\n\tif errs != nil {\n\t\tfmt.Println(errs.Error())\n\t}\n\tfmt.Println(\"gen:\", string(gen))\n\n\tloggerConfig, errs := json.MarshalIndent(config.LoggerConfig, \"\", \"   \") //转换成JSON返回的是byte[]\n\tif errs != nil {\n\t\tfmt.Println(errs.Error())\n\t}\n\tfmt.Println(\"logger:\", string(loggerConfig))\n\n}\n"
  },
  {
    "path": "cmd/migrate/migration/init.go",
    "content": "package migration\n\nimport (\n\t\"log\"\n\t\"path/filepath\"\n\t\"sort\"\n\t\"sync\"\n\n\t\"gorm.io/gorm\"\n)\n\nvar Migrate = &Migration{\n\tversion: make(map[string]func(db *gorm.DB, version string) error),\n}\n\ntype Migration struct {\n\tdb      *gorm.DB\n\tversion map[string]func(db *gorm.DB, version string) error\n\tmutex   sync.Mutex\n}\n\nfunc (e *Migration) GetDb() *gorm.DB {\n\treturn e.db\n}\n\nfunc (e *Migration) SetDb(db *gorm.DB) {\n\te.db = db\n}\n\nfunc (e *Migration) SetVersion(k string, f func(db *gorm.DB, version string) error) {\n\te.mutex.Lock()\n\tdefer e.mutex.Unlock()\n\te.version[k] = f\n}\n\nfunc (e *Migration) Migrate() {\n\tversions := make([]string, 0)\n\tfor k := range e.version {\n\t\tversions = append(versions, k)\n\t}\n\tif !sort.StringsAreSorted(versions) {\n\t\tsort.Strings(versions)\n\t}\n\tvar err error\n\tvar count int64\n\tfor _, v := range versions {\n\t\terr = e.db.Table(\"sys_migration\").Where(\"version = ?\", v).Count(&count).Error\n\t\tif err != nil {\n\t\t\tlog.Fatalln(err)\n\t\t}\n\t\tif count > 0 {\n\t\t\tlog.Println(count)\n\t\t\tcount = 0\n\t\t\tcontinue\n\t\t}\n\t\terr = (e.version[v])(e.db.Debug(), v)\n\t\tif err != nil {\n\t\t\tlog.Fatalln(err)\n\t\t}\n\t}\n}\n\nfunc GetFilename(s string) string {\n\ts = filepath.Base(s)\n\treturn s[:13]\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/by.go",
    "content": "package models\n\nimport (\n\t\"time\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype ControlBy struct {\n\tCreateBy int `json:\"createBy\" gorm:\"index;comment:创建者\"`\n\tUpdateBy int `json:\"updateBy\" gorm:\"index;comment:更新者\"`\n}\n\ntype Model struct {\n\tId int `json:\"id\" gorm:\"primaryKey;autoIncrement;comment:主键编码\"`\n}\n\ntype ModelTime struct {\n\tCreatedAt time.Time      `json:\"createdAt\" gorm:\"comment:创建时间\"`\n\tUpdatedAt time.Time      `json:\"updatedAt\" gorm:\"comment:最后更新时间\"`\n\tDeletedAt gorm.DeletedAt `json:\"-\" gorm:\"index;comment:删除时间\"`\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/casbin_rule.go",
    "content": "package models\n\n// CasbinRule sys_casbin_rule\ntype CasbinRule struct {\n\tID    uint   `gorm:\"primaryKey;autoIncrement\"`\n\tPtype string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV0    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV1    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV2    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV3    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV4    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n\tV5    string `gorm:\"size:512;uniqueIndex:unique_index\"`\n}\n\nfunc (CasbinRule) TableName() string {\n\treturn \"sys_casbin_rule\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/initdb.go",
    "content": "package models\n\nimport (\n\t\"fmt\"\n\t\"go-admin/common/global\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"strings\"\n\n\t\"gorm.io/gorm\"\n)\n\nfunc InitDb(db *gorm.DB) (err error) {\n\tfilePath := \"config/db.sql\"\n\tif global.Driver == \"postgres\" {\n\t\tfilePath := \"config/db.sql\"\n\t\tif err = ExecSql(db, filePath); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfilePath = \"config/pg.sql\"\n\t\terr = ExecSql(db, filePath)\n\t} else if global.Driver == \"mysql\" {\n\t\tfilePath = \"config/db-begin-mysql.sql\"\n\t\tif err = ExecSql(db, filePath); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfilePath = \"config/db.sql\"\n\t\tif err = ExecSql(db, filePath); err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfilePath = \"config/db-end-mysql.sql\"\n\t\terr = ExecSql(db, filePath)\n\t} else {\n\t\terr = ExecSql(db, filePath)\n\t}\n\treturn err\n}\n\nfunc ExecSql(db *gorm.DB, filePath string) error {\n\tsql, err := Ioutil(filePath)\n\tif err != nil {\n\t\tfmt.Println(\"数据库基础数据初始化脚本读取失败！原因:\", err.Error())\n\t\treturn err\n\t}\n\tsqlList := strings.Split(sql, \";\")\n\tfor i := 0; i < len(sqlList)-1; i++ {\n\t\tif strings.Contains(sqlList[i], \"--\") {\n\t\t\tfmt.Println(sqlList[i])\n\t\t\tcontinue\n\t\t}\n\t\tsql := strings.Replace(sqlList[i]+\";\", \"\\n\", \"\", -1)\n\t\tsql = strings.TrimSpace(sql)\n\t\tif err = db.Exec(sql).Error; err != nil {\n\t\t\tlog.Printf(\"error sql: %s\", sql)\n\t\t\tif !strings.Contains(err.Error(), \"Query was empty\") {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc Ioutil(filePath string) (string, error) {\n\tif contents, err := ioutil.ReadFile(filePath); err == nil {\n\t\t//因为contents是[]byte类型，直接转换成string类型后会多一行空格,需要使用strings.Replace替换换行符\n\t\tresult := strings.Replace(string(contents), \"\\n\", \"\", 1)\n\t\tfmt.Println(\"Use ioutil.ReadFile to read a file:\", result)\n\t\treturn result, nil\n\t} else {\n\t\treturn \"\", err\n\t}\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/model.go",
    "content": "package models\n\nimport (\n\t\"time\"\n)\n\ntype BaseModel struct {\n\tCreatedAt time.Time  `json:\"createdAt\"`\n\tUpdatedAt time.Time  `json:\"updatedAt\"`\n\tDeletedAt *time.Time `json:\"deletedAt\"`\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/role_dept.go",
    "content": "package models\n\ntype SysRoleDept struct {\n\tRoleId int `gorm:\"size:11;primaryKey\"`\n\tDeptId int `gorm:\"size:11;primaryKey\"`\n}\n\nfunc (SysRoleDept) TableName() string {\n\treturn \"sys_role_dept\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/sys_api.go",
    "content": "package models\n\ntype SysApi struct {\n\tId     int    `json:\"id\" gorm:\"primaryKey;autoIncrement;comment:主键编码\"`\n\tHandle string `json:\"handle\" gorm:\"size:128;comment:handle\"`\n\tTitle  string `json:\"title\" gorm:\"size:128;comment:标题\"`\n\tPath   string `json:\"path\" gorm:\"size:128;comment:地址\"`\n\tType   string `json:\"type\" gorm:\"size:16;comment:接口类型\"`\n\tAction string `json:\"action\" gorm:\"size:16;comment:请求类型\"`\n\tModelTime\n\tControlBy\n}\n\nfunc (SysApi) TableName() string {\n\treturn \"sys_api\"\n}"
  },
  {
    "path": "cmd/migrate/migration/models/sys_columns.go",
    "content": "package models\n\ntype SysColumns struct {\n\tColumnId           int    `gorm:\"primaryKey;autoIncrement\" json:\"columnId\"`\n\tTableId            int    `gorm:\"\" json:\"tableId\"`\n\tColumnName         string `gorm:\"size:128;\" json:\"columnName\"`\n\tColumnComment      string `gorm:\"column:column_comment;size:128;\" json:\"columnComment\"`\n\tColumnType         string `gorm:\"column:column_type;size:128;\" json:\"columnType\"`\n\tGoType             string `gorm:\"column:go_type;size:128;\" json:\"goType\"`\n\tGoField            string `gorm:\"column:go_field;size:128;\" json:\"goField\"`\n\tJsonField          string `gorm:\"column:json_field;size:128;\" json:\"jsonField\"`\n\tIsPk               string `gorm:\"column:is_pk;size:4;\" json:\"isPk\"`\n\tIsIncrement        string `gorm:\"column:is_increment;size:4;\" json:\"isIncrement\"`\n\tIsRequired         string `gorm:\"column:is_required;size:4;\" json:\"isRequired\"`\n\tIsInsert           string `gorm:\"column:is_insert;size:4;\" json:\"isInsert\"`\n\tIsEdit             string `gorm:\"column:is_edit;size:4;\" json:\"isEdit\"`\n\tIsList             string `gorm:\"column:is_list;size:4;\" json:\"isList\"`\n\tIsQuery            string `gorm:\"column:is_query;size:4;\" json:\"isQuery\"`\n\tQueryType          string `gorm:\"column:query_type;size:128;\" json:\"queryType\"`\n\tHtmlType           string `gorm:\"column:html_type;size:128;\" json:\"htmlType\"`\n\tDictType           string `gorm:\"column:dict_type;size:128;\" json:\"dictType\"`\n\tSort               int    `gorm:\"column:sort;\" json:\"sort\"`\n\tList               string `gorm:\"column:list;size:1;\" json:\"list\"`\n\tPk                 bool   `gorm:\"column:pk;size:1;\" json:\"pk\"`\n\tRequired           bool   `gorm:\"column:required;size:1;\" json:\"required\"`\n\tSuperColumn        bool   `gorm:\"column:super_column;size:1;\" json:\"superColumn\"`\n\tUsableColumn       bool   `gorm:\"column:usable_column;size:1;\" json:\"usableColumn\"`\n\tIncrement          bool   `gorm:\"column:increment;size:1;\" json:\"increment\"`\n\tInsert             bool   `gorm:\"column:insert;size:1;\" json:\"insert\"`\n\tEdit               bool   `gorm:\"column:edit;size:1;\" json:\"edit\"`\n\tQuery              bool   `gorm:\"column:query;size:1;\" json:\"query\"`\n\tRemark             string `gorm:\"column:remark;size:255;\" json:\"remark\"`\n\tFkTableName        string `gorm:\"\" json:\"fkTableName\"`\n\tFkTableNameClass   string `gorm:\"\" json:\"fkTableNameClass\"`\n\tFkTableNamePackage string `gorm:\"\" json:\"fkTableNamePackage\"`\n\tFkLabelId          string `gorm:\"\" json:\"fkLabelId\"`\n\tFkLabelName        string `gorm:\"size:255;\" json:\"fkLabelName\"`\n\tModelTime\n\tControlBy\n}\n\nfunc (SysColumns) TableName() string {\n\treturn \"sys_columns\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/sys_config.go",
    "content": "package models\n\ntype SysConfig struct {\n\tModel\n\tConfigName  string `json:\"configName\" gorm:\"type:varchar(128);comment:ConfigName\"`\n\tConfigKey   string `json:\"configKey\" gorm:\"type:varchar(128);comment:ConfigKey\"`\n\tConfigValue string `json:\"configValue\" gorm:\"type:varchar(255);comment:ConfigValue\"`\n\tConfigType  string `json:\"configType\" gorm:\"type:varchar(64);comment:ConfigType\"`\n\tIsFrontend  int    `json:\"isFrontend\" gorm:\"type:varchar(64);comment:是否前台\"`\n\tRemark      string `json:\"remark\" gorm:\"type:varchar(128);comment:Remark\"`\n\tControlBy\n\tModelTime\n}\n\nfunc (SysConfig) TableName() string {\n\treturn \"sys_config\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/sys_dept.go",
    "content": "package models\n\ntype SysDept struct {\n\tDeptId   int    `json:\"deptId\" gorm:\"primaryKey;autoIncrement;\"` //部门编码\n\tParentId int    `json:\"parentId\" gorm:\"\"`                        //上级部门\n\tDeptPath string `json:\"deptPath\" gorm:\"size:255;\"`               //\n\tDeptName string `json:\"deptName\"  gorm:\"size:128;\"`              //部门名称\n\tSort     int    `json:\"sort\" gorm:\"size:4;\"`                     //排序\n\tLeader   string `json:\"leader\" gorm:\"size:128;\"`                 //负责人\n\tPhone    string `json:\"phone\" gorm:\"size:11;\"`                   //手机\n\tEmail    string `json:\"email\" gorm:\"size:64;\"`                   //邮箱\n\tStatus   int    `json:\"status\" gorm:\"size:4;\"`                   //状态\n\tControlBy\n\tModelTime\n}\n\nfunc (SysDept) TableName() string {\n\treturn \"sys_dept\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/sys_dict_data.go",
    "content": "package models\n\ntype DictData struct {\n\tDictCode  int    `gorm:\"primaryKey;autoIncrement;\" json:\"dictCode\" example:\"1\"` //字典编码\n\tDictSort  int    `gorm:\"\" json:\"dictSort\"`                                      //显示顺序\n\tDictLabel string `gorm:\"size:128;\" json:\"dictLabel\"`                            //数据标签\n\tDictValue string `gorm:\"size:255;\" json:\"dictValue\"`                            //数据键值\n\tDictType  string `gorm:\"size:64;\" json:\"dictType\"`                              //字典类型\n\tCssClass  string `gorm:\"size:128;\" json:\"cssClass\"`                             //\n\tListClass string `gorm:\"size:128;\" json:\"listClass\"`                            //\n\tIsDefault string `gorm:\"size:8;\" json:\"isDefault\"`                              //\n\tStatus    int    `gorm:\"size:4;\" json:\"status\"`                                 //状态\n\tDefault   string `gorm:\"size:8;\" json:\"default\"`                                //\n\tRemark    string `gorm:\"size:255;\" json:\"remark\"`                               //备注\n\tControlBy\n\tModelTime\n}\n\nfunc (DictData) TableName() string {\n\treturn \"sys_dict_data\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/sys_dict_type.go",
    "content": "package models\n\ntype DictType struct {\n\tDictId   int    `gorm:\"primaryKey;autoIncrement;\" json:\"dictId\"`\n\tDictName string `gorm:\"size:128;\" json:\"dictName\"` //字典名称\n\tDictType string `gorm:\"size:128;\" json:\"dictType\"` //字典类型\n\tStatus   int    `gorm:\"size:4;\" json:\"status\"`     //状态\n\tRemark   string `gorm:\"size:255;\" json:\"remark\"`   //备注\n\tControlBy\n\tModelTime\n}\n\nfunc (DictType) TableName() string {\n\treturn \"sys_dict_type\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/sys_job.go",
    "content": "package models\n\ntype SysJob struct {\n\tJobId          int    `json:\"jobId\" gorm:\"primaryKey;autoIncrement\"` // 编码\n\tJobName        string `json:\"jobName\" gorm:\"size:255;\"`              // 名称\n\tJobGroup       string `json:\"jobGroup\" gorm:\"size:255;\"`             // 任务分组\n\tJobType        int    `json:\"jobType\" gorm:\"size:1;\"`                // 任务类型\n\tCronExpression string `json:\"cronExpression\" gorm:\"size:255;\"`       // cron表达式\n\tInvokeTarget   string `json:\"invokeTarget\" gorm:\"size:255;\"`         // 调用目标\n\tArgs           string `json:\"args\" gorm:\"size:255;\"`                 // 目标参数\n\tMisfirePolicy  int    `json:\"misfirePolicy\" gorm:\"size:255;\"`        // 执行策略\n\tConcurrent     int    `json:\"concurrent\" gorm:\"size:1;\"`             // 是否并发\n\tStatus         int    `json:\"status\" gorm:\"size:1;\"`                 // 状态\n\tEntryId        int    `json:\"entry_id\" gorm:\"size:11;\"`              // job启动时返回的id\n\tModelTime\n\tControlBy\n}\n\nfunc (SysJob) TableName() string {\n\treturn \"sys_job\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/sys_login_log.go",
    "content": "package models\n\nimport (\n\t\"time\"\n)\n\ntype SysLoginLog struct {\n\tModel\n\tUsername      string    `json:\"username\" gorm:\"type:varchar(128);comment:用户名\"`\n\tStatus        string    `json:\"status\" gorm:\"type:varchar(4);comment:状态\"`\n\tIpaddr        string    `json:\"ipaddr\" gorm:\"type:varchar(255);comment:ip地址\"`\n\tLoginLocation string    `json:\"loginLocation\" gorm:\"type:varchar(255);comment:归属地\"`\n\tBrowser       string    `json:\"browser\" gorm:\"type:varchar(255);comment:浏览器\"`\n\tOs            string    `json:\"os\" gorm:\"type:varchar(255);comment:系统\"`\n\tPlatform      string    `json:\"platform\" gorm:\"type:varchar(255);comment:固件\"`\n\tLoginTime     time.Time `json:\"loginTime\" gorm:\"type:timestamp;comment:登录时间\"`\n\tRemark        string    `json:\"remark\" gorm:\"type:varchar(255);comment:备注\"`\n\tMsg           string    `json:\"msg\" gorm:\"type:varchar(255);comment:信息\"`\n\tCreatedAt     time.Time `json:\"createdAt\" gorm:\"comment:创建时间\"`\n\tUpdatedAt     time.Time `json:\"updatedAt\" gorm:\"comment:最后更新时间\"`\n\tControlBy\n}\n\nfunc (SysLoginLog) TableName() string {\n\treturn \"sys_login_log\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/sys_menu.go",
    "content": "package models\n\ntype SysMenu struct {\n\tMenuId     int       `json:\"menuId\" gorm:\"primaryKey;autoIncrement\"`\n\tMenuName   string    `json:\"menuName\" gorm:\"size:128;\"`\n\tTitle      string    `json:\"title\" gorm:\"size:128;\"`\n\tIcon       string    `json:\"icon\" gorm:\"size:128;\"`\n\tPath       string    `json:\"path\" gorm:\"size:128;\"`\n\tPaths      string    `json:\"paths\" gorm:\"size:128;\"`\n\tMenuType   string    `json:\"menuType\" gorm:\"size:1;\"`\n\tAction     string    `json:\"action\" gorm:\"size:16;\"`\n\tPermission string    `json:\"permission\" gorm:\"size:255;\"`\n\tParentId   int       `json:\"parentId\" gorm:\"size:11;\"`\n\tNoCache    bool      `json:\"noCache\" gorm:\"size:8;\"`\n\tBreadcrumb string    `json:\"breadcrumb\" gorm:\"size:255;\"`\n\tComponent  string    `json:\"component\" gorm:\"size:255;\"`\n\tSort       int       `json:\"sort\" gorm:\"size:4;\"`\n\tVisible    string    `json:\"visible\" gorm:\"size:1;\"`\n\tIsFrame    string    `json:\"isFrame\" gorm:\"size:1;DEFAULT:0;\"`\n\tSysApi     []SysApi  `json:\"sysApi\" gorm:\"many2many:sys_menu_api_rule\"`\n\tControlBy\n\tModelTime\n}\n\nfunc (SysMenu) TableName() string {\n\treturn \"sys_menu\"\n}"
  },
  {
    "path": "cmd/migrate/migration/models/sys_opera_log.go",
    "content": "package models\n\nimport (\n\t\"time\"\n)\n\ntype SysOperaLog struct {\n\tModel\n\tTitle         string    `json:\"title\" gorm:\"type:varchar(255);comment:操作模块\"`\n\tBusinessType  string    `json:\"businessType\" gorm:\"type:varchar(128);comment:操作类型\"`\n\tBusinessTypes string    `json:\"businessTypes\" gorm:\"type:varchar(128);comment:BusinessTypes\"`\n\tMethod        string    `json:\"method\" gorm:\"type:varchar(128);comment:函数\"`\n\tRequestMethod string    `json:\"requestMethod\" gorm:\"type:varchar(128);comment:请求方式: GET POST PUT DELETE\"`\n\tOperatorType  string    `json:\"operatorType\" gorm:\"type:varchar(128);comment:操作类型\"`\n\tOperName      string    `json:\"operName\" gorm:\"type:varchar(128);comment:操作者\"`\n\tDeptName      string    `json:\"deptName\" gorm:\"type:varchar(128);comment:部门名称\"`\n\tOperUrl       string    `json:\"operUrl\" gorm:\"type:varchar(255);comment:访问地址\"`\n\tOperIp        string    `json:\"operIp\" gorm:\"type:varchar(128);comment:客户端ip\"`\n\tOperLocation  string    `json:\"operLocation\" gorm:\"type:varchar(128);comment:访问位置\"`\n\tOperParam     string    `json:\"operParam\" gorm:\"type:text;comment:请求参数\"`\n\tStatus        string    `json:\"status\" gorm:\"type:varchar(4);comment:操作状态 1:正常 2:关闭\"`\n\tOperTime      time.Time `json:\"operTime\" gorm:\"type:timestamp;comment:操作时间\"`\n\tJsonResult    string    `json:\"jsonResult\" gorm:\"type:varchar(255);comment:返回数据\"`\n\tRemark        string    `json:\"remark\" gorm:\"type:varchar(255);comment:备注\"`\n\tLatencyTime   string    `json:\"latencyTime\" gorm:\"type:varchar(128);comment:耗时\"`\n\tUserAgent     string    `json:\"userAgent\" gorm:\"type:varchar(255);comment:ua\"`\n\tCreatedAt     time.Time `json:\"createdAt\" gorm:\"comment:创建时间\"`\n\tUpdatedAt     time.Time `json:\"updatedAt\" gorm:\"comment:最后更新时间\"`\n\tControlBy\n}\n\nfunc (SysOperaLog) TableName() string {\n\treturn \"sys_opera_log\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/sys_post.go",
    "content": "package models\n\ntype SysPost struct {\n\tPostId   int    `gorm:\"primaryKey;autoIncrement\" json:\"postId\"` //岗位编号\n\tPostName string `gorm:\"size:128;\" json:\"postName\"`              //岗位名称\n\tPostCode string `gorm:\"size:128;\" json:\"postCode\"`              //岗位代码\n\tSort     int    `gorm:\"size:4;\" json:\"sort\"`                    //岗位排序\n\tStatus   int    `gorm:\"size:4;\" json:\"status\"`                  //状态\n\tRemark   string `gorm:\"size:255;\" json:\"remark\"`                //描述\n\tControlBy\n\tModelTime\n}\n\nfunc (SysPost) TableName() string {\n\treturn \"sys_post\"\n}"
  },
  {
    "path": "cmd/migrate/migration/models/sys_role.go",
    "content": "package models\n\ntype SysRole struct {\n\tRoleId    int       `json:\"roleId\" gorm:\"primaryKey;autoIncrement\"` // 角色编码\n\tRoleName  string    `json:\"roleName\" gorm:\"size:128;\"`              // 角色名称\n\tStatus    string    `json:\"status\" gorm:\"size:4;\"`                  //\n\tRoleKey   string    `json:\"roleKey\" gorm:\"size:128;\"`               //角色代码\n\tRoleSort  int       `json:\"roleSort\" gorm:\"\"`                       //角色排序\n\tFlag      string    `json:\"flag\" gorm:\"size:128;\"`                  //\n\tRemark    string    `json:\"remark\" gorm:\"size:255;\"`                //备注\n\tAdmin     bool      `json:\"admin\" gorm:\"size:4;\"`\n\tDataScope string    `json:\"dataScope\" gorm:\"size:128;\"`\n\tSysMenu   []SysMenu `json:\"sysMenu\" gorm:\"many2many:sys_role_menu;foreignKey:RoleId;joinForeignKey:role_id;references:MenuId;joinReferences:menu_id;\"`\n\tControlBy\n\tModelTime\n}\n\nfunc (SysRole) TableName() string {\n\treturn \"sys_role\"\n}"
  },
  {
    "path": "cmd/migrate/migration/models/sys_tables.go",
    "content": "package models\n\ntype SysTables struct {\n\tTableId             int    `gorm:\"primaryKey;autoIncrement\" json:\"tableId\"`        //表编码\n\tTBName              string `gorm:\"column:table_name;size:255;\" json:\"tableName\"`   //表名称\n\tTableComment        string `gorm:\"size:255;\" json:\"tableComment\"`                  //表备注\n\tClassName           string `gorm:\"size:255;\" json:\"className\"`                     //类名\n\tTplCategory         string `gorm:\"size:255;\" json:\"tplCategory\"`                   //\n\tPackageName         string `gorm:\"size:255;\" json:\"packageName\"`                   //包名\n\tModuleName          string `gorm:\"size:255;\" json:\"moduleName\"`                    //go文件名\n\tModuleFrontName     string `gorm:\"size:255;comment:前端文件名;\" json:\"moduleFrontName\"` //前端文件名\n\tBusinessName        string `gorm:\"size:255;\" json:\"businessName\"`                  //\n\tFunctionName        string `gorm:\"size:255;\" json:\"functionName\"`                  //功能名称\n\tFunctionAuthor      string `gorm:\"size:255;\" json:\"functionAuthor\"`                //功能作者\n\tPkColumn            string `gorm:\"size:255;\" json:\"pkColumn\"`\n\tPkGoField           string `gorm:\"size:255;\" json:\"pkGoField\"`\n\tPkJsonField         string `gorm:\"size:255;\" json:\"pkJsonField\"`\n\tOptions             string `gorm:\"size:255;\" json:\"options\"`\n\tTreeCode            string `gorm:\"size:255;\" json:\"treeCode\"`\n\tTreeParentCode      string `gorm:\"size:255;\" json:\"treeParentCode\"`\n\tTreeName            string `gorm:\"size:255;\" json:\"treeName\"`\n\tTree                bool   `gorm:\"size:1;default:0;\" json:\"tree\"`\n\tCrud                bool   `gorm:\"size:1;default:1;\" json:\"crud\"`\n\tRemark              string `gorm:\"size:255;\" json:\"remark\"`\n\tIsDataScope         int    `gorm:\"size:1;\" json:\"isDataScope\"`\n\tIsActions           int    `gorm:\"size:1;\" json:\"isActions\"`\n\tIsAuth              int    `gorm:\"size:1;\" json:\"isAuth\"`\n\tIsLogicalDelete     string `gorm:\"size:1;\" json:\"isLogicalDelete\"`\n\tLogicalDelete       bool   `gorm:\"size:1;\" json:\"logicalDelete\"`\n\tLogicalDeleteColumn string `gorm:\"size:128;\" json:\"logicalDeleteColumn\"`\n\tModelTime\n\tControlBy\n}\n\nfunc (SysTables) TableName() string {\n\treturn \"sys_tables\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/sys_user.go",
    "content": "package models\n\nimport (\n\t\"golang.org/x/crypto/bcrypt\"\n\t\"gorm.io/gorm\"\n)\n\ntype SysUser struct {\n\tUserId   int    `gorm:\"primaryKey;autoIncrement;comment:编码\"  json:\"userId\"`\n\tUsername string `json:\"username\" gorm:\"type:varchar(64);comment:用户名\"`\n\tPassword string `json:\"-\" gorm:\"type:varchar(128);comment:密码\"`\n\tNickName string `json:\"nickName\" gorm:\"type:varchar(128);comment:昵称\"`\n\tPhone    string `json:\"phone\" gorm:\"type:varchar(11);comment:手机号\"`\n\tRoleId   int    `json:\"roleId\" gorm:\"type:bigint;comment:角色ID\"`\n\tSalt     string `json:\"-\" gorm:\"type:varchar(255);comment:加盐\"`\n\tAvatar   string `json:\"avatar\" gorm:\"type:varchar(255);comment:头像\"`\n\tSex      string `json:\"sex\" gorm:\"type:varchar(255);comment:性别\"`\n\tEmail    string `json:\"email\" gorm:\"type:varchar(128);comment:邮箱\"`\n\tDeptId   int    `json:\"deptId\" gorm:\"type:bigint;comment:部门\"`\n\tPostId   int    `json:\"postId\" gorm:\"type:bigint;comment:岗位\"`\n\tRemark   string `json:\"remark\" gorm:\"type:varchar(255);comment:备注\"`\n\tStatus   string `json:\"status\" gorm:\"type:varchar(4);comment:状态\"`\n\tControlBy\n\tModelTime\n}\n\nfunc (*SysUser) TableName() string {\n\treturn \"sys_user\"\n}\n\n// Encrypt 加密\nfunc (e *SysUser) Encrypt() (err error) {\n\tif e.Password == \"\" {\n\t\treturn\n\t}\n\n\tvar hash []byte\n\tif hash, err = bcrypt.GenerateFromPassword([]byte(e.Password), bcrypt.DefaultCost); err != nil {\n\t\treturn\n\t} else {\n\t\te.Password = string(hash)\n\t\treturn\n\t}\n}\n\nfunc (e *SysUser) BeforeCreate(_ *gorm.DB) error {\n\treturn e.Encrypt()\n}\n"
  },
  {
    "path": "cmd/migrate/migration/models/tb_demo.go",
    "content": "package models\n\ntype TbDemo struct {\n\tModel\n\tName string `json:\"name\" gorm:\"type:varchar(128);comment:名称\"`\n\tModelTime\n\tControlBy\n}\n\nfunc (TbDemo) TableName() string {\n\treturn \"tb_demo\"\n}\n"
  },
  {
    "path": "cmd/migrate/migration/version/1599190683659_tables.go",
    "content": "package version\n\nimport (\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"runtime\"\n\n\t\"go-admin/cmd/migrate/migration\"\n\t\"go-admin/cmd/migrate/migration/models\"\n\tcommon \"go-admin/common/models\"\n\n\t\"gorm.io/gorm\"\n)\n\nfunc init() {\n\t_, fileName, _, _ := runtime.Caller(0)\n\tmigration.Migrate.SetVersion(migration.GetFilename(fileName), _1599190683659Tables)\n}\n\nfunc _1599190683659Tables(db *gorm.DB, version string) error {\n\treturn db.Transaction(func(tx *gorm.DB) error {\n\t\tif config.DatabaseConfig.Driver == \"mysql\" {\n\t\t\ttx = tx.Set(\"gorm:table_options\", \"ENGINE=InnoDB DEFAULT CHARSET=utf8mb4\")\n\t\t}\n\t\terr := tx.Migrator().AutoMigrate(\n\t\t\tnew(models.SysDept),\n\t\t\tnew(models.SysConfig),\n\t\t\tnew(models.SysTables),\n\t\t\tnew(models.SysColumns),\n\t\t\tnew(models.SysMenu),\n\t\t\tnew(models.SysLoginLog),\n\t\t\tnew(models.SysOperaLog),\n\t\t\tnew(models.SysRoleDept),\n\t\t\tnew(models.SysUser),\n\t\t\tnew(models.SysRole),\n\t\t\tnew(models.SysPost),\n\t\t\tnew(models.DictData),\n\t\t\tnew(models.DictType),\n\t\t\tnew(models.SysJob),\n\t\t\tnew(models.SysConfig),\n\t\t\tnew(models.SysApi),\n\t\t\tnew(models.TbDemo),\n\t\t)\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tif err := models.InitDb(tx); err != nil {\n\t\t\treturn err\n\t\t}\n\t\treturn tx.Create(&common.Migration{\n\t\t\tVersion: version,\n\t\t}).Error\n\t})\n}\n"
  },
  {
    "path": "cmd/migrate/migration/version/1653638869132_migrate.go",
    "content": "package version\n\nimport (\n\t\"go-admin/cmd/migrate/migration/models\"\n\tcommon \"go-admin/common/models\"\n\t\"gorm.io/gorm\"\n\t\"runtime\"\n\t\"strconv\"\n\n\t\"go-admin/cmd/migrate/migration\"\n)\n\nfunc init() {\n\t_, fileName, _, _ := runtime.Caller(0)\n\tmigration.Migrate.SetVersion(migration.GetFilename(fileName), _1653638869132Test)\n}\n\nfunc _1653638869132Test(db *gorm.DB, version string) error {\n\treturn db.Transaction(func(tx *gorm.DB) error {\n\t\tvar list []models.SysMenu\n\t\terr := tx.Model(&models.SysMenu{}).Order(\"parent_id,menu_id\").Find(&list).Error\n\t\tif err != nil {\n\t\t\treturn err\n\t\t}\n\t\tfor _, v := range list {\n\t\t\tif v.ParentId == 0 {\n\t\t\t\tv.Paths = \"/0/\" + strconv.Itoa(v.MenuId)\n\t\t\t} else {\n\t\t\t\tvar e models.SysMenu\n\t\t\t\terr = tx.Model(&models.SysMenu{}).Where(\"menu_id=?\", v.ParentId).First(&e).Error\n\t\t\t\tif err != nil {\n\t\t\t\t\tif err == gorm.ErrRecordNotFound {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\treturn err\n\t\t\t\t}\n\t\t\t\tv.Paths = e.Paths + \"/\" + strconv.Itoa(v.MenuId)\n\t\t\t}\n\t\t\terr = tx.Model(&v).Update(\"paths\", v.Paths).Error\n\t\t\tif err != nil {\n\t\t\t\treturn err\n\t\t\t}\n\t\t}\n\t\treturn tx.Create(&common.Migration{\n\t\t\tVersion: version,\n\t\t}).Error\n\t})\n}\n"
  },
  {
    "path": "cmd/migrate/migration/version-local/doc.go",
    "content": "package version_local\n\nfunc init() {\n}\n\n/**\n开发者项目的迁移脚本放在这个目录里，init写法参考version目录里的migrate或者自动生成\n*/\n"
  },
  {
    "path": "cmd/migrate/server.go",
    "content": "package migrate\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"strconv\"\n\t\"text/template\"\n\t\"time\"\n\n\t\"github.com/go-admin-team/go-admin-core/config/source/file\"\n\t\"github.com/spf13/cobra\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"go-admin/cmd/migrate/migration\"\n\t_ \"go-admin/cmd/migrate/migration/version\"\n\t_ \"go-admin/cmd/migrate/migration/version-local\"\n\t\"go-admin/common/database\"\n\t\"go-admin/common/models\"\n)\n\nvar (\n\tconfigYml string\n\tgenerate  bool\n\tgoAdmin   bool\n\thost      string\n\tStartCmd  = &cobra.Command{\n\t\tUse:     \"migrate\",\n\t\tShort:   \"Initialize the database\",\n\t\tExample: \"go-admin migrate -c config/settings.yml\",\n\t\tRun: func(cmd *cobra.Command, args []string) {\n\t\t\trun()\n\t\t},\n\t}\n)\n\n// fixme 在您看不见代码的时候运行迁移，我觉得是不安全的，所以编译后最好不要去执行迁移\nfunc init() {\n\tStartCmd.PersistentFlags().StringVarP(&configYml, \"config\", \"c\", \"config/settings.yml\", \"Start server with provided configuration file\")\n\tStartCmd.PersistentFlags().BoolVarP(&generate, \"generate\", \"g\", false, \"generate migration file\")\n\tStartCmd.PersistentFlags().BoolVarP(&goAdmin, \"goAdmin\", \"a\", false, \"generate go-admin migration file\")\n\tStartCmd.PersistentFlags().StringVarP(&host, \"domain\", \"d\", \"*\", \"select tenant host\")\n}\n\nfunc run() {\n\n\tif !generate {\n\t\tfmt.Println(`start init`)\n\t\t//1. 读取配置\n\t\tconfig.Setup(\n\t\t\tfile.NewSource(file.WithPath(configYml)),\n\t\t\tinitDB,\n\t\t)\n\t} else {\n\t\tfmt.Println(`generate migration file`)\n\t\t_ = genFile()\n\t}\n}\n\nfunc migrateModel() error {\n\tif host == \"\" {\n\t\thost = \"*\"\n\t}\n\tdb := sdk.Runtime.GetDbByKey(host)\n\tif db == nil {\n\t\tif len(sdk.Runtime.GetDb()) == 1 && host == \"*\" {\n\t\t\tfor k, v := range sdk.Runtime.GetDb() {\n\t\t\t\tdb = v\n\t\t\t\thost = k\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t}\n\tif db == nil {\n\t\treturn fmt.Errorf(\"未找到数据库配置\")\n\t}\n\tif config.DatabasesConfig[host].Driver == \"mysql\" {\n\t\t//初始化数据库时候用\n\t\tdb.Set(\"gorm:table_options\", \"ENGINE=InnoDB CHARSET=utf8mb4\")\n\t}\n\terr := db.Debug().AutoMigrate(&models.Migration{})\n\tif err != nil {\n\t\treturn err\n\t}\n\tmigration.Migrate.SetDb(db.Debug())\n\tmigration.Migrate.Migrate()\n\treturn err\n}\nfunc initDB() {\n\t//3. 初始化数据库链接\n\tdatabase.Setup()\n\t//4. 数据库迁移\n\tfmt.Println(\"数据库迁移开始\")\n\t_ = migrateModel()\n\tfmt.Println(`数据库基础数据初始化成功`)\n}\n\nfunc genFile() error {\n\tt1, err := template.ParseFiles(\"template/migrate.template\")\n\tif err != nil {\n\t\treturn err\n\t}\n\tm := map[string]string{}\n\tm[\"GenerateTime\"] = strconv.FormatInt(time.Now().UnixNano()/1e6, 10)\n\tm[\"Package\"] = \"version_local\"\n\tif goAdmin {\n\t\tm[\"Package\"] = \"version\"\n\t}\n\tvar b1 bytes.Buffer\n\terr = t1.Execute(&b1, m)\n\tif goAdmin {\n\t\tpkg.FileCreate(b1, \"./cmd/migrate/migration/version/\"+m[\"GenerateTime\"]+\"_migrate.go\")\n\t} else {\n\t\tpkg.FileCreate(b1, \"./cmd/migrate/migration/version-local/\"+m[\"GenerateTime\"]+\"_migrate.go\")\n\t}\n\treturn nil\n}\n"
  },
  {
    "path": "cmd/version/server.go",
    "content": "package version\n\nimport (\n\t\"fmt\"\n\t\"github.com/spf13/cobra\"\n\t\"go-admin/common/global\"\n)\n\nvar (\n\tStartCmd = &cobra.Command{\n\t\tUse:     \"version\",\n\t\tShort:   \"Get version info\",\n\t\tExample: \"go-admin version\",\n\t\tPreRun: func(cmd *cobra.Command, args []string) {\n\n\t\t},\n\t\tRunE: func(cmd *cobra.Command, args []string) error {\n\t\t\treturn run()\n\t\t},\n\t}\n)\n\nfunc run() error {\n\tfmt.Println(global.Version)\n\treturn nil\n}\n"
  },
  {
    "path": "common/actions/create.go",
    "content": "package actions\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\n\t\"go-admin/common/dto\"\n\t\"go-admin/common/models\"\n)\n\n// CreateAction 通用新增动作\nfunc CreateAction(control dto.Control) gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tlog := api.GetRequestLogger(c)\n\t\tdb, err := pkg.GetOrm(c)\n\t\tif err != nil {\n\t\t\tlog.Error(err)\n\t\t\treturn\n\t\t}\n\n\t\t//新增操作\n\t\treq := control.Generate()\n\t\terr = req.Bind(c)\n\t\tif err != nil {\n\t\t\tresponse.Error(c, http.StatusUnprocessableEntity, err, err.Error())\n\t\t\treturn\n\t\t}\n\t\tvar object models.ActiveRecord\n\t\tobject, err = req.GenerateM()\n\t\tif err != nil {\n\t\t\tresponse.Error(c, 500, err, \"模型生成失败\")\n\t\t\treturn\n\t\t}\n\t\tobject.SetCreateBy(user.GetUserId(c))\n\t\terr = db.WithContext(c).Create(object).Error\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Create error: %s\", err)\n\t\t\tresponse.Error(c, 500, err, \"创建失败\")\n\t\t\treturn\n\t\t}\n\t\tresponse.OK(c, object.GetId(), \"创建成功\")\n\t\tc.Next()\n\t}\n}\n"
  },
  {
    "path": "common/actions/delete.go",
    "content": "package actions\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\n\t\"go-admin/common/dto\"\n\t\"go-admin/common/models\"\n)\n\n// DeleteAction 通用删除动作\nfunc DeleteAction(control dto.Control) gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tdb, err := pkg.GetOrm(c)\n\t\tif err != nil {\n\t\t\tlog.Error(err)\n\t\t\treturn\n\t\t}\n\n\t\tmsgID := pkg.GenerateMsgIDFromContext(c)\n\t\t//删除操作\n\t\treq := control.Generate()\n\t\terr = req.Bind(c)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"MsgID[%s] Bind error: %s\", msgID, err)\n\t\t\tresponse.Error(c, http.StatusUnprocessableEntity, err, \"参数验证失败\")\n\t\t\treturn\n\t\t}\n\t\tvar object models.ActiveRecord\n\t\tobject, err = req.GenerateM()\n\t\tif err != nil {\n\t\t\tresponse.Error(c, 500, err, \"模型生成失败\")\n\t\t\treturn\n\t\t}\n\n\t\tobject.SetUpdateBy(user.GetUserId(c))\n\n\t\t//数据权限检查\n\t\tp := GetPermissionFromContext(c)\n\n\t\tdb = db.WithContext(c).Scopes(\n\t\t\tPermission(object.TableName(), p),\n\t\t).Where(req.GetId()).Delete(object)\n\t\tif err = db.Error; err != nil {\n\t\t\tlog.Errorf(\"MsgID[%s] Delete error: %s\", msgID, err)\n\t\t\tresponse.Error(c, 500, err, \"删除失败\")\n\t\t\treturn\n\t\t}\n\t\tif db.RowsAffected == 0 {\n\t\t\tresponse.Error(c, http.StatusForbidden, nil, \"无权删除该数据\")\n\t\t\treturn\n\t\t}\n\t\tresponse.OK(c, object.GetId(), \"删除成功\")\n\t\tc.Next()\n\t}\n}\n"
  },
  {
    "path": "common/actions/index.go",
    "content": "package actions\n\nimport (\n\t\"errors\"\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/common/dto\"\n\t\"go-admin/common/models\"\n)\n\n// IndexAction 通用查询动作\nfunc IndexAction(m models.ActiveRecord, d dto.Index, f func() interface{}) gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tdb, err := pkg.GetOrm(c)\n\t\tif err != nil {\n\t\t\tlog.Error(err)\n\t\t\treturn\n\t\t}\n\n\t\tmsgID := pkg.GenerateMsgIDFromContext(c)\n\t\tlist := f()\n\t\tobject := m.Generate()\n\t\treq := d.Generate()\n\t\tvar count int64\n\n\t\t//查询列表\n\t\terr = req.Bind(c)\n\t\tif err != nil {\n\t\t\tresponse.Error(c, http.StatusUnprocessableEntity, err, \"参数验证失败\")\n\t\t\treturn\n\t\t}\n\n\t\t//数据权限检查\n\t\tp := GetPermissionFromContext(c)\n\n\t\terr = db.WithContext(c).Model(object).\n\t\t\tScopes(\n\t\t\t\tdto.MakeCondition(req.GetNeedSearch()),\n\t\t\t\tdto.Paginate(req.GetPageSize(), req.GetPageIndex()),\n\t\t\t\tPermission(object.TableName(), p),\n\t\t\t).\n\t\t\tFind(list).Limit(-1).Offset(-1).\n\t\t\tCount(&count).Error\n\t\tif err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\tlog.Errorf(\"MsgID[%s] Index error: %s\", msgID, err)\n\t\t\tresponse.Error(c, 500, err, \"查询失败\")\n\t\t\treturn\n\t\t}\n\t\tresponse.PageOK(c, list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n\t\tc.Next()\n\t}\n}\n"
  },
  {
    "path": "common/actions/permission.go",
    "content": "package actions\n\nimport (\n\t\"errors\"\n\n\t\"github.com/gin-gonic/gin\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\t\"gorm.io/gorm\"\n)\n\ntype DataPermission struct {\n\tDataScope string\n\tUserId    int\n\tDeptId    int\n\tRoleId    int\n}\n\nfunc PermissionAction() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tdb, err := pkg.GetOrm(c)\n\t\tif err != nil {\n\t\t\tlog.Error(err)\n\t\t\treturn\n\t\t}\n\n\t\tmsgID := pkg.GenerateMsgIDFromContext(c)\n\t\tvar p = new(DataPermission)\n\t\tif userId := user.GetUserIdStr(c); userId != \"\" {\n\t\t\tp, err = newDataPermission(db, userId)\n\t\t\tif err != nil {\n\t\t\t\tlog.Errorf(\"MsgID[%s] PermissionAction error: %s\", msgID, err)\n\t\t\t\tresponse.Error(c, 500, err, \"权限范围鉴定错误\")\n\t\t\t\tc.Abort()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tc.Set(PermissionKey, p)\n\t\tc.Next()\n\t}\n}\n\nfunc newDataPermission(tx *gorm.DB, userId interface{}) (*DataPermission, error) {\n\tvar err error\n\tp := &DataPermission{}\n\n\terr = tx.Table(\"sys_user\").\n\t\tSelect(\"sys_user.user_id\", \"sys_role.role_id\", \"sys_user.dept_id\", \"sys_role.data_scope\").\n\t\tJoins(\"left join sys_role on sys_role.role_id = sys_user.role_id\").\n\t\tWhere(\"sys_user.user_id = ?\", userId).\n\t\tScan(p).Error\n\tif err != nil {\n\t\terr = errors.New(\"获取用户数据出错 msg:\" + err.Error())\n\t\treturn nil, err\n\t}\n\treturn p, nil\n}\n\nfunc Permission(tableName string, p *DataPermission) func(db *gorm.DB) *gorm.DB {\n\treturn func(db *gorm.DB) *gorm.DB {\n\t\tif !config.ApplicationConfig.EnableDP {\n\t\t\treturn db\n\t\t}\n\t\tswitch p.DataScope {\n\t\tcase \"2\":\n\t\t\treturn db.Where(tableName+\".create_by in (select sys_user.user_id from sys_role_dept left join sys_user on sys_user.dept_id=sys_role_dept.dept_id where sys_role_dept.role_id = ?)\", p.RoleId)\n\t\tcase \"3\":\n\t\t\treturn db.Where(tableName+\".create_by in (SELECT user_id from sys_user where dept_id = ? )\", p.DeptId)\n\t\tcase \"4\":\n\t\t\treturn db.Where(tableName+\".create_by in (SELECT user_id from sys_user where sys_user.dept_id in(select dept_id from sys_dept where dept_path like ? ))\", \"%/\"+pkg.IntToString(p.DeptId)+\"/%\")\n\t\tcase \"5\":\n\t\t\treturn db.Where(tableName+\".create_by = ?\", p.UserId)\n\t\tdefault:\n\t\t\treturn db\n\t\t}\n\t}\n}\n\nfunc getPermissionFromContext(c *gin.Context) *DataPermission {\n\tp := new(DataPermission)\n\tif pm, ok := c.Get(PermissionKey); ok {\n\t\tswitch pm.(type) {\n\t\tcase *DataPermission:\n\t\t\tp = pm.(*DataPermission)\n\t\t}\n\t}\n\treturn p\n}\n\n// GetPermissionFromContext 提供非action写法数据范围约束\nfunc GetPermissionFromContext(c *gin.Context) *DataPermission {\n\treturn getPermissionFromContext(c)\n}\n"
  },
  {
    "path": "common/actions/type.go",
    "content": "package actions\n\nconst (\n\tPermissionKey = \"dataPermission\"\n)\n"
  },
  {
    "path": "common/actions/update.go",
    "content": "package actions\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\n\t\"go-admin/common/dto\"\n\t\"go-admin/common/models\"\n)\n\n// UpdateAction 通用更新动作\nfunc UpdateAction(control dto.Control) gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tdb, err := pkg.GetOrm(c)\n\t\tif err != nil {\n\t\t\tlog.Error(err)\n\t\t\treturn\n\t\t}\n\n\t\tmsgID := pkg.GenerateMsgIDFromContext(c)\n\t\treq := control.Generate()\n\t\t//更新操作\n\t\terr = req.Bind(c)\n\t\tif err != nil {\n\t\t\tresponse.Error(c, http.StatusUnprocessableEntity, err, \"参数验证失败\")\n\t\t\treturn\n\t\t}\n\t\tvar object models.ActiveRecord\n\t\tobject, err = req.GenerateM()\n\t\tif err != nil {\n\t\t\tresponse.Error(c, 500, err, \"模型生成失败\")\n\t\t\treturn\n\t\t}\n\t\tobject.SetUpdateBy(user.GetUserId(c))\n\n\t\t//数据权限检查\n\t\tp := GetPermissionFromContext(c)\n\n\t\tdb = db.WithContext(c).Scopes(\n\t\t\tPermission(object.TableName(), p),\n\t\t).Where(req.GetId()).Updates(object)\n\t\tif err = db.Error; err != nil {\n\t\t\tlog.Errorf(\"MsgID[%s] Update error: %s\", msgID, err)\n\t\t\tresponse.Error(c, 500, err, \"更新失败\")\n\t\t\treturn\n\t\t}\n\t\tif db.RowsAffected == 0 {\n\t\t\tresponse.Error(c, http.StatusForbidden, nil, \"无权更新该数据\")\n\t\t\treturn\n\t\t}\n\t\tresponse.OK(c, object.GetId(), \"更新成功\")\n\t\tc.Next()\n\t}\n}\n"
  },
  {
    "path": "common/actions/view.go",
    "content": "package actions\n\nimport (\n\t\"errors\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/common/dto\"\n\t\"go-admin/common/models\"\n)\n\n// ViewAction 通用详情动作\nfunc ViewAction(control dto.Control, f func() interface{}) gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tdb, err := pkg.GetOrm(c)\n\t\tif err != nil {\n\t\t\tlog.Error(err)\n\t\t\treturn\n\t\t}\n\n\t\tmsgID := pkg.GenerateMsgIDFromContext(c)\n\t\t//查看详情\n\t\treq := control.Generate()\n\t\terr = req.Bind(c)\n\t\tif err != nil {\n\t\t\tresponse.Error(c, http.StatusUnprocessableEntity, err, \"参数验证失败\")\n\t\t\treturn\n\t\t}\n\t\tvar object models.ActiveRecord\n\t\tobject, err = req.GenerateM()\n\t\tif err != nil {\n\t\t\tresponse.Error(c, 500, err, \"模型生成失败\")\n\t\t\treturn\n\t\t}\n\n\t\tvar rsp interface{}\n\t\tif f != nil {\n\t\t\trsp = f()\n\t\t} else {\n\t\t\trsp, _ = req.GenerateM()\n\t\t}\n\n\t\t//数据权限检查\n\t\tp := GetPermissionFromContext(c)\n\n\t\terr = db.Model(object).WithContext(c).Scopes(\n\t\t\tPermission(object.TableName(), p),\n\t\t).Where(req.GetId()).First(rsp).Error\n\n\t\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\t\tresponse.Error(c, http.StatusNotFound, nil, \"查看对象不存在或无权查看\")\n\t\t\treturn\n\t\t}\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"MsgID[%s] View error: %s\", msgID, err)\n\t\t\tresponse.Error(c, 500, err, \"查看失败\")\n\t\t\treturn\n\t\t}\n\t\tresponse.OK(c, rsp, \"查询成功\")\n\t\tc.Next()\n\t}\n}\n"
  },
  {
    "path": "common/apis/api.go",
    "content": "package apis\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/common/service\"\n)\n\ntype Api struct {\n\tContext *gin.Context\n\tLogger  *logger.Helper\n\tOrm     *gorm.DB\n\tErrors  error\n}\n\nfunc (e *Api) AddError(err error) {\n\tif e.Errors == nil {\n\t\te.Errors = err\n\t} else if err != nil {\n\t\te.Logger.Error(err)\n\t\te.Errors = fmt.Errorf(\"%v; %w\", e.Errors, err)\n\t}\n}\n\n// MakeContext 设置http上下文\nfunc (e *Api) MakeContext(c *gin.Context) *Api {\n\te.Context = c\n\te.Logger = api.GetRequestLogger(c)\n\treturn e\n}\n\n// GetLogger 获取上下文提供的日志\nfunc (e *Api) GetLogger() *logger.Helper {\n\treturn api.GetRequestLogger(e.Context)\n}\n\nfunc (e *Api) Bind(d interface{}, bindings ...binding.Binding) *Api {\n\tvar err error\n\tif len(bindings) == 0 {\n\t\tbindings = append(bindings, binding.JSON, nil)\n\t}\n\tfor i := range bindings {\n\t\tswitch bindings[i] {\n\t\tcase binding.JSON:\n\t\t\terr = e.Context.ShouldBindWith(d, binding.JSON)\n\t\tcase binding.XML:\n\t\t\terr = e.Context.ShouldBindWith(d, binding.XML)\n\t\tcase binding.Form:\n\t\t\terr = e.Context.ShouldBindWith(d, binding.Form)\n\t\tcase binding.Query:\n\t\t\terr = e.Context.ShouldBindWith(d, binding.Query)\n\t\tcase binding.FormPost:\n\t\t\terr = e.Context.ShouldBindWith(d, binding.FormPost)\n\t\tcase binding.FormMultipart:\n\t\t\terr = e.Context.ShouldBindWith(d, binding.FormMultipart)\n\t\tcase binding.ProtoBuf:\n\t\t\terr = e.Context.ShouldBindWith(d, binding.ProtoBuf)\n\t\tcase binding.MsgPack:\n\t\t\terr = e.Context.ShouldBindWith(d, binding.MsgPack)\n\t\tcase binding.YAML:\n\t\t\terr = e.Context.ShouldBindWith(d, binding.YAML)\n\t\tcase binding.Header:\n\t\t\terr = e.Context.ShouldBindWith(d, binding.Header)\n\t\tdefault:\n\t\t\terr = e.Context.ShouldBindUri(d)\n\t\t}\n\t\tif err != nil {\n\t\t\te.AddError(err)\n\t\t}\n\t}\n\treturn e\n}\n\n// GetOrm 获取Orm DB\nfunc (e *Api) GetOrm() (*gorm.DB, error) {\n\tdb, err := pkg.GetOrm(e.Context)\n\tif err != nil {\n\t\te.Error(500, err, \"数据库连接获取失败\")\n\t\treturn nil, err\n\t}\n\treturn db, nil\n}\n\n// MakeOrm 设置Orm DB\nfunc (e *Api) MakeOrm() *Api {\n\tvar err error\n\tif e.Logger == nil {\n\t\terr = errors.New(\"at MakeOrm logger is nil\")\n\t\t//e.Logger.Error(500, err, \"at MakeOrm logger is nil\")\n\t\te.AddError(err)\n\t\treturn e\n\t}\n\tdb, err := pkg.GetOrm(e.Context)\n\tif err != nil {\n\t\te.Logger.Error(500, err, \"数据库连接获取失败\")\n\t\te.AddError(err)\n\t}\n\te.Orm = db\n\treturn e\n}\n\nfunc (e *Api) MakeService(c *service.Service) *Api {\n\tc.Log = e.Logger\n\tc.Orm = e.Orm\n\treturn e\n}\n\n// Error 通常错误数据处理\nfunc (e *Api) Error(code int, err error, msg string) {\n\tresponse.Error(e.Context, code, err, msg)\n}\n\n// OK 通常成功数据处理\nfunc (e *Api) OK(data interface{}, msg string) {\n\tresponse.OK(e.Context, data, msg)\n}\n\n// PageOK 分页数据处理\nfunc (e *Api) PageOK(result interface{}, count int, pageIndex int, pageSize int, msg string) {\n\tresponse.PageOK(e.Context, result, count, pageIndex, pageSize, msg)\n}\n\n// Custom 兼容函数\nfunc (e *Api) Custom(data gin.H) {\n\tresponse.Custum(e.Context, data)\n}\n"
  },
  {
    "path": "common/database/initialize.go",
    "content": "package database\n\nimport (\n\t\"time\"\n\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\ttoolsConfig \"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\tmycasbin \"github.com/go-admin-team/go-admin-core/sdk/pkg/casbin\"\n\ttoolsDB \"github.com/go-admin-team/go-admin-core/tools/database\"\n\t. \"github.com/go-admin-team/go-admin-core/tools/gorm/logger\"\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/logger\"\n\t\"gorm.io/gorm/schema\"\n\n\t\"go-admin/common/global\"\n)\n\n// Setup 配置数据库\nfunc Setup() {\n\tfor k := range toolsConfig.DatabasesConfig {\n\t\tsetupSimpleDatabase(k, toolsConfig.DatabasesConfig[k])\n\t}\n}\n\nfunc setupSimpleDatabase(host string, c *toolsConfig.Database) {\n\tif global.Driver == \"\" {\n\t\tglobal.Driver = c.Driver\n\t}\n\tlog.Infof(\"%s => %s\", host, pkg.Green(c.Source))\n\tregisters := make([]toolsDB.ResolverConfigure, len(c.Registers))\n\tfor i := range c.Registers {\n\t\tregisters[i] = toolsDB.NewResolverConfigure(\n\t\t\tc.Registers[i].Sources,\n\t\t\tc.Registers[i].Replicas,\n\t\t\tc.Registers[i].Policy,\n\t\t\tc.Registers[i].Tables)\n\t}\n\tresolverConfig := toolsDB.NewConfigure(c.Source, c.MaxIdleConns, c.MaxOpenConns, c.ConnMaxIdleTime, c.ConnMaxLifeTime, registers)\n\tdb, err := resolverConfig.Init(&gorm.Config{\n\t\tNamingStrategy: schema.NamingStrategy{\n\t\t\tSingularTable: true,\n\t\t},\n\t\tLogger: New(\n\t\t\tlogger.Config{\n\t\t\t\tSlowThreshold: time.Second,\n\t\t\t\tColorful:      true,\n\t\t\t\tLogLevel: logger.LogLevel(\n\t\t\t\t\tlog.DefaultLogger.Options().Level.LevelForGorm()),\n\t\t\t},\n\t\t),\n\t}, opens[c.Driver])\n\n\tif err != nil {\n\t\tlog.Fatal(pkg.Red(c.Driver+\" connect error :\"), err)\n\t} else {\n\t\tlog.Info(pkg.Green(c.Driver + \" connect success !\"))\n\t}\n\n\te := mycasbin.Setup(db, \"\")\n\n\tsdk.Runtime.SetDb(host, db)\n\tsdk.Runtime.SetCasbin(host, e)\n}\n"
  },
  {
    "path": "common/database/open.go",
    "content": "//go:build !sqlite3\n\npackage database\n\nimport (\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/driver/postgres\"\n\t\"gorm.io/driver/sqlserver\"\n\t\"gorm.io/gorm\"\n)\n\nvar opens = map[string]func(string) gorm.Dialector{\n\t\"mysql\":     mysql.Open,\n\t\"postgres\":  postgres.Open,\n\t\"sqlserver\": sqlserver.Open,\n}\n"
  },
  {
    "path": "common/database/open_sqlite3.go",
    "content": "//go:build sqlite3\n// +build sqlite3\n\npackage database\n\nimport (\n\t\"gorm.io/driver/mysql\"\n\t\"gorm.io/driver/postgres\"\n\t\"gorm.io/driver/sqlite\"\n\t\"gorm.io/driver/sqlserver\"\n\t\"gorm.io/gorm\"\n)\n\nvar opens = map[string]func(string) gorm.Dialector{\n\t\"mysql\":     mysql.Open,\n\t\"postgres\":  postgres.Open,\n\t\"sqlite3\":   sqlite.Open,\n\t\"sqlserver\": sqlserver.Open,\n}\n"
  },
  {
    "path": "common/dto/auto_form.go",
    "content": "package dto\n\ntype AutoForm struct {\n\tFields        []Field `json:\"fields\"`\n\tFormRef       string  `json:\"formRef\"`\n\tFormModel     string  `json:\"formModel\"`\n\tSize          string  `json:\"size\"`\n\tLabelPosition string  `json:\"labelPosition\"`\n\tLabelWidth    int     `json:\"labelWidth\"`\n\tFormRules     string  `json:\"formRules\"`\n\tGutter        int     `json:\"gutter\"`\n\tDisabled      bool    `json:\"disabled\"`\n\tSpan          int     `json:\"span\"`\n\tFormBtns      bool    `json:\"formBtns\"`\n}\n\ntype Config struct {\n\tLabel        string        `json:\"label\"`\n\tLabelWidth   interface{}   `json:\"labelWidth\"`\n\tShowLabel    bool          `json:\"showLabel\"`\n\tChangeTag    bool          `json:\"changeTag\"`\n\tTag          string        `json:\"tag\"`\n\tTagIcon      string        `json:\"tagIcon\"`\n\tRequired     bool          `json:\"required\"`\n\tLayout       string        `json:\"layout\"`\n\tSpan         int           `json:\"span\"`\n\tDocument     string        `json:\"document\"`\n\tRegList      []interface{} `json:\"regList\"`\n\tFormId       int           `json:\"formId\"`\n\tRenderKey    int64         `json:\"renderKey\"`\n\tDefaultValue interface{}   `json:\"defaultValue\"`\n\tShowTip      bool          `json:\"showTip,omitempty\"`\n\tButtonText   string        `json:\"buttonText,omitempty\"`\n\tFileSize     int           `json:\"fileSize,omitempty\"`\n\tSizeUnit     string        `json:\"sizeUnit,omitempty\"`\n}\n\ntype Option struct {\n\tLabel string `json:\"label\"`\n\tValue string `json:\"value\"`\n}\n\ntype Slot struct {\n\tPrepend  string   `json:\"prepend,omitempty\"`\n\tAppend   string   `json:\"append,omitempty\"`\n\tListType bool     `json:\"list-type,omitempty\"`\n\tOptions  []Option `json:\"options,omitempty\"`\n}\n\ntype Field struct {\n\tConfig        Config      `json:\"__config__\"`\n\tSlot          Slot        `json:\"__slot__\"`\n\tPlaceholder   string      `json:\"placeholder,omitempty\"`\n\tStyle         Style       `json:\"style,omitempty\"`\n\tClearable     bool        `json:\"clearable,omitempty\"`\n\tPrefixIcon    string      `json:\"prefix-icon,omitempty\"`\n\tSuffixIcon    string      `json:\"suffix-icon,omitempty\"`\n\tMaxlength     interface{} `json:\"maxlength\"`\n\tShowWordLimit bool        `json:\"show-word-limit,omitempty\"`\n\tReadonly      bool        `json:\"readonly,omitempty\"`\n\tDisabled      bool        `json:\"disabled\"`\n\tVModel        string      `json:\"__vModel__\"`\n\tAction        string      `json:\"action,omitempty\"`\n\tAccept        string      `json:\"accept,omitempty\"`\n\tName          string      `json:\"name,omitempty\"`\n\tAutoUpload    bool        `json:\"auto-upload,omitempty\"`\n\tListType      string      `json:\"list-type,omitempty\"`\n\tMultiple      bool        `json:\"multiple,omitempty\"`\n\tFilterable    bool        `json:\"filterable,omitempty\"`\n}\n\ntype Style struct {\n\tWidth string `json:\"width\"`\n}\n"
  },
  {
    "path": "common/dto/generate.go",
    "content": "package dto\n\nimport (\n\tvd \"github.com/bytedance/go-tagexpr/v2/validator\"\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n)\n\ntype ObjectById struct {\n\tId  int   `uri:\"id\"`\n\tIds []int `json:\"ids\"`\n}\n\nfunc (s *ObjectById) Bind(ctx *gin.Context) error {\n\tvar err error\n\tlog := api.GetRequestLogger(ctx)\n\terr = ctx.ShouldBindUri(s)\n\tif err != nil {\n\t\tlog.Warnf(\"ShouldBindUri error: %s\", err.Error())\n\t\treturn err\n\t}\n\tif ctx.Request.Method == http.MethodDelete {\n\t\terr = ctx.ShouldBind(&s)\n\t\tif err != nil {\n\t\t\tlog.Warnf(\"ShouldBind error: %s\", err.Error())\n\t\t\treturn err\n\t\t}\n\t\tif len(s.Ids) > 0 {\n\t\t\treturn nil\n\t\t}\n\t\tif s.Ids == nil {\n\t\t\ts.Ids = make([]int, 0)\n\t\t}\n\t\tif s.Id != 0 {\n\t\t\ts.Ids = append(s.Ids, s.Id)\n\t\t}\n\t}\n\tif err = vd.Validate(s); err != nil {\n\t\tlog.Errorf(\"Validate error: %s\", err.Error())\n\t\treturn err\n\t}\n\treturn err\n}\n\nfunc (s *ObjectById) GetId() interface{} {\n\tif len(s.Ids) > 0 {\n\t\ts.Ids = append(s.Ids, s.Id)\n\t\treturn s.Ids\n\t}\n\treturn s.Id\n}\n\ntype ObjectGetReq struct {\n\tId int `uri:\"id\"`\n}\n\nfunc (s *ObjectGetReq) Bind(ctx *gin.Context) error {\n\tvar err error\n\tlog := api.GetRequestLogger(ctx)\n\terr = ctx.ShouldBindUri(s)\n\tif err != nil {\n\t\tlog.Warnf(\"ShouldBindUri error: %s\", err.Error())\n\t\treturn err\n\t}\n\tif err = vd.Validate(s); err != nil {\n\t\tlog.Errorf(\"Validate error: %s\", err.Error())\n\t\treturn err\n\t}\n\treturn err\n}\n\nfunc (s *ObjectGetReq) GetId() interface{} {\n\treturn s.Id\n}\n\ntype ObjectDeleteReq struct {\n\tIds []int `json:\"ids\"`\n}\n\nfunc (s *ObjectDeleteReq) Bind(ctx *gin.Context) error {\n\tvar err error\n\tlog := api.GetRequestLogger(ctx)\n\terr = ctx.ShouldBind(&s)\n\tif err != nil {\n\t\tlog.Warnf(\"ShouldBind error: %s\", err.Error())\n\t\treturn err\n\t}\n\tif len(s.Ids) > 0 {\n\t\treturn nil\n\t}\n\tif s.Ids == nil {\n\t\ts.Ids = make([]int, 0)\n\t}\n\n\tif err = vd.Validate(s); err != nil {\n\t\tlog.Errorf(\"Validate error: %s\", err.Error())\n\t\treturn err\n\t}\n\treturn err\n}\n\nfunc (s *ObjectDeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n"
  },
  {
    "path": "common/dto/order.go",
    "content": "package dto\n\nimport (\n\t\"gorm.io/gorm\"\n\t\"gorm.io/gorm/clause\"\n)\n\nfunc OrderDest(sort string, bl bool) func(db *gorm.DB) *gorm.DB {\n\treturn func(db *gorm.DB) *gorm.DB {\n\t\treturn db.Order(clause.OrderByColumn{Column: clause.Column{Name: sort}, Desc: bl})\n\t}\n}\n"
  },
  {
    "path": "common/dto/pagination.go",
    "content": "package dto\n\ntype Pagination struct {\n\tPageIndex int `form:\"pageIndex\"`\n\tPageSize  int `form:\"pageSize\"`\n}\n\nfunc (m *Pagination) GetPageIndex() int {\n\tif m.PageIndex <= 0 {\n\t\tm.PageIndex = 1\n\t}\n\treturn m.PageIndex\n}\n\nfunc (m *Pagination) GetPageSize() int {\n\tif m.PageSize <= 0 {\n\t\tm.PageSize = 10\n\t}\n\treturn m.PageSize\n}\n"
  },
  {
    "path": "common/dto/search.go",
    "content": "package dto\n\nimport (\n\t\"github.com/go-admin-team/go-admin-core/tools/search\"\n\t\"go-admin/common/global\"\n\t\"gorm.io/gorm\"\n)\n\ntype GeneralDelDto struct {\n\tId  int   `uri:\"id\" json:\"id\" validate:\"required\"`\n\tIds []int `json:\"ids\"`\n}\n\nfunc (g GeneralDelDto) GetIds() []int {\n\tids := make([]int, 0)\n\tif g.Id != 0 {\n\t\tids = append(ids, g.Id)\n\t}\n\tif len(g.Ids) > 0 {\n\t\tfor _, id := range g.Ids {\n\t\t\tif id > 0 {\n\t\t\t\tids = append(ids, id)\n\t\t\t}\n\t\t}\n\t} else {\n\t\tif g.Id > 0 {\n\t\t\tids = append(ids, g.Id)\n\t\t}\n\t}\n\tif len(ids) <= 0 {\n\t\t//方式全部删除\n\t\tids = append(ids, 0)\n\t}\n\treturn ids\n}\n\ntype GeneralGetDto struct {\n\tId int `uri:\"id\" json:\"id\" validate:\"required\"`\n}\n\nfunc MakeCondition(q interface{}) func(db *gorm.DB) *gorm.DB {\n\treturn func(db *gorm.DB) *gorm.DB {\n\t\tcondition := &search.GormCondition{\n\t\t\tGormPublic: search.GormPublic{},\n\t\t\tJoin:       make([]*search.GormJoin, 0),\n\t\t}\n\t\tsearch.ResolveSearchQuery(global.Driver, q, condition)\n\t\tfor _, join := range condition.Join {\n\t\t\tif join == nil {\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tdb = db.Joins(join.JoinOn)\n\t\t\tfor k, v := range join.Where {\n\t\t\t\tdb = db.Where(k, v...)\n\t\t\t}\n\t\t\tfor k, v := range join.Or {\n\t\t\t\tdb = db.Or(k, v...)\n\t\t\t}\n\t\t\tfor _, o := range join.Order {\n\t\t\t\tdb = db.Order(o)\n\t\t\t}\n\t\t}\n\t\tfor k, v := range condition.Where {\n\t\t\tdb = db.Where(k, v...)\n\t\t}\n\t\tfor k, v := range condition.Or {\n\t\t\tdb = db.Or(k, v...)\n\t\t}\n\t\tfor _, o := range condition.Order {\n\t\t\tdb = db.Order(o)\n\t\t}\n\t\treturn db\n\t}\n}\n\nfunc Paginate(pageSize, pageIndex int) func(db *gorm.DB) *gorm.DB {\n\treturn func(db *gorm.DB) *gorm.DB {\n\t\toffset := (pageIndex - 1) * pageSize\n\t\tif offset < 0 {\n\t\t\toffset = 0\n\t\t}\n\t\treturn db.Offset(offset).Limit(pageSize)\n\t}\n}\n"
  },
  {
    "path": "common/dto/type.go",
    "content": "package dto\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"go-admin/common/models\"\n)\n\ntype Index interface {\n\tGenerate() Index\n\tBind(ctx *gin.Context) error\n\tGetPageIndex() int\n\tGetPageSize() int\n\tGetNeedSearch() interface{}\n}\n\ntype Control interface {\n\tGenerate() Control\n\tBind(ctx *gin.Context) error\n\tGenerateM() (models.ActiveRecord, error)\n\tGetId() interface{}\n}\n"
  },
  {
    "path": "common/file_store/initialize.go",
    "content": "package file_store\n\nimport \"fmt\"\n\ntype OXS struct {\n\t// Endpoint 访问域名\n\tEndpoint string\n\t// AccessKeyID AK\n\tAccessKeyID string\n\t// AccessKeySecret AKS\n\tAccessKeySecret string\n\t// BucketName 桶名称\n\tBucketName string\n}\n\n// Setup 配置文件存储driver\nfunc (e *OXS) Setup(driver DriverType, options ...ClientOption) FileStoreType {\n\tfileStoreType := driver\n\tvar fileStore FileStoreType\n\tswitch fileStoreType {\n\tcase AliYunOSS:\n\t\tfileStore = new(ALiYunOSS)\n\t\terr := fileStore.Setup(e.Endpoint, e.AccessKeyID, e.AccessKeySecret, e.BucketName)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\treturn fileStore\n\tcase HuaweiOBS:\n\t\tfileStore = new(HuaWeiOBS)\n\t\terr := fileStore.Setup(e.Endpoint, e.AccessKeyID, e.AccessKeySecret, e.BucketName)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\treturn fileStore\n\tcase QiNiuKodo:\n\t\tfileStore = new(QiNiuKODO)\n\t\terr := fileStore.Setup(e.Endpoint, e.AccessKeyID, e.AccessKeySecret, e.BucketName)\n\t\tif err != nil {\n\t\t\tfmt.Println(err)\n\t\t}\n\t\treturn fileStore\n\t}\n\n\treturn nil\n}\n"
  },
  {
    "path": "common/file_store/interface.go",
    "content": "package file_store\n\n// DriverType 驱动类型\ntype DriverType string\n\nconst (\n\t// HuaweiOBS 华为云OBS\n\tHuaweiOBS DriverType = \"HuaweiOBS\"\n\t// AliYunOSS 阿里云OSS\n\tAliYunOSS DriverType = \"AliYunOSS\"\n\t// QiNiuKodo 七牛云kodo\n\tQiNiuKodo DriverType = \"QiNiuKodo\"\n)\n\ntype ClientOption map[string]interface{}\n\n// TODO: FileStoreType名称待定\n\n// FileStoreType OXS\ntype FileStoreType interface {\n\t// Setup 装载 endpoint sss\n\tSetup(endpoint, accessKeyID, accessKeySecret, BucketName string, options ...ClientOption) error\n\t// UpLoad 上传\n\tUpLoad(yourObjectName string, localFile interface{}) error\n\t// GetTempToken 获取临时Token\n\tGetTempToken() (string, error)\n}\n"
  },
  {
    "path": "common/file_store/kodo.go",
    "content": "package file_store\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/qiniu/go-sdk/v7/auth/qbox\"\n\t\"github.com/qiniu/go-sdk/v7/storage\"\n)\n\ntype Zone string\n\nconst (\n\t// HuaDong 华东\n\tHuaDong Zone = \"HuaDong\"\n\t// HuaBei 华北\n\tHuaBei Zone = \"HuaBei\"\n\t// HuaNan 华南\n\tHuaNan Zone = \"HuaNan\"\n\t// BeiMei 北美\n\tBeiMei Zone = \"BeiMei\"\n\t// XinJiaPo 新加坡\n\tXinJiaPo Zone = \"XinJiaPo\"\n)\n\ntype QiNiuKODO struct {\n\tClient     interface{}\n\tBucketName string\n\tcfg        storage.Config\n\toptions    []ClientOption\n}\n\nfunc (e *QiNiuKODO) getToken() string {\n\tputPolicy := storage.PutPolicy{\n\t\tScope: e.BucketName,\n\t}\n\tif len(e.options) > 0 && e.options[0][\"Expires\"] != nil {\n\t\tputPolicy.Expires = e.options[0][\"Expires\"].(uint64)\n\t}\n\tupToken := putPolicy.UploadToken(e.Client.(*qbox.Mac))\n\treturn upToken\n}\n\n//Setup 装载\n//endpoint sss\nfunc (e *QiNiuKODO) Setup(endpoint, accessKeyID, accessKeySecret, BucketName string, options ...ClientOption) error {\n\n\tmac := qbox.NewMac(accessKeyID, accessKeySecret)\n\t// 获取存储空间。\n\tcfg := storage.Config{}\n\t// 空间对应的机房\n\te.setZoneORDefault(cfg, options...)\n\t// 是否使用https域名\n\tcfg.UseHTTPS = true\n\t// 上传是否使用CDN上传加速\n\tcfg.UseCdnDomains = false\n\n\te.Client = mac\n\te.BucketName = BucketName\n\te.cfg = cfg\n\te.options = options\n\treturn nil\n}\n\n// setZoneORDefault 设置Zone或者默认华东\nfunc (e *QiNiuKODO) setZoneORDefault(cfg storage.Config, options ...ClientOption) {\n\tif len(options) > 0 && options[0][\"Zone\"] != nil {\n\t\tif _, ok := options[0][\"Zone\"].(Zone); !ok {\n\t\t\tcfg.Zone = &storage.ZoneHuadong\n\t\t}\n\t\tswitch options[0][\"Zone\"].(Zone) {\n\t\tcase HuaDong:\n\t\t\tcfg.Zone = &storage.ZoneHuadong\n\t\tcase HuaBei:\n\t\t\tcfg.Zone = &storage.ZoneHuabei\n\t\tcase HuaNan:\n\t\t\tcfg.Zone = &storage.ZoneHuanan\n\t\tcase BeiMei:\n\t\t\tcfg.Zone = &storage.ZoneBeimei\n\t\tcase XinJiaPo:\n\t\t\tcfg.Zone = &storage.ZoneXinjiapo\n\t\tdefault:\n\t\t\tcfg.Zone = &storage.ZoneHuadong\n\t\t}\n\t}\n}\n\n// UpLoad 文件上传\nfunc (e *QiNiuKODO) UpLoad(yourObjectName string, localFile interface{}) error {\n\n\t// 构建表单上传的对象\n\tformUploader := storage.NewFormUploader(&e.cfg)\n\tret := storage.PutRet{}\n\t// 可选配置\n\tputExtra := storage.PutExtra{\n\t\tParams: map[string]string{\n\t\t\t\"x:name\": \"github logo\",\n\t\t},\n\t}\n\terr := formUploader.PutFile(context.Background(), &ret, e.getToken(), yourObjectName, localFile.(string), &putExtra)\n\tif err != nil {\n\t\tfmt.Println(err)\n\t\treturn err\n\t}\n\tfmt.Println(ret.Key, ret.Hash)\n\treturn nil\n}\n\nfunc (e *QiNiuKODO) GetTempToken() (string, error) {\n\ttoken := e.getToken()\n\treturn token, nil\n}\n"
  },
  {
    "path": "common/file_store/kodo_test.go",
    "content": "package file_store\n\nimport (\n\t\"testing\"\n)\n\nfunc TestKODOUpload(t *testing.T) {\n\te := OXS{\"\", \"\", \"\", \"\"}\n\tvar oxs = e.Setup(QiNiuKodo, map[string]interface{}{\"Zone\": \"华东\"})\n\terr := oxs.UpLoad(\"test.png\", \"./test.png\")\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\tt.Log(\"ok\")\n}\n\nfunc TestKODOGetTempToken(t *testing.T) {\n\te := OXS{\"\", \"\", \"\", \"\"}\n\tvar oxs = e.Setup(QiNiuKodo, map[string]interface{}{\"Zone\": \"华东\"})\n\ttoken, _ := oxs.GetTempToken()\n\tt.Log(token)\n\tt.Log(\"ok\")\n}\n"
  },
  {
    "path": "common/file_store/obs.go",
    "content": "package file_store\n\nimport (\n\t\"fmt\"\n\t\"github.com/huaweicloud/huaweicloud-sdk-go-obs/obs\"\n\t\"log\"\n)\n\ntype HuaWeiOBS struct {\n\tClient     interface{}\n\tBucketName string\n}\n\nfunc (e *HuaWeiOBS) Setup(endpoint, accessKeyID, accessKeySecret, BucketName string, options ...ClientOption) error {\n\t// 创建ObsClient结构体\n\tclient, err := obs.New(accessKeyID, accessKeySecret, endpoint)\n\tif err != nil {\n\t\tlog.Println(\"Error:\", err)\n\t\treturn err\n\t}\n\te.Client = client\n\te.BucketName = BucketName\n\treturn nil\n}\n\n// UpLoad 文件上传\n// yourObjectName 文件路径名称，与objectKey是同一概念，表示断点续传上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg\nfunc (e *HuaWeiOBS) UpLoad(yourObjectName string, localFile interface{}) error {\n\t// 获取存储空间。\n\tinput := &obs.PutFileInput{}\n\tinput.Bucket = e.BucketName\n\tinput.Key = yourObjectName\n\tinput.SourceFile = localFile.(string)\n\toutput, err := e.Client.(*obs.ObsClient).PutFile(input)\n\n\tif err == nil {\n\t\tfmt.Printf(\"RequestId:%s\\n\", output.RequestId)\n\t\tfmt.Printf(\"ETag:%s, StorageClass:%s\\n\", output.ETag, output.StorageClass)\n\t} else {\n\t\tif obsError, ok := err.(obs.ObsError); ok {\n\t\t\tfmt.Println(obsError.Code)\n\t\t\tfmt.Println(obsError.Message)\n\t\t} else {\n\t\t\tfmt.Println(err)\n\t\t}\n\t}\n\treturn nil\n}\n\nfunc (e *HuaWeiOBS) GetTempToken() (string, error) {\n\treturn \"\", nil\n}\n"
  },
  {
    "path": "common/file_store/obs_test.go",
    "content": "package file_store\n\nimport (\n\t\"testing\"\n)\n\nfunc TestOBSUpload(t *testing.T) {\n\te := OXS{\"\", \"\", \"\", \"\"}\n\tvar oxs = e.Setup(HuaweiOBS)\n\terr := oxs.UpLoad(\"test.png\", \"./test.png\")\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\tt.Log(\"ok\")\n}\n"
  },
  {
    "path": "common/file_store/oss.go",
    "content": "package file_store\n\nimport (\n\t\"github.com/aliyun/aliyun-oss-go-sdk/oss\"\n\t\"log\"\n)\n\ntype ALiYunOSS struct {\n\tClient     interface{}\n\tBucketName string\n}\n\n//Setup 装载\n//endpoint sss\nfunc (e *ALiYunOSS) Setup(endpoint, accessKeyID, accessKeySecret, BucketName string, options ...ClientOption) error {\n\tclient, err := oss.New(endpoint, accessKeyID, accessKeySecret)\n\tif err != nil {\n\t\tlog.Println(\"Error:\", err)\n\t\treturn err\n\t}\n\te.Client = client\n\te.BucketName = BucketName\n\n\treturn nil\n}\n\n// UpLoad 文件上传\nfunc (e *ALiYunOSS) UpLoad(yourObjectName string, localFile interface{}) error {\n\t// 获取存储空间。\n\tbucket, err := e.Client.(*oss.Client).Bucket(e.BucketName)\n\tif err != nil {\n\t\tlog.Println(\"Error:\", err)\n\t\treturn err\n\t}\n\t// 设置分片大小为100 KB，指定分片上传并发数为3，并开启断点续传上传。\n\t// 其中<yourObjectName>与objectKey是同一概念，表示断点续传上传文件到OSS时需要指定包含文件后缀在内的完整路径，例如abc/efg/123.jpg。\n\t// \"LocalFile\"为filePath，100*1024为partSize。\n\terr = bucket.UploadFile(yourObjectName, localFile.(string), 100*1024, oss.Routines(3), oss.Checkpoint(true, \"\"))\n\tif err != nil {\n\t\tlog.Println(\"Error:\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\nfunc (e *ALiYunOSS) GetTempToken() (string, error) {\n\treturn \"\", nil\n}\n"
  },
  {
    "path": "common/file_store/oss_test.go",
    "content": "package file_store\n\nimport (\n\t\"testing\"\n)\n\nfunc TestOSSUpload(t *testing.T) {\n\t// 打括号内填写自己的测试信息即可\n\te := OXS{}\n\tvar oxs = e.Setup(AliYunOSS)\n\terr := oxs.UpLoad(\"test.png\", \"./test.png\")\n\tif err != nil {\n\t\tt.Error(err)\n\t}\n\tt.Log(\"ok\")\n}\n"
  },
  {
    "path": "common/global/adm.go",
    "content": "package global\n\nconst (\n\t// Version go-admin version info\n\tVersion = \"2.2.0\"\n)\n\nvar (\n\t// Driver 数据库驱动\n\tDriver string\n)\n"
  },
  {
    "path": "common/global/casbin.go",
    "content": "package global\n\nimport (\n\t\"github.com/casbin/casbin/v2\"\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n)\n\nfunc LoadPolicy(c *gin.Context) (*casbin.SyncedEnforcer, error) {\n\tlog := api.GetRequestLogger(c)\n\tif err := sdk.Runtime.GetCasbinKey(c.Request.Host).LoadPolicy(); err == nil {\n\t\treturn sdk.Runtime.GetCasbinKey(c.Request.Host), err\n\t} else {\n\t\tlog.Errorf(\"casbin rbac_model or policy init error, %s \", err.Error())\n\t\treturn nil, err\n\t}\n}\n"
  },
  {
    "path": "common/global/logo.go",
    "content": "package global\n\n// LogoContent go-admin ascii显示，减少静态文件依赖\nvar LogoContent = []byte{10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 95, 95, 95, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 44, 45, 45, 45, 44, 32, 32, 32, 32, 32, 32, 32, 32, 44, 39, 32, 32, 44, 32, 96, 46, 32, 32, 44, 45, 45, 44, 10, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 44, 45, 45, 45, 46, 32, 32, 32, 32, 32, 32, 44, 45, 45, 45, 44, 46, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 44, 45, 45, 45, 46, 39, 124, 32, 32, 32, 32, 32, 44, 45, 43, 45, 44, 46, 39, 32, 95, 32, 124, 44, 45, 45, 46, 39, 124, 32, 32, 32, 32, 32, 32, 32, 32, 32, 44, 45, 45, 45, 44, 10, 32, 32, 44, 45, 45, 45, 45, 46, 95, 44, 46, 32, 32, 39, 32, 32, 32, 44, 39, 92, 32, 32, 32, 44, 39, 32, 32, 46, 39, 32, 124, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 32, 32, 32, 124, 32, 58, 32, 32, 44, 45, 43, 45, 46, 32, 59, 32, 32, 32, 44, 32, 124, 124, 124, 32, 32, 124, 44, 32, 32, 32, 32, 32, 32, 44, 45, 43, 45, 46, 32, 47, 32, 32, 124, 10, 32, 47, 32, 32, 32, 47, 32, 32, 39, 32, 47, 32, 47, 32, 32, 32, 47, 32, 32, 32, 124, 44, 45, 45, 45, 46, 39, 32, 32, 32, 44, 32, 44, 45, 45, 46, 45, 45, 46, 32, 32, 32, 32, 32, 32, 124, 32, 32, 32, 124, 32, 124, 32, 44, 45, 45, 46, 39, 124, 39, 32, 32, 32, 124, 32, 32, 124, 124, 96, 45, 45, 39, 95, 32, 32, 32, 32, 32, 44, 45, 45, 46, 39, 124, 39, 32, 32, 32, 124, 10, 124, 32, 32, 32, 58, 32, 32, 32, 32, 32, 124, 46, 32, 32, 32, 59, 32, 44, 46, 32, 58, 124, 32, 32, 32, 124, 32, 32, 32, 32, 124, 47, 32, 32, 32, 32, 32, 32, 32, 92, 32, 32, 32, 44, 45, 45, 46, 95, 95, 124, 32, 124, 124, 32, 32, 32, 124, 32, 32, 44, 39, 44, 32, 124, 32, 32, 124, 44, 44, 39, 32, 44, 39, 124, 32, 32, 32, 124, 32, 32, 32, 124, 32, 32, 44, 34, 39, 32, 124, 10, 124, 32, 32, 32, 124, 32, 46, 92, 32, 32, 46, 39, 32, 32, 32, 124, 32, 124, 58, 32, 58, 58, 32, 32, 32, 58, 32, 32, 46, 39, 46, 45, 45, 46, 32, 32, 46, 45, 46, 32, 124, 32, 47, 32, 32, 32, 44, 39, 32, 32, 32, 124, 124, 32, 32, 32, 124, 32, 47, 32, 32, 124, 32, 124, 45, 45, 39, 32, 39, 32, 32, 124, 32, 124, 32, 32, 32, 124, 32, 32, 32, 124, 32, 47, 32, 32, 124, 32, 124, 10, 46, 32, 32, 32, 59, 32, 39, 59, 32, 32, 124, 39, 32, 32, 32, 124, 32, 46, 59, 32, 58, 58, 32, 32, 32, 124, 46, 39, 32, 32, 32, 92, 95, 95, 92, 47, 58, 32, 46, 32, 46, 46, 32, 32, 32, 39, 32, 32, 47, 32, 32, 124, 124, 32, 32, 32, 58, 32, 124, 32, 32, 124, 32, 44, 32, 32, 32, 32, 124, 32, 32, 124, 32, 58, 32, 32, 32, 124, 32, 32, 32, 124, 32, 124, 32, 32, 124, 32, 124, 10, 39, 32, 32, 32, 46, 32, 32, 32, 46, 32, 124, 124, 32, 32, 32, 58, 32, 32, 32, 32, 124, 96, 45, 45, 45, 39, 32, 32, 32, 32, 32, 44, 34, 32, 46, 45, 45, 46, 59, 32, 124, 39, 32, 32, 32, 59, 32, 124, 58, 32, 32, 124, 124, 32, 32, 32, 58, 32, 124, 32, 32, 124, 47, 32, 32, 32, 32, 32, 39, 32, 32, 58, 32, 124, 95, 95, 32, 124, 32, 32, 32, 124, 32, 124, 32, 32, 124, 47, 10, 32, 96, 45, 45, 45, 96, 45, 39, 124, 32, 124, 32, 92, 32, 32, 32, 92, 32, 32, 47, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 47, 32, 32, 47, 32, 32, 44, 46, 32, 32, 124, 124, 32, 32, 32, 124, 32, 39, 47, 32, 32, 39, 124, 32, 32, 32, 124, 32, 124, 96, 45, 39, 32, 32, 32, 32, 32, 32, 124, 32, 32, 124, 32, 39, 46, 39, 124, 124, 32, 32, 32, 124, 32, 124, 45, 45, 39, 10, 32, 46, 39, 95, 95, 47, 92, 95, 58, 32, 124, 32, 32, 96, 45, 45, 45, 45, 39, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 59, 32, 32, 58, 32, 32, 32, 46, 39, 32, 32, 32, 92, 32, 32, 32, 58, 32, 32, 32, 32, 58, 124, 124, 32, 32, 32, 59, 47, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 59, 32, 32, 58, 32, 32, 32, 32, 59, 124, 32, 32, 32, 124, 47, 10, 32, 124, 32, 32, 32, 58, 32, 32, 32, 32, 58, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 32, 32, 44, 32, 32, 32, 32, 32, 46, 45, 46, 47, 92, 32, 32, 32, 92, 32, 32, 47, 32, 32, 39, 45, 45, 45, 39, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 124, 32, 32, 44, 32, 32, 32, 47, 32, 39, 45, 45, 45, 39, 10, 32, 32, 92, 32, 32, 32, 92, 32, 32, 47, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 96, 45, 45, 96, 45, 45, 45, 39, 32, 32, 32, 32, 32, 96, 45, 45, 45, 45, 39, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 45, 45, 45, 96, 45, 39, 10, 32, 32, 32, 96, 45, 45, 96, 45, 39, 10}\n"
  },
  {
    "path": "common/global/topic.go",
    "content": "package global\n\nconst (\n\tLoginLog   = \"login_log_queue\"\n\tOperateLog = \"operate_log_queue\"\n\tApiCheck   = \"api_check_queue\"\n)\n"
  },
  {
    "path": "common/ip.go",
    "content": "package common\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"strings\"\n)\n\nfunc GetClientIP(c *gin.Context) string {\n\t// 优先从 X-Forwarded-For 获取 IP\n\tip := c.Request.Header.Get(\"X-Forwarded-For\")\n\tif ip == \"\" || strings.Contains(ip, \"127.0.0.1\") {\n\t\t// 如果为空或为本地地址，则尝试从 X-Real-IP 获取\n\t\tip = c.Request.Header.Get(\"X-real-ip\")\n\t}\n\tif ip == \"\" {\n\t\t// 如果仍为空，则使用 RemoteIP\n\t\tip = c.RemoteIP()\n\t}\n\tif ip == \"\" || ip == \"127.0.0.1\" {\n\t\t// 如果仍为空或为本地地址，则使用 ClientIP\n\t\tip = c.ClientIP()\n\t}\n\tif ip == \"\" {\n\t\t// 最后兜底为本地地址\n\t\tip = \"127.0.0.1\"\n\t}\n\treturn ip\n}\n"
  },
  {
    "path": "common/middleware/auth.go",
    "content": "package middleware\n\nimport (\n\t\"time\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/common/middleware/handler\"\n)\n\n// AuthInit jwt验证new\nfunc AuthInit() (*jwt.GinJWTMiddleware, error) {\n\ttimeout := time.Hour\n\tif config.ApplicationConfig.Mode == \"dev\" {\n\t\ttimeout = time.Duration(876010) * time.Hour\n\t} else {\n\t\tif config.JwtConfig.Timeout != 0 {\n\t\t\ttimeout = time.Duration(config.JwtConfig.Timeout) * time.Second\n\t\t}\n\t}\n\treturn jwt.New(&jwt.GinJWTMiddleware{\n\t\tRealm:           \"test zone\",\n\t\tKey:             []byte(config.JwtConfig.Secret),\n\t\tTimeout:         timeout,\n\t\tMaxRefresh:      time.Hour,\n\t\tPayloadFunc:     handler.PayloadFunc,\n\t\tIdentityHandler: handler.IdentityHandler,\n\t\tAuthenticator:   handler.Authenticator,\n\t\tAuthorizator:    handler.Authorizator,\n\t\tUnauthorized:    handler.Unauthorized,\n\t\tTokenLookup:     \"header: Authorization, query: token, cookie: jwt\",\n\t\tTokenHeadName:   \"Bearer\",\n\t\tTimeFunc:        time.Now,\n\t})\n\n}"
  },
  {
    "path": "common/middleware/customerror.go",
    "content": "package middleware\n\nimport (\n\t\"fmt\"\n\t\"net/http\"\n\t\"runtime\"\n\t\"strconv\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n)\n\nfunc CustomError(c *gin.Context) {\n\tdefer func() {\n\t\tif err := recover(); err != nil {\n\n\t\t\tif c.IsAborted() {\n\t\t\t\tc.Status(200)\n\t\t\t}\n\t\t\tswitch errStr := err.(type) {\n\t\t\tcase string:\n\t\t\t\tp := strings.Split(errStr, \"#\")\n\t\t\t\tif len(p) == 3 && p[0] == \"CustomError\" {\n\t\t\t\t\tstatusCode, e := strconv.Atoi(p[1])\n\t\t\t\t\tif e != nil {\n\t\t\t\t\t\tbreak\n\t\t\t\t\t}\n\t\t\t\t\tc.Status(statusCode)\n\t\t\t\t\tfmt.Println(\n\t\t\t\t\t\ttime.Now().Format(\"2006-01-02 15:04:05\"),\n\t\t\t\t\t\t\"[ERROR]\",\n\t\t\t\t\t\tc.Request.Method,\n\t\t\t\t\t\tc.Request.URL,\n\t\t\t\t\t\tstatusCode,\n\t\t\t\t\t\tc.Request.RequestURI,\n\t\t\t\t\t\tc.ClientIP(),\n\t\t\t\t\t\tp[2],\n\t\t\t\t\t)\n\t\t\t\t\tc.JSON(http.StatusOK, gin.H{\n\t\t\t\t\t\t\"code\": statusCode,\n\t\t\t\t\t\t\"msg\":  p[2],\n\t\t\t\t\t})\n\t\t\t\t} else {\n\t\t\t\t\tc.JSON(http.StatusOK, gin.H{\n\t\t\t\t\t\t\"code\": 500,\n\t\t\t\t\t\t\"msg\":  errStr,\n\t\t\t\t\t})\n\t\t\t\t}\n\t\t\tcase runtime.Error:\n\t\t\t\tc.JSON(http.StatusOK, gin.H{\n\t\t\t\t\t\"code\": 500,\n\t\t\t\t\t\"msg\":  errStr.Error(),\n\t\t\t\t})\n\t\t\tdefault:\n\t\t\t\tpanic(err)\n\t\t\t}\n\t\t}\n\t}()\n\tc.Next()\n}\n"
  },
  {
    "path": "common/middleware/db.go",
    "content": "package middleware\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n)\n\nfunc WithContextDb(c *gin.Context) {\n\tc.Set(\"db\", sdk.Runtime.GetDbByKey(c.Request.Host).WithContext(c))\n\tc.Next()\n}\n"
  },
  {
    "path": "common/middleware/demo.go",
    "content": "package middleware\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"net/http\"\n)\n\nfunc DemoEvn() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tmethod := c.Request.Method\n\t\tif config.ApplicationConfig.Mode == \"demo\" {\n\t\t\tif method == \"GET\" ||\n\t\t\t\tmethod == \"OPTIONS\" ||\n\t\t\t\tc.Request.RequestURI == \"/api/v1/login\" ||\n\t\t\t\tc.Request.RequestURI == \"/api/v1/logout\" {\n\t\t\t\tc.Next()\n\t\t\t} else {\n\t\t\t\tc.JSON(http.StatusOK, gin.H{\n\t\t\t\t\t\"code\": 500,\n\t\t\t\t\t\"msg\":  \"谢谢您的参与，但为了大家更好的体验，所以本次提交就算了吧！\\U0001F600\\U0001F600\\U0001F600\",\n\t\t\t\t})\n\t\t\t\tc.Abort()\n\t\t\t\treturn\n\t\t\t}\n\t\t}\n\t\tc.Next()\n\t}\n}\n"
  },
  {
    "path": "common/middleware/handler/auth.go",
    "content": "package handler\n\nimport (\n\t\"go-admin/app/admin/models\"\n\t\"go-admin/common\"\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/captcha\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\t\"github.com/mssola/user_agent\"\n\t\"go-admin/common/global\"\n)\n\nfunc PayloadFunc(data interface{}) jwt.MapClaims {\n\tif v, ok := data.(map[string]interface{}); ok {\n\t\tu, _ := v[\"user\"].(SysUser)\n\t\tr, _ := v[\"role\"].(SysRole)\n\t\treturn jwt.MapClaims{\n\t\t\tjwt.IdentityKey:  u.UserId,\n\t\t\tjwt.RoleIdKey:    r.RoleId,\n\t\t\tjwt.RoleKey:      r.RoleKey,\n\t\t\tjwt.NiceKey:      u.Username,\n\t\t\tjwt.DataScopeKey: r.DataScope,\n\t\t\tjwt.RoleNameKey:  r.RoleName,\n\t\t}\n\t}\n\treturn jwt.MapClaims{}\n}\n\nfunc IdentityHandler(c *gin.Context) interface{} {\n\tclaims := jwt.ExtractClaims(c)\n\treturn map[string]interface{}{\n\t\t\"IdentityKey\": claims[\"identity\"],\n\t\t\"UserName\":    claims[\"nice\"],\n\t\t\"RoleKey\":     claims[\"rolekey\"],\n\t\t\"UserId\":      claims[\"identity\"],\n\t\t\"RoleIds\":     claims[\"roleid\"],\n\t\t\"DataScope\":   claims[\"datascope\"],\n\t}\n}\n\n// Authenticator 获取token\n// @Summary 登陆\n// @Description 获取token\n// @Description LoginHandler can be used by clients to get a jwt token.\n// @Description Payload needs to be json in the form of {\"username\": \"USERNAME\", \"password\": \"PASSWORD\"}.\n// @Description Reply will be of the form {\"token\": \"TOKEN\"}.\n// @Description dev mode：It should be noted that all fields cannot be empty, and a value of 0 can be passed in addition to the account password\n// @Description 注意：开发模式：需要注意全部字段不能为空，账号密码外可以传入0值\n// @Tags 登陆\n// @Accept  application/json\n// @Product application/json\n// @Param account body Login  true \"account\"\n// @Success 200 {string} string \"{\"code\": 200, \"expire\": \"2019-08-07T12:45:48+08:00\", \"token\": \".eyJleHAiOjE1NjUxNTMxNDgsImlkIjoiYWRtaW4iLCJvcmlnX2lhdCI6MTU2NTE0OTU0OH0.-zvzHvbg0A\" }\"\n// @Router /api/v1/login [post]\nfunc Authenticator(c *gin.Context) (interface{}, error) {\n\tlog := api.GetRequestLogger(c)\n\tdb, err := pkg.GetOrm(c)\n\tif err != nil {\n\t\tlog.Errorf(\"get db error, %s\", err.Error())\n\t\tresponse.Error(c, 500, err, \"数据库连接获取失败\")\n\t\treturn nil, jwt.ErrFailedAuthentication\n\t}\n\n\tvar loginVals Login\n\tvar status = \"2\"\n\tvar msg = \"登录成功\"\n\tvar username = \"\"\n\tdefer func() {\n\t\tLoginLogToDB(c, status, msg, username)\n\t}()\n\n\tif err = c.ShouldBind(&loginVals); err != nil {\n\t\tusername = loginVals.Username\n\t\tmsg = \"数据解析失败\"\n\t\tstatus = \"1\"\n\n\t\treturn nil, jwt.ErrMissingLoginValues\n\t}\n\tif config.ApplicationConfig.Mode != \"dev\" {\n\t\tif !captcha.Verify(loginVals.UUID, loginVals.Code, true) {\n\t\t\tusername = loginVals.Username\n\t\t\tmsg = \"验证码错误\"\n\t\t\tstatus = \"1\"\n\n\t\t\treturn nil, jwt.ErrInvalidVerificationode\n\t\t}\n\t}\n\tsysUser, role, e := loginVals.GetUser(db)\n\tif e == nil {\n\t\tusername = loginVals.Username\n\n\t\treturn map[string]interface{}{\"user\": sysUser, \"role\": role}, nil\n\t} else {\n\t\tmsg = \"登录失败\"\n\t\tstatus = \"1\"\n\t\tlog.Warnf(\"%s login failed!\", loginVals.Username)\n\t}\n\treturn nil, jwt.ErrFailedAuthentication\n}\n\n// LoginLogToDB Write log to database\nfunc LoginLogToDB(c *gin.Context, status string, msg string, username string) {\n\tif !config.LoggerConfig.EnabledDB {\n\t\treturn\n\t}\n\tlog := api.GetRequestLogger(c)\n\tl := make(map[string]interface{})\n\n\tua := user_agent.New(c.Request.UserAgent())\n\tl[\"ipaddr\"] = common.GetClientIP(c)\n\tl[\"loginLocation\"] = \"\" // pkg.GetLocation(common.GetClientIP(c),gaConfig.ExtConfig.AMap.Key)\n\tl[\"loginTime\"] = pkg.GetCurrentTime()\n\tl[\"status\"] = status\n\tl[\"remark\"] = c.Request.UserAgent()\n\tbrowserName, browserVersion := ua.Browser()\n\tl[\"browser\"] = browserName + \" \" + browserVersion\n\tl[\"os\"] = ua.OS()\n\tl[\"platform\"] = ua.Platform()\n\tl[\"username\"] = username\n\tl[\"msg\"] = msg\n\n\tq := sdk.Runtime.GetMemoryQueue(c.Request.Host)\n\tmessage, err := sdk.Runtime.GetStreamMessage(\"\", global.LoginLog, l)\n\tif err != nil {\n\t\tlog.Errorf(\"GetStreamMessage error, %s\", err.Error())\n\t\t//日志报错错误，不中断请求\n\t} else {\n\t\terr = q.Append(message)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Append message error, %s\", err.Error())\n\t\t}\n\t}\n}\n\n// LogOut\n// @Summary 退出登录\n// @Description 获取token\n// LoginHandler can be used by clients to get a jwt token.\n// Reply will be of the form {\"token\": \"TOKEN\"}.\n// @Accept  application/json\n// @Product application/json\n// @Success 200 {string} string \"{\"code\": 200, \"msg\": \"成功退出系统\" }\"\n// @Router /logout [post]\n// @Security Bearer\nfunc LogOut(c *gin.Context) {\n\tLoginLogToDB(c, \"2\", \"退出成功\", user.GetUserName(c))\n\tc.JSON(http.StatusOK, gin.H{\n\t\t\"code\": 200,\n\t\t\"msg\":  \"退出成功\",\n\t})\n\n}\n\nfunc Authorizator(data interface{}, c *gin.Context) bool {\n\n\tif v, ok := data.(map[string]interface{}); ok {\n\t\tu, _ := v[\"user\"].(models.SysUser)\n\t\tr, _ := v[\"role\"].(models.SysRole)\n\t\tc.Set(\"role\", r.RoleName)\n\t\tc.Set(\"roleIds\", r.RoleId)\n\t\tc.Set(\"userId\", u.UserId)\n\t\tc.Set(\"userName\", u.Username)\n\t\tc.Set(\"dataScope\", r.DataScope)\n\t\treturn true\n\t}\n\treturn false\n}\n\nfunc Unauthorized(c *gin.Context, code int, message string) {\n\tc.JSON(http.StatusOK, gin.H{\n\t\t\"code\": code,\n\t\t\"msg\":  message,\n\t})\n}\n"
  },
  {
    "path": "common/middleware/handler/httpshandler.go",
    "content": "package handler\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/unrolled/secure\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n)\n\nfunc TlsHandler() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tsecureMiddleware := secure.New(secure.Options{\n\t\t\tSSLRedirect: true,\n\t\t\tSSLHost:     config.SslConfig.Domain,\n\t\t})\n\t\terr := secureMiddleware.Process(c.Writer, c.Request)\n\t\tif err != nil {\n\t\t\treturn\n\t\t}\n\t\tc.Next()\n\t}\n}\n"
  },
  {
    "path": "common/middleware/handler/login.go",
    "content": "package handler\n\nimport (\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"gorm.io/gorm\"\n)\n\ntype Login struct {\n\tUsername string `form:\"UserName\" json:\"username\" binding:\"required\"`\n\tPassword string `form:\"Password\" json:\"password\" binding:\"required\"`\n\tCode     string `form:\"Code\" json:\"code\" binding:\"required\"`\n\tUUID     string `form:\"UUID\" json:\"uuid\" binding:\"required\"`\n}\n\nfunc (u *Login) GetUser(tx *gorm.DB) (user SysUser, role SysRole, err error) {\n\terr = tx.Table(\"sys_user\").Where(\"username = ?  and status = '2'\", u.Username).First(&user).Error\n\tif err != nil {\n\t\tlog.Errorf(\"get user error, %s\", err.Error())\n\t\treturn\n\t}\n\t_, err = pkg.CompareHashAndPassword(user.Password, u.Password)\n\tif err != nil {\n\t\tlog.Errorf(\"user login error, %s\", err.Error())\n\t\treturn\n\t}\n\terr = tx.Table(\"sys_role\").Where(\"role_id = ? \", user.RoleId).First(&role).Error\n\tif err != nil {\n\t\tlog.Errorf(\"get role error, %s\", err.Error())\n\t\treturn\n\t}\n\treturn\n}\n"
  },
  {
    "path": "common/middleware/handler/ping.go",
    "content": "package handler\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n)\n\nfunc Ping(c *gin.Context) {\n\tc.JSON(200, gin.H{\n\t\t\"message\": \"ok\",\n\t})\n}\n"
  },
  {
    "path": "common/middleware/handler/role.go",
    "content": "package handler\n\nimport \"go-admin/common/models\"\n\ntype SysRole struct {\n\tRoleId    int    `json:\"roleId\" gorm:\"primaryKey;autoIncrement\"` // 角色编码\n\tRoleName  string `json:\"roleName\" gorm:\"size:128;\"`              // 角色名称\n\tStatus    string `json:\"status\" gorm:\"size:4;\"`                  //\n\tRoleKey   string `json:\"roleKey\" gorm:\"size:128;\"`               //角色代码\n\tRoleSort  int    `json:\"roleSort\" gorm:\"\"`                       //角色排序\n\tFlag      string `json:\"flag\" gorm:\"size:128;\"`                  //\n\tRemark    string `json:\"remark\" gorm:\"size:255;\"`                //备注\n\tAdmin     bool   `json:\"admin\" gorm:\"size:4;\"`\n\tDataScope string `json:\"dataScope\" gorm:\"size:128;\"`\n\tParams    string `json:\"params\" gorm:\"-\"`\n\tMenuIds   []int  `json:\"menuIds\" gorm:\"-\"`\n\tDeptIds   []int  `json:\"deptIds\" gorm:\"-\"`\n\tmodels.ControlBy\n\tmodels.ModelTime\n}\n\nfunc (SysRole) TableName() string {\n\treturn \"sys_role\"\n}\n"
  },
  {
    "path": "common/middleware/handler/user.go",
    "content": "package handler\n\nimport (\n\t\"go-admin/common/models\"\n\t\"gorm.io/gorm\"\n)\n\ntype SysUser struct {\n\tUserId   int    `gorm:\"primaryKey;autoIncrement;comment:编码\"  json:\"userId\"`\n\tUsername string `json:\"username\" gorm:\"size:64;comment:用户名\"`\n\tPassword string `json:\"-\" gorm:\"size:128;comment:密码\"`\n\tNickName string `json:\"nickName\" gorm:\"size:128;comment:昵称\"`\n\tPhone    string `json:\"phone\" gorm:\"size:11;comment:手机号\"`\n\tRoleId   int    `json:\"roleId\" gorm:\"size:20;comment:角色ID\"`\n\tSalt     string `json:\"-\" gorm:\"size:255;comment:加盐\"`\n\tAvatar   string `json:\"avatar\" gorm:\"size:255;comment:头像\"`\n\tSex      string `json:\"sex\" gorm:\"size:255;comment:性别\"`\n\tEmail    string `json:\"email\" gorm:\"size:128;comment:邮箱\"`\n\tDeptId   int    `json:\"deptId\" gorm:\"size:20;comment:部门\"`\n\tPostId   int    `json:\"postId\" gorm:\"size:20;comment:岗位\"`\n\tRemark   string `json:\"remark\" gorm:\"size:255;comment:备注\"`\n\tStatus   string `json:\"status\" gorm:\"size:4;comment:状态\"`\n\tDeptIds  []int  `json:\"deptIds\" gorm:\"-\"`\n\tPostIds  []int  `json:\"postIds\" gorm:\"-\"`\n\tRoleIds  []int  `json:\"roleIds\" gorm:\"-\"`\n\t//Dept     *SysDept `json:\"dept\"`\n\tmodels.ControlBy\n\tmodels.ModelTime\n}\n\nfunc (*SysUser) TableName() string {\n\treturn \"sys_user\"\n}\n\nfunc (e *SysUser) AfterFind(_ *gorm.DB) error {\n\te.DeptIds = []int{e.DeptId}\n\te.PostIds = []int{e.PostId}\n\te.RoleIds = []int{e.RoleId}\n\treturn nil\n}\n"
  },
  {
    "path": "common/middleware/header.go",
    "content": "package middleware\n\nimport (\n\t\"net/http\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n)\n\n// NoCache is a middleware function that appends headers\n// to prevent the client from caching the HTTP response.\nfunc NoCache(c *gin.Context) {\n\tc.Header(\"Cache-Control\", \"no-cache, no-store, max-age=0, must-revalidate, value\")\n\tc.Header(\"Expires\", \"Thu, 01 Jan 1970 00:00:00 GMT\")\n\tc.Header(\"Last-Modified\", time.Now().UTC().Format(http.TimeFormat))\n\tc.Next()\n}\n\n// Options is a middleware function that appends headers\n// for options requests and aborts then exits the middleware\n// chain and ends the request.\nfunc Options(c *gin.Context) {\n\tif c.Request.Method != \"OPTIONS\" {\n\t\tc.Next()\n\t} else {\n\t\tc.Header(\"Access-Control-Allow-Origin\", \"*\")\n\t\tc.Header(\"Access-Control-Allow-Methods\", \"GET,POST,PUT,PATCH,DELETE,OPTIONS\")\n\t\tc.Header(\"Access-Control-Allow-Headers\", \"authorization, origin, content-type, accept\")\n\t\tc.Header(\"Allow\", \"HEAD,GET,POST,PUT,PATCH,DELETE,OPTIONS\")\n\t\tc.Header(\"Content-Type\", \"application/json\")\n\t\tc.AbortWithStatus(200)\n\t}\n}\n\n// Secure is a middleware function that appends security\n// and resource access headers.\nfunc Secure(c *gin.Context) {\n\tc.Header(\"Access-Control-Allow-Origin\", \"*\")\n\t//c.Header(\"X-Frame-Options\", \"DENY\")\n\tc.Header(\"X-Content-Type-Options\", \"nosniff\")\n\tc.Header(\"X-XSS-Protection\", \"1; mode=block\")\n\tif c.Request.TLS != nil {\n\t\tc.Header(\"Strict-Transport-Security\", \"max-age=31536000\")\n\t}\n\n\t// Also consider adding Content-Security-Policy headers\n\t// c.Header(\"Content-Security-Policy\", \"script-src 'self' https://cdnjs.cloudflare.com\")\n}\n"
  },
  {
    "path": "common/middleware/init.go",
    "content": "package middleware\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"go-admin/common/actions\"\n)\n\nconst (\n\tJwtTokenCheck   string = \"JwtToken\"\n\tRoleCheck       string = \"AuthCheckRole\"\n\tPermissionCheck string = \"PermissionAction\"\n)\n\nfunc InitMiddleware(r *gin.Engine) {\n\tr.Use(DemoEvn())\n\t// 数据库链接\n\tr.Use(WithContextDb)\n\t// 日志处理\n\tr.Use(LoggerToFile())\n\t// 自定义错误处理\n\tr.Use(CustomError)\n\t// NoCache is a middleware function that appends headers\n\tr.Use(NoCache)\n\t// 跨域处理\n\tr.Use(Options)\n\t// Secure is a middleware function that appends security\n\tr.Use(Secure)\n\t// 链路追踪\n\t//r.Use(middleware.Trace())\n\tsdk.Runtime.SetMiddleware(JwtTokenCheck, (*jwt.GinJWTMiddleware).MiddlewareFunc)\n\tsdk.Runtime.SetMiddleware(RoleCheck, AuthCheckRole())\n\tsdk.Runtime.SetMiddleware(PermissionCheck, actions.PermissionAction())\n}\n"
  },
  {
    "path": "common/middleware/logger.go",
    "content": "package middleware\n\nimport (\n\t\"bufio\"\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"go-admin/app/admin/service/dto\"\n\t\"go-admin/common\"\n\t\"io\"\n\t\"io/ioutil\"\n\t\"net/http\"\n\t\"strings\"\n\t\"time\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\n\t\"go-admin/common/global\"\n)\n\n// LoggerToFile 日志记录到文件\nfunc LoggerToFile() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tlog := api.GetRequestLogger(c)\n\t\t// 开始时间\n\t\tstartTime := time.Now()\n\t\t// 处理请求\n\t\tvar body string\n\t\tswitch c.Request.Method {\n\t\tcase http.MethodPost, http.MethodPut, http.MethodGet, http.MethodDelete:\n\t\t\tbf := bytes.NewBuffer(nil)\n\t\t\twt := bufio.NewWriter(bf)\n\t\t\t_, err := io.Copy(wt, c.Request.Body)\n\t\t\tif err != nil {\n\t\t\t\tlog.Warnf(\"copy body error, %s\", err.Error())\n\t\t\t\terr = nil\n\t\t\t}\n\t\t\trb, _ := ioutil.ReadAll(bf)\n\t\t\tc.Request.Body = ioutil.NopCloser(bytes.NewBuffer(rb))\n\t\t\tbody = string(rb)\n\t\t}\n\n\t\tc.Next()\n\t\turl := c.Request.RequestURI\n\t\tif strings.Index(url, \"logout\") > -1 ||\n\t\t\tstrings.Index(url, \"login\") > -1 {\n\t\t\treturn\n\t\t}\n\t\t// 结束时间\n\t\tendTime := time.Now()\n\t\tif c.Request.Method == http.MethodOptions {\n\t\t\treturn\n\t\t}\n\n\t\trt, bl := c.Get(\"result\")\n\t\tvar result = \"\"\n\t\tif bl {\n\t\t\trb, err := json.Marshal(rt)\n\t\t\tif err != nil {\n\t\t\t\tlog.Warnf(\"json Marshal result error, %s\", err.Error())\n\t\t\t} else {\n\t\t\t\tresult = string(rb)\n\t\t\t}\n\t\t}\n\n\t\tst, bl := c.Get(\"status\")\n\t\tvar statusBus = 0\n\t\tif bl {\n\t\t\tstatusBus = st.(int)\n\t\t}\n\n\t\t// 请求方式\n\t\treqMethod := c.Request.Method\n\t\t// 请求路由\n\t\treqUri := c.Request.RequestURI\n\t\t// 状态码\n\t\tstatusCode := c.Writer.Status()\n\t\t// 请求IP\n\t\tclientIP := common.GetClientIP(c)\n\t\t// 执行时间\n\t\tlatencyTime := endTime.Sub(startTime)\n\t\t// 日志格式\n\t\tlogData := map[string]interface{}{\n\t\t\t\"statusCode\":  statusCode,\n\t\t\t\"latencyTime\": latencyTime,\n\t\t\t\"clientIP\":    clientIP,\n\t\t\t\"method\":      reqMethod,\n\t\t\t\"uri\":         reqUri,\n\t\t}\n\t\tlog.WithFields(logData).Info()\n\t\tdefer func() {\n\t\t\tlog.Fields(map[string]interface{}{})\n\t\t}()\n\t\tif c.Request.Method != \"OPTIONS\" && config.LoggerConfig.EnabledDB && statusCode != 404 {\n\t\t\tSetDBOperLog(c, clientIP, statusCode, reqUri, reqMethod, latencyTime, body, result, statusBus)\n\t\t}\n\t}\n}\n\n// SetDBOperLog 写入操作日志表 fixme 该方法后续即将弃用\nfunc SetDBOperLog(c *gin.Context, clientIP string, statusCode int, reqUri string, reqMethod string, latencyTime time.Duration, body string, result string, status int) {\n\n\tlog := api.GetRequestLogger(c)\n\tl := make(map[string]interface{})\n\tl[\"_fullPath\"] = c.FullPath()\n\tl[\"operUrl\"] = reqUri\n\tl[\"operIp\"] = clientIP\n\tl[\"operLocation\"] = \"\" // pkg.GetLocation(clientIP, gaConfig.ExtConfig.AMap.Key)\n\tl[\"operName\"] = user.GetUserName(c)\n\tl[\"requestMethod\"] = reqMethod\n\tl[\"operParam\"] = body\n\tl[\"operTime\"] = time.Now()\n\tl[\"jsonResult\"] = result\n\tl[\"latencyTime\"] = latencyTime.String()\n\tl[\"statusCode\"] = statusCode\n\tl[\"userAgent\"] = c.Request.UserAgent()\n\tl[\"createBy\"] = user.GetUserId(c)\n\tl[\"updateBy\"] = user.GetUserId(c)\n\tif status == http.StatusOK {\n\t\tl[\"status\"] = dto.OperaStatusEnabel\n\t} else {\n\t\tl[\"status\"] = dto.OperaStatusDisable\n\t}\n\tq := sdk.Runtime.GetMemoryQueue(c.Request.Host)\n\tmessage, err := sdk.Runtime.GetStreamMessage(\"\", global.OperateLog, l)\n\tif err != nil {\n\t\tlog.Errorf(\"GetStreamMessage error, %s\", err.Error())\n\t\t// 日志报错错误，不中断请求\n\t} else {\n\t\terr = q.Append(message)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"Append message error, %s\", err.Error())\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "common/middleware/permission.go",
    "content": "package middleware\n\nimport (\n\t\"github.com/casbin/casbin/v2/util\"\n\t\"net/http\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n)\n\n// AuthCheckRole 权限检查中间件\nfunc AuthCheckRole() gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tlog := api.GetRequestLogger(c)\n\t\tdata, _ := c.Get(jwtauth.JwtPayloadKey)\n\t\tv := data.(jwtauth.MapClaims)\n\t\te := sdk.Runtime.GetCasbinKey(c.Request.Host)\n\t\tvar res, casbinExclude bool\n\t\tvar err error\n\t\t//检查权限\n\t\tif v[\"rolekey\"] == \"admin\" {\n\t\t\tres = true\n\t\t\tc.Next()\n\t\t\treturn\n\t\t}\n\t\tfor _, i := range CasbinExclude {\n\t\t\tif util.KeyMatch2(c.Request.URL.Path, i.Url) && c.Request.Method == i.Method {\n\t\t\t\tcasbinExclude = true\n\t\t\t\tbreak\n\t\t\t}\n\t\t}\n\t\tif casbinExclude {\n\t\t\tlog.Infof(\"Casbin exclusion, no validation method:%s path:%s\", c.Request.Method, c.Request.URL.Path)\n\t\t\tc.Next()\n\t\t\treturn\n\t\t}\n\t\tres, err = e.Enforce(v[\"rolekey\"], c.Request.URL.Path, c.Request.Method)\n\t\tif err != nil {\n\t\t\tlog.Errorf(\"AuthCheckRole error:%s method:%s path:%s\", err, c.Request.Method, c.Request.URL.Path)\n\t\t\tresponse.Error(c, 500, err, \"\")\n\t\t\treturn\n\t\t}\n\n\t\tif res {\n\t\t\tlog.Infof(\"isTrue: %v role: %s method: %s path: %s\", res, v[\"rolekey\"], c.Request.Method, c.Request.URL.Path)\n\t\t\tc.Next()\n\t\t} else {\n\t\t\tlog.Warnf(\"isTrue: %v role: %s method: %s path: %s message: %s\", res, v[\"rolekey\"], c.Request.Method, c.Request.URL.Path, \"当前request无权限，请管理员确认！\")\n\t\t\tc.JSON(http.StatusOK, gin.H{\n\t\t\t\t\"code\": 403,\n\t\t\t\t\"msg\":  \"对不起，您没有该接口访问权限，请联系管理员\",\n\t\t\t})\n\t\t\tc.Abort()\n\t\t\treturn\n\t\t}\n\n\t}\n}\n"
  },
  {
    "path": "common/middleware/request_id.go",
    "content": "package middleware\n\nimport (\n\t\"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"net/http\"\n\t\"strings\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/google/uuid\"\n)\n\n// RequestId 自动增加requestId\nfunc RequestId(trafficKey string) gin.HandlerFunc {\n\treturn func(c *gin.Context) {\n\t\tif c.Request.Method == http.MethodOptions {\n\t\t\tc.Next()\n\t\t\treturn\n\t\t}\n\t\trequestId := c.GetHeader(trafficKey)\n\t\tif requestId == \"\" {\n\t\t\trequestId = c.GetHeader(strings.ToLower(trafficKey))\n\t\t}\n\t\tif requestId == \"\" {\n\t\t\trequestId = uuid.New().String()\n\t\t}\n\t\tc.Request.Header.Set(trafficKey, requestId)\n\t\tc.Set(trafficKey, requestId)\n\t\tc.Set(pkg.LoggerKey,\n\t\t\tlogger.NewHelper(logger.DefaultLogger).\n\t\t\t\tWithFields(map[string]interface{}{\n\t\t\t\t\ttrafficKey: requestId,\n\t\t\t\t}))\n\t\tc.Next()\n\t}\n}\n"
  },
  {
    "path": "common/middleware/sentinel.go",
    "content": "package middleware\n\nimport (\n\t\"github.com/alibaba/sentinel-golang/core/system\"\n\tsentinel \"github.com/alibaba/sentinel-golang/pkg/adapters/gin\"\n\t\"github.com/gin-gonic/gin\"\n\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n)\n\n// Sentinel 限流\nfunc Sentinel() gin.HandlerFunc {\n\tif _, err := system.LoadRules([]*system.Rule{\n\t\t{\n\t\t\tMetricType:   system.InboundQPS,\n\t\t\tTriggerCount: 200,\n\t\t\tStrategy:     system.BBR,\n\t\t},\n\t}); err != nil {\n\t\tlog.Fatalf(\"Unexpected error: %+v\", err)\n\t}\n\treturn sentinel.SentinelMiddleware(\n\t\tsentinel.WithBlockFallback(func(ctx *gin.Context) {\n\t\t\tctx.AbortWithStatusJSON(200, map[string]interface{}{\n\t\t\t\t\"msg\":  \"too many request; the quota used up!\",\n\t\t\t\t\"code\": 500,\n\t\t\t})\n\t\t}),\n\t)\n}\n"
  },
  {
    "path": "common/middleware/settings.go",
    "content": "package middleware\n\ntype UrlInfo struct {\n\tUrl    string\n\tMethod string\n}\n\n// CasbinExclude casbin 排除的路由列表\nvar CasbinExclude = []UrlInfo{\n\t{Url: \"/api/v1/dict/type-option-select\", Method: \"GET\"},\n\t{Url: \"/api/v1/dict-data/option-select\", Method: \"GET\"},\n\t{Url: \"/api/v1/deptTree\", Method: \"GET\"},\n\t{Url: \"/api/v1/db/tables/page\", Method: \"GET\"},\n\t{Url: \"/api/v1/db/columns/page\", Method: \"GET\"},\n\t{Url: \"/api/v1/gen/toproject/:tableId\", Method: \"GET\"},\n\t{Url: \"/api/v1/gen/todb/:tableId\", Method: \"GET\"},\n\t{Url: \"/api/v1/gen/tabletree\", Method: \"GET\"},\n\t{Url: \"/api/v1/gen/preview/:tableId\", Method: \"GET\"},\n\t{Url: \"/api/v1/gen/apitofile/:tableId\", Method: \"GET\"},\n\t{Url: \"/api/v1/getCaptcha\", Method: \"GET\"},\n\t{Url: \"/api/v1/getinfo\", Method: \"GET\"},\n\t{Url: \"/api/v1/menuTreeselect\", Method: \"GET\"},\n\t{Url: \"/api/v1/menurole\", Method: \"GET\"},\n\t{Url: \"/api/v1/menuids\", Method: \"GET\"},\n\t{Url: \"/api/v1/roleMenuTreeselect/:roleId\", Method: \"GET\"},\n\t{Url: \"/api/v1/roleDeptTreeselect/:roleId\", Method: \"GET\"},\n\t{Url: \"/api/v1/refresh_token\", Method: \"GET\"},\n\t{Url: \"/api/v1/configKey/:configKey\", Method: \"GET\"},\n\t{Url: \"/api/v1/app-config\", Method: \"GET\"},\n\t{Url: \"/api/v1/user/profile\", Method: \"GET\"},\n\t{Url: \"/info\", Method: \"GET\"},\n\t{Url: \"/api/v1/login\", Method: \"POST\"},\n\t{Url: \"/api/v1/logout\", Method: \"POST\"},\n\t{Url: \"/api/v1/user/avatar\", Method: \"POST\"},\n\t{Url: \"/api/v1/user/pwd\", Method: \"PUT\"},\n\t{Url: \"/api/v1/metrics\", Method: \"GET\"},\n\t{Url: \"/api/v1/health\", Method: \"GET\"},\n\t{Url: \"/\", Method: \"GET\"},\n\t{Url: \"/api/v1/server-monitor\", Method: \"GET\"},\n\t{Url: \"/api/v1/public/uploadFile\", Method: \"POST\"},\n        {Url: \"/api/v1/user/pwd/set\", Method: \"PUT\"},\n\t{Url: \"/api/v1/sys-user\", Method: \"PUT\"},\n}\n"
  },
  {
    "path": "common/middleware/trace.go",
    "content": "package middleware\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/opentracing/opentracing-go\"\n)\n\n// Trace 链路追踪\nfunc Trace() gin.HandlerFunc {\n\treturn func(ctx *gin.Context) {\n\t\tvar sp opentracing.Span\n\t\topName := ctx.Request.URL.Path\n\t\t// Attempt to join a trace by getting trace context from the headers.\n\t\twireContext, err := opentracing.GlobalTracer().Extract(\n\t\t\topentracing.TextMap,\n\t\t\topentracing.HTTPHeadersCarrier(ctx.Request.Header))\n\t\tif err != nil {\n\t\t\t// If for whatever reason we can't join, go ahead and start a new root span.\n\t\t\tsp = opentracing.StartSpan(opName)\n\t\t} else {\n\t\t\tsp = opentracing.StartSpan(opName, opentracing.ChildOf(wireContext))\n\t\t}\n\t\tctx.Set(\"traceSpan\", sp)\n\t\tctx.Next()\n\t\tsp.Finish()\n\t}\n}\n"
  },
  {
    "path": "common/models/by.go",
    "content": "package models\n\nimport (\n\t\"time\"\n\n\t\"gorm.io/gorm\"\n)\n\ntype ControlBy struct {\n\tCreateBy int `json:\"createBy\" gorm:\"index;comment:创建者\"`\n\tUpdateBy int `json:\"updateBy\" gorm:\"index;comment:更新者\"`\n}\n\n// SetCreateBy 设置创建人id\nfunc (e *ControlBy) SetCreateBy(createBy int) {\n\te.CreateBy = createBy\n}\n\n// SetUpdateBy 设置修改人id\nfunc (e *ControlBy) SetUpdateBy(updateBy int) {\n\te.UpdateBy = updateBy\n}\n\ntype Model struct {\n\tId int `json:\"id\" gorm:\"primaryKey;autoIncrement;comment:主键编码\"`\n}\n\ntype ModelTime struct {\n\tCreatedAt time.Time      `json:\"createdAt\" gorm:\"comment:创建时间\"`\n\tUpdatedAt time.Time      `json:\"updatedAt\" gorm:\"comment:最后更新时间\"`\n\tDeletedAt gorm.DeletedAt `json:\"-\" gorm:\"index;comment:删除时间\"`\n}"
  },
  {
    "path": "common/models/menu.go",
    "content": "package models\n\n// Menu 菜单中的类型枚举值\nconst (\n\t// Directory 目录\n\tDirectory string = \"M\"\n\t// Menu 菜单\n\tMenu      string = \"C\"\n\t// Button 按钮\n\tButton    string = \"F\"\n)\n"
  },
  {
    "path": "common/models/migrate.go",
    "content": "package models\n\nimport \"time\"\n\ntype Migration struct {\n\tVersion   string    `gorm:\"primaryKey\"`\n\tApplyTime time.Time `gorm:\"autoCreateTime\"`\n}\n\nfunc (Migration) TableName() string {\n\treturn \"sys_migration\"\n}\n"
  },
  {
    "path": "common/models/response.go",
    "content": "package models\n\ntype Response struct {\n\t// 代码\n\tCode int `json:\"code\" example:\"200\"`\n\t// 数据集\n\tData interface{} `json:\"data\"`\n\t// 消息\n\tMsg       string `json:\"msg\"`\n\tRequestId string `json:\"requestId\"`\n}\n\ntype Page struct {\n\tList      interface{} `json:\"list\"`\n\tCount     int         `json:\"count\"`\n\tPageIndex int         `json:\"pageIndex\"`\n\tPageSize  int         `json:\"pageSize\"`\n}\n\n// ReturnOK 正常返回\nfunc (res *Response) ReturnOK() *Response {\n\tres.Code = 200\n\treturn res\n}\n\n// ReturnError 错误返回\nfunc (res *Response) ReturnError(code int) *Response {\n\tres.Code = code\n\treturn res\n}\n"
  },
  {
    "path": "common/models/type.go",
    "content": "package models\n\nimport \"gorm.io/gorm/schema\"\n\ntype ActiveRecord interface {\n\tschema.Tabler\n\tSetCreateBy(createBy int)\n\tSetUpdateBy(updateBy int)\n\tGenerate() ActiveRecord\n\tGetId() interface{}\n}\n"
  },
  {
    "path": "common/models/user.go",
    "content": "package models\n\nimport (\n\t\"gorm.io/gorm\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n)\n\n// BaseUser 密码登录基础用户\ntype BaseUser struct {\n\tUsername     string `json:\"username\" gorm:\"type:varchar(100);comment:用户名\"`\n\tSalt         string `json:\"-\" gorm:\"type:varchar(255);comment:加盐;<-\"`\n\tPasswordHash string `json:\"-\" gorm:\"type:varchar(128);comment:密码hash;<-\"`\n\tPassword     string `json:\"password\" gorm:\"-\"`\n}\n\n// SetPassword 设置密码\nfunc (u *BaseUser) SetPassword(value string) {\n\tu.Password = value\n\tu.generateSalt()\n\tu.PasswordHash = u.GetPasswordHash()\n}\n\n// GetPasswordHash 获取密码hash\nfunc (u *BaseUser) GetPasswordHash() string {\n\tpasswordHash, err := pkg.SetPassword(u.Password, u.Salt)\n\tif err != nil {\n\t\treturn \"\"\n\t}\n\treturn passwordHash\n}\n\n// generateSalt 生成加盐值\nfunc (u *BaseUser) generateSalt() {\n\tu.Salt = pkg.GenerateRandomKey16()\n}\n\n// Verify 验证密码\nfunc (u *BaseUser) Verify(db *gorm.DB, tableName string) bool {\n\tdb.Table(tableName).Where(\"username = ?\", u.Username).First(u)\n\treturn u.GetPasswordHash() == u.PasswordHash\n}\n"
  },
  {
    "path": "common/response/binding.go",
    "content": "package response\n\nimport (\n\t\"fmt\"\n\t\"github.com/gin-gonic/gin/binding\"\n\t\"reflect\"\n\t\"strings\"\n\t\"sync\"\n)\n\nconst (\n\t_ uint8 = iota\n\tjson\n\txml\n\tyaml\n\tform\n\tquery\n)\n\n//var constructor = &bindConstructor{}\n\ntype bindConstructor struct {\n\tcache map[string][]uint8\n\tmux   sync.Mutex\n}\n\nfunc (e *bindConstructor) GetBindingForGin(d interface{}) []binding.Binding {\n\tbs := e.getBinding(reflect.TypeOf(d).String())\n\tif bs == nil {\n\t\t//重新构建\n\t\tbs = e.resolve(d)\n\t}\n\tgbs := make([]binding.Binding, len(bs))\n\tfor i, b := range bs {\n\t\tswitch b {\n\t\tcase json:\n\t\t\tgbs[i] = binding.JSON\n\t\tcase xml:\n\t\t\tgbs[i] = binding.XML\n\t\tcase yaml:\n\t\t\tgbs[i] = binding.YAML\n\t\tcase form:\n\t\t\tgbs[i] = binding.Form\n\t\tcase query:\n\t\t\tgbs[i] = binding.Query\n\t\tdefault:\n\t\t\tgbs[i] = nil\n\t\t}\n\t}\n\treturn gbs\n}\n\nfunc (e *bindConstructor) resolve(d interface{}) []uint8 {\n\tbs := make([]uint8, 0)\n\tqType := reflect.TypeOf(d).Elem()\n\tvar tag reflect.StructTag\n\tvar ok bool\n\tfmt.Println(qType.Kind())\n\tfor i := 0; i < qType.NumField(); i++ {\n\t\ttag = qType.Field(i).Tag\n\t\tif _, ok = tag.Lookup(\"json\"); ok {\n\t\t\tbs = append(bs, json)\n\t\t}\n\t\tif _, ok = tag.Lookup(\"xml\"); ok {\n\t\t\tbs = append(bs, xml)\n\t\t}\n\t\tif _, ok = tag.Lookup(\"yaml\"); ok {\n\t\t\tbs = append(bs, yaml)\n\t\t}\n\t\tif _, ok = tag.Lookup(\"form\"); ok {\n\t\t\tbs = append(bs, form)\n\t\t}\n\t\tif _, ok = tag.Lookup(\"query\"); ok {\n\t\t\tbs = append(bs, query)\n\t\t}\n\t\tif _, ok = tag.Lookup(\"uri\"); ok {\n\t\t\tbs = append(bs, 0)\n\t\t}\n\t\tif t, ok := tag.Lookup(\"binding\"); ok && strings.Index(t, \"dive\") > -1 {\n\t\t\tqValue := reflect.ValueOf(d)\n\t\t\tbs = append(bs, e.resolve(qValue.Field(i))...)\n\t\t\tcontinue\n\t\t}\n\t\tif t, ok := tag.Lookup(\"validate\"); ok && strings.Index(t, \"dive\") > -1 {\n\t\t\tqValue := reflect.ValueOf(d)\n\t\t\tbs = append(bs, e.resolve(qValue.Field(i))...)\n\t\t}\n\t}\n\treturn bs\n}\n\nfunc (e *bindConstructor) getBinding(name string) []uint8 {\n\te.mux.Lock()\n\tdefer e.mux.Unlock()\n\treturn e.cache[name]\n}\n\nfunc (e *bindConstructor) setBinding(name string, bs []uint8) {\n\te.mux.Lock()\n\tdefer e.mux.Unlock()\n\tif e.cache == nil {\n\t\te.cache = make(map[string][]uint8)\n\t}\n\te.cache[name] = bs\n}\n"
  },
  {
    "path": "common/service/service.go",
    "content": "package service\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/go-admin-team/go-admin-core/logger\"\n\t\"gorm.io/gorm\"\n)\n\ntype Service struct {\n\tOrm   *gorm.DB\n\tMsg   string\n\tMsgID string\n\tLog   *logger.Helper\n\tError error\n}\n\nfunc (db *Service) AddError(err error) error {\n\tif db.Error == nil {\n\t\tdb.Error = err\n\t} else if err != nil {\n\t\tdb.Error = fmt.Errorf(\"%v; %w\", db.Error, err)\n\t}\n\treturn db.Error\n}\n"
  },
  {
    "path": "common/storage/initialize.go",
    "content": "/*\n * @Author: zhangwenjian\n * @Date: 2025/04/13 22:03\n * @Last Modified by: zhangwenjian\n * @Last Modified time: 2025/04/13 22:03\n */\n\npackage storage\n\nimport (\n\t\"log\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/config\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/captcha\"\n)\n\n// Setup 配置storage组件\nfunc Setup() {\n\tsetupCache()\n\tsetupCaptcha()\n\tsetupQueue()\n}\n\nfunc setupCache() {\n\tcacheAdapter, err := config.CacheConfig.Setup()\n\tif err != nil {\n\t\tlog.Fatalf(\"cache setup error, %s\\n\", err.Error())\n\t}\n\tsdk.Runtime.SetCacheAdapter(cacheAdapter)\n}\n\nfunc setupCaptcha() {\n\tcaptcha.SetStore(captcha.NewCacheStore(sdk.Runtime.GetCacheAdapter(), 600))\n}\n\nfunc setupQueue() {\n\tif config.QueueConfig.Empty() {\n\t\treturn\n\t}\n\tif q := sdk.Runtime.GetQueueAdapter(); q != nil {\n\t\tq.Shutdown()\n\t}\n\tqueueAdapter, err := config.QueueConfig.Setup()\n\tif err != nil {\n\t\tlog.Fatalf(\"queue setup error, %s\\n\", err.Error())\n\t}\n\tsdk.Runtime.SetQueueAdapter(queueAdapter)\n\tgo queueAdapter.Run()\n}\n"
  },
  {
    "path": "config/READMEN.md",
    "content": "# ⚙ 配置详情\n\n1. 配置文件说明\n```yml\nsettings:\n  application:  \n    # 项目启动环境            \n    mode: dev  # dev开发环境 prod线上环境；\n    host: 0.0.0.0  # 主机ip 或者域名，默认0.0.0.0\n    # 服务名称\n    name: go-admin   \n    # 服务端口\n    port: 8000   \n    readtimeout: 1   \n    writertimeout: 2 \n  log:\n    # 日志文件存放路径\n    dir: temp/logs\n  jwt:\n    # JWT加密字符串\n    secret: go-admin\n    # 过期时间单位：秒\n    timeout: 3600\n  database:\n    # 数据库名称\n    name: dbname \n    # 数据库类型\n    dbtype: mysql    \n    # 数据库地址\n    host: 127.0.0.1  \n    # 数据库密码\n    password: password  \n    # 数据库端口\n    port: 3306       \n    # 数据库用户名\n    username: root   \n```"
  },
  {
    "path": "config/db-begin-mysql.sql",
    "content": "SET NAMES utf8mb4;\nSET FOREIGN_KEY_CHECKS = 0;"
  },
  {
    "path": "config/db-end-mysql.sql",
    "content": "SET FOREIGN_KEY_CHECKS = 1;"
  },
  {
    "path": "config/db-sqlserver.sql",
    "content": "-- 开始初始化数据 ;\nSET IDENTITY_INSERT sys_api ON;\nINSERT INTO sys_api (id, handle, title, path, type, \"action\", created_at, updated_at, deleted_at, create_by, update_by)VALUES \n(5, 'go-admin/app/admin/apis.SysLoginLog.Get-fm', '登录日志通过id获取', '/api/v1/sys-login-log/:id', 'BUS', 'GET', '2021-05-13 19:59:00.728', '2021-06-17 11:37:12.331', NULL, 0, 0),\n(6, 'go-admin/app/admin/apis.SysOperaLog.GetPage-fm', '操作日志列表', '/api/v1/sys-opera-log', 'BUS', 'GET', '2021-05-13 19:59:00.778', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(7, 'go-admin/app/admin/apis.SysOperaLog.Get-fm', '操作日志通过id获取', '/api/v1/sys-opera-log/:id', 'BUS', 'GET', '2021-05-13 19:59:00.821', '2021-06-16 21:49:48.598', NULL, 0, 0),\n(8, 'go-admin/common/actions.IndexAction.func1', '分类列表', '/api/v1/syscategory', 'BUS', 'GET', '2021-05-13 19:59:00.870', '2021-06-13 20:53:47.883', NULL, 0, 0),\n(9, 'go-admin/common/actions.ViewAction.func1', '分类通过id获取', '/api/v1/syscategory/:id', 'BUS', 'GET', '2021-05-13 19:59:00.945', '2021-06-13 20:53:47.926', NULL, 0, 0),\n(10, 'go-admin/common/actions.IndexAction.func1', '内容列表', '/api/v1/syscontent', 'BUS', 'GET', '2021-05-13 19:59:01.005', '2021-06-13 20:53:47.966', NULL, 0, 0),\n(11, 'go-admin/common/actions.ViewAction.func1', '内容通过id获取', '/api/v1/syscontent/:id', 'BUS', 'GET', '2021-05-13 19:59:01.056', '2021-06-13 20:53:48.005', NULL, 0, 0),\n(15, 'go-admin/common/actions.IndexAction.func1', 'job列表', '/api/v1/sysjob', 'BUS', 'GET', '2021-05-13 19:59:01.248', '2021-06-13 20:53:48.169', NULL, 0, 0),\n(16, 'go-admin/common/actions.ViewAction.func1', 'job通过id获取', '/api/v1/sysjob/:id', 'BUS', 'GET', '2021-05-13 19:59:01.298', '2021-06-13 20:53:48.214', NULL, 0, 0),\n(21, 'go-admin/app/admin/apis.SysDictType.GetPage-fm', '字典类型列表', '/api/v1/dict/type', 'BUS', 'GET', '2021-05-13 19:59:01.525', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(22, 'go-admin/app/admin/apis.SysDictType.GetAll-fm', '字典类型查询【代码生成】', '/api/v1/dict/type-option-select', 'SYS', 'GET', '2021-05-13 19:59:01.582', '2021-06-13 20:53:48.388', NULL, 0, 0),\n(23, 'go-admin/app/admin/apis.SysDictType.Get-fm', '字典类型通过id获取', '/api/v1/dict/type/:id', 'BUS', 'GET', '2021-05-13 19:59:01.632', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(24, 'go-admin/app/admin/apis.SysDictData.GetPage-fm', '字典数据列表', '/api/v1/dict/data', 'BUS', 'GET', '2021-05-13 19:59:01.684', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(25, 'go-admin/app/admin/apis.SysDictData.Get-fm', '字典数据通过code获取', '/api/v1/dict/data/:dictCode', 'BUS', 'GET', '2021-05-13 19:59:01.732', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(26, 'go-admin/app/admin/apis.SysDictData.GetSysDictDataAll-fm', '数据字典根据key获取', '/api/v1/dict-data/option-select', 'SYS', 'GET', '2021-05-13 19:59:01.832', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(27, 'go-admin/app/admin/apis.SysDept.GetPage-fm', '部门列表', '/api/v1/dept', 'BUS', 'GET', '2021-05-13 19:59:01.940', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(28, 'go-admin/app/admin/apis.SysDept.Get-fm', '部门通过id获取', '/api/v1/dept/:id', 'BUS', 'GET', '2021-05-13 19:59:02.009', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(29, 'go-admin/app/admin/apis.SysDept.Get2Tree-fm', '查询部门下拉树【角色权限-自定权限】', '/api/v1/deptTree', 'SYS', 'GET', '2021-05-13 19:59:02.050', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(30, 'go-admin/app/admin/apis/tools.(*Gen).GetDBTableList-fm', '数据库表列表', '/api/v1/db/tables/page', 'SYS', 'GET', '2021-05-13 19:59:02.098', '2021-06-13 20:53:48.730', NULL, 0, 0),\n(31, 'go-admin/app/admin/apis/tools.(*Gen).GetDBColumnList-fm', '数据表列列表', '/api/v1/db/columns/page', 'SYS', 'GET', '2021-05-13 19:59:02.140', '2021-06-13 20:53:48.771', NULL, 0, 0),\n(32, 'go-admin/app/admin/apis/tools.Gen.GenCode-fm', '数据库表生成到项目', '/api/v1/gen/toproject/:tableId', 'SYS', 'GET', '2021-05-13 19:59:02.183', '2021-06-13 20:53:48.812', NULL, 0, 0),\n(33, 'go-admin/app/admin/apis/tools.Gen.GenMenuAndApi-fm', '数据库表生成到DB', '/api/v1/gen/todb/:tableId', 'SYS', 'GET', '2021-05-13 19:59:02.227', '2021-06-13 20:53:48.853', NULL, 0, 0),\n(34, 'go-admin/app/admin/apis/tools.(*SysTable).GetSysTablesTree-fm', '关系表数据【代码生成】', '/api/v1/gen/tabletree', 'SYS', 'GET', '2021-05-13 19:59:02.271', '2021-06-13 20:53:48.893', NULL, 0, 0),\n(35, 'go-admin/app/admin/apis/tools.Gen.Preview-fm', '生成预览通过id获取', '/api/v1/gen/preview/:tableId', 'SYS', 'GET', '2021-05-13 19:59:02.315', '2021-06-13 20:53:48.935', NULL, 0, 0),\n(36, 'go-admin/app/admin/apis/tools.Gen.GenApiToFile-fm', '生成api带文件', '/api/v1/gen/apitofile/:tableId', 'SYS', 'GET', '2021-05-13 19:59:02.357', '2021-06-13 20:53:48.977', NULL, 0, 0),\n(37, 'go-admin/app/admin/apis.System.GenerateCaptchaHandler-fm', '验证码获取', '/api/v1/getCaptcha', 'SYS', 'GET', '2021-05-13 19:59:02.405', '2021-06-13 20:53:49.020', NULL, 0, 0),\n(38, 'go-admin/app/admin/apis.SysUser.GetInfo-fm', '用户信息获取', '/api/v1/getinfo', 'SYS', 'GET', '2021-05-13 19:59:02.447', '2021-06-13 20:53:49.065', NULL, 0, 0),\n(39, 'go-admin/app/admin/apis.SysMenu.GetPage-fm', '菜单列表', '/api/v1/menu', 'BUS', 'GET', '2021-05-13 19:59:02.497', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(40, 'go-admin/app/admin/apis.SysMenu.GetMenuTreeSelect-fm', '查询菜单下拉树结构【废弃】', '/api/v1/menuTreeselect', 'SYS', 'GET', '2021-05-13 19:59:02.542', '2021-06-03 22:37:21.857', NULL, 0, 0),\n(41, 'go-admin/app/admin/apis.SysMenu.Get-fm', '菜单通过id获取', '/api/v1/menu/:id', 'BUS', 'GET', '2021-05-13 19:59:02.584', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(42, 'go-admin/app/admin/apis.SysMenu.GetMenuRole-fm', '角色菜单【顶部左侧菜单】', '/api/v1/menurole', 'SYS', 'GET', '2021-05-13 19:59:02.630', '2021-06-13 20:53:49.574', NULL, 0, 0),\n(43, 'go-admin/app/admin/apis.SysMenu.GetMenuIDS-fm', '获取角色对应的菜单id数组【废弃】', '/api/v1/menuids', 'SYS', 'GET', '2021-05-13 19:59:02.675', '2021-06-03 22:39:52.500', NULL, 0, 0),\n(44, 'go-admin/app/admin/apis.SysRole.GetPage-fm', '角色列表', '/api/v1/role', 'BUS', 'GET', '2021-05-13 19:59:02.720', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(45, 'go-admin/app/admin/apis.SysMenu.GetMenuTreeSelect-fm', '菜单权限列表【角色配菜单使用】', '/api/v1/roleMenuTreeselect/:roleId', 'SYS', 'GET', '2021-05-13 19:59:02.762', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(46, 'go-admin/app/admin/apis.SysDept.GetDeptTreeRoleSelect-fm', '角色部门结构树【自定义数据权限】', '/api/v1/roleDeptTreeselect/:roleId', 'SYS', 'GET', '2021-05-13 19:59:02.809', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(47, 'go-admin/app/admin/apis.SysRole.Get-fm', '角色通过id获取', '/api/v1/role/:id', 'BUS', 'GET', '2021-05-13 19:59:02.850', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(48, 'github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth.(*GinJWTMiddleware).RefreshHandler-fm', '刷新token', '/api/v1/refresh_token', 'SYS', 'GET', '2021-05-13 19:59:02.892', '2021-06-13 20:53:49.278', NULL, 0, 0),\n(53, 'go-admin/app/admin/apis.SysConfig.GetPage-fm', '参数列表', '/api/v1/config', 'BUS', 'GET', '2021-05-13 19:59:03.116', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(54, 'go-admin/app/admin/apis.SysConfig.Get-fm', '参数通过id获取', '/api/v1/config/:id', 'BUS', 'GET', '2021-05-13 19:59:03.157', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(55, 'go-admin/app/admin/apis.SysConfig.GetSysConfigByKEYForService-fm', '参数通过键名搜索【基础默认配置】', '/api/v1/configKey/:configKey', 'SYS', 'GET', '2021-05-13 19:59:03.198', '2021-06-13 20:53:49.745', NULL, 0, 0),\n(57, 'go-admin/app/jobs/apis.SysJob.RemoveJobForService-fm', 'job移除', '/api/v1/job/remove/:id', 'BUS', 'GET', '2021-05-13 19:59:03.295', '2021-06-13 20:53:49.786', NULL, 0, 0),\n(58, 'go-admin/app/jobs/apis.SysJob.StartJobForService-fm', 'job启动', '/api/v1/job/start/:id', 'BUS', 'GET', '2021-05-13 19:59:03.339', '2021-06-13 20:53:49.829', NULL, 0, 0),\n(59, 'go-admin/app/admin/apis.SysPost.GetPage-fm', '岗位列表', '/api/v1/post', 'BUS', 'GET', '2021-05-13 19:59:03.381', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(60, 'go-admin/app/admin/apis.SysPost.Get-fm', '岗位通过id获取', '/api/v1/post/:id', 'BUS', 'GET', '2021-05-13 19:59:03.433', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(62, 'go-admin/app/admin/apis.SysConfig.GetSysConfigBySysApp-fm', '系统前端参数', '/api/v1/app-config', 'SYS', 'GET', '2021-05-13 19:59:03.526', '2021-06-13 20:53:49.994', NULL, 0, 0),\n(63, 'go-admin/app/admin/apis.SysUser.GetProfile-fm', '*用户信息获取', '/api/v1/user/profile', 'SYS', 'GET', '2021-05-13 19:59:03.567', '2021-06-13 20:53:50.038', NULL, 0, 0),\n(66, 'github.com/go-admin-team/go-admin-core/sdk/pkg/ws.(*Manager).WsClient-fm', '链接ws【定时任务log】', '/ws/:id/:channel', 'BUS', 'GET', '2021-05-13 19:59:03.705', '2021-06-13 20:53:50.167', NULL, 0, 0),\n(67, 'github.com/go-admin-team/go-admin-core/sdk/pkg/ws.(*Manager).UnWsClient-fm', '退出ws【定时任务log】', '/wslogout/:id/:channel', 'BUS', 'GET', '2021-05-13 19:59:03.756', '2021-06-13 20:53:50.209', NULL, 0, 0),\n(68, 'go-admin/common/middleware/handler.Ping', '*用户基本信息', '/info', 'SYS', 'GET', '2021-05-13 19:59:03.800', '2021-06-13 20:53:50.251', NULL, 0, 0),\n(72, 'go-admin/common/actions.CreateAction.func1', '分类创建', '/api/v1/syscategory', 'BUS', 'POST', '2021-05-13 19:59:03.982', '2021-06-13 20:53:50.336', NULL, 0, 0),\n(73, 'go-admin/common/actions.CreateAction.func1', '内容创建', '/api/v1/syscontent', 'BUS', 'POST', '2021-05-13 19:59:04.027', '2021-06-13 20:53:50.375', NULL, 0, 0),\n(76, 'go-admin/common/actions.CreateAction.func1', 'job创建', '/api/v1/sysjob', 'BUS', 'POST', '2021-05-13 19:59:04.164', '2021-06-13 20:53:50.500', NULL, 0, 0),\n(80, 'go-admin/app/admin/apis.SysDictData.Insert-fm', '字典数据创建', '/api/v1/dict/data', 'BUS', 'POST', '2021-05-13 19:59:04.347', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(81, 'go-admin/app/admin/apis.SysDictType.Insert-fm', '字典类型创建', '/api/v1/dict/type', 'BUS', 'POST', '2021-05-13 19:59:04.391', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(82, 'go-admin/app/admin/apis.SysDept.Insert-fm', '部门创建', '/api/v1/dept', 'BUS', 'POST', '2021-05-13 19:59:04.435', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(85, 'github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth.(*GinJWTMiddleware).LoginHandler-fm', '*登录', '/api/v1/login', 'SYS', 'POST', '2021-05-13 19:59:04.597', '2021-06-13 20:53:50.784', NULL, 0, 0),\n(86, 'go-admin/common/middleware/handler.LogOut', '*退出', '/api/v1/logout', 'SYS', 'POST', '2021-05-13 19:59:04.642', '2021-06-13 20:53:50.824', NULL, 0, 0),\n(87, 'go-admin/app/admin/apis.SysConfig.Insert-fm', '参数创建', '/api/v1/config', 'BUS', 'POST', '2021-05-13 19:59:04.685', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(88, 'go-admin/app/admin/apis.SysMenu.Insert-fm', '菜单创建', '/api/v1/menu', 'BUS', 'POST', '2021-05-13 19:59:04.777', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(89, 'go-admin/app/admin/apis.SysPost.Insert-fm', '岗位创建', '/api/v1/post', 'BUS', 'POST', '2021-05-13 19:59:04.886', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(90, 'go-admin/app/admin/apis.SysRole.Insert-fm', '角色创建', '/api/v1/role', 'BUS', 'POST', '2021-05-13 19:59:04.975', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(91, 'go-admin/app/admin/apis.SysUser.InsetAvatar-fm', '*用户头像编辑', '/api/v1/user/avatar', 'SYS', 'POST', '2021-05-13 19:59:05.058', '2021-06-13 20:53:51.079', NULL, 0, 0),\n(92, 'go-admin/app/admin/apis.SysApi.Update-fm', '接口编辑', '/api/v1/sys-api/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.122', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(95, 'go-admin/common/actions.UpdateAction.func1', '分类编辑', '/api/v1/syscategory/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.255', '2021-06-13 20:53:51.247', NULL, 0, 0),\n(96, 'go-admin/common/actions.UpdateAction.func1', '内容编辑', '/api/v1/syscontent/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.299', '2021-06-13 20:53:51.289', NULL, 0, 0),\n(97, 'go-admin/common/actions.UpdateAction.func1', 'job编辑', '/api/v1/sysjob', 'BUS', 'PUT', '2021-05-13 19:59:05.343', '2021-06-13 20:53:51.331', NULL, 0, 0),\n(101, 'go-admin/app/admin/apis.SysDictData.Update-fm', '字典数据编辑', '/api/v1/dict/data/:dictCode', 'BUS', 'PUT', '2021-05-13 19:59:05.519', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(102, 'go-admin/app/admin/apis.SysDictType.Update-fm', '字典类型编辑', '/api/v1/dict/type/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.569', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(103, 'go-admin/app/admin/apis.SysDept.Update-fm', '部门编辑', '/api/v1/dept/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.613', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(104, 'go-admin/app/other/apis.SysFileDir.Update-fm', '文件夹编辑', '/api/v1/file-dir/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.662', '2021-06-13 20:53:51.847', NULL, 0, 0),\n(105, 'go-admin/app/other/apis.SysFileInfo.Update-fm', '文件编辑', '/api/v1/file-info/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.709', '2021-06-13 20:53:51.892', NULL, 0, 0),\n(106, 'go-admin/app/admin/apis.SysRole.Update-fm', '角色编辑', '/api/v1/role/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.752', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(107, 'go-admin/app/admin/apis.SysRole.Update2DataScope-fm', '角色数据权限修改', '/api/v1/roledatascope', 'BUS', 'PUT', '2021-05-13 19:59:05.803', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(108, 'go-admin/app/admin/apis.SysConfig.Update-fm', '参数编辑', '/api/v1/config/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.848', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(109, 'go-admin/app/admin/apis.SysMenu.Update-fm', '编辑菜单', '/api/v1/menu/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.891', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(110, 'go-admin/app/admin/apis.SysPost.Update-fm', '岗位编辑', '/api/v1/post/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.934', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(111, 'go-admin/app/admin/apis.SysUser.UpdatePwd-fm', '*用户修改密码', '/api/v1/user/pwd', 'SYS', 'PUT', '2021-05-13 19:59:05.987', '2021-06-13 20:53:51.724', NULL, 0, 0),\n(112, 'go-admin/common/actions.DeleteAction.func1', '分类删除', '/api/v1/syscategory', 'BUS', 'DELETE', '2021-05-13 19:59:06.030', '2021-06-13 20:53:52.237', NULL, 0, 0),\n(113, 'go-admin/common/actions.DeleteAction.func1', '内容删除', '/api/v1/syscontent', 'BUS', 'DELETE', '2021-05-13 19:59:06.076', '2021-06-13 20:53:52.278', NULL, 0, 0),\n(114, 'go-admin/app/admin/apis.SysLoginLog.Delete-fm', '登录日志删除', '/api/v1/sys-login-log', 'BUS', 'DELETE', '2021-05-13 19:59:06.118', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(115, 'go-admin/app/admin/apis.SysOperaLog.Delete-fm', '操作日志删除', '/api/v1/sys-opera-log', 'BUS', 'DELETE', '2021-05-13 19:59:06.162', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(116, 'go-admin/common/actions.DeleteAction.func1', 'job删除', '/api/v1/sysjob', 'BUS', 'DELETE', '2021-05-13 19:59:06.206', '2021-06-13 20:53:52.323', NULL, 0, 0),\n(117, 'go-admin/app/other/apis.SysChinaAreaData.Delete-fm', '行政区删除', '/api/v1/sys-area-data', 'BUS', 'DELETE', '2021-05-13 19:59:06.249', '2021-06-13 20:53:52.061', NULL, 0, 0),\n(120, 'go-admin/app/admin/apis.SysDictData.Delete-fm', '字典数据删除', '/api/v1/dict/data', 'BUS', 'DELETE', '2021-05-13 19:59:06.387', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(121, 'go-admin/app/admin/apis.SysDictType.Delete-fm', '字典类型删除', '/api/v1/dict/type', 'BUS', 'DELETE', '2021-05-13 19:59:06.432', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(122, 'go-admin/app/admin/apis.SysDept.Delete-fm', '部门删除', '/api/v1/dept/:id', 'BUS', 'DELETE', '2021-05-13 19:59:06.475', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(123, 'go-admin/app/other/apis.SysFileDir.Delete-fm', '文件夹删除', '/api/v1/file-dir/:id', 'BUS', 'DELETE', '2021-05-13 19:59:06.520', '2021-06-13 20:53:52.539', NULL, 0, 0),\n(124, 'go-admin/app/other/apis.SysFileInfo.Delete-fm', '文件删除', '/api/v1/file-info/:id', 'BUS', 'DELETE', '2021-05-13 19:59:06.566', '2021-06-13 20:53:52.580', NULL, 0, 0),\n(125, 'go-admin/app/admin/apis.SysConfig.Delete-fm', '参数删除', '/api/v1/config', 'BUS', 'DELETE', '2021-05-13 19:59:06.612', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(126, 'go-admin/app/admin/apis.SysMenu.Delete-fm', '删除菜单', '/api/v1/menu', 'BUS', 'DELETE', '2021-05-13 19:59:06.654', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(127, 'go-admin/app/admin/apis.SysPost.Delete-fm', '岗位删除', '/api/v1/post/:id', 'BUS', 'DELETE', '2021-05-13 19:59:06.702', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(128, 'go-admin/app/admin/apis.SysRole.Delete-fm', '角色删除', '/api/v1/role', 'BUS', 'DELETE', '2021-05-13 19:59:06.746', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(131, 'github.com/go-admin-team/go-admin-core/tools/transfer.Handler.func1', '系统指标', '/api/v1/metrics', 'SYS', 'GET', '2021-05-17 22:13:55.933', '2021-06-13 20:53:49.614', NULL, 0, 0),\n(132, 'go-admin/app/other/router.registerMonitorRouter.func1', '健康状态', '/api/v1/health', 'SYS', 'GET', '2021-05-17 22:13:56.285', '2021-06-13 20:53:49.951', NULL, 0, 0),\n(133, 'go-admin/app/admin/apis.HelloWorld', '项目默认接口', '/', 'SYS', 'GET', '2021-05-24 10:30:44.553', '2021-06-13 20:53:47.406', NULL, 0, 0),\n(134, 'go-admin/app/other/apis.ServerMonitor.ServerInfo-fm', '服务器基本状态', '/api/v1/server-monitor', 'SYS', 'GET', '2021-05-24 10:30:44.937', '2021-06-13 20:53:48.255', NULL, 0, 0),\n(135, 'go-admin/app/admin/apis.SysApi.GetPage-fm', '接口列表', '/api/v1/sys-api', 'BUS', 'GET', '2021-05-24 11:37:53.303', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(136, 'go-admin/app/admin/apis.SysApi.Get-fm', '接口通过id获取', '/api/v1/sys-api/:id', 'BUS', 'GET', '2021-05-24 11:37:53.359', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(137, 'go-admin/app/admin/apis.SysLoginLog.GetPage-fm', '登录日志列表', '/api/v1/sys-login-log', 'BUS', 'GET', '2021-05-24 11:47:30.397', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(138, 'go-admin/app/other/apis.File.UploadFile-fm', '文件上传', '/api/v1/public/uploadFile', 'SYS', 'POST', '2021-05-25 19:16:18.493', '2021-06-13 20:53:50.866', NULL, 0, 0),\n(139, 'go-admin/app/admin/apis.SysConfig.Update2Set-fm', '参数信息修改【参数配置】', '/api/v1/set-config', 'BUS', 'PUT', '2021-05-27 09:45:14.853', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(140, 'go-admin/app/admin/apis.SysConfig.Get2Set-fm', '参数获取全部【配置使用】', '/api/v1/set-config', 'BUS', 'GET', '2021-05-27 11:54:14.384', '2021-06-17 11:48:40.732', NULL, 0, 0),\n(141, 'go-admin/app/admin/apis.SysUser.GetPage-fm', '管理员列表', '/api/v1/sys-user', 'BUS', 'GET', '2021-06-13 19:24:57.111', '2021-06-17 20:31:14.318', NULL, 0, 0),\n(142, 'go-admin/app/admin/apis.SysUser.Get-fm', '管理员通过id获取', '/api/v1/sys-user/:id', 'BUS', 'GET', '2021-06-13 19:24:57.188', '2021-06-17 20:31:14.318', NULL, 0, 0),\n(143, 'go-admin/app/admin/apis/tools.(*SysTable).GetSysTablesInfo-fm', '', '/api/v1/sys/tables/info', '', 'GET', '2021-06-13 19:24:57.437', '2021-06-13 20:53:48.047', NULL, 0, 0),\n(144, 'go-admin/app/admin/apis/tools.(*SysTable).GetSysTables-fm', '', '/api/v1/sys/tables/info/:tableId', '', 'GET', '2021-06-13 19:24:57.510', '2021-06-13 20:53:48.088', NULL, 0, 0),\n(145, 'go-admin/app/admin/apis/tools.(*SysTable).GetSysTableList-fm', '', '/api/v1/sys/tables/page', '', 'GET', '2021-06-13 19:24:57.582', '2021-06-13 20:53:48.128', NULL, 0, 0),\n(146, 'github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1', '', '/static/*filepath', '', 'GET', '2021-06-13 19:24:59.641', '2021-06-13 20:53:50.081', NULL, 0, 0),\n(147, 'github.com/swaggo/gin-swagger.CustomWrapHandler.func1', '', '/swagger/*any', '', 'GET', '2021-06-13 19:24:59.713', '2021-06-13 20:53:50.123', NULL, 0, 0),\n(148, 'github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1', '', '/form-generator/*filepath', '', 'GET', '2021-06-13 19:24:59.914', '2021-06-13 20:53:50.295', NULL, 0, 0),\n(149, 'go-admin/app/admin/apis/tools.(*SysTable).InsertSysTable-fm', '', '/api/v1/sys/tables/info', '', 'POST', '2021-06-13 19:25:00.163', '2021-06-13 20:53:50.539', NULL, 0, 0),\n(150, 'go-admin/app/admin/apis.SysUser.Insert-fm', '管理员创建', '/api/v1/sys-user', 'BUS', 'POST', '2021-06-13 19:25:00.233', '2021-06-17 20:31:14.318', NULL, 0, 0),\n(151, 'go-admin/app/admin/apis.SysUser.Update-fm', '管理员编辑', '/api/v1/sys-user', 'BUS', 'PUT', '2021-06-13 19:25:00.986', '2021-06-17 20:31:14.318', NULL, 0, 0),\n(152, 'go-admin/app/admin/apis/tools.(*SysTable).UpdateSysTable-fm', '', '/api/v1/sys/tables/info', '', 'PUT', '2021-06-13 19:25:01.149', '2021-06-13 20:53:51.375', NULL, 0, 0),\n(153, 'go-admin/app/admin/apis.SysRole.Update2Status-fm', '', '/api/v1/role-status', '', 'PUT', '2021-06-13 19:25:01.446', '2021-06-13 20:53:51.636', NULL, 0, 0),\n(154, 'go-admin/app/admin/apis.SysUser.ResetPwd-fm', '', '/api/v1/user/pwd/reset', '', 'PUT', '2021-06-13 19:25:01.601', '2021-06-13 20:53:51.764', NULL, 0, 0),\n(155, 'go-admin/app/admin/apis.SysUser.UpdateStatus-fm', '', '/api/v1/user/status', '', 'PUT', '2021-06-13 19:25:01.671', '2021-06-13 20:53:51.806', NULL, 0, 0),\n(156, 'go-admin/app/admin/apis.SysUser.Delete-fm', '管理员删除', '/api/v1/sys-user', 'BUS', 'DELETE', '2021-06-13 19:25:02.043', '2021-06-17 20:31:14.318', NULL, 0, 0),\n(157, 'go-admin/app/admin/apis/tools.(*SysTable).DeleteSysTables-fm', '', '/api/v1/sys/tables/info/:tableId', '', 'DELETE', '2021-06-13 19:25:02.283', '2021-06-13 20:53:52.367', NULL, 0, 0),\n(158, 'github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1', '', '/static/*filepath', '', 'HEAD', '2021-06-13 19:25:02.734', '2021-06-13 20:53:52.791', NULL, 0, 0),\n(159, 'github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1', '', '/form-generator/*filepath', '', 'HEAD', '2021-06-13 19:25:02.808', '2021-06-13 20:53:52.838', NULL, 0, 0);\nSET IDENTITY_INSERT sys_api OFF;\n\nINSERT INTO sys_config VALUES\n(1, '皮肤样式', 'sys_index_skinName', 'skin-green', 'Y', '0', '主框架页-默认皮肤样式名称:蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', 1, 1, '2021-05-13 19:56:37.913', '2021-06-05 13:50:13.123', NULL),\n(2, '初始密码', 'sys_user_initPassword', '123456', 'Y', '0', '用户管理-账号初始密码:123456', 1, 1, '2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL),\n(3, '侧栏主题', 'sys_index_sideTheme', 'theme-dark', 'Y', '0', '主框架页-侧边栏主题:深色主题theme-dark，浅色主题theme-light', 1, 1, '2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL),\n(4, '系统名称', 'sys_app_name', 'go-admin管理系统', 'Y', '1', '', 1, 0, '2021-03-17 08:52:06.067', '2021-05-28 10:08:25.248', NULL),\n(5, '系统logo', 'sys_app_logo', 'https://gitee.com/mydearzwj/image/raw/master/img/go-admin.png', 'Y', '1', '', 1, 0, '2021-03-17 08:53:19.462', '2021-03-17 08:53:19.462', NULL);\n\nSET IDENTITY_INSERT sys_dept ON;\nINSERT INTO sys_dept (dept_id, parent_id, dept_path, dept_name, sort, leader, phone, email, status, create_by, update_by, created_at, updated_at, deleted_at)VALUES\n(1, 0, '/0/1/', '爱拓科技', 0, 'aituo', '13782218188', 'atuo@aituo.com', '2', 1, 1, '2021-05-13 19:56:37.913', '2021-06-05 17:06:44.960', NULL),\n(7, 1, '/0/1/7/', '研发部', 1, 'aituo', '13782218188', 'atuo@aituo.com', '2', 1, 1, '2021-05-13 19:56:37.913', '2021-06-16 21:35:00.109', NULL),\n(8, 1, '/0/1/8/', '运维部', 0, 'aituo', '13782218188', 'atuo@aituo.com', '2', 1, 1, '2021-05-13 19:56:37.913', '2021-06-16 21:41:39.747', NULL),\n(9, 1, '/0/1/9/', '客服部', 0, 'aituo', '13782218188', 'atuo@aituo.com', '2', 1, 1, '2021-05-13 19:56:37.913', '2021-06-05 17:07:05.993', NULL),\n(10, 1, '/0/1/10/', '人力资源', 3, 'aituo', '13782218188', 'atuo@aituo.com', '1', 1, 1, '2021-05-13 19:56:37.913', '2021-06-05 17:07:08.503', NULL);\nSET IDENTITY_INSERT sys_dept OFF;\n\nINSERT INTO sys_dict_data (dict_code, dict_sort, dict_label, dict_value, dict_type, css_class, list_class, is_default,\n                           status, \"default\", remark, create_by, update_by, created_at, updated_at, deleted_at)VALUES \n(1, 0, '正常', '2', 'sys_normal_disable', '', '', '', '2', '', '系统正常', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:40.168', NULL);\nINSERT INTO sys_dict_data VALUES (2, 0, '停用', '1', 'sys_normal_disable', '', '', '', '2', '', '系统停用', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (3, 0, '男', '0', 'sys_user_sex', '', '', '', '2', '', '性别男', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (4, 0, '女', '1', 'sys_user_sex', '', '', '', '2', '', '性别女', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (5, 0, '未知', '2', 'sys_user_sex', '', '', '', '2', '', '性别未知', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (6, 0, '显示', '0', 'sys_show_hide', '', '', '', '2', '', '显示菜单', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (7, 0, '隐藏', '1', 'sys_show_hide', '', '', '', '2', '', '隐藏菜单', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (8, 0, '是', 'Y', 'sys_yes_no', '', '', '', '2', '', '系统默认是', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (9, 0, '否', 'N', 'sys_yes_no', '', '', '', '2', '', '系统默认否', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (10, 0, '正常', '2', 'sys_job_status', '', '', '', '2', '', '正常状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (11, 0, '停用', '1', 'sys_job_status', '', '', '', '2', '', '停用状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (12, 0, '默认', 'DEFAULT', 'sys_job_group', '', '', '', '2', '', '默认分组', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (13, 0, '系统', 'SYSTEM', 'sys_job_group', '', '', '', '2', '', '系统分组', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (14, 0, '通知', '1', 'sys_notice_type', '', '', '', '2', '', '通知', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (15, 0, '公告', '2', 'sys_notice_type', '', '', '', '2', '', '公告', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (16, 0, '正常', '2', 'sys_common_status', '', '', '', '2', '', '正常状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (17, 0, '关闭', '1', 'sys_common_status', '', '', '', '2', '', '关闭状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (18, 0, '新增', '1', 'sys_oper_type', '', '', '', '2', '', '新增操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (19, 0, '修改', '2', 'sys_oper_type', '', '', '', '2', '', '修改操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (20, 0, '删除', '3', 'sys_oper_type', '', '', '', '2', '', '删除操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (21, 0, '授权', '4', 'sys_oper_type', '', '', '', '2', '', '授权操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (22, 0, '导出', '5', 'sys_oper_type', '', '', '', '2', '', '导出操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (23, 0, '导入', '6', 'sys_oper_type', '', '', '', '2', '', '导入操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (24, 0, '强退', '7', 'sys_oper_type', '', '', '', '2', '', '强退操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (25, 0, '生成代码', '8', 'sys_oper_type', '', '', '', '2', '', '生成操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (26, 0, '清空数据', '9', 'sys_oper_type', '', '', '', '2', '', '清空操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (27, 0, '成功', '0', 'sys_notice_status', '', '', '', '2', '', '成功状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (28, 0, '失败', '1', 'sys_notice_status', '', '', '', '2', '', '失败状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (29, 0, '登录', '10', 'sys_oper_type', '', '', '', '2', '', '登录操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (30, 0, '退出', '11', 'sys_oper_type', '', '', '', '2', '', '', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (31, 0, '获取验证码', '12', 'sys_oper_type', '', '', '', '2', '', '获取验证码', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (32, 0, '正常', '1', 'sys_content_status', '', '', '', '1', '', '', 1, 1, '2021-05-13 19:56:40.845', '2021-05-13 19:56:40.845', NULL);\nINSERT INTO sys_dict_data VALUES (33, 1, '禁用', '2', 'sys_content_status', '', '', '', '1', '', '', 1, 1, '2021-05-13 19:56:40.845', '2021-05-13 19:56:40.845', NULL);\n\n\nINSERT INTO sys_dict_type (dict_id, dict_name, dict_type, status, remark, create_by, update_by, created_at, updated_at,\n                           deleted_at)VALUES (1, '系统开关', 'sys_normal_disable', '2', '系统开关列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (2, '用户性别', 'sys_user_sex', '2', '用户性别列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (3, '菜单状态', 'sys_show_hide', '2', '菜单状态列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (4, '系统是否', 'sys_yes_no', '2', '系统是否列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (5, '任务状态', 'sys_job_status', '2', '任务状态列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (6, '任务分组', 'sys_job_group', '2', '任务分组列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (7, '通知类型', 'sys_notice_type', '2', '通知类型列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (8, '系统状态', 'sys_common_status', '2', '登录状态列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (9, '操作类型', 'sys_oper_type', '2', '操作类型列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (10, '通知状态', 'sys_notice_status', '2', '通知状态列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (11, '内容状态', 'sys_content_status', '2', '', 1, 1, '2021-05-13 19:56:40.813', '2021-05-13 19:56:40.813', NULL);\n\n\nINSERT INTO sys_job (job_id, job_name, job_group, job_type, cron_expression, invoke_target, args, misfire_policy, concurrent, status, entry_id, created_at, updated_at, deleted_at, create_by, update_by)VALUES \n(1, '接口测试', 'DEFAULT', 1, '0/5 * * * * ', 'http://localhost:8000', '', 1, 1, 1, 0, '2021-05-13 19:56:37.914', '2021-06-14 20:59:55.417', NULL, 1, 1),\n(2, '函数测试', 'DEFAULT', 2, '0/5 * * * * ', 'ExamplesOne', '参数', 1, 1, 1, 0, '2021-05-13 19:56:37.914', '2021-05-31 23:55:37.221', NULL, 1, 1);\n\nSET IDENTITY_INSERT sys_menu ON;\nINSERT INTO sys_menu (menu_id, menu_name, title, icon, path, paths, menu_type, \"action\", permission, parent_id, no_cache, breadcrumb, component, sort, visible, is_frame, create_by, update_by, created_at, updated_at, deleted_at)VALUES \n(2, 'Admin', '系统管理', 'api-server', '/admin', '/0/2', 'M', '无', '', 0, 1, '', 'Layout', 10, '0', '1', 0, 1, '2021-05-20 21:58:45.679', '2021-06-17 11:48:40.703', NULL),\n(3, 'SysUserManage', '用户管理', 'user', '/admin/sys-user', '/0/2/3', 'C', '无', 'admin:sysUser:list', 2, 0, '', '/admin/sys-user/index', 10, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 20:31:14.305', NULL),\n(43, '', '新增管理员', 'app-group-fill', '', '/0/2/3/43', 'F', 'POST', 'admin:sysUser:add', 3, 0, '', '', 10, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 20:31:14.305', NULL),\n(44, '', '查询管理员', 'app-group-fill', '', '/0/2/3/44', 'F', 'GET', 'admin:sysUser:query', 3, 0, '', '', 40, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 20:31:14.305', NULL),\n(45, '', '修改管理员', 'app-group-fill', '', '/0/2/3/45', 'F', 'PUT', 'admin:sysUser:edit', 3, 0, '', '', 30, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 20:31:14.305', NULL),\n(46, '', '删除管理员', 'app-group-fill', '', '/0/2/3/46', 'F', 'DELETE', 'admin:sysUser:remove', 3, 0, '', '', 20, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 20:31:14.305', NULL),\n(51, 'SysMenuManage', '菜单管理', 'tree-table', '/admin/sys-menu', '/0/2/51', 'C', '无', 'admin:sysMenu:list', 2, 1, '', '/admin/sys-menu/index', 30, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(52, 'SysRoleManage', '角色管理', 'peoples', '/admin/sys-role', '/0/2/52', 'C', '无', 'admin:sysRole:list', 2, 1, '', '/admin/sys-role/index', 20, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(56, 'SysDeptManage', '部门管理', 'tree', '/admin/sys-dept', '/0/2/56', 'C', '无', 'admin:sysDept:list', 2, 0, '', '/admin/sys-dept/index', 40, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(57, 'SysPostManage', '岗位管理', 'pass', '/admin/sys-post', '/0/2/57', 'C', '无', 'admin:sysPost:list', 2, 0, '', '/admin/sys-post/index', 50, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(58, 'Dict', '字典管理', 'education', '/admin/dict', '/0/2/58', 'C', '无', 'admin:sysDictType:list', 2, 0, '', '/admin/dict/index', 60, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(59, 'SysDictDataManage', '字典数据', 'education', '/admin/dict/data/:dictId', '/0/2/59', 'C', '无', 'admin:sysDictData:list', 2, 0, '', '/admin/dict/data', 100, '1', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(60, 'Tools', '开发工具', 'dev-tools', '/dev-tools', '/0/60', 'M', '无', '', 0, 0, '', 'Layout', 40, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-05 22:15:03.465', NULL),\n(61, 'Swagger', '系统接口', 'guide', '/dev-tools/swagger', '/0/60/61', 'C', '无', '', 60, 0, '', '/dev-tools/swagger/index', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-05 22:15:03.465', NULL),\n(62, 'SysConfigManage', '参数管理', 'swagger', '/admin/sys-config', '/0/2/62', 'C', '无', 'admin:sysConfig:list', 2, 0, '', '/admin/sys-config/index', 70, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(211, 'Log', '日志管理', 'log', '/log', '/0/2/211', 'M', '', '', 2, 0, '', '/log/index', 80, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(212, 'SysLoginLogManage', '登录日志', 'logininfor', '/admin/sys-login-log', '/0/2/211/212', 'C', '', 'admin:sysLoginLog:list', 211, 0, '', '/admin/sys-login-log/index', 1, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(216, 'OperLog', '操作日志', 'skill', '/admin/sys-oper-log', '/0/2/211/216', 'C', '', 'admin:sysOperLog:list', 211, 0, '', '/admin/sys-oper-log/index', 1, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(220, '', '新增菜单', 'app-group-fill', '', '/0/2/51/220', 'F', '', 'admin:sysMenu:add', 51, 0, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(221, '', '修改菜单', 'app-group-fill', '', '/0/2/51/221', 'F', '', 'admin:sysMenu:edit', 51, 0, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(222, '', '查询菜单', 'app-group-fill', '', '/0/2/51/222', 'F', '', 'admin:sysMenu:query', 51, 0, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(223, '', '删除菜单', 'app-group-fill', '', '/0/2/51/223', 'F', '', 'admin:sysMenu:remove', 51, 0, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(224, '', '新增角色', 'app-group-fill', '', '/0/2/52/224', 'F', '', 'admin:sysRole:add', 52, 0, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(225, '', '查询角色', 'app-group-fill', '', '/0/2/52/225', 'F', '', 'admin:sysRole:query', 52, 0, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(226, '', '修改角色', 'app-group-fill', '', '/0/2/52/226', 'F', '', 'admin:sysRole:update', 52, 0, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(227, '', '删除角色', 'app-group-fill', '', '/0/2/52/227', 'F', '', 'admin:sysRole:remove', 52, 0, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(228, '', '查询部门', 'app-group-fill', '', '/0/2/56/228', 'F', '', 'admin:sysDept:query', 56, 0, '', '', 40, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(229, '', '新增部门', 'app-group-fill', '', '/0/2/56/229', 'F', '', 'admin:sysDept:add', 56, 0, '', '', 10, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(230, '', '修改部门', 'app-group-fill', '', '/0/2/56/230', 'F', '', 'admin:sysDept:edit', 56, 0, '', '', 30, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(231, '', '删除部门', 'app-group-fill', '', '/0/2/56/231', 'F', '', 'admin:sysDept:remove', 56, 0, '', '', 20, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(232, '', '查询岗位', 'app-group-fill', '', '/0/2/57/232', 'F', '', 'admin:sysPost:query', 57, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(233, '', '新增岗位', 'app-group-fill', '', '/0/2/57/233', 'F', '', 'admin:sysPost:add', 57, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(234, '', '修改岗位', 'app-group-fill', '', '/0/2/57/234', 'F', '', 'admin:sysPost:edit', 57, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(235, '', '删除岗位', 'app-group-fill', '', '/0/2/57/235', 'F', '', 'admin:sysPost:remove', 57, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(236, '', '查询字典', 'app-group-fill', '', '/0/2/58/236', 'F', '', 'admin:sysDictType:query', 58, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(237, '', '新增类型', 'app-group-fill', '', '/0/2/58/237', 'F', '', 'admin:sysDictType:add', 58, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(238, '', '修改类型', 'app-group-fill', '', '/0/2/58/238', 'F', '', 'admin:sysDictType:edit', 58, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(239, '', '删除类型', 'app-group-fill', '', '/0/2/58/239', 'F', '', 'system:sysdicttype:remove', 58, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(240, '', '查询数据', 'app-group-fill', '', '/0/2/59/240', 'F', '', 'admin:sysDictData:query', 59, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(241, '', '新增数据', 'app-group-fill', '', '/0/2/59/241', 'F', '', 'admin:sysDictData:add', 59, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(242, '', '修改数据', 'app-group-fill', '', '/0/2/59/242', 'F', '', 'admin:sysDictData:edit', 59, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(243, '', '删除数据', 'app-group-fill', '', '/0/2/59/243', 'F', '', 'admin:sysDictData:remove', 59, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(244, '', '查询参数', 'app-group-fill', '', '/0/2/62/244', 'F', '', 'admin:sysConfig:query', 62, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(245, '', '新增参数', 'app-group-fill', '', '/0/2/62/245', 'F', '', 'admin:sysConfig:add', 62, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(246, '', '修改参数', 'app-group-fill', '', '/0/2/62/246', 'F', '', 'admin:sysConfig:edit', 62, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(247, '', '删除参数', 'app-group-fill', '', '/0/2/62/247', 'F', '', 'admin:sysConfig:remove', 62, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(248, '', '查询登录日志', 'app-group-fill', '', '/0/2/211/212/248', 'F', '', 'admin:sysLoginLog:query', 212, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(249, '', '删除登录日志', 'app-group-fill', '', '/0/2/211/212/249', 'F', '', 'admin:sysLoginLog:remove', 212, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(250, '', '查询操作日志', 'app-group-fill', '', '/0/2/211/216/250', 'F', '', 'admin:sysOperLog:query', 216, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(251, '', '删除操作日志', 'app-group-fill', '', '/0/2/211/216/251', 'F', '', 'admin:sysOperLog:remove', 216, 0, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL),\n(261, 'Gen', '代码生成', 'code', '/dev-tools/gen', '/0/60/261', 'C', '', '', 60, 0, '', '/dev-tools/gen/index', 2, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-16 21:26:12.446', NULL),\n(262, 'EditTable', '代码生成修改', 'build', '/dev-tools/editTable', '/0/60/262', 'C', '', '', 60, 0, '', '/dev-tools/gen/editTable', 100, '1', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-16 21:26:12.446', NULL),\n(264, 'Build', '表单构建', 'build', '/dev-tools/build', '/0/60/264', 'C', '', '', 60, 0, '', '/dev-tools/build/index', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-16 21:26:12.446', NULL),\n(269, 'ServerMonitor', '服务监控', 'druid', '/sys-tools/monitor', '/0/60/269', 'C', '', 'sysTools:serverMonitor:list', 537, 0, '', '/sys-tools/monitor', 0, '0', '1', 1, 1, '2020-04-14 00:28:19.000', '2021-06-16 21:26:12.446', NULL),\n(459, 'Schedule', '定时任务', 'time-range', '/schedule', '/0/459', 'M', '无', '', 0, 0, '', 'Layout', 20, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL),\n(460, 'ScheduleManage', 'Schedule', 'job', '/schedule/manage', '/0/459/460', 'C', '无', 'job:sysJob:list', 459, 0, '', '/schedule/index', 0, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL),\n(461, 'sys_job', '分页获取定时任务', 'app-group-fill', '', '/0/459/460/461', 'F', '无', 'job:sysJob:query', 460, 0, '', '', 0, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL),\n(462, 'sys_job', '创建定时任务', 'app-group-fill', '', '/0/459/460/462', 'F', '无', 'job:sysJob:add', 460, 0, '', '', 0, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL),\n(463, 'sys_job', '修改定时任务', 'app-group-fill', '', '/0/459/460/463', 'F', '无', 'job:sysJob:edit', 460, 0, '', '', 0, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL),\n(464, 'sys_job', '删除定时任务', 'app-group-fill', '', '/0/459/460/464', 'F', '无', 'job:sysJob:remove', 460, 0, '', '', 0, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL),\n(471, 'JobLog', '日志', 'bug', '/schedule/log', '/0/459/471', 'C', '', '', 459, 0, '', '/schedule/log', 0, '1', '1', 1, 1, '2020-08-05 21:24:46.000', '2021-06-05 22:15:03.465', NULL),\n(528, 'SysApiManage', '接口管理', 'api-doc', '/admin/sys-api', '/0/527/528', 'C', '无', 'admin:sysApi:list', 2, 0, '', '/admin/sys-api/index', 0, '0', '0', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(529, '', '查询接口', 'app-group-fill', '', '/0/527/528/529', 'F', '无', 'admin:sysApi:query', 528, 0, '', '', 40, '0', '0', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(531, '', '修改接口', 'app-group-fill', '', '/0/527/528/531', 'F', '无', 'admin:sysApi:edit', 528, 0, '', '', 30, '0', '0', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL),\n(537, 'SysTools', '系统工具', 'system-tools', '/sys-tools', '', 'M', '', '', 0, 0, '', 'Layout', 30, '0', '1', 1, 1, '2021-05-21 11:13:32.166', '2021-06-16 21:26:12.446', NULL),\n(540, 'SysConfigSet', '参数设置', 'system-tools', '/admin/sys-config/set', '', 'C', '', 'admin:sysConfigSet:list', 2, 0, '', '/admin/sys-config/set', 0, '0', '1', 1, 1, '2021-05-25 16:06:52.560', '2021-06-17 11:48:40.703', NULL),\n(542, '', '修改', 'upload', '', '', 'F', '', 'admin:sysConfigSet:update', 540, 0, '', '', 0, '0', '1', 1, 1, '2021-06-13 11:45:48.670', '2021-06-17 11:48:40.703', NULL);\nSET IDENTITY_INSERT sys_menu OFF;\nINSERT INTO sys_menu_api_rule (sys_menu_menu_id, sys_api_id)VALUES (216, 6);\n(250, 6),\n(58, 21),\n(236, 21),\n(238, 23),\n(59, 24),\n(240, 24),\n(242, 25),\n(58, 26),\n(236, 26),\n(56, 27),\n(228, 27),\n(230, 28),\n(226, 29),\n(51, 39),\n(51, 135),\n(222, 39),\n(221, 41),\n(52, 44),\n(225, 44),\n(226, 45),\n(226, 46),\n(226, 47),\n(62, 53),\n(244, 53),\n(246, 54),\n(57, 59),\n(232, 59),\n(234, 60),\n(241, 80),\n(237, 81),\n(229, 82),\n(245, 87),\n(220, 88),\n(233, 89),\n(224, 90),\n(531, 92),\n(242, 101),\n(238, 102),\n(230, 103),\n(226, 106),\n(226, 107),\n(246, 108),\n(221, 109),\n(234, 110),\n(249, 114),\n(251, 115),\n(243, 120),\n(239, 121),\n(231, 122),\n(247, 125),\n(223, 126),\n(235, 127),\n(227, 128),\n(528, 135),\n(529, 135),\n(531, 136),\n(212, 137),\n(248, 137),\n(542, 139),\n(540, 140),\n(3, 141),\n(44, 141),\n(45, 142),\n(43, 150),\n(45, 151),\n(46, 156);\nINSERT INTO sys_post (post_id, post_name, post_code, sort, status, remark, create_by, update_by, created_at, updated_at, deleted_at)VALUES \n(1, '首席执行官', 'CEO', 0, '2','首席执行官', 1, 1, '2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL),\n(2, '首席技术执行官', 'CTO', 2, '2','首席技术执行官', 1, 1,'2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL),\n(3, '首席运营官', 'COO', 3, '2','测试工程师', 1, 1,'2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL);\nINSERT INTO sys_role (role_id, role_name, status, role_key, role_sort, flag, remark, admin, data_scope, create_by, update_by, created_at, updated_at, deleted_at)VALUES \n(1, '系统管理员', '2', 'admin', 1, '', '', 1, '', 1, 1, '2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL);\nINSERT INTO sys_user VALUES (1, 'admin', '$2a$10$/Glr4g9Svr6O0kvjsRJCXu3f0W8/dsP3XZyVNi1019ratWpSPMyw.', 'zhangwj', '13818888888', 1, '', '', '1', '1@qq.com', 1, 1, '', '2', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:40.205', NULL);\n-- 数据完成 ;"
  },
  {
    "path": "config/db.sql",
    "content": "-- 开始初始化数据 ;\nINSERT INTO sys_api VALUES (5, 'go-admin/app/admin/apis.SysLoginLog.Get-fm', '登录日志通过id获取', '/api/v1/sys-login-log/:id', 'BUS', 'GET', '2021-05-13 19:59:00.728', '2021-06-17 11:37:12.331', NULL, 0, 0);\nINSERT INTO sys_api VALUES (6, 'go-admin/app/admin/apis.SysOperaLog.GetPage-fm', '操作日志列表', '/api/v1/sys-opera-log', 'BUS', 'GET', '2021-05-13 19:59:00.778', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (7, 'go-admin/app/admin/apis.SysOperaLog.Get-fm', '操作日志通过id获取', '/api/v1/sys-opera-log/:id', 'BUS', 'GET', '2021-05-13 19:59:00.821', '2021-06-16 21:49:48.598', NULL, 0, 0);\nINSERT INTO sys_api VALUES (8, 'go-admin/common/actions.IndexAction.func1', '分类列表', '/api/v1/syscategory', 'BUS', 'GET', '2021-05-13 19:59:00.870', '2021-06-13 20:53:47.883', NULL, 0, 0);\nINSERT INTO sys_api VALUES (9, 'go-admin/common/actions.ViewAction.func1', '分类通过id获取', '/api/v1/syscategory/:id', 'BUS', 'GET', '2021-05-13 19:59:00.945', '2021-06-13 20:53:47.926', NULL, 0, 0);\nINSERT INTO sys_api VALUES (10, 'go-admin/common/actions.IndexAction.func1', '内容列表', '/api/v1/syscontent', 'BUS', 'GET', '2021-05-13 19:59:01.005', '2021-06-13 20:53:47.966', NULL, 0, 0);\nINSERT INTO sys_api VALUES (11, 'go-admin/common/actions.ViewAction.func1', '内容通过id获取', '/api/v1/syscontent/:id', 'BUS', 'GET', '2021-05-13 19:59:01.056', '2021-06-13 20:53:48.005', NULL, 0, 0);\nINSERT INTO sys_api VALUES (15, 'go-admin/common/actions.IndexAction.func1', 'job列表', '/api/v1/sysjob', 'BUS', 'GET', '2021-05-13 19:59:01.248', '2021-06-13 20:53:48.169', NULL, 0, 0);\nINSERT INTO sys_api VALUES (16, 'go-admin/common/actions.ViewAction.func1', 'job通过id获取', '/api/v1/sysjob/:id', 'BUS', 'GET', '2021-05-13 19:59:01.298', '2021-06-13 20:53:48.214', NULL, 0, 0);\nINSERT INTO sys_api VALUES (21, 'go-admin/app/admin/apis.SysDictType.GetPage-fm', '字典类型列表', '/api/v1/dict/type', 'BUS', 'GET', '2021-05-13 19:59:01.525', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (22, 'go-admin/app/admin/apis.SysDictType.GetAll-fm', '字典类型查询【代码生成】', '/api/v1/dict/type-option-select', 'SYS', 'GET', '2021-05-13 19:59:01.582', '2021-06-13 20:53:48.388', NULL, 0, 0);\nINSERT INTO sys_api VALUES (23, 'go-admin/app/admin/apis.SysDictType.Get-fm', '字典类型通过id获取', '/api/v1/dict/type/:id', 'BUS', 'GET', '2021-05-13 19:59:01.632', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (24, 'go-admin/app/admin/apis.SysDictData.GetPage-fm', '字典数据列表', '/api/v1/dict/data', 'BUS', 'GET', '2021-05-13 19:59:01.684', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (25, 'go-admin/app/admin/apis.SysDictData.Get-fm', '字典数据通过code获取', '/api/v1/dict/data/:dictCode', 'BUS', 'GET', '2021-05-13 19:59:01.732', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (26, 'go-admin/app/admin/apis.SysDictData.GetSysDictDataAll-fm', '数据字典根据key获取', '/api/v1/dict-data/option-select', 'SYS', 'GET', '2021-05-13 19:59:01.832', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (27, 'go-admin/app/admin/apis.SysDept.GetPage-fm', '部门列表', '/api/v1/dept', 'BUS', 'GET', '2021-05-13 19:59:01.940', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (28, 'go-admin/app/admin/apis.SysDept.Get-fm', '部门通过id获取', '/api/v1/dept/:id', 'BUS', 'GET', '2021-05-13 19:59:02.009', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (29, 'go-admin/app/admin/apis.SysDept.Get2Tree-fm', '查询部门下拉树【角色权限-自定权限】', '/api/v1/deptTree', 'SYS', 'GET', '2021-05-13 19:59:02.050', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (30, 'go-admin/app/admin/apis/tools.(*Gen).GetDBTableList-fm', '数据库表列表', '/api/v1/db/tables/page', 'SYS', 'GET', '2021-05-13 19:59:02.098', '2021-06-13 20:53:48.730', NULL, 0, 0);\nINSERT INTO sys_api VALUES (31, 'go-admin/app/admin/apis/tools.(*Gen).GetDBColumnList-fm', '数据表列列表', '/api/v1/db/columns/page', 'SYS', 'GET', '2021-05-13 19:59:02.140', '2021-06-13 20:53:48.771', NULL, 0, 0);\nINSERT INTO sys_api VALUES (32, 'go-admin/app/admin/apis/tools.Gen.GenCode-fm', '数据库表生成到项目', '/api/v1/gen/toproject/:tableId', 'SYS', 'GET', '2021-05-13 19:59:02.183', '2021-06-13 20:53:48.812', NULL, 0, 0);\nINSERT INTO sys_api VALUES (33, 'go-admin/app/admin/apis/tools.Gen.GenMenuAndApi-fm', '数据库表生成到DB', '/api/v1/gen/todb/:tableId', 'SYS', 'GET', '2021-05-13 19:59:02.227', '2021-06-13 20:53:48.853', NULL, 0, 0);\nINSERT INTO sys_api VALUES (34, 'go-admin/app/admin/apis/tools.(*SysTable).GetSysTablesTree-fm', '关系表数据【代码生成】', '/api/v1/gen/tabletree', 'SYS', 'GET', '2021-05-13 19:59:02.271', '2021-06-13 20:53:48.893', NULL, 0, 0);\nINSERT INTO sys_api VALUES (35, 'go-admin/app/admin/apis/tools.Gen.Preview-fm', '生成预览通过id获取', '/api/v1/gen/preview/:tableId', 'SYS', 'GET', '2021-05-13 19:59:02.315', '2021-06-13 20:53:48.935', NULL, 0, 0);\nINSERT INTO sys_api VALUES (36, 'go-admin/app/admin/apis/tools.Gen.GenApiToFile-fm', '生成api带文件', '/api/v1/gen/apitofile/:tableId', 'SYS', 'GET', '2021-05-13 19:59:02.357', '2021-06-13 20:53:48.977', NULL, 0, 0);\nINSERT INTO sys_api VALUES (37, 'go-admin/app/admin/apis.System.GenerateCaptchaHandler-fm', '验证码获取', '/api/v1/getCaptcha', 'SYS', 'GET', '2021-05-13 19:59:02.405', '2021-06-13 20:53:49.020', NULL, 0, 0);\nINSERT INTO sys_api VALUES (38, 'go-admin/app/admin/apis.SysUser.GetInfo-fm', '用户信息获取', '/api/v1/getinfo', 'SYS', 'GET', '2021-05-13 19:59:02.447', '2021-06-13 20:53:49.065', NULL, 0, 0);\nINSERT INTO sys_api VALUES (39, 'go-admin/app/admin/apis.SysMenu.GetPage-fm', '菜单列表', '/api/v1/menu', 'BUS', 'GET', '2021-05-13 19:59:02.497', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (40, 'go-admin/app/admin/apis.SysMenu.GetMenuTreeSelect-fm', '查询菜单下拉树结构【废弃】', '/api/v1/menuTreeselect', 'SYS', 'GET', '2021-05-13 19:59:02.542', '2021-06-03 22:37:21.857', NULL, 0, 0);\nINSERT INTO sys_api VALUES (41, 'go-admin/app/admin/apis.SysMenu.Get-fm', '菜单通过id获取', '/api/v1/menu/:id', 'BUS', 'GET', '2021-05-13 19:59:02.584', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (42, 'go-admin/app/admin/apis.SysMenu.GetMenuRole-fm', '角色菜单【顶部左侧菜单】', '/api/v1/menurole', 'SYS', 'GET', '2021-05-13 19:59:02.630', '2021-06-13 20:53:49.574', NULL, 0, 0);\nINSERT INTO sys_api VALUES (43, 'go-admin/app/admin/apis.SysMenu.GetMenuIDS-fm', '获取角色对应的菜单id数组【废弃】', '/api/v1/menuids', 'SYS', 'GET', '2021-05-13 19:59:02.675', '2021-06-03 22:39:52.500', NULL, 0, 0);\nINSERT INTO sys_api VALUES (44, 'go-admin/app/admin/apis.SysRole.GetPage-fm', '角色列表', '/api/v1/role', 'BUS', 'GET', '2021-05-13 19:59:02.720', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (45, 'go-admin/app/admin/apis.SysMenu.GetMenuTreeSelect-fm', '菜单权限列表【角色配菜单使用】', '/api/v1/roleMenuTreeselect/:roleId', 'SYS', 'GET', '2021-05-13 19:59:02.762', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (46, 'go-admin/app/admin/apis.SysDept.GetDeptTreeRoleSelect-fm', '角色部门结构树【自定义数据权限】', '/api/v1/roleDeptTreeselect/:roleId', 'SYS', 'GET', '2021-05-13 19:59:02.809', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (47, 'go-admin/app/admin/apis.SysRole.Get-fm', '角色通过id获取', '/api/v1/role/:id', 'BUS', 'GET', '2021-05-13 19:59:02.850', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (48, 'github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth.(*GinJWTMiddleware).RefreshHandler-fm', '刷新token', '/api/v1/refresh_token', 'SYS', 'GET', '2021-05-13 19:59:02.892', '2021-06-13 20:53:49.278', NULL, 0, 0);\nINSERT INTO sys_api VALUES (53, 'go-admin/app/admin/apis.SysConfig.GetPage-fm', '参数列表', '/api/v1/config', 'BUS', 'GET', '2021-05-13 19:59:03.116', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (54, 'go-admin/app/admin/apis.SysConfig.Get-fm', '参数通过id获取', '/api/v1/config/:id', 'BUS', 'GET', '2021-05-13 19:59:03.157', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (55, 'go-admin/app/admin/apis.SysConfig.GetSysConfigByKEYForService-fm', '参数通过键名搜索【基础默认配置】', '/api/v1/configKey/:configKey', 'SYS', 'GET', '2021-05-13 19:59:03.198', '2021-06-13 20:53:49.745', NULL, 0, 0);\nINSERT INTO sys_api VALUES (57, 'go-admin/app/jobs/apis.SysJob.RemoveJobForService-fm', 'job移除', '/api/v1/job/remove/:id', 'BUS', 'GET', '2021-05-13 19:59:03.295', '2021-06-13 20:53:49.786', NULL, 0, 0);\nINSERT INTO sys_api VALUES (58, 'go-admin/app/jobs/apis.SysJob.StartJobForService-fm', 'job启动', '/api/v1/job/start/:id', 'BUS', 'GET', '2021-05-13 19:59:03.339', '2021-06-13 20:53:49.829', NULL, 0, 0);\nINSERT INTO sys_api VALUES (59, 'go-admin/app/admin/apis.SysPost.GetPage-fm', '岗位列表', '/api/v1/post', 'BUS', 'GET', '2021-05-13 19:59:03.381', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (60, 'go-admin/app/admin/apis.SysPost.Get-fm', '岗位通过id获取', '/api/v1/post/:id', 'BUS', 'GET', '2021-05-13 19:59:03.433', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (62, 'go-admin/app/admin/apis.SysConfig.GetSysConfigBySysApp-fm', '系统前端参数', '/api/v1/app-config', 'SYS', 'GET', '2021-05-13 19:59:03.526', '2021-06-13 20:53:49.994', NULL, 0, 0);\nINSERT INTO sys_api VALUES (63, 'go-admin/app/admin/apis.SysUser.GetProfile-fm', '*用户信息获取', '/api/v1/user/profile', 'SYS', 'GET', '2021-05-13 19:59:03.567', '2021-06-13 20:53:50.038', NULL, 0, 0);\nINSERT INTO sys_api VALUES (66, 'github.com/go-admin-team/go-admin-core/sdk/pkg/ws.(*Manager).WsClient-fm', '链接ws【定时任务log】', '/ws/:id/:channel', 'BUS', 'GET', '2021-05-13 19:59:03.705', '2021-06-13 20:53:50.167', NULL, 0, 0);\nINSERT INTO sys_api VALUES (67, 'github.com/go-admin-team/go-admin-core/sdk/pkg/ws.(*Manager).UnWsClient-fm', '退出ws【定时任务log】', '/wslogout/:id/:channel', 'BUS', 'GET', '2021-05-13 19:59:03.756', '2021-06-13 20:53:50.209', NULL, 0, 0);\nINSERT INTO sys_api VALUES (68, 'go-admin/common/middleware/handler.Ping', '*用户基本信息', '/info', 'SYS', 'GET', '2021-05-13 19:59:03.800', '2021-06-13 20:53:50.251', NULL, 0, 0);\nINSERT INTO sys_api VALUES (72, 'go-admin/common/actions.CreateAction.func1', '分类创建', '/api/v1/syscategory', 'BUS', 'POST', '2021-05-13 19:59:03.982', '2021-06-13 20:53:50.336', NULL, 0, 0);\nINSERT INTO sys_api VALUES (73, 'go-admin/common/actions.CreateAction.func1', '内容创建', '/api/v1/syscontent', 'BUS', 'POST', '2021-05-13 19:59:04.027', '2021-06-13 20:53:50.375', NULL, 0, 0);\nINSERT INTO sys_api VALUES (76, 'go-admin/common/actions.CreateAction.func1', 'job创建', '/api/v1/sysjob', 'BUS', 'POST', '2021-05-13 19:59:04.164', '2021-06-13 20:53:50.500', NULL, 0, 0);\nINSERT INTO sys_api VALUES (80, 'go-admin/app/admin/apis.SysDictData.Insert-fm', '字典数据创建', '/api/v1/dict/data', 'BUS', 'POST', '2021-05-13 19:59:04.347', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (81, 'go-admin/app/admin/apis.SysDictType.Insert-fm', '字典类型创建', '/api/v1/dict/type', 'BUS', 'POST', '2021-05-13 19:59:04.391', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (82, 'go-admin/app/admin/apis.SysDept.Insert-fm', '部门创建', '/api/v1/dept', 'BUS', 'POST', '2021-05-13 19:59:04.435', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (85, 'github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth.(*GinJWTMiddleware).LoginHandler-fm', '*登录', '/api/v1/login', 'SYS', 'POST', '2021-05-13 19:59:04.597', '2021-06-13 20:53:50.784', NULL, 0, 0);\nINSERT INTO sys_api VALUES (86, 'go-admin/common/middleware/handler.LogOut', '*退出', '/api/v1/logout', 'SYS', 'POST', '2021-05-13 19:59:04.642', '2021-06-13 20:53:50.824', NULL, 0, 0);\nINSERT INTO sys_api VALUES (87, 'go-admin/app/admin/apis.SysConfig.Insert-fm', '参数创建', '/api/v1/config', 'BUS', 'POST', '2021-05-13 19:59:04.685', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (88, 'go-admin/app/admin/apis.SysMenu.Insert-fm', '菜单创建', '/api/v1/menu', 'BUS', 'POST', '2021-05-13 19:59:04.777', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (89, 'go-admin/app/admin/apis.SysPost.Insert-fm', '岗位创建', '/api/v1/post', 'BUS', 'POST', '2021-05-13 19:59:04.886', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (90, 'go-admin/app/admin/apis.SysRole.Insert-fm', '角色创建', '/api/v1/role', 'BUS', 'POST', '2021-05-13 19:59:04.975', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (91, 'go-admin/app/admin/apis.SysUser.InsetAvatar-fm', '*用户头像编辑', '/api/v1/user/avatar', 'SYS', 'POST', '2021-05-13 19:59:05.058', '2021-06-13 20:53:51.079', NULL, 0, 0);\nINSERT INTO sys_api VALUES (92, 'go-admin/app/admin/apis.SysApi.Update-fm', '接口编辑', '/api/v1/sys-api/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.122', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (95, 'go-admin/common/actions.UpdateAction.func1', '分类编辑', '/api/v1/syscategory/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.255', '2021-06-13 20:53:51.247', NULL, 0, 0);\nINSERT INTO sys_api VALUES (96, 'go-admin/common/actions.UpdateAction.func1', '内容编辑', '/api/v1/syscontent/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.299', '2021-06-13 20:53:51.289', NULL, 0, 0);\nINSERT INTO sys_api VALUES (97, 'go-admin/common/actions.UpdateAction.func1', 'job编辑', '/api/v1/sysjob', 'BUS', 'PUT', '2021-05-13 19:59:05.343', '2021-06-13 20:53:51.331', NULL, 0, 0);\nINSERT INTO sys_api VALUES (101, 'go-admin/app/admin/apis.SysDictData.Update-fm', '字典数据编辑', '/api/v1/dict/data/:dictCode', 'BUS', 'PUT', '2021-05-13 19:59:05.519', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (102, 'go-admin/app/admin/apis.SysDictType.Update-fm', '字典类型编辑', '/api/v1/dict/type/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.569', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (103, 'go-admin/app/admin/apis.SysDept.Update-fm', '部门编辑', '/api/v1/dept/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.613', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (104, 'go-admin/app/other/apis.SysFileDir.Update-fm', '文件夹编辑', '/api/v1/file-dir/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.662', '2021-06-13 20:53:51.847', NULL, 0, 0);\nINSERT INTO sys_api VALUES (105, 'go-admin/app/other/apis.SysFileInfo.Update-fm', '文件编辑', '/api/v1/file-info/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.709', '2021-06-13 20:53:51.892', NULL, 0, 0);\nINSERT INTO sys_api VALUES (106, 'go-admin/app/admin/apis.SysRole.Update-fm', '角色编辑', '/api/v1/role/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.752', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (107, 'go-admin/app/admin/apis.SysRole.Update2DataScope-fm', '角色数据权限修改', '/api/v1/roledatascope', 'BUS', 'PUT', '2021-05-13 19:59:05.803', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (108, 'go-admin/app/admin/apis.SysConfig.Update-fm', '参数编辑', '/api/v1/config/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.848', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (109, 'go-admin/app/admin/apis.SysMenu.Update-fm', '编辑菜单', '/api/v1/menu/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.891', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (110, 'go-admin/app/admin/apis.SysPost.Update-fm', '岗位编辑', '/api/v1/post/:id', 'BUS', 'PUT', '2021-05-13 19:59:05.934', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (111, 'go-admin/app/admin/apis.SysUser.UpdatePwd-fm', '*用户修改密码', '/api/v1/user/pwd', 'SYS', 'PUT', '2021-05-13 19:59:05.987', '2021-06-13 20:53:51.724', NULL, 0, 0);\nINSERT INTO sys_api VALUES (112, 'go-admin/common/actions.DeleteAction.func1', '分类删除', '/api/v1/syscategory', 'BUS', 'DELETE', '2021-05-13 19:59:06.030', '2021-06-13 20:53:52.237', NULL, 0, 0);\nINSERT INTO sys_api VALUES (113, 'go-admin/common/actions.DeleteAction.func1', '内容删除', '/api/v1/syscontent', 'BUS', 'DELETE', '2021-05-13 19:59:06.076', '2021-06-13 20:53:52.278', NULL, 0, 0);\nINSERT INTO sys_api VALUES (114, 'go-admin/app/admin/apis.SysLoginLog.Delete-fm', '登录日志删除', '/api/v1/sys-login-log', 'BUS', 'DELETE', '2021-05-13 19:59:06.118', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (115, 'go-admin/app/admin/apis.SysOperaLog.Delete-fm', '操作日志删除', '/api/v1/sys-opera-log', 'BUS', 'DELETE', '2021-05-13 19:59:06.162', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (116, 'go-admin/common/actions.DeleteAction.func1', 'job删除', '/api/v1/sysjob', 'BUS', 'DELETE', '2021-05-13 19:59:06.206', '2021-06-13 20:53:52.323', NULL, 0, 0);\nINSERT INTO sys_api VALUES (117, 'go-admin/app/other/apis.SysChinaAreaData.Delete-fm', '行政区删除', '/api/v1/sys-area-data', 'BUS', 'DELETE', '2021-05-13 19:59:06.249', '2021-06-13 20:53:52.061', NULL, 0, 0);\nINSERT INTO sys_api VALUES (120, 'go-admin/app/admin/apis.SysDictData.Delete-fm', '字典数据删除', '/api/v1/dict/data', 'BUS', 'DELETE', '2021-05-13 19:59:06.387', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (121, 'go-admin/app/admin/apis.SysDictType.Delete-fm', '字典类型删除', '/api/v1/dict/type', 'BUS', 'DELETE', '2021-05-13 19:59:06.432', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (122, 'go-admin/app/admin/apis.SysDept.Delete-fm', '部门删除', '/api/v1/dept/:id', 'BUS', 'DELETE', '2021-05-13 19:59:06.475', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (123, 'go-admin/app/other/apis.SysFileDir.Delete-fm', '文件夹删除', '/api/v1/file-dir/:id', 'BUS', 'DELETE', '2021-05-13 19:59:06.520', '2021-06-13 20:53:52.539', NULL, 0, 0);\nINSERT INTO sys_api VALUES (124, 'go-admin/app/other/apis.SysFileInfo.Delete-fm', '文件删除', '/api/v1/file-info/:id', 'BUS', 'DELETE', '2021-05-13 19:59:06.566', '2021-06-13 20:53:52.580', NULL, 0, 0);\nINSERT INTO sys_api VALUES (125, 'go-admin/app/admin/apis.SysConfig.Delete-fm', '参数删除', '/api/v1/config', 'BUS', 'DELETE', '2021-05-13 19:59:06.612', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (126, 'go-admin/app/admin/apis.SysMenu.Delete-fm', '删除菜单', '/api/v1/menu', 'BUS', 'DELETE', '2021-05-13 19:59:06.654', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (127, 'go-admin/app/admin/apis.SysPost.Delete-fm', '岗位删除', '/api/v1/post/:id', 'BUS', 'DELETE', '2021-05-13 19:59:06.702', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (128, 'go-admin/app/admin/apis.SysRole.Delete-fm', '角色删除', '/api/v1/role', 'BUS', 'DELETE', '2021-05-13 19:59:06.746', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (131, 'github.com/go-admin-team/go-admin-core/tools/transfer.Handler.func1', '系统指标', '/api/v1/metrics', 'SYS', 'GET', '2021-05-17 22:13:55.933', '2021-06-13 20:53:49.614', NULL, 0, 0);\nINSERT INTO sys_api VALUES (132, 'go-admin/app/other/router.registerMonitorRouter.func1', '健康状态', '/api/v1/health', 'SYS', 'GET', '2021-05-17 22:13:56.285', '2021-06-13 20:53:49.951', NULL, 0, 0);\nINSERT INTO sys_api VALUES (133, 'go-admin/app/admin/apis.HelloWorld', '项目默认接口', '/', 'SYS', 'GET', '2021-05-24 10:30:44.553', '2021-06-13 20:53:47.406', NULL, 0, 0);\nINSERT INTO sys_api VALUES (134, 'go-admin/app/other/apis.ServerMonitor.ServerInfo-fm', '服务器基本状态', '/api/v1/server-monitor', 'SYS', 'GET', '2021-05-24 10:30:44.937', '2021-06-13 20:53:48.255', NULL, 0, 0);\nINSERT INTO sys_api VALUES (135, 'go-admin/app/admin/apis.SysApi.GetPage-fm', '接口列表', '/api/v1/sys-api', 'BUS', 'GET', '2021-05-24 11:37:53.303', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (136, 'go-admin/app/admin/apis.SysApi.Get-fm', '接口通过id获取', '/api/v1/sys-api/:id', 'BUS', 'GET', '2021-05-24 11:37:53.359', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (137, 'go-admin/app/admin/apis.SysLoginLog.GetPage-fm', '登录日志列表', '/api/v1/sys-login-log', 'BUS', 'GET', '2021-05-24 11:47:30.397', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (138, 'go-admin/app/other/apis.File.UploadFile-fm', '文件上传', '/api/v1/public/uploadFile', 'SYS', 'POST', '2021-05-25 19:16:18.493', '2021-06-13 20:53:50.866', NULL, 0, 0);\nINSERT INTO sys_api VALUES (139, 'go-admin/app/admin/apis.SysConfig.Update2Set-fm', '参数信息修改【参数配置】', '/api/v1/set-config', 'BUS', 'PUT', '2021-05-27 09:45:14.853', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (140, 'go-admin/app/admin/apis.SysConfig.Get2Set-fm', '参数获取全部【配置使用】', '/api/v1/set-config', 'BUS', 'GET', '2021-05-27 11:54:14.384', '2021-06-17 11:48:40.732', NULL, 0, 0);\nINSERT INTO sys_api VALUES (141, 'go-admin/app/admin/apis.SysUser.GetPage-fm', '管理员列表', '/api/v1/sys-user', 'BUS', 'GET', '2021-06-13 19:24:57.111', '2021-06-17 20:31:14.318', NULL, 0, 0);\nINSERT INTO sys_api VALUES (142, 'go-admin/app/admin/apis.SysUser.Get-fm', '管理员通过id获取', '/api/v1/sys-user/:id', 'BUS', 'GET', '2021-06-13 19:24:57.188', '2021-06-17 20:31:14.318', NULL, 0, 0);\nINSERT INTO sys_api VALUES (143, 'go-admin/app/admin/apis/tools.(*SysTable).GetSysTablesInfo-fm', '', '/api/v1/sys/tables/info', '', 'GET', '2021-06-13 19:24:57.437', '2021-06-13 20:53:48.047', NULL, 0, 0);\nINSERT INTO sys_api VALUES (144, 'go-admin/app/admin/apis/tools.(*SysTable).GetSysTables-fm', '', '/api/v1/sys/tables/info/:tableId', '', 'GET', '2021-06-13 19:24:57.510', '2021-06-13 20:53:48.088', NULL, 0, 0);\nINSERT INTO sys_api VALUES (145, 'go-admin/app/admin/apis/tools.(*SysTable).GetSysTableList-fm', '', '/api/v1/sys/tables/page', '', 'GET', '2021-06-13 19:24:57.582', '2021-06-13 20:53:48.128', NULL, 0, 0);\nINSERT INTO sys_api VALUES (146, 'github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1', '', '/static/*filepath', '', 'GET', '2021-06-13 19:24:59.641', '2021-06-13 20:53:50.081', NULL, 0, 0);\nINSERT INTO sys_api VALUES (147, 'github.com/swaggo/gin-swagger.CustomWrapHandler.func1', '', '/swagger/*any', '', 'GET', '2021-06-13 19:24:59.713', '2021-06-13 20:53:50.123', NULL, 0, 0);\nINSERT INTO sys_api VALUES (148, 'github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1', '', '/form-generator/*filepath', '', 'GET', '2021-06-13 19:24:59.914', '2021-06-13 20:53:50.295', NULL, 0, 0);\nINSERT INTO sys_api VALUES (149, 'go-admin/app/admin/apis/tools.(*SysTable).InsertSysTable-fm', '', '/api/v1/sys/tables/info', '', 'POST', '2021-06-13 19:25:00.163', '2021-06-13 20:53:50.539', NULL, 0, 0);\nINSERT INTO sys_api VALUES (150, 'go-admin/app/admin/apis.SysUser.Insert-fm', '管理员创建', '/api/v1/sys-user', 'BUS', 'POST', '2021-06-13 19:25:00.233', '2021-06-17 20:31:14.318', NULL, 0, 0);\nINSERT INTO sys_api VALUES (151, 'go-admin/app/admin/apis.SysUser.Update-fm', '管理员编辑', '/api/v1/sys-user', 'BUS', 'PUT', '2021-06-13 19:25:00.986', '2021-06-17 20:31:14.318', NULL, 0, 0);\nINSERT INTO sys_api VALUES (152, 'go-admin/app/admin/apis/tools.(*SysTable).UpdateSysTable-fm', '', '/api/v1/sys/tables/info', '', 'PUT', '2021-06-13 19:25:01.149', '2021-06-13 20:53:51.375', NULL, 0, 0);\nINSERT INTO sys_api VALUES (153, 'go-admin/app/admin/apis.SysRole.Update2Status-fm', '', '/api/v1/role-status', '', 'PUT', '2021-06-13 19:25:01.446', '2021-06-13 20:53:51.636', NULL, 0, 0);\nINSERT INTO sys_api VALUES (154, 'go-admin/app/admin/apis.SysUser.ResetPwd-fm', '', '/api/v1/user/pwd/reset', '', 'PUT', '2021-06-13 19:25:01.601', '2021-06-13 20:53:51.764', NULL, 0, 0);\nINSERT INTO sys_api VALUES (155, 'go-admin/app/admin/apis.SysUser.UpdateStatus-fm', '', '/api/v1/user/status', '', 'PUT', '2021-06-13 19:25:01.671', '2021-06-13 20:53:51.806', NULL, 0, 0);\nINSERT INTO sys_api VALUES (156, 'go-admin/app/admin/apis.SysUser.Delete-fm', '管理员删除', '/api/v1/sys-user', 'BUS', 'DELETE', '2021-06-13 19:25:02.043', '2021-06-17 20:31:14.318', NULL, 0, 0);\nINSERT INTO sys_api VALUES (157, 'go-admin/app/admin/apis/tools.(*SysTable).DeleteSysTables-fm', '', '/api/v1/sys/tables/info/:tableId', '', 'DELETE', '2021-06-13 19:25:02.283', '2021-06-13 20:53:52.367', NULL, 0, 0);\nINSERT INTO sys_api VALUES (158, 'github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1', '', '/static/*filepath', '', 'HEAD', '2021-06-13 19:25:02.734', '2021-06-13 20:53:52.791', NULL, 0, 0);\nINSERT INTO sys_api VALUES (159, 'github.com/gin-gonic/gin.(*RouterGroup).createStaticHandler.func1', '', '/form-generator/*filepath', '', 'HEAD', '2021-06-13 19:25:02.808', '2021-06-13 20:53:52.838', NULL, 0, 0);\n\nINSERT INTO sys_config VALUES (1, '皮肤样式', 'sys_index_skinName', 'skin-green', 'Y', '0', '主框架页-默认皮肤样式名称:蓝色 skin-blue、绿色 skin-green、紫色 skin-purple、红色 skin-red、黄色 skin-yellow', 1, 1, '2021-05-13 19:56:37.913', '2021-06-05 13:50:13.123', NULL);\nINSERT INTO sys_config VALUES (2, '初始密码', 'sys_user_initPassword', '123456', 'Y', '0', '用户管理-账号初始密码:123456', 1, 1, '2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL);\nINSERT INTO sys_config VALUES (3, '侧栏主题', 'sys_index_sideTheme', 'theme-dark', 'Y', '0', '主框架页-侧边栏主题:深色主题theme-dark，浅色主题theme-light', 1, 1, '2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL);\nINSERT INTO sys_config VALUES (4, '系统名称', 'sys_app_name', 'go-admin管理系统', 'Y', '1', '', 1, 0, '2021-03-17 08:52:06.067', '2021-05-28 10:08:25.248', NULL);\nINSERT INTO sys_config VALUES (5, '系统logo', 'sys_app_logo', 'https://doc-image.zhangwj.com/img/go-admin.png', 'Y', '1', '', 1, 0, '2021-03-17 08:53:19.462', '2021-03-17 08:53:19.462', NULL);\n\nINSERT INTO sys_dept VALUES (1, 0, '/0/1/', '爱拓科技', 0, 'aituo', '13782218188', 'atuo@aituo.com', '2', 1, 1, '2021-05-13 19:56:37.913', '2021-06-05 17:06:44.960', NULL);\nINSERT INTO sys_dept VALUES (7, 1, '/0/1/7/', '研发部', 1, 'aituo', '13782218188', 'atuo@aituo.com', '2', 1, 1, '2021-05-13 19:56:37.913', '2021-06-16 21:35:00.109', NULL);\nINSERT INTO sys_dept VALUES (8, 1, '/0/1/8/', '运维部', 0, 'aituo', '13782218188', 'atuo@aituo.com', '2', 1, 1, '2021-05-13 19:56:37.913', '2021-06-16 21:41:39.747', NULL);\nINSERT INTO sys_dept VALUES (9, 1, '/0/1/9/', '客服部', 0, 'aituo', '13782218188', 'atuo@aituo.com', '2', 1, 1, '2021-05-13 19:56:37.913', '2021-06-05 17:07:05.993', NULL);\nINSERT INTO sys_dept VALUES (10, 1, '/0/1/10/', '人力资源', 3, 'aituo', '13782218188', 'atuo@aituo.com', '1', 1, 1, '2021-05-13 19:56:37.913', '2021-06-05 17:07:08.503', NULL);\n\nINSERT INTO sys_dict_data VALUES (1, 0, '正常', '2', 'sys_normal_disable', '', '', '', '2', '', '系统正常', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:40.168', NULL);\nINSERT INTO sys_dict_data VALUES (2, 0, '停用', '1', 'sys_normal_disable', '', '', '', '2', '', '系统停用', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (3, 0, '男', '0', 'sys_user_sex', '', '', '', '2', '', '性别男', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (4, 0, '女', '1', 'sys_user_sex', '', '', '', '2', '', '性别女', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (5, 0, '未知', '2', 'sys_user_sex', '', '', '', '2', '', '性别未知', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (6, 0, '显示', '0', 'sys_show_hide', '', '', '', '2', '', '显示菜单', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (7, 0, '隐藏', '1', 'sys_show_hide', '', '', '', '2', '', '隐藏菜单', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (8, 0, '是', 'Y', 'sys_yes_no', '', '', '', '2', '', '系统默认是', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (9, 0, '否', 'N', 'sys_yes_no', '', '', '', '2', '', '系统默认否', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (10, 0, '正常', '2', 'sys_job_status', '', '', '', '2', '', '正常状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (11, 0, '停用', '1', 'sys_job_status', '', '', '', '2', '', '停用状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (12, 0, '默认', 'DEFAULT', 'sys_job_group', '', '', '', '2', '', '默认分组', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (13, 0, '系统', 'SYSTEM', 'sys_job_group', '', '', '', '2', '', '系统分组', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (14, 0, '通知', '1', 'sys_notice_type', '', '', '', '2', '', '通知', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (15, 0, '公告', '2', 'sys_notice_type', '', '', '', '2', '', '公告', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (16, 0, '正常', '2', 'sys_common_status', '', '', '', '2', '', '正常状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (17, 0, '关闭', '1', 'sys_common_status', '', '', '', '2', '', '关闭状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (18, 0, '新增', '1', 'sys_oper_type', '', '', '', '2', '', '新增操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (19, 0, '修改', '2', 'sys_oper_type', '', '', '', '2', '', '修改操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (20, 0, '删除', '3', 'sys_oper_type', '', '', '', '2', '', '删除操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (21, 0, '授权', '4', 'sys_oper_type', '', '', '', '2', '', '授权操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (22, 0, '导出', '5', 'sys_oper_type', '', '', '', '2', '', '导出操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (23, 0, '导入', '6', 'sys_oper_type', '', '', '', '2', '', '导入操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (24, 0, '强退', '7', 'sys_oper_type', '', '', '', '2', '', '强退操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (25, 0, '生成代码', '8', 'sys_oper_type', '', '', '', '2', '', '生成操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (26, 0, '清空数据', '9', 'sys_oper_type', '', '', '', '2', '', '清空操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (27, 0, '成功', '0', 'sys_notice_status', '', '', '', '2', '', '成功状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (28, 0, '失败', '1', 'sys_notice_status', '', '', '', '2', '', '失败状态', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (29, 0, '登录', '10', 'sys_oper_type', '', '', '', '2', '', '登录操作', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (30, 0, '退出', '11', 'sys_oper_type', '', '', '', '2', '', '', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (31, 0, '获取验证码', '12', 'sys_oper_type', '', '', '', '2', '', '获取验证码', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_data VALUES (32, 0, '正常', '1', 'sys_content_status', '', '', '', '1', '', '', 1, 1, '2021-05-13 19:56:40.845', '2021-05-13 19:56:40.845', NULL);\nINSERT INTO sys_dict_data VALUES (33, 1, '禁用', '2', 'sys_content_status', '', '', '', '1', '', '', 1, 1, '2021-05-13 19:56:40.845', '2021-05-13 19:56:40.845', NULL);\n\nINSERT INTO sys_dict_type VALUES (1, '系统开关', 'sys_normal_disable', '2', '系统开关列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (2, '用户性别', 'sys_user_sex', '2', '用户性别列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (3, '菜单状态', 'sys_show_hide', '2', '菜单状态列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (4, '系统是否', 'sys_yes_no', '2', '系统是否列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (5, '任务状态', 'sys_job_status', '2', '任务状态列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (6, '任务分组', 'sys_job_group', '2', '任务分组列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (7, '通知类型', 'sys_notice_type', '2', '通知类型列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (8, '系统状态', 'sys_common_status', '2', '登录状态列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (9, '操作类型', 'sys_oper_type', '2', '操作类型列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (10, '通知状态', 'sys_notice_status', '2', '通知状态列表', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:37.914', NULL);\nINSERT INTO sys_dict_type VALUES (11, '内容状态', 'sys_content_status', '2', '', 1, 1, '2021-05-13 19:56:40.813', '2021-05-13 19:56:40.813', NULL);\n\nINSERT INTO sys_job VALUES (1, '接口测试', 'DEFAULT', 1, '0/5 * * * * ', 'http://localhost:8000', '', 1, 1, 1, 0, '2021-05-13 19:56:37.914', '2021-06-14 20:59:55.417', NULL, 1, 1);\nINSERT INTO sys_job VALUES (2, '函数测试', 'DEFAULT', 2, '0/5 * * * * ', 'ExamplesOne', '参数', 1, 1, 1, 0, '2021-05-13 19:56:37.914', '2021-05-31 23:55:37.221', NULL, 1, 1);\n\nINSERT INTO sys_menu VALUES (2, 'Admin', '系统管理', 'api-server', '/admin', '/0/2', 'M', '无', '', 0, true, '', 'Layout', 10, '0', '1', 0, 1, '2021-05-20 21:58:45.679', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (3, 'SysUserManage', '用户管理', 'user', '/admin/sys-user', '/0/2/3', 'C', '无', 'admin:sysUser:list', 2, false, '', '/admin/sys-user/index', 10, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 20:31:14.305', NULL);\nINSERT INTO sys_menu VALUES (43, '', '新增管理员', 'app-group-fill', '', '/0/2/3/43', 'F', 'POST', 'admin:sysUser:add', 3, false, '', '', 10, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 20:31:14.305', NULL);\nINSERT INTO sys_menu VALUES (44, '', '查询管理员', 'app-group-fill', '', '/0/2/3/44', 'F', 'GET', 'admin:sysUser:query', 3, false, '', '', 40, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 20:31:14.305', NULL);\nINSERT INTO sys_menu VALUES (45, '', '修改管理员', 'app-group-fill', '', '/0/2/3/45', 'F', 'PUT', 'admin:sysUser:edit', 3, false, '', '', 30, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 20:31:14.305', NULL);\nINSERT INTO sys_menu VALUES (46, '', '删除管理员', 'app-group-fill', '', '/0/2/3/46', 'F', 'DELETE', 'admin:sysUser:remove', 3, false, '', '', 20, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 20:31:14.305', NULL);\nINSERT INTO sys_menu VALUES (51, 'SysMenuManage', '菜单管理', 'tree-table', '/admin/sys-menu', '/0/2/51', 'C', '无', 'admin:sysMenu:list', 2, true, '', '/admin/sys-menu/index', 30, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (52, 'SysRoleManage', '角色管理', 'peoples', '/admin/sys-role', '/0/2/52', 'C', '无', 'admin:sysRole:list', 2, true, '', '/admin/sys-role/index', 20, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (56, 'SysDeptManage', '部门管理', 'tree', '/admin/sys-dept', '/0/2/56', 'C', '无', 'admin:sysDept:list', 2, false, '', '/admin/sys-dept/index', 40, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (57, 'SysPostManage', '岗位管理', 'pass', '/admin/sys-post', '/0/2/57', 'C', '无', 'admin:sysPost:list', 2, false, '', '/admin/sys-post/index', 50, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (58, 'Dict', '字典管理', 'education', '/admin/dict', '/0/2/58', 'C', '无', 'admin:sysDictType:list', 2, false, '', '/admin/dict/index', 60, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (59, 'SysDictDataManage', '字典数据', 'education', '/admin/dict/data/:dictId', '/0/2/59', 'C', '无', 'admin:sysDictData:list', 2, false, '', '/admin/dict/data', 100, '1', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (60, 'Tools', '开发工具', 'dev-tools', '/dev-tools', '/0/60', 'M', '无', '', 0, false, '', 'Layout', 40, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-05 22:15:03.465', NULL);\nINSERT INTO sys_menu VALUES (61, 'Swagger', '系统接口', 'guide', '/dev-tools/swagger', '/0/60/61', 'C', '无', '', 60, false, '', '/dev-tools/swagger/index', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-05 22:15:03.465', NULL);\nINSERT INTO sys_menu VALUES (62, 'SysConfigManage', '参数管理', 'swagger', '/admin/sys-config', '/0/2/62', 'C', '无', 'admin:sysConfig:list', 2, false, '', '/admin/sys-config/index', 70, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (211, 'Log', '日志管理', 'log', '/log', '/0/2/211', 'M', '', '', 2, false, '', '/log/index', 80, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (212, 'SysLoginLogManage', '登录日志', 'logininfor', '/admin/sys-login-log', '/0/2/211/212', 'C', '', 'admin:sysLoginLog:list', 211, false, '', '/admin/sys-login-log/index', 1, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (216, 'OperLog', '操作日志', 'skill', '/admin/sys-oper-log', '/0/2/211/216', 'C', '', 'admin:sysOperLog:list', 211, false, '', '/admin/sys-oper-log/index', 1, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (220, '', '新增菜单', 'app-group-fill', '', '/0/2/51/220', 'F', '', 'admin:sysMenu:add', 51, false, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (221, '', '修改菜单', 'app-group-fill', '', '/0/2/51/221', 'F', '', 'admin:sysMenu:edit', 51, false, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (222, '', '查询菜单', 'app-group-fill', '', '/0/2/51/222', 'F', '', 'admin:sysMenu:query', 51, false, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (223, '', '删除菜单', 'app-group-fill', '', '/0/2/51/223', 'F', '', 'admin:sysMenu:remove', 51, false, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (224, '', '新增角色', 'app-group-fill', '', '/0/2/52/224', 'F', '', 'admin:sysRole:add', 52, false, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (225, '', '查询角色', 'app-group-fill', '', '/0/2/52/225', 'F', '', 'admin:sysRole:query', 52, false, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (226, '', '修改角色', 'app-group-fill', '', '/0/2/52/226', 'F', '', 'admin:sysRole:update', 52, false, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (227, '', '删除角色', 'app-group-fill', '', '/0/2/52/227', 'F', '', 'admin:sysRole:remove', 52, false, '', '', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (228, '', '查询部门', 'app-group-fill', '', '/0/2/56/228', 'F', '', 'admin:sysDept:query', 56, false, '', '', 40, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (229, '', '新增部门', 'app-group-fill', '', '/0/2/56/229', 'F', '', 'admin:sysDept:add', 56, false, '', '', 10, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (230, '', '修改部门', 'app-group-fill', '', '/0/2/56/230', 'F', '', 'admin:sysDept:edit', 56, false, '', '', 30, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (231, '', '删除部门', 'app-group-fill', '', '/0/2/56/231', 'F', '', 'admin:sysDept:remove', 56, false, '', '', 20, '0', '1', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (232, '', '查询岗位', 'app-group-fill', '', '/0/2/57/232', 'F', '', 'admin:sysPost:query', 57, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (233, '', '新增岗位', 'app-group-fill', '', '/0/2/57/233', 'F', '', 'admin:sysPost:add', 57, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (234, '', '修改岗位', 'app-group-fill', '', '/0/2/57/234', 'F', '', 'admin:sysPost:edit', 57, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (235, '', '删除岗位', 'app-group-fill', '', '/0/2/57/235', 'F', '', 'admin:sysPost:remove', 57, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (236, '', '查询字典', 'app-group-fill', '', '/0/2/58/236', 'F', '', 'admin:sysDictType:query', 58, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (237, '', '新增类型', 'app-group-fill', '', '/0/2/58/237', 'F', '', 'admin:sysDictType:add', 58, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (238, '', '修改类型', 'app-group-fill', '', '/0/2/58/238', 'F', '', 'admin:sysDictType:edit', 58, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (239, '', '删除类型', 'app-group-fill', '', '/0/2/58/239', 'F', '', 'system:sysdicttype:remove', 58, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (240, '', '查询数据', 'app-group-fill', '', '/0/2/59/240', 'F', '', 'admin:sysDictData:query', 59, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (241, '', '新增数据', 'app-group-fill', '', '/0/2/59/241', 'F', '', 'admin:sysDictData:add', 59, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (242, '', '修改数据', 'app-group-fill', '', '/0/2/59/242', 'F', '', 'admin:sysDictData:edit', 59, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (243, '', '删除数据', 'app-group-fill', '', '/0/2/59/243', 'F', '', 'admin:sysDictData:remove', 59, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (244, '', '查询参数', 'app-group-fill', '', '/0/2/62/244', 'F', '', 'admin:sysConfig:query', 62, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (245, '', '新增参数', 'app-group-fill', '', '/0/2/62/245', 'F', '', 'admin:sysConfig:add', 62, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (246, '', '修改参数', 'app-group-fill', '', '/0/2/62/246', 'F', '', 'admin:sysConfig:edit', 62, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (247, '', '删除参数', 'app-group-fill', '', '/0/2/62/247', 'F', '', 'admin:sysConfig:remove', 62, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (248, '', '查询登录日志', 'app-group-fill', '', '/0/2/211/212/248', 'F', '', 'admin:sysLoginLog:query', 212, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (249, '', '删除登录日志', 'app-group-fill', '', '/0/2/211/212/249', 'F', '', 'admin:sysLoginLog:remove', 212, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (250, '', '查询操作日志', 'app-group-fill', '', '/0/2/211/216/250', 'F', '', 'admin:sysOperLog:query', 216, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (251, '', '删除操作日志', 'app-group-fill', '', '/0/2/211/216/251', 'F', '', 'admin:sysOperLog:remove', 216, false, '', '', 0, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (261, 'Gen', '代码生成', 'code', '/dev-tools/gen', '/0/60/261', 'C', '', '', 60, false, '', '/dev-tools/gen/index', 2, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-16 21:26:12.446', NULL);\nINSERT INTO sys_menu VALUES (262, 'EditTable', '代码生成修改', 'build', '/dev-tools/editTable', '/0/60/262', 'C', '', '', 60, false, '', '/dev-tools/gen/editTable', 100, '1', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-16 21:26:12.446', NULL);\nINSERT INTO sys_menu VALUES (264, 'Build', '表单构建', 'build', '/dev-tools/build', '/0/60/264', 'C', '', '', 60, false, '', '/dev-tools/build/index', 1, '0', '1', 1, 1, '2020-04-11 15:52:48.000', '2021-06-16 21:26:12.446', NULL);\nINSERT INTO sys_menu VALUES (269, 'ServerMonitor', '服务监控', 'druid', '/sys-tools/monitor', '/0/60/269', 'C', '', 'sysTools:serverMonitor:list', 537, false, '', '/sys-tools/monitor', 0, '0', '1', 1, 1, '2020-04-14 00:28:19.000', '2021-06-16 21:26:12.446', NULL);\nINSERT INTO sys_menu VALUES (459, 'Schedule', '定时任务', 'time-range', '/schedule', '/0/459', 'M', '无', '', 0, false, '', 'Layout', 20, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL);\nINSERT INTO sys_menu VALUES (460, 'ScheduleManage', 'Schedule', 'job', '/schedule/manage', '/0/459/460', 'C', '无', 'job:sysJob:list', 459, false, '', '/schedule/index', 0, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL);\nINSERT INTO sys_menu VALUES (461, 'sys_job', '分页获取定时任务', 'app-group-fill', '', '/0/459/460/461', 'F', '无', 'job:sysJob:query', 460, false, '', '', 0, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL);\nINSERT INTO sys_menu VALUES (462, 'sys_job', '创建定时任务', 'app-group-fill', '', '/0/459/460/462', 'F', '无', 'job:sysJob:add', 460, false, '', '', 0, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL);\nINSERT INTO sys_menu VALUES (463, 'sys_job', '修改定时任务', 'app-group-fill', '', '/0/459/460/463', 'F', '无', 'job:sysJob:edit', 460, false, '', '', 0, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL);\nINSERT INTO sys_menu VALUES (464, 'sys_job', '删除定时任务', 'app-group-fill', '', '/0/459/460/464', 'F', '无', 'job:sysJob:remove', 460, false, '', '', 0, '0', '1', 1, 1, '2020-08-03 09:17:37.000', '2021-06-05 22:15:03.465', NULL);\nINSERT INTO sys_menu VALUES (471, 'JobLog', '日志', 'bug', '/schedule/log', '/0/459/471', 'C', '', '', 459, false, '', '/schedule/log', 0, '1', '1', 1, 1, '2020-08-05 21:24:46.000', '2021-06-05 22:15:03.465', NULL);\nINSERT INTO sys_menu VALUES (528, 'SysApiManage', '接口管理', 'api-doc', '/admin/sys-api', '/0/527/528', 'C', '无', 'admin:sysApi:list', 2, false, '', '/admin/sys-api/index', 0, '0', '0', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (529, '', '查询接口', 'app-group-fill', '', '/0/527/528/529', 'F', '无', 'admin:sysApi:query', 528, false, '', '', 40, '0', '0', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (531, '', '修改接口', 'app-group-fill', '', '/0/527/528/531', 'F', '无', 'admin:sysApi:edit', 528, false, '', '', 30, '0', '0', 0, 1, '2021-05-20 22:08:44.526', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (537, 'SysTools', '系统工具', 'system-tools', '/sys-tools', '', 'M', '', '', 0, false, '', 'Layout', 30, '0', '1', 1, 1, '2021-05-21 11:13:32.166', '2021-06-16 21:26:12.446', NULL);\nINSERT INTO sys_menu VALUES (540, 'SysConfigSet', '参数设置', 'system-tools', '/admin/sys-config/set', '', 'C', '', 'admin:sysConfigSet:list', 2, false, '', '/admin/sys-config/set', 0, '0', '1', 1, 1, '2021-05-25 16:06:52.560', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu VALUES (542, '', '修改', 'upload', '', '', 'F', '', 'admin:sysConfigSet:update', 540, false, '', '', 0, '0', '1', 1, 1, '2021-06-13 11:45:48.670', '2021-06-17 11:48:40.703', NULL);\nINSERT INTO sys_menu_api_rule VALUES (216, 6);\nINSERT INTO sys_menu_api_rule VALUES (250, 6);\nINSERT INTO sys_menu_api_rule VALUES (58, 21);\nINSERT INTO sys_menu_api_rule VALUES (236, 21);\nINSERT INTO sys_menu_api_rule VALUES (238, 23);\nINSERT INTO sys_menu_api_rule VALUES (59, 24);\nINSERT INTO sys_menu_api_rule VALUES (240, 24);\nINSERT INTO sys_menu_api_rule VALUES (242, 25);\nINSERT INTO sys_menu_api_rule VALUES (58, 26);\nINSERT INTO sys_menu_api_rule VALUES (236, 26);\nINSERT INTO sys_menu_api_rule VALUES (56, 27);\nINSERT INTO sys_menu_api_rule VALUES (228, 27);\nINSERT INTO sys_menu_api_rule VALUES (230, 28);\nINSERT INTO sys_menu_api_rule VALUES (226, 29);\nINSERT INTO sys_menu_api_rule VALUES (51, 39);\nINSERT INTO sys_menu_api_rule VALUES (51, 135);\nINSERT INTO sys_menu_api_rule VALUES (222, 39);\nINSERT INTO sys_menu_api_rule VALUES (221, 41);\nINSERT INTO sys_menu_api_rule VALUES (52, 44);\nINSERT INTO sys_menu_api_rule VALUES (225, 44);\nINSERT INTO sys_menu_api_rule VALUES (226, 45);\nINSERT INTO sys_menu_api_rule VALUES (226, 46);\nINSERT INTO sys_menu_api_rule VALUES (226, 47);\nINSERT INTO sys_menu_api_rule VALUES (62, 53);\nINSERT INTO sys_menu_api_rule VALUES (244, 53);\nINSERT INTO sys_menu_api_rule VALUES (246, 54);\nINSERT INTO sys_menu_api_rule VALUES (57, 59);\nINSERT INTO sys_menu_api_rule VALUES (232, 59);\nINSERT INTO sys_menu_api_rule VALUES (234, 60);\nINSERT INTO sys_menu_api_rule VALUES (241, 80);\nINSERT INTO sys_menu_api_rule VALUES (237, 81);\nINSERT INTO sys_menu_api_rule VALUES (229, 82);\nINSERT INTO sys_menu_api_rule VALUES (245, 87);\nINSERT INTO sys_menu_api_rule VALUES (220, 88);\nINSERT INTO sys_menu_api_rule VALUES (233, 89);\nINSERT INTO sys_menu_api_rule VALUES (224, 90);\nINSERT INTO sys_menu_api_rule VALUES (531, 92);\nINSERT INTO sys_menu_api_rule VALUES (242, 101);\nINSERT INTO sys_menu_api_rule VALUES (238, 102);\nINSERT INTO sys_menu_api_rule VALUES (230, 103);\nINSERT INTO sys_menu_api_rule VALUES (226, 106);\nINSERT INTO sys_menu_api_rule VALUES (226, 107);\nINSERT INTO sys_menu_api_rule VALUES (246, 108);\nINSERT INTO sys_menu_api_rule VALUES (221, 109);\nINSERT INTO sys_menu_api_rule VALUES (234, 110);\nINSERT INTO sys_menu_api_rule VALUES (249, 114);\nINSERT INTO sys_menu_api_rule VALUES (251, 115);\nINSERT INTO sys_menu_api_rule VALUES (243, 120);\nINSERT INTO sys_menu_api_rule VALUES (239, 121);\nINSERT INTO sys_menu_api_rule VALUES (231, 122);\nINSERT INTO sys_menu_api_rule VALUES (247, 125);\nINSERT INTO sys_menu_api_rule VALUES (223, 126);\nINSERT INTO sys_menu_api_rule VALUES (235, 127);\nINSERT INTO sys_menu_api_rule VALUES (227, 128);\nINSERT INTO sys_menu_api_rule VALUES (528, 135);\nINSERT INTO sys_menu_api_rule VALUES (529, 135);\nINSERT INTO sys_menu_api_rule VALUES (531, 136);\nINSERT INTO sys_menu_api_rule VALUES (212, 137);\nINSERT INTO sys_menu_api_rule VALUES (248, 137);\nINSERT INTO sys_menu_api_rule VALUES (542, 139);\nINSERT INTO sys_menu_api_rule VALUES (540, 140);\nINSERT INTO sys_menu_api_rule VALUES (3, 141);\nINSERT INTO sys_menu_api_rule VALUES (44, 141);\nINSERT INTO sys_menu_api_rule VALUES (45, 142);\nINSERT INTO sys_menu_api_rule VALUES (43, 150);\nINSERT INTO sys_menu_api_rule VALUES (45, 151);\nINSERT INTO sys_menu_api_rule VALUES (46, 156);\nINSERT INTO sys_post VALUES (1, '首席执行官', 'CEO', 0, '2','首席执行官', 1, 1, '2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL);\nINSERT INTO sys_post VALUES (2, '首席技术执行官', 'CTO', 2, '2','首席技术执行官', 1, 1,'2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL);\nINSERT INTO sys_post VALUES (3, '首席运营官', 'COO', 3, '2','测试工程师', 1, 1,'2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL);\nINSERT INTO sys_role VALUES (1, '系统管理员', '2', 'admin', 1, '', '', true, '', 1, 1, '2021-05-13 19:56:37.913', '2021-05-13 19:56:37.913', NULL);\nINSERT INTO sys_user VALUES (1, 'admin', '$2a$10$/Glr4g9Svr6O0kvjsRJCXu3f0W8/dsP3XZyVNi1019ratWpSPMyw.', 'zhangwj', '13818888888', 1, '', '', '1', '1@qq.com', 1, 1, '', '2', 1, 1, '2021-05-13 19:56:37.914', '2021-05-13 19:56:40.205', NULL);\n-- 数据完成 ;"
  },
  {
    "path": "config/extend.go",
    "content": "package config\n\nvar ExtConfig Extend\n\n// Extend 扩展配置\n//  extend:\n//    demo:\n//      name: demo-name\n// 使用方法： config.ExtConfig......即可！！\ntype Extend struct {\n\tAMap AMap   // 这里配置对应配置文件的结构即可\n}\n\ntype AMap struct {\n\tKey string\n}\n"
  },
  {
    "path": "config/pg.sql",
    "content": "-- 开始初始化数据 ;\ncreate sequence if not exists sys_role_role_id_seq;\ncreate sequence if not exists sys_user_user_id_seq;\ncreate sequence if not exists sys_post_post_id_seq;\ncreate sequence if not exists sys_menu_menu_id_seq;\ncreate sequence if not exists sys_dict_type_dict_id_seq;\ncreate sequence if not exists sys_dict_data_dict_code_seq;\ncreate sequence if not exists sys_dept_dept_id_seq;\ncreate sequence if not exists sys_config_config_id_seq;\ncreate sequence if not exists sys_job_id_seq;\n\nselect setval('sys_role_role_id_seq',4);\nselect setval('sys_user_user_id_seq',5);\nselect setval('sys_post_post_id_seq',4);\nselect setval('sys_menu_menu_id_seq',543);\nselect setval('sys_dict_type_dict_id_seq',12);\nselect setval('sys_dict_data_dict_code_seq',34);\nselect setval('sys_dept_dept_id_seq',11);\nselect setval('sys_config_config_id_seq',6);\nselect setval('sys_job_id_seq',3);\n-- 数据完成 ;\n"
  },
  {
    "path": "config/settings.demo.yml",
    "content": "settings:\n  application:\n    demomsg: \"谢谢您的参与，但为了大家更好的体验，所以本次提交就算了吧！\\U0001F600\\U0001F600\\U0001F600\"\n    enabledp: true\n    host: 0.0.0.0\n    mode: demo\n    name: testApp\n    port: 8000\n    readtimeout: 10000\n    writertimeout: 20000\n  database:\n    driver: sqlite3\n    source: ./go-admin-db.db\n  gen:\n    dbname: testhhh\n    frontpath: ../go-admin-ui/src\n  jwt:\n    secret: go-admin\n    timeout: 3600\n  logger:\n    # 日志存放路径\n    path: temp/logs\n    # 日志输出，file：文件，default：命令行，其他：命令行\n    stdout: '' #控制台日志，启用后，不输出到文件\n    # 日志等级, trace, debug, info, warn, error, fatal\n    level: trace\n    # 数据库日志开关\n    enableddb: true\n  queue:\n    memory:\n      poolSize: 100\n  extend:\n    amap:\n      key: de7a062c984bf828d5d1b3a631a517e4"
  },
  {
    "path": "config/settings.full.yml",
    "content": "settings:\n  application:\n    # dev开发环境 test测试环境 prod线上环境\n    mode: dev\n    # 服务器ip，默认使用 0.0.0.0\n    host: 0.0.0.0\n    # 服务名称\n    name: testApp\n    # 端口号\n    port: 8000 # 服务端口号\n    readtimeout: 1\n    writertimeout: 2\n    # 数据权限功能开关\n    enabledp: false\n  ssl:\n    # https对应的域名\n    domain: localhost:8000\n    # https开关\n    enable: false\n    # ssl 证书key\n    key: keystring\n    # ssl 证书路径\n    pem: temp/pem.pem\n  logger:\n    # 日志存放路径\n    path: temp/logs\n    # 日志输出，file：文件，default：命令行，其他：命令行\n    stdout: '' #控制台日志，启用后，不输出到文件\n    # 日志等级, trace, debug, info, warn, error, fatal\n    level: trace\n    # 数据库日志开关\n    enableddb: false\n  jwt:\n    # token 密钥，生产环境时及的修改\n    secret: go-admin\n    # token 过期时间 单位：秒\n    timeout: 3600\n  database:\n    # 数据库类型 mysql，sqlite3， postgres\n    driver: mysql\n    # 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms\n    source: user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms\n    # source: sqlite3.db\n    # source: host=myhost port=myport user=gorm dbname=gorm password=mypassword\n    registers:\n      - sources:\n          - user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms\n  gen:\n    # 代码生成读取的数据库名称\n    dbname: dbname\n    # 代码生成是使用前端代码存放位置，需要指定到src文件夹，相对路径\n    frontpath: ../go-admin-ui/src\n  queue:\n    memory:\n      poolSize: 100\n  extend: # 扩展项使用说明\n    demo:\n      name: data\n"
  },
  {
    "path": "config/settings.sqlite.yml",
    "content": "settings:\n  application:\n    # dev开发环境 test测试环境 prod线上环境\n    mode: dev\n    # 服务器ip，默认使用 0.0.0.0\n    host: 0.0.0.0\n    # 服务名称\n    name: testApp\n    # 端口号\n    port: 8000 # 服务端口号\n    readtimeout: 3000\n    writertimeout: 2000\n    # 数据权限功能开关\n    enabledp: false\n  logger:\n    # 日志存放路径\n    path: temp/logs\n    # 日志输出，file：文件，default：命令行，其他：命令行\n    stdout: '' #控制台日志，启用后，不输出到文件\n    # 日志等级, trace, debug, info, warn, error, fatal\n    level: trace\n    # 数据库日志开关\n    enableddb: false\n  jwt:\n    # token 密钥，生产环境时及的修改\n    secret: go-admin\n    # token 过期时间 单位：秒\n    timeout: 3600\n  database:\n    # 数据库类型 mysql，sqlite3， postgres\n    driver: sqlite3\n    # 数据库连接sqlite3数据文件的路径\n    source: go-admin-db.db\n  gen:\n    # 代码生成读取的数据库名称\n    dbname: dbname\n    # 代码生成是使用前端代码存放位置，需要指定到src文件夹，相对路径\n    frontpath: ../go-admin-ui/src\n"
  },
  {
    "path": "config/settings.yml",
    "content": "settings:\n  application:\n    # dev开发环境 test测试环境 prod线上环境\n    mode: dev\n    # 服务器ip，默认使用 0.0.0.0\n    host: 0.0.0.0\n    # 服务名称\n    name: testApp\n    # 端口号\n    port: 8000 # 服务端口号\n    readtimeout: 1\n    writertimeout: 2\n    # 数据权限功能开关\n    enabledp: false\n  logger:\n    # 日志存放路径\n    path: temp/logs\n    # 日志输出，file：文件，default：命令行，其他：命令行\n    stdout: '' #控制台日志，启用后，不输出到文件\n    # 日志等级, trace, debug, info, warn, error, fatal\n    level: trace\n    # 数据库日志开关\n    enableddb: false\n  jwt:\n    # token 密钥，生产环境时及的修改\n    secret: go-admin\n    # token 过期时间 单位：秒\n    timeout: 3600\n  database:\n    # 数据库类型 mysql, sqlite3, postgres, sqlserver\n    # sqlserver: sqlserver://用户名:密码@地址?database=数据库名\n    driver: mysql\n    # 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms\n    source: user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms\n#  databases:\n#    'locaohost:8000':\n#      driver: mysql\n#        # 数据库连接字符串 mysql 缺省信息 charset=utf8&parseTime=True&loc=Local&timeout=1000ms\n#        source: user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms\n#      registers:\n#        - sources:\n#            - user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8&parseTime=True&loc=Local&timeout=1000ms\n  gen:\n    # 代码生成读取的数据库名称\n    dbname: dbname\n    # 代码生成是使用前端代码存放位置，需要指定到src文件夹，相对路径\n    frontpath: ../go-admin-ui/src\n  extend: # 扩展项使用说明\n    demo:\n      name: data\n  cache:\n#    redis:\n#      addr: 127.0.0.1:6379\n#      password: xxxxxx\n#      db: 2\n    # key存在即可\n    memory: '' \n  queue:\n    memory:\n      poolSize: 100\n#    redis:\n#      addr: 127.0.0.1:6379\n#      password: xxxxxx\n#      producer:\n#        streamMaxLength: 100\n#        approximateMaxLength: true\n#      consumer:\n#        visibilityTimeout: 60\n#        bufferSize: 100\n#        concurrency: 10\n#        blockingTimeout: 5\n#        reclaimInterval: 1\n  locker:\n    redis:"
  },
  {
    "path": "docker-compose.yml",
    "content": "version: '3.8'\nservices:\n  go-admin-api:\n    container_name: go-admin\n    image: go-admin:latest\n    privileged: true\n    restart: always\n    ports:\n      - 8000:8000\n    volumes:\n      - ./config/:/go-admin-api/config/\n      - ./static/:/go-admin-api/static/\n      - ./temp/:/go-admin-api/temp/\n    networks:\n      - myweb\nnetworks:\n  myweb:\n    driver: bridge\n\n"
  },
  {
    "path": "docs/admin/admin_docs.go",
    "content": "// Package admin GENERATED BY SWAG; DO NOT EDIT\n// This file was generated by swaggo/swag\npackage admin\n\nimport \"github.com/swaggo/swag\"\n\nconst docTemplateadmin = `{\n    \"schemes\": {{ marshal .Schemes }},\n    \"swagger\": \"2.0\",\n    \"info\": {\n        \"description\": \"{{escape .Description}}\",\n        \"title\": \"{{.Title}}\",\n        \"contact\": {},\n        \"license\": {\n            \"name\": \"MIT\",\n            \"url\": \"https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md\"\n        },\n        \"version\": \"{{.Version}}\"\n    },\n    \"host\": \"{{.Host}}\",\n    \"basePath\": \"{{.BasePath}}\",\n    \"paths\": {\n        \"/api/v1/app-config\": {\n            \"get\": {\n                \"description\": \"获取系统配置信息，主要注意这里不在验证权限\",\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"获取系统前台配置信息，主要注意这里不在验证权限\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"type\": \"object\",\n                                            \"additionalProperties\": {\n                                                \"type\": \"string\"\n                                            }\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/captcha\": {\n            \"get\": {\n                \"description\": \"获取验证码\",\n                \"tags\": [\n                    \"登陆\"\n                ],\n                \"summary\": \"获取验证码\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"type\": \"string\"\n                                        },\n                                        \"id\": {\n                                            \"type\": \"string\"\n                                        },\n                                        \"msg\": {\n                                            \"type\": \"string\"\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/db/columns/page\": {\n            \"get\": {\n                \"description\": \"数据库表列分页列表 / database table column page list\",\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"分页列表数据 / page list data\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"tableName / 数据表名称\",\n                        \"name\": \"tableName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageSize / 页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageIndex / 页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/db/tables/page\": {\n            \"get\": {\n                \"description\": \"数据库表分页列表 / database table page list\",\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"分页列表数据 / page list data\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"tableName / 数据表名称\",\n                        \"name\": \"tableName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageSize / 页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageIndex / 页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dept\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"分页列表\",\n                \"tags\": [\n                    \"部门\"\n                ],\n                \"summary\": \"分页部门列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"deptName\",\n                        \"name\": \"deptName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"deptId\",\n                        \"name\": \"deptId\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"position\",\n                        \"name\": \"position\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"部门\"\n                ],\n                \"summary\": \"添加部门\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDeptInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"添加失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"部门\"\n                ],\n                \"summary\": \"删除部门\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDeptDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"删除失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dept/{deptId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"部门\"\n                ],\n                \"summary\": \"获取部门数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"deptId\",\n                        \"name\": \"deptId\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"部门\"\n                ],\n                \"summary\": \"修改部门\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    },\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDeptUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"添加失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict-data/option-select\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"数据字典根据key获取\",\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"数据字典根据key获取\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"dictType\",\n                        \"name\": \"dictType\",\n                        \"in\": \"query\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"type\": \"array\",\n                                            \"items\": {\n                                                \"$ref\": \"#/definitions/dto.SysDictDataGetAllResp\"\n                                            }\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict/data\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"字典数据列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"status\",\n                        \"name\": \"status\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictCode\",\n                        \"name\": \"dictCode\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictType\",\n                        \"name\": \"dictType\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"添加字典数据\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictDataInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"添加成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"删除字典数据\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"dictCode\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictDataDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"删除成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict/data/{dictCode}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"通过编码获取字典数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"字典编码\",\n                        \"name\": \"dictCode\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"修改字典数据\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictDataUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"修改成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict/type\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"字典类型列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictName\",\n                        \"name\": \"dictName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictId\",\n                        \"name\": \"dictId\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictType\",\n                        \"name\": \"dictType\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"添加字典类型\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictTypeInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"删除字典类型\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"dictCode\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictTypeDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict/type-option-select\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"字典类型全部数据 代码生成使用接口\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictName\",\n                        \"name\": \"dictName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictId\",\n                        \"name\": \"dictId\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictType\",\n                        \"name\": \"dictType\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict/type/{dictId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"字典类型通过字典id获取\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"字典类型编码\",\n                        \"name\": \"dictId\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"修改字典类型\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictTypeUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/getinfo\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"个人中心\"\n                ],\n                \"summary\": \"获取个人信息\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/login\": {\n            \"post\": {\n                \"description\": \"获取token\\nLoginHandler can be used by clients to get a jwt token.\\nPayload needs to be json in the form of {\\\"username\\\": \\\"USERNAME\\\", \\\"password\\\": \\\"PASSWORD\\\"}.\\nReply will be of the form {\\\"token\\\": \\\"TOKEN\\\"}.\\ndev mode：It should be noted that all fields cannot be empty, and a value of 0 can be passed in addition to the account password\\n注意：开发模式：需要注意全部字段不能为空，账号密码外可以传入0值\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"登陆\"\n                ],\n                \"summary\": \"登陆\",\n                \"parameters\": [\n                    {\n                        \"description\": \"account\",\n                        \"name\": \"account\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/handler.Login\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"expire\\\": \\\"2019-08-07T12:45:48+08:00\\\", \\\"token\\\": \\\".eyJleHAiOjE1NjUxNTMxNDgsImlkIjoiYWRtaW4iLCJvcmlnX2lhdCI6MTU2NTE0OTU0OH0.-zvzHvbg0A\\\" }\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/menu\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"Menu列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"menuName\",\n                        \"name\": \"menuName\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"创建菜单\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysMenuInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"删除菜单\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysMenuDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/menu/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"Menu详情数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"修改菜单\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    },\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysMenuUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/menuTreeselect/{roleId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"角色修改使用的菜单列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"roleId\",\n                        \"name\": \"roleId\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/menurole\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"根据登录角色名称获取菜单列表数据（左菜单使用）\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/post\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"岗位\"\n                ],\n                \"summary\": \"岗位列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"postName\",\n                        \"name\": \"postName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"postCode\",\n                        \"name\": \"postCode\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"postId\",\n                        \"name\": \"postId\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"status\",\n                        \"name\": \"status\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"岗位\"\n                ],\n                \"summary\": \"添加岗位\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysPostInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"岗位\"\n                ],\n                \"summary\": \"删除岗位\",\n                \"parameters\": [\n                    {\n                        \"description\": \"请求参数\",\n                        \"name\": \"id\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysPostDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/post/{id}\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"岗位\"\n                ],\n                \"summary\": \"修改岗位\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysPostUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/post/{postId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"岗位\"\n                ],\n                \"summary\": \"获取岗位信息\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"编码\",\n                        \"name\": \"id\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/public/uploadFile\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"multipart/form-data\"\n                ],\n                \"tags\": [\n                    \"公共接口\"\n                ],\n                \"summary\": \"上传图片\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"type\",\n                        \"name\": \"type\",\n                        \"in\": \"query\",\n                        \"required\": true\n                    },\n                    {\n                        \"type\": \"file\",\n                        \"description\": \"file\",\n                        \"name\": \"file\",\n                        \"in\": \"formData\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"添加失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/role\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"Get JSON\",\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"角色列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"roleName\",\n                        \"name\": \"roleName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"status\",\n                        \"name\": \"status\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"roleKey\",\n                        \"name\": \"roleKey\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"创建角色\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysRoleInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"删除用户角色\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysRoleDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/role-status/{id}\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"更新角色数据权限\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.RoleDataScopeReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/role/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"获取Role数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"roleId\",\n                        \"name\": \"roleId\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"修改用户角色\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysRoleUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/server-monitor\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"系统信息\"\n                ],\n                \"summary\": \"系统信息\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/set-config\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"界面操作设置配置值的获取\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"获取配置\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"修改成功\\\"}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"type\": \"object\",\n                                            \"additionalProperties\": true\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"界面操作设置配置值\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"设置配置\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"type\": \"array\",\n                            \"items\": {\n                                \"$ref\": \"#/definitions/dto.GetSetSysConfigReq\"\n                            }\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"修改成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-api\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取接口管理列表\",\n                \"tags\": [\n                    \"接口管理\"\n                ],\n                \"summary\": \"获取接口管理列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"名称\",\n                        \"name\": \"name\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"标题\",\n                        \"name\": \"title\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"地址\",\n                        \"name\": \"path\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"类型\",\n                        \"name\": \"action\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"allOf\": [\n                                                {\n                                                    \"$ref\": \"#/definitions/response.Page\"\n                                                },\n                                                {\n                                                    \"type\": \"object\",\n                                                    \"properties\": {\n                                                        \"list\": {\n                                                            \"type\": \"array\",\n                                                            \"items\": {\n                                                                \"$ref\": \"#/definitions/models.SysApi\"\n                                                            }\n                                                        }\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除接口管理\",\n                \"tags\": [\n                    \"接口管理\"\n                ],\n                \"summary\": \"删除接口管理\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysApiDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"删除成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-api/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取接口管理\",\n                \"tags\": [\n                    \"接口管理\"\n                ],\n                \"summary\": \"获取接口管理\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"$ref\": \"#/definitions/models.SysApi\"\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"修改接口管理\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"接口管理\"\n                ],\n                \"summary\": \"修改接口管理\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysApiUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"修改成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-config\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取配置管理列表\",\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"获取配置管理列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"名称\",\n                        \"name\": \"configName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"key\",\n                        \"name\": \"configKey\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"类型\",\n                        \"name\": \"configType\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"是否前端\",\n                        \"name\": \"isFrontend\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"allOf\": [\n                                                {\n                                                    \"$ref\": \"#/definitions/response.Page\"\n                                                },\n                                                {\n                                                    \"type\": \"object\",\n                                                    \"properties\": {\n                                                        \"list\": {\n                                                            \"type\": \"array\",\n                                                            \"items\": {\n                                                                \"$ref\": \"#/definitions/models.SysApi\"\n                                                            }\n                                                        }\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"创建配置管理\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"创建配置管理\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysConfigControl\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"创建成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除配置管理\",\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"删除配置管理\",\n                \"parameters\": [\n                    {\n                        \"description\": \"ids\",\n                        \"name\": \"ids\",\n                        \"in\": \"body\",\n                        \"schema\": {\n                            \"type\": \"array\",\n                            \"items\": {\n                                \"type\": \"integer\"\n                            }\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"删除成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-config/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"根据Key获取SysConfig的Service\",\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"根据Key获取SysConfig的Service\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"configKey\",\n                        \"name\": \"configKey\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"$ref\": \"#/definitions/dto.SysConfigByKeyReq\"\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"修改配置管理\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"修改配置管理\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysConfigControl\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"修改成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-login-log\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"登录日志\"\n                ],\n                \"summary\": \"登录日志列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"用户名\",\n                        \"name\": \"username\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"ip地址\",\n                        \"name\": \"ipaddr\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"归属地\",\n                        \"name\": \"loginLocation\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"状态\",\n                        \"name\": \"status\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"开始时间\",\n                        \"name\": \"beginTime\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"结束时间\",\n                        \"name\": \"endTime\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"登录日志删除\",\n                \"tags\": [\n                    \"登录日志\"\n                ],\n                \"summary\": \"登录日志删除\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysLoginLogDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-login-log/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"登录日志\"\n                ],\n                \"summary\": \"登录日志通过id获取\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-opera-log\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"操作日志\"\n                ],\n                \"summary\": \"操作日志列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"title\",\n                        \"name\": \"title\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"method\",\n                        \"name\": \"method\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"requestMethod\",\n                        \"name\": \"requestMethod\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"operUrl\",\n                        \"name\": \"operUrl\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"operIp\",\n                        \"name\": \"operIp\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"status\",\n                        \"name\": \"status\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"beginTime\",\n                        \"name\": \"beginTime\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"endTime\",\n                        \"name\": \"endTime\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"操作日志\"\n                ],\n                \"summary\": \"删除操作日志\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysOperaLogDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-opera-log/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"操作日志\"\n                ],\n                \"summary\": \"操作日志通过id获取\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-user\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"列表用户信息数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"username\",\n                        \"name\": \"username\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"创建用户\",\n                \"parameters\": [\n                    {\n                        \"description\": \"用户数据\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysUserInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-user/{userId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"获取用户\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"用户编码\",\n                        \"name\": \"userId\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"修改用户数据\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysUserUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"删除用户数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"userId\",\n                        \"name\": \"userId\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys/tables/info\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"修改表结构\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"修改表结构\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/tools.SysTables\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"添加失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"添加表结构\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"添加表结构\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"tableName / 数据表名称\",\n                        \"name\": \"tables\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"添加失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys/tables/info/{tableId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"获取配置\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"configKey\",\n                        \"name\": \"configKey\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"description\": \"删除表结构\",\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"删除表结构\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"tableId\",\n                        \"name\": \"tableId\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"删除失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys/tables/page\": {\n            \"get\": {\n                \"description\": \"生成表分页列表\",\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"分页列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"tableName / 数据表名称\",\n                        \"name\": \"tableName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageSize / 页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageIndex / 页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/user/avatar\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"multipart/form-data\"\n                ],\n                \"tags\": [\n                    \"个人中心\"\n                ],\n                \"summary\": \"修改头像\",\n                \"parameters\": [\n                    {\n                        \"type\": \"file\",\n                        \"description\": \"file\",\n                        \"name\": \"file\",\n                        \"in\": \"formData\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/user/profile\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"个人中心\"\n                ],\n                \"summary\": \"获取个人中心用户\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/user/pwd/reset\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"重置用户密码\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.ResetSysUserPwdReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/user/pwd/set\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"修改密码\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.PassWord\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/user/status\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"修改用户状态\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.UpdateSysUserStatusReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/logout\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取token\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"summary\": \"退出登录\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"msg\\\": \\\"成功退出系统\\\" }\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        }\n    },\n    \"definitions\": {\n        \"dto.GetSetSysConfigReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"configKey\": {\n                    \"type\": \"string\"\n                },\n                \"configValue\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.PassWord\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"newPassword\": {\n                    \"type\": \"string\"\n                },\n                \"oldPassword\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.ResetSysUserPwdReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"password\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"userId\": {\n                    \"description\": \"用户ID\",\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.RoleDataScopeReq\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"dataScope\",\n                \"roleId\"\n            ],\n            \"properties\": {\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"deptIds\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"roleId\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysApiDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                }\n            }\n        },\n        \"dto.SysApiUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"action\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"handle\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"path\": {\n                    \"type\": \"string\"\n                },\n                \"title\": {\n                    \"type\": \"string\"\n                },\n                \"type\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysConfigByKeyReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"configKey\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.SysConfigControl\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"configKey\": {\n                    \"type\": \"string\"\n                },\n                \"configName\": {\n                    \"type\": \"string\"\n                },\n                \"configType\": {\n                    \"type\": \"string\"\n                },\n                \"configValue\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"id\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"isFrontend\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDeptDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                }\n            }\n        },\n        \"dto.SysDeptInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"deptId\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"deptName\": {\n                    \"description\": \"部门名称\",\n                    \"type\": \"string\"\n                },\n                \"deptPath\": {\n                    \"description\": \"路径\",\n                    \"type\": \"string\"\n                },\n                \"email\": {\n                    \"description\": \"邮箱\",\n                    \"type\": \"string\"\n                },\n                \"leader\": {\n                    \"description\": \"负责人\",\n                    \"type\": \"string\"\n                },\n                \"parentId\": {\n                    \"description\": \"上级部门\",\n                    \"type\": \"integer\"\n                },\n                \"phone\": {\n                    \"description\": \"手机\",\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"description\": \"排序\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态\",\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDeptUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"deptId\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"deptName\": {\n                    \"description\": \"部门名称\",\n                    \"type\": \"string\"\n                },\n                \"deptPath\": {\n                    \"description\": \"路径\",\n                    \"type\": \"string\"\n                },\n                \"email\": {\n                    \"description\": \"邮箱\",\n                    \"type\": \"string\"\n                },\n                \"leader\": {\n                    \"description\": \"负责人\",\n                    \"type\": \"string\"\n                },\n                \"parentId\": {\n                    \"description\": \"上级部门\",\n                    \"type\": \"integer\"\n                },\n                \"phone\": {\n                    \"description\": \"手机\",\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"description\": \"排序\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态\",\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictDataDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictDataGetAllResp\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"label\": {\n                    \"type\": \"string\"\n                },\n                \"value\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.SysDictDataInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"cssClass\": {\n                    \"type\": \"string\"\n                },\n                \"default\": {\n                    \"type\": \"string\"\n                },\n                \"dictLabel\": {\n                    \"type\": \"string\"\n                },\n                \"dictSort\": {\n                    \"type\": \"integer\"\n                },\n                \"dictType\": {\n                    \"type\": \"string\"\n                },\n                \"dictValue\": {\n                    \"type\": \"string\"\n                },\n                \"isDefault\": {\n                    \"type\": \"string\"\n                },\n                \"listClass\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictDataUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"cssClass\": {\n                    \"type\": \"string\"\n                },\n                \"default\": {\n                    \"type\": \"string\"\n                },\n                \"dictLabel\": {\n                    \"type\": \"string\"\n                },\n                \"dictSort\": {\n                    \"type\": \"integer\"\n                },\n                \"dictType\": {\n                    \"type\": \"string\"\n                },\n                \"dictValue\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"type\": \"integer\"\n                },\n                \"isDefault\": {\n                    \"type\": \"string\"\n                },\n                \"listClass\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictTypeDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictTypeInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"dictName\": {\n                    \"type\": \"string\"\n                },\n                \"dictType\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"type\": \"integer\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictTypeUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"dictName\": {\n                    \"type\": \"string\"\n                },\n                \"dictType\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"type\": \"integer\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysLoginLogDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                }\n            }\n        },\n        \"dto.SysMenuDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysMenuInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"action\": {\n                    \"description\": \"请求方式\",\n                    \"type\": \"string\"\n                },\n                \"apis\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"breadcrumb\": {\n                    \"description\": \"是否面包屑\",\n                    \"type\": \"string\"\n                },\n                \"component\": {\n                    \"description\": \"组件\",\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"icon\": {\n                    \"description\": \"图标\",\n                    \"type\": \"string\"\n                },\n                \"isFrame\": {\n                    \"description\": \"是否frame\",\n                    \"type\": \"string\"\n                },\n                \"menuId\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"menuName\": {\n                    \"description\": \"菜单name\",\n                    \"type\": \"string\"\n                },\n                \"menuType\": {\n                    \"description\": \"菜单类型\",\n                    \"type\": \"string\"\n                },\n                \"noCache\": {\n                    \"description\": \"是否缓存\",\n                    \"type\": \"boolean\"\n                },\n                \"parentId\": {\n                    \"description\": \"上级菜单\",\n                    \"type\": \"integer\"\n                },\n                \"path\": {\n                    \"description\": \"路径\",\n                    \"type\": \"string\"\n                },\n                \"paths\": {\n                    \"description\": \"id路径\",\n                    \"type\": \"string\"\n                },\n                \"permission\": {\n                    \"description\": \"权限编码\",\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"description\": \"排序\",\n                    \"type\": \"integer\"\n                },\n                \"sysApi\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysApi\"\n                    }\n                },\n                \"title\": {\n                    \"description\": \"显示名称\",\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"visible\": {\n                    \"description\": \"是否显示\",\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.SysMenuUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"action\": {\n                    \"description\": \"请求方式\",\n                    \"type\": \"string\"\n                },\n                \"apis\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"breadcrumb\": {\n                    \"description\": \"是否面包屑\",\n                    \"type\": \"string\"\n                },\n                \"component\": {\n                    \"description\": \"组件\",\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"icon\": {\n                    \"description\": \"图标\",\n                    \"type\": \"string\"\n                },\n                \"isFrame\": {\n                    \"description\": \"是否frame\",\n                    \"type\": \"string\"\n                },\n                \"menuId\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"menuName\": {\n                    \"description\": \"菜单name\",\n                    \"type\": \"string\"\n                },\n                \"menuType\": {\n                    \"description\": \"菜单类型\",\n                    \"type\": \"string\"\n                },\n                \"noCache\": {\n                    \"description\": \"是否缓存\",\n                    \"type\": \"boolean\"\n                },\n                \"parentId\": {\n                    \"description\": \"上级菜单\",\n                    \"type\": \"integer\"\n                },\n                \"path\": {\n                    \"description\": \"路径\",\n                    \"type\": \"string\"\n                },\n                \"paths\": {\n                    \"description\": \"id路径\",\n                    \"type\": \"string\"\n                },\n                \"permission\": {\n                    \"description\": \"权限编码\",\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"description\": \"排序\",\n                    \"type\": \"integer\"\n                },\n                \"sysApi\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysApi\"\n                    }\n                },\n                \"title\": {\n                    \"description\": \"显示名称\",\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"visible\": {\n                    \"description\": \"是否显示\",\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.SysOperaLogDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                }\n            }\n        },\n        \"dto.SysPostDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysPostInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"postCode\": {\n                    \"type\": \"string\"\n                },\n                \"postId\": {\n                    \"type\": \"integer\"\n                },\n                \"postName\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysPostUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"postCode\": {\n                    \"type\": \"string\"\n                },\n                \"postId\": {\n                    \"type\": \"integer\"\n                },\n                \"postName\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysRoleDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                }\n            }\n        },\n        \"dto.SysRoleInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"admin\": {\n                    \"type\": \"boolean\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"deptIds\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"flag\": {\n                    \"description\": \"标记\",\n                    \"type\": \"string\"\n                },\n                \"menuIds\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"remark\": {\n                    \"description\": \"备注\",\n                    \"type\": \"string\"\n                },\n                \"roleId\": {\n                    \"description\": \"角色编码\",\n                    \"type\": \"integer\"\n                },\n                \"roleKey\": {\n                    \"description\": \"角色代码\",\n                    \"type\": \"string\"\n                },\n                \"roleName\": {\n                    \"description\": \"角色名称\",\n                    \"type\": \"string\"\n                },\n                \"roleSort\": {\n                    \"description\": \"角色排序\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态 1禁用 2正常\",\n                    \"type\": \"string\"\n                },\n                \"sysDept\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysDept\"\n                    }\n                },\n                \"sysMenu\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysMenu\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysRoleUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"admin\": {\n                    \"type\": \"boolean\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"deptIds\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"flag\": {\n                    \"description\": \"标记\",\n                    \"type\": \"string\"\n                },\n                \"menuIds\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"remark\": {\n                    \"description\": \"备注\",\n                    \"type\": \"string\"\n                },\n                \"roleId\": {\n                    \"description\": \"角色编码\",\n                    \"type\": \"integer\"\n                },\n                \"roleKey\": {\n                    \"description\": \"角色代码\",\n                    \"type\": \"string\"\n                },\n                \"roleName\": {\n                    \"description\": \"角色名称\",\n                    \"type\": \"string\"\n                },\n                \"roleSort\": {\n                    \"description\": \"角色排序\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态\",\n                    \"type\": \"string\"\n                },\n                \"sysDept\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysDept\"\n                    }\n                },\n                \"sysMenu\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysMenu\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysUserInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"avatar\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"deptId\": {\n                    \"type\": \"integer\"\n                },\n                \"email\": {\n                    \"type\": \"string\"\n                },\n                \"nickName\": {\n                    \"type\": \"string\"\n                },\n                \"password\": {\n                    \"type\": \"string\"\n                },\n                \"phone\": {\n                    \"type\": \"string\"\n                },\n                \"postId\": {\n                    \"type\": \"integer\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"roleId\": {\n                    \"type\": \"integer\"\n                },\n                \"sex\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"string\",\n                    \"default\": \"1\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"userId\": {\n                    \"description\": \"用户ID\",\n                    \"type\": \"integer\"\n                },\n                \"username\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.SysUserUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"avatar\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"deptId\": {\n                    \"type\": \"integer\"\n                },\n                \"email\": {\n                    \"type\": \"string\"\n                },\n                \"nickName\": {\n                    \"type\": \"string\"\n                },\n                \"phone\": {\n                    \"type\": \"string\"\n                },\n                \"postId\": {\n                    \"type\": \"integer\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"roleId\": {\n                    \"type\": \"integer\"\n                },\n                \"sex\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"string\",\n                    \"default\": \"1\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"userId\": {\n                    \"description\": \"用户ID\",\n                    \"type\": \"integer\"\n                },\n                \"username\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.UpdateStatusReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"roleId\": {\n                    \"description\": \"角色编码\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态\",\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.UpdateSysUserStatusReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"userId\": {\n                    \"description\": \"用户ID\",\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"handler.Login\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"code\",\n                \"password\",\n                \"username\",\n                \"uuid\"\n            ],\n            \"properties\": {\n                \"code\": {\n                    \"type\": \"string\"\n                },\n                \"password\": {\n                    \"type\": \"string\"\n                },\n                \"username\": {\n                    \"type\": \"string\"\n                },\n                \"uuid\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"models.SysApi\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"action\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"handle\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"type\": \"integer\"\n                },\n                \"path\": {\n                    \"type\": \"string\"\n                },\n                \"title\": {\n                    \"type\": \"string\"\n                },\n                \"type\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"models.SysConfig\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"configKey\": {\n                    \"type\": \"string\"\n                },\n                \"configName\": {\n                    \"type\": \"string\"\n                },\n                \"configType\": {\n                    \"type\": \"string\"\n                },\n                \"configValue\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"type\": \"integer\"\n                },\n                \"isFrontend\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"models.SysDept\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"children\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysDept\"\n                    }\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"deptId\": {\n                    \"description\": \"部门编码\",\n                    \"type\": \"integer\"\n                },\n                \"deptName\": {\n                    \"description\": \"部门名称\",\n                    \"type\": \"string\"\n                },\n                \"deptPath\": {\n                    \"type\": \"string\"\n                },\n                \"email\": {\n                    \"description\": \"邮箱\",\n                    \"type\": \"string\"\n                },\n                \"leader\": {\n                    \"description\": \"负责人\",\n                    \"type\": \"string\"\n                },\n                \"params\": {\n                    \"type\": \"string\"\n                },\n                \"parentId\": {\n                    \"description\": \"上级部门\",\n                    \"type\": \"integer\"\n                },\n                \"phone\": {\n                    \"description\": \"手机\",\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"description\": \"排序\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态\",\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"models.SysMenu\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"action\": {\n                    \"type\": \"string\"\n                },\n                \"apis\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"breadcrumb\": {\n                    \"type\": \"string\"\n                },\n                \"children\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysMenu\"\n                    }\n                },\n                \"component\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"icon\": {\n                    \"type\": \"string\"\n                },\n                \"isFrame\": {\n                    \"type\": \"string\"\n                },\n                \"is_select\": {\n                    \"type\": \"boolean\"\n                },\n                \"menuId\": {\n                    \"type\": \"integer\"\n                },\n                \"menuName\": {\n                    \"type\": \"string\"\n                },\n                \"menuType\": {\n                    \"type\": \"string\"\n                },\n                \"noCache\": {\n                    \"type\": \"boolean\"\n                },\n                \"params\": {\n                    \"type\": \"string\"\n                },\n                \"parentId\": {\n                    \"type\": \"integer\"\n                },\n                \"path\": {\n                    \"type\": \"string\"\n                },\n                \"paths\": {\n                    \"type\": \"string\"\n                },\n                \"permission\": {\n                    \"type\": \"string\"\n                },\n                \"roleId\": {\n                    \"type\": \"integer\"\n                },\n                \"sort\": {\n                    \"type\": \"integer\"\n                },\n                \"sysApi\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysApi\"\n                    }\n                },\n                \"title\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                },\n                \"visible\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"response.Page\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"count\": {\n                    \"type\": \"integer\"\n                },\n                \"pageIndex\": {\n                    \"type\": \"integer\"\n                },\n                \"pageSize\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"response.Response\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"code\": {\n                    \"type\": \"integer\"\n                },\n                \"msg\": {\n                    \"type\": \"string\"\n                },\n                \"requestId\": {\n                    \"description\": \"数据集\",\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"tools.Params\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"treeCode\": {\n                    \"type\": \"string\"\n                },\n                \"treeName\": {\n                    \"type\": \"string\"\n                },\n                \"treeParentCode\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"tools.SysColumns\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"columnComment\": {\n                    \"type\": \"string\"\n                },\n                \"columnId\": {\n                    \"type\": \"integer\"\n                },\n                \"columnName\": {\n                    \"type\": \"string\"\n                },\n                \"columnType\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"deletedAt\": {\n                    \"type\": \"string\"\n                },\n                \"dictType\": {\n                    \"type\": \"string\"\n                },\n                \"edit\": {\n                    \"type\": \"boolean\"\n                },\n                \"fkCol\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/tools.SysColumns\"\n                    }\n                },\n                \"fkLabelId\": {\n                    \"type\": \"string\"\n                },\n                \"fkLabelName\": {\n                    \"type\": \"string\"\n                },\n                \"fkTableName\": {\n                    \"type\": \"string\"\n                },\n                \"fkTableNameClass\": {\n                    \"type\": \"string\"\n                },\n                \"fkTableNamePackage\": {\n                    \"type\": \"string\"\n                },\n                \"goField\": {\n                    \"type\": \"string\"\n                },\n                \"goType\": {\n                    \"type\": \"string\"\n                },\n                \"htmlType\": {\n                    \"type\": \"string\"\n                },\n                \"increment\": {\n                    \"type\": \"boolean\"\n                },\n                \"insert\": {\n                    \"type\": \"boolean\"\n                },\n                \"isEdit\": {\n                    \"type\": \"string\"\n                },\n                \"isIncrement\": {\n                    \"type\": \"string\"\n                },\n                \"isInsert\": {\n                    \"type\": \"string\"\n                },\n                \"isList\": {\n                    \"type\": \"string\"\n                },\n                \"isPk\": {\n                    \"type\": \"string\"\n                },\n                \"isQuery\": {\n                    \"type\": \"string\"\n                },\n                \"isRequired\": {\n                    \"type\": \"string\"\n                },\n                \"jsonField\": {\n                    \"type\": \"string\"\n                },\n                \"list\": {\n                    \"type\": \"string\"\n                },\n                \"pk\": {\n                    \"type\": \"boolean\"\n                },\n                \"query\": {\n                    \"type\": \"boolean\"\n                },\n                \"queryType\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"required\": {\n                    \"type\": \"boolean\"\n                },\n                \"sort\": {\n                    \"type\": \"integer\"\n                },\n                \"superColumn\": {\n                    \"type\": \"boolean\"\n                },\n                \"tableId\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                },\n                \"usableColumn\": {\n                    \"type\": \"boolean\"\n                }\n            }\n        },\n        \"tools.SysTables\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"businessName\": {\n                    \"type\": \"string\"\n                },\n                \"className\": {\n                    \"description\": \"类名\",\n                    \"type\": \"string\"\n                },\n                \"columns\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/tools.SysColumns\"\n                    }\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"crud\": {\n                    \"type\": \"boolean\"\n                },\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"deletedAt\": {\n                    \"type\": \"string\"\n                },\n                \"functionAuthor\": {\n                    \"description\": \"功能作者\",\n                    \"type\": \"string\"\n                },\n                \"functionName\": {\n                    \"description\": \"功能名称\",\n                    \"type\": \"string\"\n                },\n                \"isActions\": {\n                    \"type\": \"integer\"\n                },\n                \"isAuth\": {\n                    \"type\": \"integer\"\n                },\n                \"isDataScope\": {\n                    \"type\": \"integer\"\n                },\n                \"isLogicalDelete\": {\n                    \"type\": \"string\"\n                },\n                \"logicalDelete\": {\n                    \"type\": \"boolean\"\n                },\n                \"logicalDeleteColumn\": {\n                    \"type\": \"string\"\n                },\n                \"moduleFrontName\": {\n                    \"description\": \"前端文件名\",\n                    \"type\": \"string\"\n                },\n                \"moduleName\": {\n                    \"description\": \"go文件名\",\n                    \"type\": \"string\"\n                },\n                \"options\": {\n                    \"type\": \"string\"\n                },\n                \"packageName\": {\n                    \"description\": \"包名\",\n                    \"type\": \"string\"\n                },\n                \"params\": {\n                    \"$ref\": \"#/definitions/tools.Params\"\n                },\n                \"pkColumn\": {\n                    \"type\": \"string\"\n                },\n                \"pkGoField\": {\n                    \"type\": \"string\"\n                },\n                \"pkJsonField\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"tableComment\": {\n                    \"description\": \"表备注\",\n                    \"type\": \"string\"\n                },\n                \"tableId\": {\n                    \"description\": \"表编码\",\n                    \"type\": \"integer\"\n                },\n                \"tableName\": {\n                    \"description\": \"表名称\",\n                    \"type\": \"string\"\n                },\n                \"tplCategory\": {\n                    \"type\": \"string\"\n                },\n                \"tree\": {\n                    \"type\": \"boolean\"\n                },\n                \"treeCode\": {\n                    \"type\": \"string\"\n                },\n                \"treeName\": {\n                    \"type\": \"string\"\n                },\n                \"treeParentCode\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                }\n            }\n        }\n    },\n    \"securityDefinitions\": {\n        \"Bearer\": {\n            \"type\": \"apiKey\",\n            \"name\": \"Authorization\",\n            \"in\": \"header\"\n        }\n    }\n}`\n\n// SwaggerInfoadmin holds exported Swagger Info so clients can modify it\nvar SwaggerInfoadmin = &swag.Spec{\n\tVersion:          \"2.0.0\",\n\tHost:             \"\",\n\tBasePath:         \"\",\n\tSchemes:          []string{},\n\tTitle:            \"go-admin API\",\n\tDescription:      \"基于Gin + Vue + Element UI的前后端分离权限管理系统的接口文档\\n添加qq群: 521386980 进入技术交流群 请先star，谢谢！\",\n\tInfoInstanceName: \"admin\",\n\tSwaggerTemplate:  docTemplateadmin,\n}\n\nfunc init() {\n\tswag.Register(SwaggerInfoadmin.InstanceName(), SwaggerInfoadmin)\n}\n"
  },
  {
    "path": "docs/admin/admin_swagger.json",
    "content": "{\n    \"swagger\": \"2.0\",\n    \"info\": {\n        \"description\": \"基于Gin + Vue + Element UI的前后端分离权限管理系统的接口文档\\n添加qq群: 521386980 进入技术交流群 请先star，谢谢！\",\n        \"title\": \"go-admin API\",\n        \"contact\": {},\n        \"license\": {\n            \"name\": \"MIT\",\n            \"url\": \"https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md\"\n        },\n        \"version\": \"2.0.0\"\n    },\n    \"paths\": {\n        \"/api/v1/app-config\": {\n            \"get\": {\n                \"description\": \"获取系统配置信息，主要注意这里不在验证权限\",\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"获取系统前台配置信息，主要注意这里不在验证权限\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"type\": \"object\",\n                                            \"additionalProperties\": {\n                                                \"type\": \"string\"\n                                            }\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/captcha\": {\n            \"get\": {\n                \"description\": \"获取验证码\",\n                \"tags\": [\n                    \"登陆\"\n                ],\n                \"summary\": \"获取验证码\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"type\": \"string\"\n                                        },\n                                        \"id\": {\n                                            \"type\": \"string\"\n                                        },\n                                        \"msg\": {\n                                            \"type\": \"string\"\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/db/columns/page\": {\n            \"get\": {\n                \"description\": \"数据库表列分页列表 / database table column page list\",\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"分页列表数据 / page list data\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"tableName / 数据表名称\",\n                        \"name\": \"tableName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageSize / 页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageIndex / 页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/db/tables/page\": {\n            \"get\": {\n                \"description\": \"数据库表分页列表 / database table page list\",\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"分页列表数据 / page list data\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"tableName / 数据表名称\",\n                        \"name\": \"tableName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageSize / 页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageIndex / 页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dept\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"分页列表\",\n                \"tags\": [\n                    \"部门\"\n                ],\n                \"summary\": \"分页部门列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"deptName\",\n                        \"name\": \"deptName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"deptId\",\n                        \"name\": \"deptId\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"position\",\n                        \"name\": \"position\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"部门\"\n                ],\n                \"summary\": \"添加部门\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDeptInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"添加失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"部门\"\n                ],\n                \"summary\": \"删除部门\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDeptDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"删除失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dept/{deptId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"部门\"\n                ],\n                \"summary\": \"获取部门数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"deptId\",\n                        \"name\": \"deptId\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"部门\"\n                ],\n                \"summary\": \"修改部门\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    },\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDeptUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"添加失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict-data/option-select\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"数据字典根据key获取\",\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"数据字典根据key获取\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"dictType\",\n                        \"name\": \"dictType\",\n                        \"in\": \"query\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"type\": \"array\",\n                                            \"items\": {\n                                                \"$ref\": \"#/definitions/dto.SysDictDataGetAllResp\"\n                                            }\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict/data\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"字典数据列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"status\",\n                        \"name\": \"status\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictCode\",\n                        \"name\": \"dictCode\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictType\",\n                        \"name\": \"dictType\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"添加字典数据\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictDataInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"添加成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"删除字典数据\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"dictCode\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictDataDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"删除成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict/data/{dictCode}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"通过编码获取字典数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"字典编码\",\n                        \"name\": \"dictCode\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"字典数据\"\n                ],\n                \"summary\": \"修改字典数据\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictDataUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"修改成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict/type\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"字典类型列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictName\",\n                        \"name\": \"dictName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictId\",\n                        \"name\": \"dictId\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictType\",\n                        \"name\": \"dictType\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"添加字典类型\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictTypeInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"删除字典类型\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"dictCode\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictTypeDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict/type-option-select\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"字典类型全部数据 代码生成使用接口\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictName\",\n                        \"name\": \"dictName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictId\",\n                        \"name\": \"dictId\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"dictType\",\n                        \"name\": \"dictType\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/dict/type/{dictId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"字典类型通过字典id获取\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"字典类型编码\",\n                        \"name\": \"dictId\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"字典类型\"\n                ],\n                \"summary\": \"修改字典类型\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysDictTypeUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/getinfo\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"个人中心\"\n                ],\n                \"summary\": \"获取个人信息\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/login\": {\n            \"post\": {\n                \"description\": \"获取token\\nLoginHandler can be used by clients to get a jwt token.\\nPayload needs to be json in the form of {\\\"username\\\": \\\"USERNAME\\\", \\\"password\\\": \\\"PASSWORD\\\"}.\\nReply will be of the form {\\\"token\\\": \\\"TOKEN\\\"}.\\ndev mode：It should be noted that all fields cannot be empty, and a value of 0 can be passed in addition to the account password\\n注意：开发模式：需要注意全部字段不能为空，账号密码外可以传入0值\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"登陆\"\n                ],\n                \"summary\": \"登陆\",\n                \"parameters\": [\n                    {\n                        \"description\": \"account\",\n                        \"name\": \"account\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/handler.Login\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"expire\\\": \\\"2019-08-07T12:45:48+08:00\\\", \\\"token\\\": \\\".eyJleHAiOjE1NjUxNTMxNDgsImlkIjoiYWRtaW4iLCJvcmlnX2lhdCI6MTU2NTE0OTU0OH0.-zvzHvbg0A\\\" }\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/menu\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"Menu列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"menuName\",\n                        \"name\": \"menuName\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"创建菜单\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysMenuInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"删除菜单\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysMenuDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/menu/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"Menu详情数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"修改菜单\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    },\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysMenuUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/menuTreeselect/{roleId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"角色修改使用的菜单列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"roleId\",\n                        \"name\": \"roleId\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/menurole\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"菜单\"\n                ],\n                \"summary\": \"根据登录角色名称获取菜单列表数据（左菜单使用）\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/post\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"岗位\"\n                ],\n                \"summary\": \"岗位列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"postName\",\n                        \"name\": \"postName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"postCode\",\n                        \"name\": \"postCode\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"postId\",\n                        \"name\": \"postId\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"status\",\n                        \"name\": \"status\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"岗位\"\n                ],\n                \"summary\": \"添加岗位\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysPostInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"岗位\"\n                ],\n                \"summary\": \"删除岗位\",\n                \"parameters\": [\n                    {\n                        \"description\": \"请求参数\",\n                        \"name\": \"id\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysPostDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/post/{id}\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"岗位\"\n                ],\n                \"summary\": \"修改岗位\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysPostUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/post/{postId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"岗位\"\n                ],\n                \"summary\": \"获取岗位信息\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"编码\",\n                        \"name\": \"id\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/public/uploadFile\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"multipart/form-data\"\n                ],\n                \"tags\": [\n                    \"公共接口\"\n                ],\n                \"summary\": \"上传图片\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"type\",\n                        \"name\": \"type\",\n                        \"in\": \"query\",\n                        \"required\": true\n                    },\n                    {\n                        \"type\": \"file\",\n                        \"description\": \"file\",\n                        \"name\": \"file\",\n                        \"in\": \"formData\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"添加失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/role\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"Get JSON\",\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"角色列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"roleName\",\n                        \"name\": \"roleName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"status\",\n                        \"name\": \"status\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"roleKey\",\n                        \"name\": \"roleKey\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"创建角色\",\n                \"parameters\": [\n                    {\n                        \"description\": \"data\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysRoleInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"删除用户角色\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysRoleDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/role-status/{id}\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"更新角色数据权限\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.RoleDataScopeReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/role/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"获取Role数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"roleId\",\n                        \"name\": \"roleId\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"角色/Role\"\n                ],\n                \"summary\": \"修改用户角色\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysRoleUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/server-monitor\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"系统信息\"\n                ],\n                \"summary\": \"系统信息\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/set-config\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"界面操作设置配置值的获取\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"获取配置\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"修改成功\\\"}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"type\": \"object\",\n                                            \"additionalProperties\": true\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"界面操作设置配置值\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"设置配置\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"type\": \"array\",\n                            \"items\": {\n                                \"$ref\": \"#/definitions/dto.GetSetSysConfigReq\"\n                            }\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"修改成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-api\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取接口管理列表\",\n                \"tags\": [\n                    \"接口管理\"\n                ],\n                \"summary\": \"获取接口管理列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"名称\",\n                        \"name\": \"name\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"标题\",\n                        \"name\": \"title\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"地址\",\n                        \"name\": \"path\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"类型\",\n                        \"name\": \"action\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"allOf\": [\n                                                {\n                                                    \"$ref\": \"#/definitions/response.Page\"\n                                                },\n                                                {\n                                                    \"type\": \"object\",\n                                                    \"properties\": {\n                                                        \"list\": {\n                                                            \"type\": \"array\",\n                                                            \"items\": {\n                                                                \"$ref\": \"#/definitions/models.SysApi\"\n                                                            }\n                                                        }\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除接口管理\",\n                \"tags\": [\n                    \"接口管理\"\n                ],\n                \"summary\": \"删除接口管理\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysApiDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"删除成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-api/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取接口管理\",\n                \"tags\": [\n                    \"接口管理\"\n                ],\n                \"summary\": \"获取接口管理\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"$ref\": \"#/definitions/models.SysApi\"\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"修改接口管理\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"接口管理\"\n                ],\n                \"summary\": \"修改接口管理\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysApiUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"修改成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-config\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取配置管理列表\",\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"获取配置管理列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"名称\",\n                        \"name\": \"configName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"key\",\n                        \"name\": \"configKey\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"类型\",\n                        \"name\": \"configType\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"是否前端\",\n                        \"name\": \"isFrontend\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"allOf\": [\n                                                {\n                                                    \"$ref\": \"#/definitions/response.Page\"\n                                                },\n                                                {\n                                                    \"type\": \"object\",\n                                                    \"properties\": {\n                                                        \"list\": {\n                                                            \"type\": \"array\",\n                                                            \"items\": {\n                                                                \"$ref\": \"#/definitions/models.SysApi\"\n                                                            }\n                                                        }\n                                                    }\n                                                }\n                                            ]\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"创建配置管理\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"创建配置管理\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysConfigControl\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"创建成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除配置管理\",\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"删除配置管理\",\n                \"parameters\": [\n                    {\n                        \"description\": \"ids\",\n                        \"name\": \"ids\",\n                        \"in\": \"body\",\n                        \"schema\": {\n                            \"type\": \"array\",\n                            \"items\": {\n                                \"type\": \"integer\"\n                            }\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"删除成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-config/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"根据Key获取SysConfig的Service\",\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"根据Key获取SysConfig的Service\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"configKey\",\n                        \"name\": \"configKey\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"allOf\": [\n                                {\n                                    \"$ref\": \"#/definitions/response.Response\"\n                                },\n                                {\n                                    \"type\": \"object\",\n                                    \"properties\": {\n                                        \"data\": {\n                                            \"$ref\": \"#/definitions/dto.SysConfigByKeyReq\"\n                                        }\n                                    }\n                                }\n                            ]\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"修改配置管理\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"配置管理\"\n                ],\n                \"summary\": \"修改配置管理\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysConfigControl\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"message\\\": \\\"修改成功\\\"}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-login-log\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"登录日志\"\n                ],\n                \"summary\": \"登录日志列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"用户名\",\n                        \"name\": \"username\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"ip地址\",\n                        \"name\": \"ipaddr\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"归属地\",\n                        \"name\": \"loginLocation\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"状态\",\n                        \"name\": \"status\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"开始时间\",\n                        \"name\": \"beginTime\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"结束时间\",\n                        \"name\": \"endTime\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"登录日志删除\",\n                \"tags\": [\n                    \"登录日志\"\n                ],\n                \"summary\": \"登录日志删除\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysLoginLogDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-login-log/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"登录日志\"\n                ],\n                \"summary\": \"登录日志通过id获取\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-opera-log\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"操作日志\"\n                ],\n                \"summary\": \"操作日志列表\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"title\",\n                        \"name\": \"title\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"method\",\n                        \"name\": \"method\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"requestMethod\",\n                        \"name\": \"requestMethod\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"operUrl\",\n                        \"name\": \"operUrl\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"operIp\",\n                        \"name\": \"operIp\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"status\",\n                        \"name\": \"status\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"beginTime\",\n                        \"name\": \"beginTime\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"endTime\",\n                        \"name\": \"endTime\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"操作日志\"\n                ],\n                \"summary\": \"删除操作日志\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysOperaLogDeleteReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-opera-log/{id}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"操作日志\"\n                ],\n                \"summary\": \"操作日志通过id获取\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"id\",\n                        \"name\": \"id\",\n                        \"in\": \"path\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-user\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"列表用户信息数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"username\",\n                        \"name\": \"username\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"创建用户\",\n                \"parameters\": [\n                    {\n                        \"description\": \"用户数据\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysUserInsertReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys-user/{userId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"获取用户\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"用户编码\",\n                        \"name\": \"userId\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"修改用户数据\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.SysUserUpdateReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"删除数据\",\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"删除用户数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"userId\",\n                        \"name\": \"userId\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys/tables/info\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"修改表结构\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"修改表结构\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/tools.SysTables\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"添加失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            },\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"添加表结构\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"添加表结构\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"tableName / 数据表名称\",\n                        \"name\": \"tables\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"添加失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys/tables/info/{tableId}\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"获取配置\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"configKey\",\n                        \"name\": \"configKey\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            },\n            \"delete\": {\n                \"description\": \"删除表结构\",\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"删除表结构\",\n                \"parameters\": [\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"tableId\",\n                        \"name\": \"tableId\",\n                        \"in\": \"path\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": -1, \\\"message\\\": \\\"删除失败\\\"}\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/sys/tables/page\": {\n            \"get\": {\n                \"description\": \"生成表分页列表\",\n                \"tags\": [\n                    \"工具 / 生成工具\"\n                ],\n                \"summary\": \"分页列表数据\",\n                \"parameters\": [\n                    {\n                        \"type\": \"string\",\n                        \"description\": \"tableName / 数据表名称\",\n                        \"name\": \"tableName\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageSize / 页条数\",\n                        \"name\": \"pageSize\",\n                        \"in\": \"query\"\n                    },\n                    {\n                        \"type\": \"integer\",\n                        \"description\": \"pageIndex / 页码\",\n                        \"name\": \"pageIndex\",\n                        \"in\": \"query\"\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/user/avatar\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"multipart/form-data\"\n                ],\n                \"tags\": [\n                    \"个人中心\"\n                ],\n                \"summary\": \"修改头像\",\n                \"parameters\": [\n                    {\n                        \"type\": \"file\",\n                        \"description\": \"file\",\n                        \"name\": \"file\",\n                        \"in\": \"formData\",\n                        \"required\": true\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/user/profile\": {\n            \"get\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"tags\": [\n                    \"个人中心\"\n                ],\n                \"summary\": \"获取个人中心用户\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/user/pwd/reset\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"重置用户密码\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.ResetSysUserPwdReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/user/pwd/set\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"修改密码\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.PassWord\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/api/v1/user/status\": {\n            \"put\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取JSON\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"tags\": [\n                    \"用户\"\n                ],\n                \"summary\": \"修改用户状态\",\n                \"parameters\": [\n                    {\n                        \"description\": \"body\",\n                        \"name\": \"data\",\n                        \"in\": \"body\",\n                        \"required\": true,\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/dto.UpdateSysUserStatusReq\"\n                        }\n                    }\n                ],\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"data\\\": [...]}\",\n                        \"schema\": {\n                            \"$ref\": \"#/definitions/response.Response\"\n                        }\n                    }\n                }\n            }\n        },\n        \"/logout\": {\n            \"post\": {\n                \"security\": [\n                    {\n                        \"Bearer\": []\n                    }\n                ],\n                \"description\": \"获取token\",\n                \"consumes\": [\n                    \"application/json\"\n                ],\n                \"summary\": \"退出登录\",\n                \"responses\": {\n                    \"200\": {\n                        \"description\": \"{\\\"code\\\": 200, \\\"msg\\\": \\\"成功退出系统\\\" }\",\n                        \"schema\": {\n                            \"type\": \"string\"\n                        }\n                    }\n                }\n            }\n        }\n    },\n    \"definitions\": {\n        \"dto.GetSetSysConfigReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"configKey\": {\n                    \"type\": \"string\"\n                },\n                \"configValue\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.PassWord\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"newPassword\": {\n                    \"type\": \"string\"\n                },\n                \"oldPassword\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.ResetSysUserPwdReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"password\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"userId\": {\n                    \"description\": \"用户ID\",\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.RoleDataScopeReq\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"dataScope\",\n                \"roleId\"\n            ],\n            \"properties\": {\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"deptIds\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"roleId\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysApiDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                }\n            }\n        },\n        \"dto.SysApiUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"action\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"handle\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"path\": {\n                    \"type\": \"string\"\n                },\n                \"title\": {\n                    \"type\": \"string\"\n                },\n                \"type\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysConfigByKeyReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"configKey\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.SysConfigControl\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"configKey\": {\n                    \"type\": \"string\"\n                },\n                \"configName\": {\n                    \"type\": \"string\"\n                },\n                \"configType\": {\n                    \"type\": \"string\"\n                },\n                \"configValue\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"id\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"isFrontend\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDeptDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                }\n            }\n        },\n        \"dto.SysDeptInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"deptId\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"deptName\": {\n                    \"description\": \"部门名称\",\n                    \"type\": \"string\"\n                },\n                \"deptPath\": {\n                    \"description\": \"路径\",\n                    \"type\": \"string\"\n                },\n                \"email\": {\n                    \"description\": \"邮箱\",\n                    \"type\": \"string\"\n                },\n                \"leader\": {\n                    \"description\": \"负责人\",\n                    \"type\": \"string\"\n                },\n                \"parentId\": {\n                    \"description\": \"上级部门\",\n                    \"type\": \"integer\"\n                },\n                \"phone\": {\n                    \"description\": \"手机\",\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"description\": \"排序\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态\",\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDeptUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"deptId\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"deptName\": {\n                    \"description\": \"部门名称\",\n                    \"type\": \"string\"\n                },\n                \"deptPath\": {\n                    \"description\": \"路径\",\n                    \"type\": \"string\"\n                },\n                \"email\": {\n                    \"description\": \"邮箱\",\n                    \"type\": \"string\"\n                },\n                \"leader\": {\n                    \"description\": \"负责人\",\n                    \"type\": \"string\"\n                },\n                \"parentId\": {\n                    \"description\": \"上级部门\",\n                    \"type\": \"integer\"\n                },\n                \"phone\": {\n                    \"description\": \"手机\",\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"description\": \"排序\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态\",\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictDataDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictDataGetAllResp\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"label\": {\n                    \"type\": \"string\"\n                },\n                \"value\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.SysDictDataInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"cssClass\": {\n                    \"type\": \"string\"\n                },\n                \"default\": {\n                    \"type\": \"string\"\n                },\n                \"dictLabel\": {\n                    \"type\": \"string\"\n                },\n                \"dictSort\": {\n                    \"type\": \"integer\"\n                },\n                \"dictType\": {\n                    \"type\": \"string\"\n                },\n                \"dictValue\": {\n                    \"type\": \"string\"\n                },\n                \"isDefault\": {\n                    \"type\": \"string\"\n                },\n                \"listClass\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictDataUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"cssClass\": {\n                    \"type\": \"string\"\n                },\n                \"default\": {\n                    \"type\": \"string\"\n                },\n                \"dictLabel\": {\n                    \"type\": \"string\"\n                },\n                \"dictSort\": {\n                    \"type\": \"integer\"\n                },\n                \"dictType\": {\n                    \"type\": \"string\"\n                },\n                \"dictValue\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"type\": \"integer\"\n                },\n                \"isDefault\": {\n                    \"type\": \"string\"\n                },\n                \"listClass\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictTypeDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictTypeInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"dictName\": {\n                    \"type\": \"string\"\n                },\n                \"dictType\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"type\": \"integer\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysDictTypeUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"dictName\": {\n                    \"type\": \"string\"\n                },\n                \"dictType\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"type\": \"integer\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysLoginLogDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                }\n            }\n        },\n        \"dto.SysMenuDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysMenuInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"action\": {\n                    \"description\": \"请求方式\",\n                    \"type\": \"string\"\n                },\n                \"apis\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"breadcrumb\": {\n                    \"description\": \"是否面包屑\",\n                    \"type\": \"string\"\n                },\n                \"component\": {\n                    \"description\": \"组件\",\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"icon\": {\n                    \"description\": \"图标\",\n                    \"type\": \"string\"\n                },\n                \"isFrame\": {\n                    \"description\": \"是否frame\",\n                    \"type\": \"string\"\n                },\n                \"menuId\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"menuName\": {\n                    \"description\": \"菜单name\",\n                    \"type\": \"string\"\n                },\n                \"menuType\": {\n                    \"description\": \"菜单类型\",\n                    \"type\": \"string\"\n                },\n                \"noCache\": {\n                    \"description\": \"是否缓存\",\n                    \"type\": \"boolean\"\n                },\n                \"parentId\": {\n                    \"description\": \"上级菜单\",\n                    \"type\": \"integer\"\n                },\n                \"path\": {\n                    \"description\": \"路径\",\n                    \"type\": \"string\"\n                },\n                \"paths\": {\n                    \"description\": \"id路径\",\n                    \"type\": \"string\"\n                },\n                \"permission\": {\n                    \"description\": \"权限编码\",\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"description\": \"排序\",\n                    \"type\": \"integer\"\n                },\n                \"sysApi\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysApi\"\n                    }\n                },\n                \"title\": {\n                    \"description\": \"显示名称\",\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"visible\": {\n                    \"description\": \"是否显示\",\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.SysMenuUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"action\": {\n                    \"description\": \"请求方式\",\n                    \"type\": \"string\"\n                },\n                \"apis\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"breadcrumb\": {\n                    \"description\": \"是否面包屑\",\n                    \"type\": \"string\"\n                },\n                \"component\": {\n                    \"description\": \"组件\",\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"icon\": {\n                    \"description\": \"图标\",\n                    \"type\": \"string\"\n                },\n                \"isFrame\": {\n                    \"description\": \"是否frame\",\n                    \"type\": \"string\"\n                },\n                \"menuId\": {\n                    \"description\": \"编码\",\n                    \"type\": \"integer\"\n                },\n                \"menuName\": {\n                    \"description\": \"菜单name\",\n                    \"type\": \"string\"\n                },\n                \"menuType\": {\n                    \"description\": \"菜单类型\",\n                    \"type\": \"string\"\n                },\n                \"noCache\": {\n                    \"description\": \"是否缓存\",\n                    \"type\": \"boolean\"\n                },\n                \"parentId\": {\n                    \"description\": \"上级菜单\",\n                    \"type\": \"integer\"\n                },\n                \"path\": {\n                    \"description\": \"路径\",\n                    \"type\": \"string\"\n                },\n                \"paths\": {\n                    \"description\": \"id路径\",\n                    \"type\": \"string\"\n                },\n                \"permission\": {\n                    \"description\": \"权限编码\",\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"description\": \"排序\",\n                    \"type\": \"integer\"\n                },\n                \"sysApi\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysApi\"\n                    }\n                },\n                \"title\": {\n                    \"description\": \"显示名称\",\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"visible\": {\n                    \"description\": \"是否显示\",\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.SysOperaLogDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                }\n            }\n        },\n        \"dto.SysPostDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysPostInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"postCode\": {\n                    \"type\": \"string\"\n                },\n                \"postId\": {\n                    \"type\": \"integer\"\n                },\n                \"postName\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysPostUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"postCode\": {\n                    \"type\": \"string\"\n                },\n                \"postId\": {\n                    \"type\": \"integer\"\n                },\n                \"postName\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysRoleDeleteReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"ids\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                }\n            }\n        },\n        \"dto.SysRoleInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"admin\": {\n                    \"type\": \"boolean\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"deptIds\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"flag\": {\n                    \"description\": \"标记\",\n                    \"type\": \"string\"\n                },\n                \"menuIds\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"remark\": {\n                    \"description\": \"备注\",\n                    \"type\": \"string\"\n                },\n                \"roleId\": {\n                    \"description\": \"角色编码\",\n                    \"type\": \"integer\"\n                },\n                \"roleKey\": {\n                    \"description\": \"角色代码\",\n                    \"type\": \"string\"\n                },\n                \"roleName\": {\n                    \"description\": \"角色名称\",\n                    \"type\": \"string\"\n                },\n                \"roleSort\": {\n                    \"description\": \"角色排序\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态 1禁用 2正常\",\n                    \"type\": \"string\"\n                },\n                \"sysDept\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysDept\"\n                    }\n                },\n                \"sysMenu\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysMenu\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysRoleUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"admin\": {\n                    \"type\": \"boolean\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"deptIds\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"flag\": {\n                    \"description\": \"标记\",\n                    \"type\": \"string\"\n                },\n                \"menuIds\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"remark\": {\n                    \"description\": \"备注\",\n                    \"type\": \"string\"\n                },\n                \"roleId\": {\n                    \"description\": \"角色编码\",\n                    \"type\": \"integer\"\n                },\n                \"roleKey\": {\n                    \"description\": \"角色代码\",\n                    \"type\": \"string\"\n                },\n                \"roleName\": {\n                    \"description\": \"角色名称\",\n                    \"type\": \"string\"\n                },\n                \"roleSort\": {\n                    \"description\": \"角色排序\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态\",\n                    \"type\": \"string\"\n                },\n                \"sysDept\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysDept\"\n                    }\n                },\n                \"sysMenu\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysMenu\"\n                    }\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.SysUserInsertReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"avatar\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"deptId\": {\n                    \"type\": \"integer\"\n                },\n                \"email\": {\n                    \"type\": \"string\"\n                },\n                \"nickName\": {\n                    \"type\": \"string\"\n                },\n                \"password\": {\n                    \"type\": \"string\"\n                },\n                \"phone\": {\n                    \"type\": \"string\"\n                },\n                \"postId\": {\n                    \"type\": \"integer\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"roleId\": {\n                    \"type\": \"integer\"\n                },\n                \"sex\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"string\",\n                    \"default\": \"1\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"userId\": {\n                    \"description\": \"用户ID\",\n                    \"type\": \"integer\"\n                },\n                \"username\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.SysUserUpdateReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"avatar\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"deptId\": {\n                    \"type\": \"integer\"\n                },\n                \"email\": {\n                    \"type\": \"string\"\n                },\n                \"nickName\": {\n                    \"type\": \"string\"\n                },\n                \"phone\": {\n                    \"type\": \"string\"\n                },\n                \"postId\": {\n                    \"type\": \"integer\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"roleId\": {\n                    \"type\": \"integer\"\n                },\n                \"sex\": {\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"string\",\n                    \"default\": \"1\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"userId\": {\n                    \"description\": \"用户ID\",\n                    \"type\": \"integer\"\n                },\n                \"username\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"dto.UpdateStatusReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"roleId\": {\n                    \"description\": \"角色编码\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态\",\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"dto.UpdateSysUserStatusReq\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"userId\": {\n                    \"description\": \"用户ID\",\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"handler.Login\": {\n            \"type\": \"object\",\n            \"required\": [\n                \"code\",\n                \"password\",\n                \"username\",\n                \"uuid\"\n            ],\n            \"properties\": {\n                \"code\": {\n                    \"type\": \"string\"\n                },\n                \"password\": {\n                    \"type\": \"string\"\n                },\n                \"username\": {\n                    \"type\": \"string\"\n                },\n                \"uuid\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"models.SysApi\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"action\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"handle\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"type\": \"integer\"\n                },\n                \"path\": {\n                    \"type\": \"string\"\n                },\n                \"title\": {\n                    \"type\": \"string\"\n                },\n                \"type\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"models.SysConfig\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"configKey\": {\n                    \"type\": \"string\"\n                },\n                \"configName\": {\n                    \"type\": \"string\"\n                },\n                \"configType\": {\n                    \"type\": \"string\"\n                },\n                \"configValue\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"id\": {\n                    \"type\": \"integer\"\n                },\n                \"isFrontend\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"models.SysDept\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"children\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysDept\"\n                    }\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"deptId\": {\n                    \"description\": \"部门编码\",\n                    \"type\": \"integer\"\n                },\n                \"deptName\": {\n                    \"description\": \"部门名称\",\n                    \"type\": \"string\"\n                },\n                \"deptPath\": {\n                    \"type\": \"string\"\n                },\n                \"email\": {\n                    \"description\": \"邮箱\",\n                    \"type\": \"string\"\n                },\n                \"leader\": {\n                    \"description\": \"负责人\",\n                    \"type\": \"string\"\n                },\n                \"params\": {\n                    \"type\": \"string\"\n                },\n                \"parentId\": {\n                    \"description\": \"上级部门\",\n                    \"type\": \"integer\"\n                },\n                \"phone\": {\n                    \"description\": \"手机\",\n                    \"type\": \"string\"\n                },\n                \"sort\": {\n                    \"description\": \"排序\",\n                    \"type\": \"integer\"\n                },\n                \"status\": {\n                    \"description\": \"状态\",\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"models.SysMenu\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"action\": {\n                    \"type\": \"string\"\n                },\n                \"apis\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"type\": \"integer\"\n                    }\n                },\n                \"breadcrumb\": {\n                    \"type\": \"string\"\n                },\n                \"children\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysMenu\"\n                    }\n                },\n                \"component\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"icon\": {\n                    \"type\": \"string\"\n                },\n                \"isFrame\": {\n                    \"type\": \"string\"\n                },\n                \"is_select\": {\n                    \"type\": \"boolean\"\n                },\n                \"menuId\": {\n                    \"type\": \"integer\"\n                },\n                \"menuName\": {\n                    \"type\": \"string\"\n                },\n                \"menuType\": {\n                    \"type\": \"string\"\n                },\n                \"noCache\": {\n                    \"type\": \"boolean\"\n                },\n                \"params\": {\n                    \"type\": \"string\"\n                },\n                \"parentId\": {\n                    \"type\": \"integer\"\n                },\n                \"path\": {\n                    \"type\": \"string\"\n                },\n                \"paths\": {\n                    \"type\": \"string\"\n                },\n                \"permission\": {\n                    \"type\": \"string\"\n                },\n                \"roleId\": {\n                    \"type\": \"integer\"\n                },\n                \"sort\": {\n                    \"type\": \"integer\"\n                },\n                \"sysApi\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/models.SysApi\"\n                    }\n                },\n                \"title\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                },\n                \"visible\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"response.Page\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"count\": {\n                    \"type\": \"integer\"\n                },\n                \"pageIndex\": {\n                    \"type\": \"integer\"\n                },\n                \"pageSize\": {\n                    \"type\": \"integer\"\n                }\n            }\n        },\n        \"response.Response\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"code\": {\n                    \"type\": \"integer\"\n                },\n                \"msg\": {\n                    \"type\": \"string\"\n                },\n                \"requestId\": {\n                    \"description\": \"数据集\",\n                    \"type\": \"string\"\n                },\n                \"status\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"tools.Params\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"treeCode\": {\n                    \"type\": \"string\"\n                },\n                \"treeName\": {\n                    \"type\": \"string\"\n                },\n                \"treeParentCode\": {\n                    \"type\": \"string\"\n                }\n            }\n        },\n        \"tools.SysColumns\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"columnComment\": {\n                    \"type\": \"string\"\n                },\n                \"columnId\": {\n                    \"type\": \"integer\"\n                },\n                \"columnName\": {\n                    \"type\": \"string\"\n                },\n                \"columnType\": {\n                    \"type\": \"string\"\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"deletedAt\": {\n                    \"type\": \"string\"\n                },\n                \"dictType\": {\n                    \"type\": \"string\"\n                },\n                \"edit\": {\n                    \"type\": \"boolean\"\n                },\n                \"fkCol\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/tools.SysColumns\"\n                    }\n                },\n                \"fkLabelId\": {\n                    \"type\": \"string\"\n                },\n                \"fkLabelName\": {\n                    \"type\": \"string\"\n                },\n                \"fkTableName\": {\n                    \"type\": \"string\"\n                },\n                \"fkTableNameClass\": {\n                    \"type\": \"string\"\n                },\n                \"fkTableNamePackage\": {\n                    \"type\": \"string\"\n                },\n                \"goField\": {\n                    \"type\": \"string\"\n                },\n                \"goType\": {\n                    \"type\": \"string\"\n                },\n                \"htmlType\": {\n                    \"type\": \"string\"\n                },\n                \"increment\": {\n                    \"type\": \"boolean\"\n                },\n                \"insert\": {\n                    \"type\": \"boolean\"\n                },\n                \"isEdit\": {\n                    \"type\": \"string\"\n                },\n                \"isIncrement\": {\n                    \"type\": \"string\"\n                },\n                \"isInsert\": {\n                    \"type\": \"string\"\n                },\n                \"isList\": {\n                    \"type\": \"string\"\n                },\n                \"isPk\": {\n                    \"type\": \"string\"\n                },\n                \"isQuery\": {\n                    \"type\": \"string\"\n                },\n                \"isRequired\": {\n                    \"type\": \"string\"\n                },\n                \"jsonField\": {\n                    \"type\": \"string\"\n                },\n                \"list\": {\n                    \"type\": \"string\"\n                },\n                \"pk\": {\n                    \"type\": \"boolean\"\n                },\n                \"query\": {\n                    \"type\": \"boolean\"\n                },\n                \"queryType\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"required\": {\n                    \"type\": \"boolean\"\n                },\n                \"sort\": {\n                    \"type\": \"integer\"\n                },\n                \"superColumn\": {\n                    \"type\": \"boolean\"\n                },\n                \"tableId\": {\n                    \"type\": \"integer\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                },\n                \"usableColumn\": {\n                    \"type\": \"boolean\"\n                }\n            }\n        },\n        \"tools.SysTables\": {\n            \"type\": \"object\",\n            \"properties\": {\n                \"businessName\": {\n                    \"type\": \"string\"\n                },\n                \"className\": {\n                    \"description\": \"类名\",\n                    \"type\": \"string\"\n                },\n                \"columns\": {\n                    \"type\": \"array\",\n                    \"items\": {\n                        \"$ref\": \"#/definitions/tools.SysColumns\"\n                    }\n                },\n                \"createBy\": {\n                    \"type\": \"integer\"\n                },\n                \"createdAt\": {\n                    \"type\": \"string\"\n                },\n                \"crud\": {\n                    \"type\": \"boolean\"\n                },\n                \"dataScope\": {\n                    \"type\": \"string\"\n                },\n                \"deletedAt\": {\n                    \"type\": \"string\"\n                },\n                \"functionAuthor\": {\n                    \"description\": \"功能作者\",\n                    \"type\": \"string\"\n                },\n                \"functionName\": {\n                    \"description\": \"功能名称\",\n                    \"type\": \"string\"\n                },\n                \"isActions\": {\n                    \"type\": \"integer\"\n                },\n                \"isAuth\": {\n                    \"type\": \"integer\"\n                },\n                \"isDataScope\": {\n                    \"type\": \"integer\"\n                },\n                \"isLogicalDelete\": {\n                    \"type\": \"string\"\n                },\n                \"logicalDelete\": {\n                    \"type\": \"boolean\"\n                },\n                \"logicalDeleteColumn\": {\n                    \"type\": \"string\"\n                },\n                \"moduleFrontName\": {\n                    \"description\": \"前端文件名\",\n                    \"type\": \"string\"\n                },\n                \"moduleName\": {\n                    \"description\": \"go文件名\",\n                    \"type\": \"string\"\n                },\n                \"options\": {\n                    \"type\": \"string\"\n                },\n                \"packageName\": {\n                    \"description\": \"包名\",\n                    \"type\": \"string\"\n                },\n                \"params\": {\n                    \"$ref\": \"#/definitions/tools.Params\"\n                },\n                \"pkColumn\": {\n                    \"type\": \"string\"\n                },\n                \"pkGoField\": {\n                    \"type\": \"string\"\n                },\n                \"pkJsonField\": {\n                    \"type\": \"string\"\n                },\n                \"remark\": {\n                    \"type\": \"string\"\n                },\n                \"tableComment\": {\n                    \"description\": \"表备注\",\n                    \"type\": \"string\"\n                },\n                \"tableId\": {\n                    \"description\": \"表编码\",\n                    \"type\": \"integer\"\n                },\n                \"tableName\": {\n                    \"description\": \"表名称\",\n                    \"type\": \"string\"\n                },\n                \"tplCategory\": {\n                    \"type\": \"string\"\n                },\n                \"tree\": {\n                    \"type\": \"boolean\"\n                },\n                \"treeCode\": {\n                    \"type\": \"string\"\n                },\n                \"treeName\": {\n                    \"type\": \"string\"\n                },\n                \"treeParentCode\": {\n                    \"type\": \"string\"\n                },\n                \"updateBy\": {\n                    \"type\": \"integer\"\n                },\n                \"updatedAt\": {\n                    \"type\": \"string\"\n                }\n            }\n        }\n    },\n    \"securityDefinitions\": {\n        \"Bearer\": {\n            \"type\": \"apiKey\",\n            \"name\": \"Authorization\",\n            \"in\": \"header\"\n        }\n    }\n}"
  },
  {
    "path": "docs/admin/admin_swagger.yaml",
    "content": "definitions:\n  dto.GetSetSysConfigReq:\n    properties:\n      configKey:\n        type: string\n      configValue:\n        type: string\n    type: object\n  dto.PassWord:\n    properties:\n      newPassword:\n        type: string\n      oldPassword:\n        type: string\n    type: object\n  dto.ResetSysUserPwdReq:\n    properties:\n      createBy:\n        type: integer\n      password:\n        type: string\n      updateBy:\n        type: integer\n      userId:\n        description: 用户ID\n        type: integer\n    type: object\n  dto.RoleDataScopeReq:\n    properties:\n      dataScope:\n        type: string\n      deptIds:\n        items:\n          type: integer\n        type: array\n      roleId:\n        type: integer\n    required:\n    - dataScope\n    - roleId\n    type: object\n  dto.SysApiDeleteReq:\n    properties:\n      ids:\n        items:\n          type: integer\n        type: array\n    type: object\n  dto.SysApiUpdateReq:\n    properties:\n      action:\n        type: string\n      createBy:\n        type: integer\n      handle:\n        type: string\n      id:\n        description: 编码\n        type: integer\n      path:\n        type: string\n      title:\n        type: string\n      type:\n        type: string\n      updateBy:\n        type: integer\n    type: object\n  dto.SysConfigByKeyReq:\n    properties:\n      configKey:\n        type: string\n    type: object\n  dto.SysConfigControl:\n    properties:\n      configKey:\n        type: string\n      configName:\n        type: string\n      configType:\n        type: string\n      configValue:\n        type: string\n      createBy:\n        type: integer\n      id:\n        description: 编码\n        type: integer\n      isFrontend:\n        type: string\n      remark:\n        type: string\n      updateBy:\n        type: integer\n    type: object\n  dto.SysDeptDeleteReq:\n    properties:\n      ids:\n        items:\n          type: integer\n        type: array\n    type: object\n  dto.SysDeptInsertReq:\n    properties:\n      createBy:\n        type: integer\n      deptId:\n        description: 编码\n        type: integer\n      deptName:\n        description: 部门名称\n        type: string\n      deptPath:\n        description: 路径\n        type: string\n      email:\n        description: 邮箱\n        type: string\n      leader:\n        description: 负责人\n        type: string\n      parentId:\n        description: 上级部门\n        type: integer\n      phone:\n        description: 手机\n        type: string\n      sort:\n        description: 排序\n        type: integer\n      status:\n        description: 状态\n        type: integer\n      updateBy:\n        type: integer\n    type: object\n  dto.SysDeptUpdateReq:\n    properties:\n      createBy:\n        type: integer\n      deptId:\n        description: 编码\n        type: integer\n      deptName:\n        description: 部门名称\n        type: string\n      deptPath:\n        description: 路径\n        type: string\n      email:\n        description: 邮箱\n        type: string\n      leader:\n        description: 负责人\n        type: string\n      parentId:\n        description: 上级部门\n        type: integer\n      phone:\n        description: 手机\n        type: string\n      sort:\n        description: 排序\n        type: integer\n      status:\n        description: 状态\n        type: integer\n      updateBy:\n        type: integer\n    type: object\n  dto.SysDictDataDeleteReq:\n    properties:\n      createBy:\n        type: integer\n      ids:\n        items:\n          type: integer\n        type: array\n      updateBy:\n        type: integer\n    type: object\n  dto.SysDictDataGetAllResp:\n    properties:\n      label:\n        type: string\n      value:\n        type: string\n    type: object\n  dto.SysDictDataInsertReq:\n    properties:\n      createBy:\n        type: integer\n      cssClass:\n        type: string\n      default:\n        type: string\n      dictLabel:\n        type: string\n      dictSort:\n        type: integer\n      dictType:\n        type: string\n      dictValue:\n        type: string\n      isDefault:\n        type: string\n      listClass:\n        type: string\n      remark:\n        type: string\n      status:\n        type: integer\n      updateBy:\n        type: integer\n    type: object\n  dto.SysDictDataUpdateReq:\n    properties:\n      createBy:\n        type: integer\n      cssClass:\n        type: string\n      default:\n        type: string\n      dictLabel:\n        type: string\n      dictSort:\n        type: integer\n      dictType:\n        type: string\n      dictValue:\n        type: string\n      id:\n        type: integer\n      isDefault:\n        type: string\n      listClass:\n        type: string\n      remark:\n        type: string\n      status:\n        type: integer\n      updateBy:\n        type: integer\n    type: object\n  dto.SysDictTypeDeleteReq:\n    properties:\n      createBy:\n        type: integer\n      ids:\n        items:\n          type: integer\n        type: array\n      updateBy:\n        type: integer\n    type: object\n  dto.SysDictTypeInsertReq:\n    properties:\n      createBy:\n        type: integer\n      dictName:\n        type: string\n      dictType:\n        type: string\n      id:\n        type: integer\n      remark:\n        type: string\n      status:\n        type: integer\n      updateBy:\n        type: integer\n    type: object\n  dto.SysDictTypeUpdateReq:\n    properties:\n      createBy:\n        type: integer\n      dictName:\n        type: string\n      dictType:\n        type: string\n      id:\n        type: integer\n      remark:\n        type: string\n      status:\n        type: integer\n      updateBy:\n        type: integer\n    type: object\n  dto.SysLoginLogDeleteReq:\n    properties:\n      ids:\n        items:\n          type: integer\n        type: array\n    type: object\n  dto.SysMenuDeleteReq:\n    properties:\n      createBy:\n        type: integer\n      ids:\n        items:\n          type: integer\n        type: array\n      updateBy:\n        type: integer\n    type: object\n  dto.SysMenuInsertReq:\n    properties:\n      action:\n        description: 请求方式\n        type: string\n      apis:\n        items:\n          type: integer\n        type: array\n      breadcrumb:\n        description: 是否面包屑\n        type: string\n      component:\n        description: 组件\n        type: string\n      createBy:\n        type: integer\n      icon:\n        description: 图标\n        type: string\n      isFrame:\n        description: 是否frame\n        type: string\n      menuId:\n        description: 编码\n        type: integer\n      menuName:\n        description: 菜单name\n        type: string\n      menuType:\n        description: 菜单类型\n        type: string\n      noCache:\n        description: 是否缓存\n        type: boolean\n      parentId:\n        description: 上级菜单\n        type: integer\n      path:\n        description: 路径\n        type: string\n      paths:\n        description: id路径\n        type: string\n      permission:\n        description: 权限编码\n        type: string\n      sort:\n        description: 排序\n        type: integer\n      sysApi:\n        items:\n          $ref: '#/definitions/models.SysApi'\n        type: array\n      title:\n        description: 显示名称\n        type: string\n      updateBy:\n        type: integer\n      visible:\n        description: 是否显示\n        type: string\n    type: object\n  dto.SysMenuUpdateReq:\n    properties:\n      action:\n        description: 请求方式\n        type: string\n      apis:\n        items:\n          type: integer\n        type: array\n      breadcrumb:\n        description: 是否面包屑\n        type: string\n      component:\n        description: 组件\n        type: string\n      createBy:\n        type: integer\n      icon:\n        description: 图标\n        type: string\n      isFrame:\n        description: 是否frame\n        type: string\n      menuId:\n        description: 编码\n        type: integer\n      menuName:\n        description: 菜单name\n        type: string\n      menuType:\n        description: 菜单类型\n        type: string\n      noCache:\n        description: 是否缓存\n        type: boolean\n      parentId:\n        description: 上级菜单\n        type: integer\n      path:\n        description: 路径\n        type: string\n      paths:\n        description: id路径\n        type: string\n      permission:\n        description: 权限编码\n        type: string\n      sort:\n        description: 排序\n        type: integer\n      sysApi:\n        items:\n          $ref: '#/definitions/models.SysApi'\n        type: array\n      title:\n        description: 显示名称\n        type: string\n      updateBy:\n        type: integer\n      visible:\n        description: 是否显示\n        type: string\n    type: object\n  dto.SysOperaLogDeleteReq:\n    properties:\n      ids:\n        items:\n          type: integer\n        type: array\n    type: object\n  dto.SysPostDeleteReq:\n    properties:\n      createBy:\n        type: integer\n      ids:\n        items:\n          type: integer\n        type: array\n      updateBy:\n        type: integer\n    type: object\n  dto.SysPostInsertReq:\n    properties:\n      createBy:\n        type: integer\n      postCode:\n        type: string\n      postId:\n        type: integer\n      postName:\n        type: string\n      remark:\n        type: string\n      sort:\n        type: integer\n      status:\n        type: integer\n      updateBy:\n        type: integer\n    type: object\n  dto.SysPostUpdateReq:\n    properties:\n      createBy:\n        type: integer\n      postCode:\n        type: string\n      postId:\n        type: integer\n      postName:\n        type: string\n      remark:\n        type: string\n      sort:\n        type: integer\n      status:\n        type: integer\n      updateBy:\n        type: integer\n    type: object\n  dto.SysRoleDeleteReq:\n    properties:\n      ids:\n        items:\n          type: integer\n        type: array\n    type: object\n  dto.SysRoleInsertReq:\n    properties:\n      admin:\n        type: boolean\n      createBy:\n        type: integer\n      dataScope:\n        type: string\n      deptIds:\n        items:\n          type: integer\n        type: array\n      flag:\n        description: 标记\n        type: string\n      menuIds:\n        items:\n          type: integer\n        type: array\n      remark:\n        description: 备注\n        type: string\n      roleId:\n        description: 角色编码\n        type: integer\n      roleKey:\n        description: 角色代码\n        type: string\n      roleName:\n        description: 角色名称\n        type: string\n      roleSort:\n        description: 角色排序\n        type: integer\n      status:\n        description: 状态 1禁用 2正常\n        type: string\n      sysDept:\n        items:\n          $ref: '#/definitions/models.SysDept'\n        type: array\n      sysMenu:\n        items:\n          $ref: '#/definitions/models.SysMenu'\n        type: array\n      updateBy:\n        type: integer\n    type: object\n  dto.SysRoleUpdateReq:\n    properties:\n      admin:\n        type: boolean\n      createBy:\n        type: integer\n      dataScope:\n        type: string\n      deptIds:\n        items:\n          type: integer\n        type: array\n      flag:\n        description: 标记\n        type: string\n      menuIds:\n        items:\n          type: integer\n        type: array\n      remark:\n        description: 备注\n        type: string\n      roleId:\n        description: 角色编码\n        type: integer\n      roleKey:\n        description: 角色代码\n        type: string\n      roleName:\n        description: 角色名称\n        type: string\n      roleSort:\n        description: 角色排序\n        type: integer\n      status:\n        description: 状态\n        type: string\n      sysDept:\n        items:\n          $ref: '#/definitions/models.SysDept'\n        type: array\n      sysMenu:\n        items:\n          $ref: '#/definitions/models.SysMenu'\n        type: array\n      updateBy:\n        type: integer\n    type: object\n  dto.SysUserInsertReq:\n    properties:\n      avatar:\n        type: string\n      createBy:\n        type: integer\n      deptId:\n        type: integer\n      email:\n        type: string\n      nickName:\n        type: string\n      password:\n        type: string\n      phone:\n        type: string\n      postId:\n        type: integer\n      remark:\n        type: string\n      roleId:\n        type: integer\n      sex:\n        type: string\n      status:\n        default: \"1\"\n        type: string\n      updateBy:\n        type: integer\n      userId:\n        description: 用户ID\n        type: integer\n      username:\n        type: string\n    type: object\n  dto.SysUserUpdateReq:\n    properties:\n      avatar:\n        type: string\n      createBy:\n        type: integer\n      deptId:\n        type: integer\n      email:\n        type: string\n      nickName:\n        type: string\n      phone:\n        type: string\n      postId:\n        type: integer\n      remark:\n        type: string\n      roleId:\n        type: integer\n      sex:\n        type: string\n      status:\n        default: \"1\"\n        type: string\n      updateBy:\n        type: integer\n      userId:\n        description: 用户ID\n        type: integer\n      username:\n        type: string\n    type: object\n  dto.UpdateStatusReq:\n    properties:\n      createBy:\n        type: integer\n      roleId:\n        description: 角色编码\n        type: integer\n      status:\n        description: 状态\n        type: string\n      updateBy:\n        type: integer\n    type: object\n  dto.UpdateSysUserStatusReq:\n    properties:\n      createBy:\n        type: integer\n      status:\n        type: string\n      updateBy:\n        type: integer\n      userId:\n        description: 用户ID\n        type: integer\n    type: object\n  handler.Login:\n    properties:\n      code:\n        type: string\n      password:\n        type: string\n      username:\n        type: string\n      uuid:\n        type: string\n    required:\n    - code\n    - password\n    - username\n    - uuid\n    type: object\n  models.SysApi:\n    properties:\n      action:\n        type: string\n      createBy:\n        type: integer\n      createdAt:\n        type: string\n      handle:\n        type: string\n      id:\n        type: integer\n      path:\n        type: string\n      title:\n        type: string\n      type:\n        type: string\n      updateBy:\n        type: integer\n      updatedAt:\n        type: string\n    type: object\n  models.SysConfig:\n    properties:\n      configKey:\n        type: string\n      configName:\n        type: string\n      configType:\n        type: string\n      configValue:\n        type: string\n      createBy:\n        type: integer\n      createdAt:\n        type: string\n      id:\n        type: integer\n      isFrontend:\n        type: string\n      remark:\n        type: string\n      updateBy:\n        type: integer\n      updatedAt:\n        type: string\n    type: object\n  models.SysDept:\n    properties:\n      children:\n        items:\n          $ref: '#/definitions/models.SysDept'\n        type: array\n      createBy:\n        type: integer\n      createdAt:\n        type: string\n      dataScope:\n        type: string\n      deptId:\n        description: 部门编码\n        type: integer\n      deptName:\n        description: 部门名称\n        type: string\n      deptPath:\n        type: string\n      email:\n        description: 邮箱\n        type: string\n      leader:\n        description: 负责人\n        type: string\n      params:\n        type: string\n      parentId:\n        description: 上级部门\n        type: integer\n      phone:\n        description: 手机\n        type: string\n      sort:\n        description: 排序\n        type: integer\n      status:\n        description: 状态\n        type: integer\n      updateBy:\n        type: integer\n      updatedAt:\n        type: string\n    type: object\n  models.SysMenu:\n    properties:\n      action:\n        type: string\n      apis:\n        items:\n          type: integer\n        type: array\n      breadcrumb:\n        type: string\n      children:\n        items:\n          $ref: '#/definitions/models.SysMenu'\n        type: array\n      component:\n        type: string\n      createBy:\n        type: integer\n      createdAt:\n        type: string\n      dataScope:\n        type: string\n      icon:\n        type: string\n      is_select:\n        type: boolean\n      isFrame:\n        type: string\n      menuId:\n        type: integer\n      menuName:\n        type: string\n      menuType:\n        type: string\n      noCache:\n        type: boolean\n      params:\n        type: string\n      parentId:\n        type: integer\n      path:\n        type: string\n      paths:\n        type: string\n      permission:\n        type: string\n      roleId:\n        type: integer\n      sort:\n        type: integer\n      sysApi:\n        items:\n          $ref: '#/definitions/models.SysApi'\n        type: array\n      title:\n        type: string\n      updateBy:\n        type: integer\n      updatedAt:\n        type: string\n      visible:\n        type: string\n    type: object\n  response.Page:\n    properties:\n      count:\n        type: integer\n      pageIndex:\n        type: integer\n      pageSize:\n        type: integer\n    type: object\n  response.Response:\n    properties:\n      code:\n        type: integer\n      msg:\n        type: string\n      requestId:\n        description: 数据集\n        type: string\n      status:\n        type: string\n    type: object\n  tools.Params:\n    properties:\n      treeCode:\n        type: string\n      treeName:\n        type: string\n      treeParentCode:\n        type: string\n    type: object\n  tools.SysColumns:\n    properties:\n      columnComment:\n        type: string\n      columnId:\n        type: integer\n      columnName:\n        type: string\n      columnType:\n        type: string\n      createBy:\n        type: integer\n      createdAt:\n        type: string\n      deletedAt:\n        type: string\n      dictType:\n        type: string\n      edit:\n        type: boolean\n      fkCol:\n        items:\n          $ref: '#/definitions/tools.SysColumns'\n        type: array\n      fkLabelId:\n        type: string\n      fkLabelName:\n        type: string\n      fkTableName:\n        type: string\n      fkTableNameClass:\n        type: string\n      fkTableNamePackage:\n        type: string\n      goField:\n        type: string\n      goType:\n        type: string\n      htmlType:\n        type: string\n      increment:\n        type: boolean\n      insert:\n        type: boolean\n      isEdit:\n        type: string\n      isIncrement:\n        type: string\n      isInsert:\n        type: string\n      isList:\n        type: string\n      isPk:\n        type: string\n      isQuery:\n        type: string\n      isRequired:\n        type: string\n      jsonField:\n        type: string\n      list:\n        type: string\n      pk:\n        type: boolean\n      query:\n        type: boolean\n      queryType:\n        type: string\n      remark:\n        type: string\n      required:\n        type: boolean\n      sort:\n        type: integer\n      superColumn:\n        type: boolean\n      tableId:\n        type: integer\n      updateBy:\n        type: integer\n      updatedAt:\n        type: string\n      usableColumn:\n        type: boolean\n    type: object\n  tools.SysTables:\n    properties:\n      businessName:\n        type: string\n      className:\n        description: 类名\n        type: string\n      columns:\n        items:\n          $ref: '#/definitions/tools.SysColumns'\n        type: array\n      createBy:\n        type: integer\n      createdAt:\n        type: string\n      crud:\n        type: boolean\n      dataScope:\n        type: string\n      deletedAt:\n        type: string\n      functionAuthor:\n        description: 功能作者\n        type: string\n      functionName:\n        description: 功能名称\n        type: string\n      isActions:\n        type: integer\n      isAuth:\n        type: integer\n      isDataScope:\n        type: integer\n      isLogicalDelete:\n        type: string\n      logicalDelete:\n        type: boolean\n      logicalDeleteColumn:\n        type: string\n      moduleFrontName:\n        description: 前端文件名\n        type: string\n      moduleName:\n        description: go文件名\n        type: string\n      options:\n        type: string\n      packageName:\n        description: 包名\n        type: string\n      params:\n        $ref: '#/definitions/tools.Params'\n      pkColumn:\n        type: string\n      pkGoField:\n        type: string\n      pkJsonField:\n        type: string\n      remark:\n        type: string\n      tableComment:\n        description: 表备注\n        type: string\n      tableId:\n        description: 表编码\n        type: integer\n      tableName:\n        description: 表名称\n        type: string\n      tplCategory:\n        type: string\n      tree:\n        type: boolean\n      treeCode:\n        type: string\n      treeName:\n        type: string\n      treeParentCode:\n        type: string\n      updateBy:\n        type: integer\n      updatedAt:\n        type: string\n    type: object\ninfo:\n  contact: {}\n  description: |-\n    基于Gin + Vue + Element UI的前后端分离权限管理系统的接口文档\n    添加qq群: 521386980 进入技术交流群 请先star，谢谢！\n  license:\n    name: MIT\n    url: https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md\n  title: go-admin API\n  version: 2.0.0\npaths:\n  /api/v1/app-config:\n    get:\n      description: 获取系统配置信息，主要注意这里不在验证权限\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            allOf:\n            - $ref: '#/definitions/response.Response'\n            - properties:\n                data:\n                  additionalProperties:\n                    type: string\n                  type: object\n              type: object\n      summary: 获取系统前台配置信息，主要注意这里不在验证权限\n      tags:\n      - 配置管理\n  /api/v1/captcha:\n    get:\n      description: 获取验证码\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            allOf:\n            - $ref: '#/definitions/response.Response'\n            - properties:\n                data:\n                  type: string\n                id:\n                  type: string\n                msg:\n                  type: string\n              type: object\n      summary: 获取验证码\n      tags:\n      - 登陆\n  /api/v1/db/columns/page:\n    get:\n      description: 数据库表列分页列表 / database table column page list\n      parameters:\n      - description: tableName / 数据表名称\n        in: query\n        name: tableName\n        type: string\n      - description: pageSize / 页条数\n        in: query\n        name: pageSize\n        type: integer\n      - description: pageIndex / 页码\n        in: query\n        name: pageIndex\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      summary: 分页列表数据 / page list data\n      tags:\n      - 工具 / 生成工具\n  /api/v1/db/tables/page:\n    get:\n      description: 数据库表分页列表 / database table page list\n      parameters:\n      - description: tableName / 数据表名称\n        in: query\n        name: tableName\n        type: string\n      - description: pageSize / 页条数\n        in: query\n        name: pageSize\n        type: integer\n      - description: pageIndex / 页码\n        in: query\n        name: pageIndex\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      summary: 分页列表数据 / page list data\n      tags:\n      - 工具 / 生成工具\n  /api/v1/dept:\n    delete:\n      description: 删除数据\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysDeptDeleteReq'\n      responses:\n        \"200\":\n          description: '{\"code\": -1, \"message\": \"删除失败\"}'\n          schema:\n            type: string\n      security:\n      - Bearer: []\n      summary: 删除部门\n      tags:\n      - 部门\n    get:\n      description: 分页列表\n      parameters:\n      - description: deptName\n        in: query\n        name: deptName\n        type: string\n      - description: deptId\n        in: query\n        name: deptId\n        type: string\n      - description: position\n        in: query\n        name: position\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 分页部门列表数据\n      tags:\n      - 部门\n    post:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: data\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysDeptInsertReq'\n      responses:\n        \"200\":\n          description: '{\"code\": -1, \"message\": \"添加失败\"}'\n          schema:\n            type: string\n      security:\n      - Bearer: []\n      summary: 添加部门\n      tags:\n      - 部门\n  /api/v1/dept/{deptId}:\n    get:\n      description: 获取JSON\n      parameters:\n      - description: deptId\n        in: path\n        name: deptId\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 获取部门数据\n      tags:\n      - 部门\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: id\n        in: path\n        name: id\n        required: true\n        type: integer\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysDeptUpdateReq'\n      responses:\n        \"200\":\n          description: '{\"code\": -1, \"message\": \"添加失败\"}'\n          schema:\n            type: string\n      security:\n      - Bearer: []\n      summary: 修改部门\n      tags:\n      - 部门\n  /api/v1/dict-data/option-select:\n    get:\n      description: 数据字典根据key获取\n      parameters:\n      - description: dictType\n        in: query\n        name: dictType\n        required: true\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            allOf:\n            - $ref: '#/definitions/response.Response'\n            - properties:\n                data:\n                  items:\n                    $ref: '#/definitions/dto.SysDictDataGetAllResp'\n                  type: array\n              type: object\n      security:\n      - Bearer: []\n      summary: 数据字典根据key获取\n      tags:\n      - 字典数据\n  /api/v1/dict/data:\n    delete:\n      description: 删除数据\n      parameters:\n      - description: body\n        in: body\n        name: dictCode\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysDictDataDeleteReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"message\": \"删除成功\"}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 删除字典数据\n      tags:\n      - 字典数据\n    get:\n      description: 获取JSON\n      parameters:\n      - description: status\n        in: query\n        name: status\n        type: string\n      - description: dictCode\n        in: query\n        name: dictCode\n        type: string\n      - description: dictType\n        in: query\n        name: dictType\n        type: string\n      - description: 页条数\n        in: query\n        name: pageSize\n        type: integer\n      - description: 页码\n        in: query\n        name: pageIndex\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 字典数据列表\n      tags:\n      - 字典数据\n    post:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: data\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysDictDataInsertReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"message\": \"添加成功\"}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 添加字典数据\n      tags:\n      - 字典数据\n  /api/v1/dict/data/{dictCode}:\n    get:\n      description: 获取JSON\n      parameters:\n      - description: 字典编码\n        in: path\n        name: dictCode\n        required: true\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 通过编码获取字典数据\n      tags:\n      - 字典数据\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysDictDataUpdateReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"message\": \"修改成功\"}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改字典数据\n      tags:\n      - 字典数据\n  /api/v1/dict/type:\n    delete:\n      description: 删除数据\n      parameters:\n      - description: body\n        in: body\n        name: dictCode\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysDictTypeDeleteReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 删除字典类型\n      tags:\n      - 字典类型\n    get:\n      description: 获取JSON\n      parameters:\n      - description: dictName\n        in: query\n        name: dictName\n        type: string\n      - description: dictId\n        in: query\n        name: dictId\n        type: string\n      - description: dictType\n        in: query\n        name: dictType\n        type: string\n      - description: 页条数\n        in: query\n        name: pageSize\n        type: integer\n      - description: 页码\n        in: query\n        name: pageIndex\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 字典类型列表数据\n      tags:\n      - 字典类型\n    post:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: data\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysDictTypeInsertReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 添加字典类型\n      tags:\n      - 字典类型\n  /api/v1/dict/type-option-select:\n    get:\n      description: 获取JSON\n      parameters:\n      - description: dictName\n        in: query\n        name: dictName\n        type: string\n      - description: dictId\n        in: query\n        name: dictId\n        type: string\n      - description: dictType\n        in: query\n        name: dictType\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 字典类型全部数据 代码生成使用接口\n      tags:\n      - 字典类型\n  /api/v1/dict/type/{dictId}:\n    get:\n      description: 获取JSON\n      parameters:\n      - description: 字典类型编码\n        in: path\n        name: dictId\n        required: true\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 字典类型通过字典id获取\n      tags:\n      - 字典类型\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysDictTypeUpdateReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改字典类型\n      tags:\n      - 字典类型\n  /api/v1/getinfo:\n    get:\n      description: 获取JSON\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 获取个人信息\n      tags:\n      - 个人中心\n  /api/v1/login:\n    post:\n      consumes:\n      - application/json\n      description: |-\n        获取token\n        LoginHandler can be used by clients to get a jwt token.\n        Payload needs to be json in the form of {\"username\": \"USERNAME\", \"password\": \"PASSWORD\"}.\n        Reply will be of the form {\"token\": \"TOKEN\"}.\n        dev mode：It should be noted that all fields cannot be empty, and a value of 0 can be passed in addition to the account password\n        注意：开发模式：需要注意全部字段不能为空，账号密码外可以传入0值\n      parameters:\n      - description: account\n        in: body\n        name: account\n        required: true\n        schema:\n          $ref: '#/definitions/handler.Login'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"expire\": \"2019-08-07T12:45:48+08:00\", \"token\":\n            \".eyJleHAiOjE1NjUxNTMxNDgsImlkIjoiYWRtaW4iLCJvcmlnX2lhdCI6MTU2NTE0OTU0OH0.-zvzHvbg0A\"\n            }'\n          schema:\n            type: string\n      summary: 登陆\n      tags:\n      - 登陆\n  /api/v1/menu:\n    delete:\n      description: 删除数据\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysMenuDeleteReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 删除菜单\n      tags:\n      - 菜单\n    get:\n      description: 获取JSON\n      parameters:\n      - description: menuName\n        in: query\n        name: menuName\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: Menu列表数据\n      tags:\n      - 菜单\n    post:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: data\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysMenuInsertReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 创建菜单\n      tags:\n      - 菜单\n  /api/v1/menu/{id}:\n    get:\n      description: 获取JSON\n      parameters:\n      - description: id\n        in: path\n        name: id\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: Menu详情数据\n      tags:\n      - 菜单\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: id\n        in: path\n        name: id\n        required: true\n        type: integer\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysMenuUpdateReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改菜单\n      tags:\n      - 菜单\n  /api/v1/menuTreeselect/{roleId}:\n    get:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: roleId\n        in: path\n        name: roleId\n        required: true\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 角色修改使用的菜单列表\n      tags:\n      - 菜单\n  /api/v1/menurole:\n    get:\n      description: 获取JSON\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 根据登录角色名称获取菜单列表数据（左菜单使用）\n      tags:\n      - 菜单\n  /api/v1/post:\n    delete:\n      description: 删除数据\n      parameters:\n      - description: 请求参数\n        in: body\n        name: id\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysPostDeleteReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 删除岗位\n      tags:\n      - 岗位\n    get:\n      description: 获取JSON\n      parameters:\n      - description: postName\n        in: query\n        name: postName\n        type: string\n      - description: postCode\n        in: query\n        name: postCode\n        type: string\n      - description: postId\n        in: query\n        name: postId\n        type: string\n      - description: status\n        in: query\n        name: status\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 岗位列表数据\n      tags:\n      - 岗位\n    post:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: data\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysPostInsertReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 添加岗位\n      tags:\n      - 岗位\n  /api/v1/post/{id}:\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysPostUpdateReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改岗位\n      tags:\n      - 岗位\n  /api/v1/post/{postId}:\n    get:\n      description: 获取JSON\n      parameters:\n      - description: 编码\n        in: path\n        name: id\n        required: true\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 获取岗位信息\n      tags:\n      - 岗位\n  /api/v1/public/uploadFile:\n    post:\n      consumes:\n      - multipart/form-data\n      description: 获取JSON\n      parameters:\n      - description: type\n        in: query\n        name: type\n        required: true\n        type: string\n      - description: file\n        in: formData\n        name: file\n        required: true\n        type: file\n      responses:\n        \"200\":\n          description: '{\"code\": -1, \"message\": \"添加失败\"}'\n          schema:\n            type: string\n      security:\n      - Bearer: []\n      summary: 上传图片\n      tags:\n      - 公共接口\n  /api/v1/role:\n    delete:\n      description: 删除数据\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysRoleDeleteReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 删除用户角色\n      tags:\n      - 角色/Role\n    get:\n      description: Get JSON\n      parameters:\n      - description: roleName\n        in: query\n        name: roleName\n        type: string\n      - description: status\n        in: query\n        name: status\n        type: string\n      - description: roleKey\n        in: query\n        name: roleKey\n        type: string\n      - description: 页条数\n        in: query\n        name: pageSize\n        type: integer\n      - description: 页码\n        in: query\n        name: pageIndex\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 角色列表数据\n      tags:\n      - 角色/Role\n    post:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: data\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysRoleInsertReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 创建角色\n      tags:\n      - 角色/Role\n  /api/v1/role-status/{id}:\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.RoleDataScopeReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 更新角色数据权限\n      tags:\n      - 角色/Role\n  /api/v1/role/{id}:\n    get:\n      description: 获取JSON\n      parameters:\n      - description: roleId\n        in: path\n        name: roleId\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 获取Role数据\n      tags:\n      - 角色/Role\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysRoleUpdateReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改用户角色\n      tags:\n      - 角色/Role\n  /api/v1/server-monitor:\n    get:\n      description: 获取JSON\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 系统信息\n      tags:\n      - 系统信息\n  /api/v1/set-config:\n    get:\n      consumes:\n      - application/json\n      description: 界面操作设置配置值的获取\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"message\": \"修改成功\"}'\n          schema:\n            allOf:\n            - $ref: '#/definitions/response.Response'\n            - properties:\n                data:\n                  additionalProperties: true\n                  type: object\n              type: object\n      security:\n      - Bearer: []\n      summary: 获取配置\n      tags:\n      - 配置管理\n    put:\n      consumes:\n      - application/json\n      description: 界面操作设置配置值\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          items:\n            $ref: '#/definitions/dto.GetSetSysConfigReq'\n          type: array\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"message\": \"修改成功\"}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 设置配置\n      tags:\n      - 配置管理\n  /api/v1/sys-api:\n    delete:\n      description: 删除接口管理\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysApiDeleteReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"message\": \"删除成功\"}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 删除接口管理\n      tags:\n      - 接口管理\n    get:\n      description: 获取接口管理列表\n      parameters:\n      - description: 名称\n        in: query\n        name: name\n        type: string\n      - description: 标题\n        in: query\n        name: title\n        type: string\n      - description: 地址\n        in: query\n        name: path\n        type: string\n      - description: 类型\n        in: query\n        name: action\n        type: string\n      - description: 页条数\n        in: query\n        name: pageSize\n        type: integer\n      - description: 页码\n        in: query\n        name: pageIndex\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            allOf:\n            - $ref: '#/definitions/response.Response'\n            - properties:\n                data:\n                  allOf:\n                  - $ref: '#/definitions/response.Page'\n                  - properties:\n                      list:\n                        items:\n                          $ref: '#/definitions/models.SysApi'\n                        type: array\n                    type: object\n              type: object\n      security:\n      - Bearer: []\n      summary: 获取接口管理列表\n      tags:\n      - 接口管理\n  /api/v1/sys-api/{id}:\n    get:\n      description: 获取接口管理\n      parameters:\n      - description: id\n        in: path\n        name: id\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            allOf:\n            - $ref: '#/definitions/response.Response'\n            - properties:\n                data:\n                  $ref: '#/definitions/models.SysApi'\n              type: object\n      security:\n      - Bearer: []\n      summary: 获取接口管理\n      tags:\n      - 接口管理\n    put:\n      consumes:\n      - application/json\n      description: 修改接口管理\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysApiUpdateReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"message\": \"修改成功\"}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改接口管理\n      tags:\n      - 接口管理\n  /api/v1/sys-config:\n    delete:\n      description: 删除配置管理\n      parameters:\n      - description: ids\n        in: body\n        name: ids\n        schema:\n          items:\n            type: integer\n          type: array\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"message\": \"删除成功\"}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 删除配置管理\n      tags:\n      - 配置管理\n    get:\n      description: 获取配置管理列表\n      parameters:\n      - description: 名称\n        in: query\n        name: configName\n        type: string\n      - description: key\n        in: query\n        name: configKey\n        type: string\n      - description: 类型\n        in: query\n        name: configType\n        type: string\n      - description: 是否前端\n        in: query\n        name: isFrontend\n        type: integer\n      - description: 页条数\n        in: query\n        name: pageSize\n        type: integer\n      - description: 页码\n        in: query\n        name: pageIndex\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            allOf:\n            - $ref: '#/definitions/response.Response'\n            - properties:\n                data:\n                  allOf:\n                  - $ref: '#/definitions/response.Page'\n                  - properties:\n                      list:\n                        items:\n                          $ref: '#/definitions/models.SysApi'\n                        type: array\n                    type: object\n              type: object\n      security:\n      - Bearer: []\n      summary: 获取配置管理列表\n      tags:\n      - 配置管理\n    post:\n      consumes:\n      - application/json\n      description: 创建配置管理\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysConfigControl'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"message\": \"创建成功\"}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 创建配置管理\n      tags:\n      - 配置管理\n  /api/v1/sys-config/{id}:\n    get:\n      description: 根据Key获取SysConfig的Service\n      parameters:\n      - description: configKey\n        in: path\n        name: configKey\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            allOf:\n            - $ref: '#/definitions/response.Response'\n            - properties:\n                data:\n                  $ref: '#/definitions/dto.SysConfigByKeyReq'\n              type: object\n      security:\n      - Bearer: []\n      summary: 根据Key获取SysConfig的Service\n      tags:\n      - 配置管理\n    put:\n      consumes:\n      - application/json\n      description: 修改配置管理\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysConfigControl'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"message\": \"修改成功\"}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改配置管理\n      tags:\n      - 配置管理\n  /api/v1/sys-login-log:\n    delete:\n      description: 登录日志删除\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysLoginLogDeleteReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 登录日志删除\n      tags:\n      - 登录日志\n    get:\n      description: 获取JSON\n      parameters:\n      - description: 用户名\n        in: query\n        name: username\n        type: string\n      - description: ip地址\n        in: query\n        name: ipaddr\n        type: string\n      - description: 归属地\n        in: query\n        name: loginLocation\n        type: string\n      - description: 状态\n        in: query\n        name: status\n        type: string\n      - description: 开始时间\n        in: query\n        name: beginTime\n        type: string\n      - description: 结束时间\n        in: query\n        name: endTime\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 登录日志列表\n      tags:\n      - 登录日志\n  /api/v1/sys-login-log/{id}:\n    get:\n      description: 获取JSON\n      parameters:\n      - description: id\n        in: path\n        name: id\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 登录日志通过id获取\n      tags:\n      - 登录日志\n  /api/v1/sys-opera-log:\n    delete:\n      description: 删除数据\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysOperaLogDeleteReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 删除操作日志\n      tags:\n      - 操作日志\n    get:\n      description: 获取JSON\n      parameters:\n      - description: title\n        in: query\n        name: title\n        type: string\n      - description: method\n        in: query\n        name: method\n        type: string\n      - description: requestMethod\n        in: query\n        name: requestMethod\n        type: string\n      - description: operUrl\n        in: query\n        name: operUrl\n        type: string\n      - description: operIp\n        in: query\n        name: operIp\n        type: string\n      - description: status\n        in: query\n        name: status\n        type: string\n      - description: beginTime\n        in: query\n        name: beginTime\n        type: string\n      - description: endTime\n        in: query\n        name: endTime\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 操作日志列表\n      tags:\n      - 操作日志\n  /api/v1/sys-opera-log/{id}:\n    get:\n      description: 获取JSON\n      parameters:\n      - description: id\n        in: path\n        name: id\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 操作日志通过id获取\n      tags:\n      - 操作日志\n  /api/v1/sys-user:\n    get:\n      description: 获取JSON\n      parameters:\n      - description: username\n        in: query\n        name: username\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            type: string\n      security:\n      - Bearer: []\n      summary: 列表用户信息数据\n      tags:\n      - 用户\n    post:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: 用户数据\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysUserInsertReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 创建用户\n      tags:\n      - 用户\n  /api/v1/sys-user/{userId}:\n    delete:\n      description: 删除数据\n      parameters:\n      - description: userId\n        in: path\n        name: userId\n        required: true\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 删除用户数据\n      tags:\n      - 用户\n    get:\n      description: 获取JSON\n      parameters:\n      - description: 用户编码\n        in: path\n        name: userId\n        required: true\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 获取用户\n      tags:\n      - 用户\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.SysUserUpdateReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改用户数据\n      tags:\n      - 用户\n  /api/v1/sys/tables/info:\n    post:\n      consumes:\n      - application/json\n      description: 添加表结构\n      parameters:\n      - description: tableName / 数据表名称\n        in: query\n        name: tables\n        type: string\n      responses:\n        \"200\":\n          description: '{\"code\": -1, \"message\": \"添加失败\"}'\n          schema:\n            type: string\n      security:\n      - Bearer: []\n      summary: 添加表结构\n      tags:\n      - 工具 / 生成工具\n    put:\n      consumes:\n      - application/json\n      description: 修改表结构\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/tools.SysTables'\n      responses:\n        \"200\":\n          description: '{\"code\": -1, \"message\": \"添加失败\"}'\n          schema:\n            type: string\n      security:\n      - Bearer: []\n      summary: 修改表结构\n      tags:\n      - 工具 / 生成工具\n  /api/v1/sys/tables/info/{tableId}:\n    delete:\n      description: 删除表结构\n      parameters:\n      - description: tableId\n        in: path\n        name: tableId\n        required: true\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": -1, \"message\": \"删除失败\"}'\n          schema:\n            type: string\n      summary: 删除表结构\n      tags:\n      - 工具 / 生成工具\n    get:\n      description: 获取JSON\n      parameters:\n      - description: configKey\n        in: path\n        name: configKey\n        required: true\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 获取配置\n      tags:\n      - 工具 / 生成工具\n  /api/v1/sys/tables/page:\n    get:\n      description: 生成表分页列表\n      parameters:\n      - description: tableName / 数据表名称\n        in: query\n        name: tableName\n        type: string\n      - description: pageSize / 页条数\n        in: query\n        name: pageSize\n        type: integer\n      - description: pageIndex / 页码\n        in: query\n        name: pageIndex\n        type: integer\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      summary: 分页列表数据\n      tags:\n      - 工具 / 生成工具\n  /api/v1/user/avatar:\n    post:\n      consumes:\n      - multipart/form-data\n      description: 获取JSON\n      parameters:\n      - description: file\n        in: formData\n        name: file\n        required: true\n        type: file\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改头像\n      tags:\n      - 个人中心\n  /api/v1/user/profile:\n    get:\n      description: 获取JSON\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 获取个人中心用户\n      tags:\n      - 个人中心\n  /api/v1/user/pwd/reset:\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.ResetSysUserPwdReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 重置用户密码\n      tags:\n      - 用户\n  /api/v1/user/pwd/set:\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.PassWord'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改密码\n      tags:\n      - 用户\n  /api/v1/user/status:\n    put:\n      consumes:\n      - application/json\n      description: 获取JSON\n      parameters:\n      - description: body\n        in: body\n        name: data\n        required: true\n        schema:\n          $ref: '#/definitions/dto.UpdateSysUserStatusReq'\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"data\": [...]}'\n          schema:\n            $ref: '#/definitions/response.Response'\n      security:\n      - Bearer: []\n      summary: 修改用户状态\n      tags:\n      - 用户\n  /logout:\n    post:\n      consumes:\n      - application/json\n      description: 获取token\n      responses:\n        \"200\":\n          description: '{\"code\": 200, \"msg\": \"成功退出系统\" }'\n          schema:\n            type: string\n      security:\n      - Bearer: []\n      summary: 退出登录\nsecurityDefinitions:\n  Bearer:\n    in: header\n    name: Authorization\n    type: apiKey\nswagger: \"2.0\"\n"
  },
  {
    "path": "go.mod",
    "content": "module go-admin\n\ngo 1.24\n\nrequire (\n\tgithub.com/alibaba/sentinel-golang v1.0.4\n\tgithub.com/alibaba/sentinel-golang/pkg/adapters/gin v0.0.0-20241224061304-f4c2c5964666\n\tgithub.com/aliyun/aliyun-oss-go-sdk v3.0.2+incompatible\n\tgithub.com/bitly/go-simplejson v0.5.1\n\tgithub.com/bytedance/go-tagexpr/v2 v2.9.11\n\tgithub.com/casbin/casbin/v2 v2.104.0\n\tgithub.com/gin-gonic/gin v1.10.0\n\tgithub.com/go-admin-team/go-admin-core v1.5.3-rc.3.0.20250408121721-2763de5dcdf4\n\tgithub.com/go-admin-team/go-admin-core/sdk v1.5.3-rc.3.0.20250408121721-2763de5dcdf4\n\tgithub.com/google/uuid v1.6.0\n\tgithub.com/huaweicloud/huaweicloud-sdk-go-obs v3.24.9+incompatible\n\tgithub.com/mssola/user_agent v0.6.0\n\tgithub.com/opentracing/opentracing-go v1.2.0\n\tgithub.com/pkg/errors v0.9.1\n\tgithub.com/prometheus/client_golang v1.22.0\n\tgithub.com/qiniu/go-sdk/v7 v7.25.3\n\tgithub.com/robfig/cron/v3 v3.0.1\n\tgithub.com/shirou/gopsutil/v3 v3.24.5\n\tgithub.com/spf13/cobra v1.9.1\n\tgithub.com/swaggo/files v1.0.1\n\tgithub.com/swaggo/gin-swagger v1.6.0\n\tgithub.com/swaggo/swag v1.16.4\n\tgithub.com/unrolled/secure v1.17.0\n\tgolang.org/x/crypto v0.37.0\n\tgorm.io/driver/mysql v1.5.7\n\tgorm.io/driver/postgres v1.5.11\n\tgorm.io/driver/sqlite v1.5.7\n\tgorm.io/driver/sqlserver v1.5.4\n\tgorm.io/gorm v1.25.12\n)\n\nrequire (\n\tfilippo.io/edwards25519 v1.1.0 // indirect\n\tgithub.com/BurntSushi/toml v1.5.0 // indirect\n\tgithub.com/KyleBanks/depth v1.2.1 // indirect\n\tgithub.com/PuerkitoBio/purell v1.1.1 // indirect\n\tgithub.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect\n\tgithub.com/alex-ant/gomath v0.0.0-20160516115720-89013a210a82 // indirect\n\tgithub.com/andeya/ameda v1.5.3 // indirect\n\tgithub.com/andeya/goutil v1.0.1 // indirect\n\tgithub.com/beorn7/perks v1.0.1 // indirect\n\tgithub.com/bmatcuk/doublestar/v4 v4.8.1 // indirect\n\tgithub.com/bytedance/sonic v1.13.2 // indirect\n\tgithub.com/bytedance/sonic/loader v0.2.4 // indirect\n\tgithub.com/casbin/gorm-adapter/v3 v3.32.0 // indirect\n\tgithub.com/casbin/govaluate v1.3.0 // indirect\n\tgithub.com/cespare/xxhash/v2 v2.3.0 // indirect\n\tgithub.com/chanxuehong/rand v0.0.0-20211009035549-2f07823e8e99 // indirect\n\tgithub.com/chanxuehong/wechat v0.0.0-20230222024006-36f0325263cd // indirect\n\tgithub.com/cloudwego/base64x v0.1.5 // indirect\n\tgithub.com/dustin/go-humanize v1.0.1 // indirect\n\tgithub.com/fsnotify/fsnotify v1.9.0 // indirect\n\tgithub.com/gabriel-vasile/mimetype v1.4.8 // indirect\n\tgithub.com/gammazero/toposort v0.1.1 // indirect\n\tgithub.com/ghodss/yaml v1.0.0 // indirect\n\tgithub.com/gin-contrib/sse v1.1.0 // indirect\n\tgithub.com/glebarez/go-sqlite v1.22.0 // indirect\n\tgithub.com/glebarez/sqlite v1.11.0 // indirect\n\tgithub.com/go-admin-team/go-admin-core/plugins/logger/zap v1.5.2 // indirect\n\tgithub.com/go-ole/go-ole v1.2.6 // indirect\n\tgithub.com/go-openapi/jsonpointer v0.19.5 // indirect\n\tgithub.com/go-openapi/jsonreference v0.19.6 // indirect\n\tgithub.com/go-openapi/spec v0.20.4 // indirect\n\tgithub.com/go-openapi/swag v0.19.15 // indirect\n\tgithub.com/go-playground/locales v0.14.1 // indirect\n\tgithub.com/go-playground/universal-translator v0.18.1 // indirect\n\tgithub.com/go-playground/validator/v10 v10.26.0 // indirect\n\tgithub.com/go-sql-driver/mysql v1.9.2 // indirect\n\tgithub.com/goccy/go-json v0.10.5 // indirect\n\tgithub.com/gofrs/flock v0.8.1 // indirect\n\tgithub.com/golang-jwt/jwt/v5 v5.2.2 // indirect\n\tgithub.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect\n\tgithub.com/golang-sql/sqlexp v0.1.0 // indirect\n\tgithub.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect\n\tgithub.com/golang/protobuf v1.5.4 // indirect\n\tgithub.com/gorilla/websocket v1.5.3 // indirect\n\tgithub.com/imdario/mergo v0.3.13 // indirect\n\tgithub.com/inconshreveable/mousetrap v1.1.0 // indirect\n\tgithub.com/jackc/pgpassfile v1.0.0 // indirect\n\tgithub.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect\n\tgithub.com/jackc/pgx/v5 v5.7.4 // indirect\n\tgithub.com/jackc/puddle/v2 v2.2.2 // indirect\n\tgithub.com/jinzhu/inflection v1.0.0 // indirect\n\tgithub.com/jinzhu/now v1.1.5 // indirect\n\tgithub.com/josharian/intern v1.0.0 // indirect\n\tgithub.com/json-iterator/go v1.1.12 // indirect\n\tgithub.com/klauspost/cpuid/v2 v2.2.10 // indirect\n\tgithub.com/leodido/go-urn v1.4.0 // indirect\n\tgithub.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect\n\tgithub.com/mailru/easyjson v0.7.6 // indirect\n\tgithub.com/mattn/go-isatty v0.0.20 // indirect\n\tgithub.com/mattn/go-sqlite3 v1.14.22 // indirect\n\tgithub.com/microsoft/go-mssqldb v1.8.0 // indirect\n\tgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect\n\tgithub.com/modern-go/reflect2 v1.0.2 // indirect\n\tgithub.com/mojocn/base64Captcha v1.3.8 // indirect\n\tgithub.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect\n\tgithub.com/ncruces/go-strftime v0.1.9 // indirect\n\tgithub.com/nyaruka/phonenumbers v1.0.55 // indirect\n\tgithub.com/pelletier/go-toml/v2 v2.2.4 // indirect\n\tgithub.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect\n\tgithub.com/prometheus/client_model v0.6.1 // indirect\n\tgithub.com/prometheus/common v0.62.0 // indirect\n\tgithub.com/prometheus/procfs v0.15.1 // indirect\n\tgithub.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect\n\tgithub.com/shamsher31/goimgext v1.0.0 // indirect\n\tgithub.com/shoenig/go-m1cpu v0.1.6 // indirect\n\tgithub.com/spf13/cast v1.7.1 // indirect\n\tgithub.com/spf13/pflag v1.0.6 // indirect\n\tgithub.com/tklauser/go-sysconf v0.3.12 // indirect\n\tgithub.com/tklauser/numcpus v0.6.1 // indirect\n\tgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirect\n\tgithub.com/ugorji/go/codec v1.2.12 // indirect\n\tgithub.com/yusufpapurcu/wmi v1.2.4 // indirect\n\tgo.uber.org/multierr v1.11.0 // indirect\n\tgo.uber.org/zap v1.27.0 // indirect\n\tgolang.org/x/arch v0.16.0 // indirect\n\tgolang.org/x/exp v0.0.0-20250305212735-054e65f0b394 // indirect\n\tgolang.org/x/image v0.26.0 // indirect\n\tgolang.org/x/net v0.39.0 // indirect\n\tgolang.org/x/sync v0.13.0 // indirect\n\tgolang.org/x/sys v0.32.0 // indirect\n\tgolang.org/x/text v0.24.0 // indirect\n\tgolang.org/x/time v0.0.0-20191024005414-555d28b269f0 // indirect\n\tgolang.org/x/tools v0.32.0 // indirect\n\tgoogle.golang.org/protobuf v1.36.6 // indirect\n\tgopkg.in/yaml.v2 v2.4.0 // indirect\n\tgopkg.in/yaml.v3 v3.0.1 // indirect\n\tgorm.io/plugin/dbresolver v1.5.3 // indirect\n\tmodernc.org/fileutil v1.3.0 // indirect\n\tmodernc.org/libc v1.62.1 // indirect\n\tmodernc.org/mathutil v1.7.1 // indirect\n\tmodernc.org/memory v1.9.1 // indirect\n\tmodernc.org/sqlite v1.37.0 // indirect\n)\n\n//replace (\n//\tgithub.com/go-admin-team/go-admin-core v1.5.2-0.20231103105356-84418ed9252c => ../go-admin-core\n//\tgithub.com/go-admin-team/go-admin-core/sdk v1.5.2-0.20231103105356-84418ed9252c => ../go-admin-core/sdk\n//)\n"
  },
  {
    "path": "main.go",
    "content": "package main\n\nimport (\n\t\"go-admin/cmd\"\n)\n\n//go:generate swag init --parseDependency --parseDepth=6 --instanceName admin -o ./docs/admin\n\n// @title go-admin API\n// @version 2.0.0\n// @description 基于Gin + Vue + Element UI的前后端分离权限管理系统的接口文档\n// @description 添加qq群: 521386980 进入技术交流群 请先star，谢谢！\n// @license.name MIT\n// @license.url https://github.com/go-admin-team/go-admin/blob/master/LICENSE.md\n\n// @securityDefinitions.apikey Bearer\n// @in header\n// @name Authorization\nfunc main() {\n\tcmd.Execute()\n}\n"
  },
  {
    "path": "restart.sh",
    "content": "#!/bin/bash\necho \"go build\"\ngo mod tidy\ngo build -o go-admin main.go\nchmod +x ./go-admin\necho \"kill go-admin service\"\nkillall go-admin # kill go-admin service\nnohup ./go-admin server -c=config/settings.dev.yml >> access.log 2>&1 & #后台启动服务将日志写入access.log文件\necho \"run go-admin success\"\nps -aux | grep go-admin\n"
  },
  {
    "path": "scripts/Dockerfile",
    "content": "FROM alpine\n\nCOPY ./go-admin /\nEXPOSE 8000\n\nCMD [\"/go-admin\",\"server\",\"-c\", \"/config/settings.yml\"]\n"
  },
  {
    "path": "scripts/k8s/deploy.yml",
    "content": "---\napiVersion: v1\nkind: Service\nmetadata:\n  name: go-admin\n  labels:\n    app: go-admin\n    service: go-admin\nspec:\n  ports:\n  - port: 8000\n    name: http\n    protocol: TCP\n  selector:\n    app: go-admin\n---\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: go-admin-v1\n  labels:\n    app: go-admin\n    version: v1\nspec:\n  replicas: 1\n  selector:\n    matchLabels:\n      app: go-admin\n      version: v1\n  template:\n    metadata:\n      labels:\n        app: go-admin\n        version: v1\n    spec:\n      containers:\n      - name: go-admin\n        image: registry.cn-shanghai.aliyuncs.com/go-admin-team/go-admin\n        imagePullPolicy: IfNotPresent\n        ports:\n        - containerPort: 8000\n        volumeMounts:\n        - name: go-admin\n          mountPath: /temp\n        - name: go-admin\n          mountPath: /static\n        - name: go-admin-config\n          mountPath: /config/\n          readOnly: true\n      volumes:\n      - name: go-admin\n        persistentVolumeClaim:\n          claimName: go-admin\n      - name: go-admin-config\n        configMap:\n          name: settings-admin\n---\n"
  },
  {
    "path": "scripts/k8s/prerun.sh",
    "content": "#!/bin/bash\nkubectl create ns go-admin\nkubectl create configmap settings-admin --from-file=../../config/settings.yml -n go-admin\n"
  },
  {
    "path": "scripts/k8s/storage.yml",
    "content": "apiVersion: v1\nkind: PersistentVolumeClaim\nmetadata:\n  name: go-admin\n  namespace: go-admin\nspec:\n  accessModes:\n    - ReadWriteMany\n  resources:\n    requests:\n      storage: \"1Mi\"\n  volumeName:\n  storageClassName: nfs-csi"
  },
  {
    "path": "ssh/swag.sh",
    "content": "#!/bin/bash\n\nswag i -g init_router.go -dir app/admin/router --instanceName admin --parseDependency -o docs/admin\n"
  },
  {
    "path": "static/form-generator/css/index.1a124643.css",
    "content": ".add-item[data-v-60dcec16]{margin-top:8px}.url-item[data-v-60dcec16]{margin-bottom:12px}.tab-editor[data-v-3157a144]{position:absolute;top:33px;bottom:0;left:0;right:0;font-size:14px}.left-editor[data-v-3157a144]{position:relative;height:100%;background:#1e1e1e;overflow:hidden}.setting[data-v-3157a144]{position:absolute;right:15px;top:3px;color:#a9f122;font-size:18px;cursor:pointer;z-index:1}.right-preview[data-v-3157a144]{height:100%}.right-preview .result-wrapper[data-v-3157a144]{height:calc(100vh - 33px);width:100%;overflow:auto;padding:12px;-webkit-box-sizing:border-box;box-sizing:border-box}.action-bar[data-v-3157a144]{height:33px;background:#f2fafb;padding:0 15px;-webkit-box-sizing:border-box;box-sizing:border-box}.action-bar .bar-btn[data-v-3157a144]{display:inline-block;padding:0 6px;line-height:32px;color:#8285f5;cursor:pointer;font-size:14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.action-bar .bar-btn i[data-v-3157a144]{font-size:20px}.action-bar .bar-btn[data-v-3157a144]:hover{color:#4348d4}.action-bar .bar-btn+.bar-btn[data-v-3157a144]{margin-left:8px}.action-bar .delete-btn[data-v-3157a144]{color:#f56c6c}.action-bar .delete-btn[data-v-3157a144]:hover{color:#ea0b30}[data-v-3157a144] .el-drawer__header,[data-v-44793736] .el-drawer__header{display:none}.action-bar[data-v-44793736]{height:33px;background:#f2fafb;padding:0 15px;-webkit-box-sizing:border-box;box-sizing:border-box}.action-bar .bar-btn[data-v-44793736]{display:inline-block;padding:0 6px;line-height:32px;color:#8285f5;cursor:pointer;font-size:14px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.action-bar .bar-btn i[data-v-44793736]{font-size:20px}.action-bar .bar-btn[data-v-44793736]:hover{color:#4348d4}.action-bar .bar-btn+.bar-btn[data-v-44793736]{margin-left:8px}.action-bar .delete-btn[data-v-44793736]{color:#f56c6c}.action-bar .delete-btn[data-v-44793736]:hover{color:#ea0b30}.json-editor[data-v-44793736]{height:calc(100vh - 33px)}.icon-ul[data-v-3ba3d51c]{margin:0;padding:0;font-size:0}.icon-ul li[data-v-3ba3d51c]{list-style-type:none;text-align:center;font-size:14px;display:inline-block;width:16.66%;-webkit-box-sizing:border-box;box-sizing:border-box;height:108px;padding:15px 6px 6px 6px;cursor:pointer;overflow:hidden}.icon-ul li[data-v-3ba3d51c]:hover{background:#f2f2f2}.icon-ul li.active-item[data-v-3ba3d51c]{background:#e1f3fb;color:#7a6df0}.icon-ul li>i[data-v-3ba3d51c]{font-size:30px;line-height:50px}.icon-dialog[data-v-3ba3d51c] .el-dialog{border-radius:8px;margin-bottom:0;margin-top:4vh!important;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;max-height:92vh;overflow:hidden;-webkit-box-sizing:border-box;box-sizing:border-box}.icon-dialog[data-v-3ba3d51c] .el-dialog .el-dialog__header{padding-top:14px}.icon-dialog[data-v-3ba3d51c] .el-dialog .el-dialog__body{margin:0 20px 20px 20px;padding:0;overflow:auto}.right-board[data-v-0c0004cd]{width:350px;position:absolute;right:0;top:0;padding-top:3px}.right-board .field-box[data-v-0c0004cd]{position:relative;height:calc(100vh - 42px);-webkit-box-sizing:border-box;box-sizing:border-box;overflow:hidden}.right-board .el-scrollbar[data-v-0c0004cd]{height:100%}.select-item[data-v-0c0004cd]{display:-webkit-box;display:-ms-flexbox;display:flex;border:1px dashed #fff;-webkit-box-sizing:border-box;box-sizing:border-box}.select-item .close-btn[data-v-0c0004cd]{cursor:pointer;color:#f56c6c}.select-item .el-input+.el-input[data-v-0c0004cd]{margin-left:4px}.select-item+.select-item[data-v-0c0004cd]{margin-top:4px}.select-item.sortable-chosen[data-v-0c0004cd]{border:1px dashed #409eff}.select-line-icon[data-v-0c0004cd]{line-height:32px;font-size:22px;padding:0 4px;color:#777}.option-drag[data-v-0c0004cd]{cursor:move}.time-range .el-date-editor[data-v-0c0004cd]{width:227px}.time-range[data-v-0c0004cd] .el-icon-time{display:none}.document-link[data-v-0c0004cd]{position:absolute;display:block;width:26px;height:26px;top:0;left:0;cursor:pointer;background:#409eff;z-index:1;border-radius:0 0 6px 0;text-align:center;line-height:26px;color:#fff;font-size:18px}.node-label[data-v-0c0004cd]{font-size:14px}.node-icon[data-v-0c0004cd]{color:#bebfc3}.container{position:relative;width:100%;height:100%}.components-list{padding:8px;-webkit-box-sizing:border-box;box-sizing:border-box;height:100%}.components-list .components-item{display:inline-block;width:48%;margin:1%;-webkit-transition:-webkit-transform 0ms!important;transition:-webkit-transform 0ms!important;transition:transform 0ms!important;transition:transform 0ms,-webkit-transform 0ms!important}.components-draggable{padding-bottom:20px}.components-title{font-size:14px;color:#222;margin:6px 2px}.components-title .svg-icon{color:#666;font-size:18px}.components-body{padding:8px 10px;background:#f6f7ff;font-size:12px;cursor:move;border:1px dashed #f6f7ff;border-radius:3px}.components-body .svg-icon{color:#777;font-size:15px}.components-body:hover{border:1px dashed #787be8;color:#787be8}.components-body:hover .svg-icon{color:#787be8}.left-board{width:260px;position:absolute;left:0;top:0;height:100vh}.center-scrollbar,.left-scrollbar{height:calc(100vh - 42px);overflow:hidden}.center-scrollbar{border-left:1px solid #f1e8e8;border-right:1px solid #f1e8e8}.center-board,.center-scrollbar{-webkit-box-sizing:border-box;box-sizing:border-box}.center-board{height:100vh;width:auto;margin:0 350px 0 260px}.empty-info{position:absolute;top:46%;left:0;right:0;text-align:center;font-size:18px;color:#ccb1ea;letter-spacing:4px}.action-bar{position:relative;height:42px;text-align:right;padding:0 15px;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px solid #f1e8e8;border-top:none;border-left:none}.action-bar .delete-btn{color:#f56c6c}.logo-wrapper{position:relative;height:42px;background:#fff;border-bottom:1px solid #f1e8e8;-webkit-box-sizing:border-box;box-sizing:border-box}.logo{position:absolute;left:12px;top:6px;line-height:30px;color:#00afff;font-weight:600;font-size:17px;white-space:nowrap}.logo>img{width:30px;height:30px;vertical-align:top}.logo .github{display:inline-block;vertical-align:sub;margin-left:15px}.logo .github>img{height:22px}.center-board-row{padding:12px 12px 15px 12px;-webkit-box-sizing:border-box;box-sizing:border-box}.center-board-row>.el-form{height:calc(100vh - 69px)}.drawing-board{height:100%;position:relative}.drawing-board .components-body{padding:0;margin:0;font-size:0}.drawing-board .sortable-ghost{position:relative;display:block;overflow:hidden}.drawing-board .sortable-ghost:before{content:\" \";position:absolute;left:0;right:0;top:0;height:3px;background:#5959df;z-index:2}.drawing-board .components-item.sortable-ghost{width:100%;height:60px;background-color:#f6f7ff}.drawing-board .active-from-item>.el-form-item{background:#f6f7ff;border-radius:6px}.drawing-board .active-from-item>.drawing-item-copy,.drawing-board .active-from-item>.drawing-item-delete{display:initial}.drawing-board .active-from-item>.component-name{color:#409eff}.drawing-board .el-form-item{margin-bottom:15px}.drawing-item{position:relative;cursor:move}.drawing-item.unfocus-bordered:not(.active-from-item)>div:first-child{border:1px dashed #ccc}.drawing-item .el-form-item{padding:12px 10px}.drawing-row-item{position:relative;cursor:move;-webkit-box-sizing:border-box;box-sizing:border-box;border:1px dashed #ccc;border-radius:3px;padding:0 2px;margin-bottom:15px}.drawing-row-item .drawing-row-item{margin-bottom:2px}.drawing-row-item .el-col{margin-top:22px}.drawing-row-item .el-form-item{margin-bottom:0}.drawing-row-item .drag-wrapper{min-height:80px}.drawing-row-item.active-from-item{border:1px dashed #409eff}.drawing-row-item .component-name{position:absolute;top:0;left:0;font-size:12px;color:#bbb;display:inline-block;padding:0 6px}.drawing-item:hover>.el-form-item,.drawing-row-item:hover>.el-form-item{background:#f6f7ff;border-radius:6px}.drawing-item:hover>.drawing-item-copy,.drawing-item:hover>.drawing-item-delete,.drawing-row-item:hover>.drawing-item-copy,.drawing-row-item:hover>.drawing-item-delete{display:initial}.drawing-item>.drawing-item-copy,.drawing-item>.drawing-item-delete,.drawing-row-item>.drawing-item-copy,.drawing-row-item>.drawing-item-delete{display:none;position:absolute;top:-10px;width:22px;height:22px;line-height:22px;text-align:center;border-radius:50%;font-size:12px;border:1px solid;cursor:pointer;z-index:1}.drawing-item>.drawing-item-copy,.drawing-row-item>.drawing-item-copy{right:56px;border-color:#409eff;color:#409eff;background:#fff}.drawing-item>.drawing-item-copy:hover,.drawing-row-item>.drawing-item-copy:hover{background:#409eff;color:#fff}.drawing-item>.drawing-item-delete,.drawing-row-item>.drawing-item-delete{right:24px;border-color:#f56c6c;color:#f56c6c;background:#fff}.drawing-item>.drawing-item-delete:hover,.drawing-row-item>.drawing-item-delete:hover{background:#f56c6c;color:#fff}body,html{margin:0;padding:0;background:#fff;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility}body,html,input,textarea{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}.editor-tabs{background:#121315}.editor-tabs .el-tabs__header{margin:0;border-bottom-color:#121315}.editor-tabs .el-tabs__header .el-tabs__nav{border-color:#121315}.editor-tabs .el-tabs__item{height:32px;line-height:32px;color:#888a8e;border-left:1px solid #121315!important;background:#363636;margin-right:5px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.editor-tabs .el-tabs__item.is-active{background:#1e1e1e;border-bottom-color:#1e1e1e!important;color:#fff}.editor-tabs .el-icon-edit{color:#f1fa8c}.editor-tabs .el-icon-document{color:#a95812}.right-scrollbar .el-scrollbar__view{padding:12px 18px 15px 15px}.el-scrollbar__wrap{-webkit-box-sizing:border-box;box-sizing:border-box;overflow-x:hidden!important}.center-tabs .el-tabs__header,.el-scrollbar__wrap{margin-bottom:0!important}.center-tabs .el-tabs__item{width:50%;text-align:center}.center-tabs .el-tabs__nav{width:100%}.reg-item{padding:12px 6px;background:#f8f8f8;position:relative;border-radius:4px}.reg-item .close-btn{position:absolute;right:-6px;top:-6px;display:block;width:16px;height:16px;line-height:16px;background:rgba(0,0,0,.2);border-radius:50%;color:#fff;text-align:center;z-index:1;cursor:pointer;font-size:12px}.reg-item .close-btn:hover{background:rgba(210,23,23,.5)}.reg-item+.reg-item{margin-top:18px}.action-bar .el-button+.el-button{margin-left:15px}.action-bar i{font-size:20px;vertical-align:middle;position:relative;top:-1px}.custom-tree-node{width:100%;font-size:14px}.custom-tree-node .node-operation{float:right}.custom-tree-node i[class*=el-icon]+i[class*=el-icon]{margin-left:6px}.custom-tree-node .el-icon-plus{color:#409eff}.custom-tree-node .el-icon-delete{color:#157a0c}.el-scrollbar__view{overflow-x:hidden}.el-rate{display:inline-block;vertical-align:text-top}.el-upload__tip{line-height:1.2}.svg-icon[data-v-19957a58]{width:1em;height:1em;vertical-align:-.15em;fill:currentColor;overflow:hidden}.svg-external-icon[data-v-19957a58]{background-color:currentColor;-webkit-mask-size:cover!important;mask-size:cover!important;display:inline-block}"
  },
  {
    "path": "static/form-generator/css/parser-example.69e16e51.css",
    "content": ".test-form[data-v-77b1aafa]{margin:15px auto;width:800px;padding:15px}"
  },
  {
    "path": "static/form-generator/index.html",
    "content": "<!doctype html><html lang=\"zh\"><head><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=0,maximum-scale=0,user-scalable=yes,shrink-to-fit=no\"><link rel=\"icon\" href=\"/form-generator/favicon.ico\"><title>form-generator</title><style>.pre-loader{position:absolute;top:calc(50% - 32px);left:calc(50% - 32px);width:64px;height:64px;border-radius:50%;perspective:800px}.pre-loader .inner{position:absolute;box-sizing:border-box;width:100%;height:100%;border-radius:50%}.pre-loader .inner.one{left:0;top:0;-webkit-animation:rotate-one 1s linear infinite;animation:rotate-one 1s linear infinite;border-bottom:3px solid #bc9048}.pre-loader .inner.two{right:0;top:0;-webkit-animation:rotate-two 1s linear infinite;animation:rotate-two 1s linear infinite;border-right:3px solid #74aeff}.pre-loader .inner.three{right:0;bottom:0;-webkit-animation:rotate-three 1s linear infinite;animation:rotate-three 1s linear infinite;border-top:3px solid #caef74}@keyframes rotate-one{0%{-webkit-transform:rotateX(35deg) rotateY(-45deg) rotateZ(0);transform:rotateX(35deg) rotateY(-45deg) rotateZ(0)}100%{-webkit-transform:rotateX(35deg) rotateY(-45deg) rotateZ(360deg);transform:rotateX(35deg) rotateY(-45deg) rotateZ(360deg)}}@keyframes rotate-two{0%{-webkit-transform:rotateX(50deg) rotateY(10deg) rotateZ(0);transform:rotateX(50deg) rotateY(10deg) rotateZ(0)}100%{-webkit-transform:rotateX(50deg) rotateY(10deg) rotateZ(360deg);transform:rotateX(50deg) rotateY(10deg) rotateZ(360deg)}}@keyframes rotate-three{0%{-webkit-transform:rotateX(35deg) rotateY(55deg) rotateZ(0);transform:rotateX(35deg) rotateY(55deg) rotateZ(0)}100%{-webkit-transform:rotateX(35deg) rotateY(55deg) rotateZ(360deg);transform:rotateX(35deg) rotateY(55deg) rotateZ(360deg)}}</style><link href=\"https://lib.baomitu.com/element-ui/2.13.2/theme-chalk/index.css\" rel=\"stylesheet\"><link href=\"https://lib.baomitu.com/monaco-editor/0.19.3/min/vs/editor/editor.main.css\" rel=\"stylesheet\"><script src=\"https://lib.baomitu.com/vue/2.6.11/vue.min.js\"></script><script src=\"https://lib.baomitu.com/vue-router/3.1.3/vue-router.min.js\"></script><script src=\"https://lib.baomitu.com/element-ui/2.13.2/index.js\"></script><link href=\"/form-generator/css/parser-example.69e16e51.css\" rel=\"prefetch\"><link href=\"/form-generator/js/parser-example.ce55fa09.js\" rel=\"prefetch\"><link href=\"/form-generator/js/tinymce-example.641995ab.js\" rel=\"prefetch\"><link href=\"/form-generator/css/index.1a124643.css\" rel=\"preload\" as=\"style\"><link href=\"/form-generator/js/chunk-vendors.971555db.js\" rel=\"preload\" as=\"script\"><link href=\"/form-generator/js/index.8e6d9f8f.js\" rel=\"preload\" as=\"script\"><link href=\"/form-generator/css/index.1a124643.css\" rel=\"stylesheet\"></head><body><noscript><strong>抱歉，javascript被禁用，请开启后重试。</strong></noscript><div id=\"app\"></div><div class=\"pre-loader\" id=\"pre-loader\"><div class=\"inner one\"></div><div class=\"inner two\"></div><div class=\"inner three\"></div></div><script src=\"/form-generator/js/chunk-vendors.971555db.js\"></script><script src=\"/form-generator/js/index.8e6d9f8f.js\"></script></body></html>"
  },
  {
    "path": "static/form-generator/js/chunk-vendors.971555db.js",
    "content": "(window[\"webpackJsonp\"]=window[\"webpackJsonp\"]||[]).push([[\"chunk-vendors\"],{\"00ee\":function(t,e,s){var i=s(\"b622\"),r=i(\"toStringTag\"),n={};n[r]=\"z\",t.exports=\"[object z]\"===String(n)},\"0366\":function(t,e,s){var i=s(\"1c0b\");t.exports=function(t,e,s){if(i(t),void 0===e)return t;switch(s){case 0:return function(){return t.call(e)};case 1:return function(s){return t.call(e,s)};case 2:return function(s,i){return t.call(e,s,i)};case 3:return function(s,i,r){return t.call(e,s,i,r)}}return function(){return t.apply(e,arguments)}}},\"057f\":function(t,e,s){var i=s(\"fc6a\"),r=s(\"241c\").f,n={}.toString,a=\"object\"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],o=function(t){try{return r(t)}catch(e){return a.slice()}};t.exports.f=function(t){return a&&\"[object Window]\"==n.call(t)?o(t):r(i(t))}},\"06cf\":function(t,e,s){var i=s(\"83ab\"),r=s(\"d1e7\"),n=s(\"5c6c\"),a=s(\"fc6a\"),o=s(\"c04e\"),c=s(\"5135\"),h=s(\"0cfb\"),l=Object.getOwnPropertyDescriptor;e.f=i?l:function(t,e){if(t=a(t),e=o(e,!0),h)try{return l(t,e)}catch(s){}if(c(t,e))return n(!r.f.call(t,e),t[e])}},\"0cfb\":function(t,e,s){var i=s(\"83ab\"),r=s(\"d039\"),n=s(\"cc12\");t.exports=!i&&!r((function(){return 7!=Object.defineProperty(n(\"div\"),\"a\",{get:function(){return 7}}).a}))},1276:function(t,e,s){\"use strict\";var i=s(\"d784\"),r=s(\"44e7\"),n=s(\"825a\"),a=s(\"1d80\"),o=s(\"4840\"),c=s(\"8aa5\"),h=s(\"50c4\"),l=s(\"14c3\"),p=s(\"9263\"),u=s(\"d039\"),d=[].push,f=Math.min,m=4294967295,y=!u((function(){return!RegExp(m,\"y\")}));i(\"split\",2,(function(t,e,s){var i;return i=\"c\"==\"abbc\".split(/(b)*/)[1]||4!=\"test\".split(/(?:)/,-1).length||2!=\"ab\".split(/(?:ab)*/).length||4!=\".\".split(/(.?)(.?)/).length||\".\".split(/()()/).length>1||\"\".split(/.?/).length?function(t,s){var i=String(a(this)),n=void 0===s?m:s>>>0;if(0===n)return[];if(void 0===t)return[i];if(!r(t))return e.call(i,t,n);var o,c,h,l=[],u=(t.ignoreCase?\"i\":\"\")+(t.multiline?\"m\":\"\")+(t.unicode?\"u\":\"\")+(t.sticky?\"y\":\"\"),f=0,y=new RegExp(t.source,u+\"g\");while(o=p.call(y,i)){if(c=y.lastIndex,c>f&&(l.push(i.slice(f,o.index)),o.length>1&&o.index<i.length&&d.apply(l,o.slice(1)),h=o[0].length,f=c,l.length>=n))break;y.lastIndex===o.index&&y.lastIndex++}return f===i.length?!h&&y.test(\"\")||l.push(\"\"):l.push(i.slice(f)),l.length>n?l.slice(0,n):l}:\"0\".split(void 0,0).length?function(t,s){return void 0===t&&0===s?[]:e.call(this,t,s)}:e,[function(e,s){var r=a(this),n=void 0==e?void 0:e[t];return void 0!==n?n.call(e,r,s):i.call(String(r),e,s)},function(t,r){var a=s(i,t,this,r,i!==e);if(a.done)return a.value;var p=n(t),u=String(this),d=o(p,RegExp),g=p.unicode,x=(p.ignoreCase?\"i\":\"\")+(p.multiline?\"m\":\"\")+(p.unicode?\"u\":\"\")+(y?\"y\":\"g\"),b=new d(y?p:\"^(?:\"+p.source+\")\",x),v=void 0===r?m:r>>>0;if(0===v)return[];if(0===u.length)return null===l(b,u)?[u]:[];var w=0,P=0,T=[];while(P<u.length){b.lastIndex=y?P:0;var E,A=l(b,y?u:u.slice(P));if(null===A||(E=f(h(b.lastIndex+(y?0:P)),u.length))===w)P=c(u,P,g);else{if(T.push(u.slice(w,P)),T.length===v)return T;for(var S=1;S<=A.length-1;S++)if(T.push(A[S]),T.length===v)return T;P=w=E}}return T.push(u.slice(w)),T}]}),!y)},\"14c3\":function(t,e,s){var i=s(\"c6b6\"),r=s(\"9263\");t.exports=function(t,e){var s=t.exec;if(\"function\"===typeof s){var n=s.call(t,e);if(\"object\"!==typeof n)throw TypeError(\"RegExp exec method returned something other than an Object or null\");return n}if(\"RegExp\"!==i(t))throw TypeError(\"RegExp#exec called on incompatible receiver\");return r.call(t,e)}},\"159b\":function(t,e,s){var i=s(\"da84\"),r=s(\"fdbc\"),n=s(\"17c2\"),a=s(\"9112\");for(var o in r){var c=i[o],h=c&&c.prototype;if(h&&h.forEach!==n)try{a(h,\"forEach\",n)}catch(l){h.forEach=n}}},\"17c2\":function(t,e,s){\"use strict\";var i=s(\"b727\").forEach,r=s(\"a640\"),n=s(\"ae40\"),a=r(\"forEach\"),o=n(\"forEach\");t.exports=a&&o?[].forEach:function(t){return i(this,t,arguments.length>1?arguments[1]:void 0)}},1861:function(t,e,s){\"use strict\";Object.defineProperty(e,\"__esModule\",{value:!0});const i=!0,r=!0,n=!0,a=!0,o=!0,c=!0;class h{constructor(t,e={}){this.label=t,this.keyword=e.keyword,this.beforeExpr=!!e.beforeExpr,this.startsExpr=!!e.startsExpr,this.rightAssociative=!!e.rightAssociative,this.isLoop=!!e.isLoop,this.isAssign=!!e.isAssign,this.prefix=!!e.prefix,this.postfix=!!e.postfix,this.binop=null!=e.binop?e.binop:null,this.updateContext=null}}const l=new Map;function p(t,e={}){e.keyword=t;const s=new h(t,e);return l.set(t,s),s}function u(t,e){return new h(t,{beforeExpr:i,binop:e})}const d={num:new h(\"num\",{startsExpr:r}),bigint:new h(\"bigint\",{startsExpr:r}),regexp:new h(\"regexp\",{startsExpr:r}),string:new h(\"string\",{startsExpr:r}),name:new h(\"name\",{startsExpr:r}),eof:new h(\"eof\"),bracketL:new h(\"[\",{beforeExpr:i,startsExpr:r}),bracketHashL:new h(\"#[\",{beforeExpr:i,startsExpr:r}),bracketBarL:new h(\"[|\",{beforeExpr:i,startsExpr:r}),bracketR:new h(\"]\"),bracketBarR:new h(\"|]\"),braceL:new h(\"{\",{beforeExpr:i,startsExpr:r}),braceBarL:new h(\"{|\",{beforeExpr:i,startsExpr:r}),braceHashL:new h(\"#{\",{beforeExpr:i,startsExpr:r}),braceR:new h(\"}\"),braceBarR:new h(\"|}\"),parenL:new h(\"(\",{beforeExpr:i,startsExpr:r}),parenR:new h(\")\"),comma:new h(\",\",{beforeExpr:i}),semi:new h(\";\",{beforeExpr:i}),colon:new h(\":\",{beforeExpr:i}),doubleColon:new h(\"::\",{beforeExpr:i}),dot:new h(\".\"),question:new h(\"?\",{beforeExpr:i}),questionDot:new h(\"?.\"),arrow:new h(\"=>\",{beforeExpr:i}),template:new h(\"template\"),ellipsis:new h(\"...\",{beforeExpr:i}),backQuote:new h(\"`\",{startsExpr:r}),dollarBraceL:new h(\"${\",{beforeExpr:i,startsExpr:r}),at:new h(\"@\"),hash:new h(\"#\",{startsExpr:r}),interpreterDirective:new h(\"#!...\"),eq:new h(\"=\",{beforeExpr:i,isAssign:a}),assign:new h(\"_=\",{beforeExpr:i,isAssign:a}),incDec:new h(\"++/--\",{prefix:o,postfix:c,startsExpr:r}),bang:new h(\"!\",{beforeExpr:i,prefix:o,startsExpr:r}),tilde:new h(\"~\",{beforeExpr:i,prefix:o,startsExpr:r}),pipeline:u(\"|>\",0),nullishCoalescing:u(\"??\",1),logicalOR:u(\"||\",1),logicalAND:u(\"&&\",2),bitwiseOR:u(\"|\",3),bitwiseXOR:u(\"^\",4),bitwiseAND:u(\"&\",5),equality:u(\"==/!=/===/!==\",6),relational:u(\"</>/<=/>=\",7),bitShift:u(\"<</>>/>>>\",8),plusMin:new h(\"+/-\",{beforeExpr:i,binop:9,prefix:o,startsExpr:r}),modulo:new h(\"%\",{beforeExpr:i,binop:10,startsExpr:r}),star:u(\"*\",10),slash:u(\"/\",10),exponent:new h(\"**\",{beforeExpr:i,binop:11,rightAssociative:!0}),_break:p(\"break\"),_case:p(\"case\",{beforeExpr:i}),_catch:p(\"catch\"),_continue:p(\"continue\"),_debugger:p(\"debugger\"),_default:p(\"default\",{beforeExpr:i}),_do:p(\"do\",{isLoop:n,beforeExpr:i}),_else:p(\"else\",{beforeExpr:i}),_finally:p(\"finally\"),_for:p(\"for\",{isLoop:n}),_function:p(\"function\",{startsExpr:r}),_if:p(\"if\"),_return:p(\"return\",{beforeExpr:i}),_switch:p(\"switch\"),_throw:p(\"throw\",{beforeExpr:i,prefix:o,startsExpr:r}),_try:p(\"try\"),_var:p(\"var\"),_const:p(\"const\"),_while:p(\"while\",{isLoop:n}),_with:p(\"with\"),_new:p(\"new\",{beforeExpr:i,startsExpr:r}),_this:p(\"this\",{startsExpr:r}),_super:p(\"super\",{startsExpr:r}),_class:p(\"class\",{startsExpr:r}),_extends:p(\"extends\",{beforeExpr:i}),_export:p(\"export\"),_import:p(\"import\",{startsExpr:r}),_null:p(\"null\",{startsExpr:r}),_true:p(\"true\",{startsExpr:r}),_false:p(\"false\",{startsExpr:r}),_in:p(\"in\",{beforeExpr:i,binop:7}),_instanceof:p(\"instanceof\",{beforeExpr:i,binop:7}),_typeof:p(\"typeof\",{beforeExpr:i,prefix:o,startsExpr:r}),_void:p(\"void\",{beforeExpr:i,prefix:o,startsExpr:r}),_delete:p(\"delete\",{beforeExpr:i,prefix:o,startsExpr:r})},f=0,m=1,y=2,g=4,x=8,b=16,v=32,w=64,P=128,T=m|y|P,E=1,A=2,S=4,C=8,k=16,N=64,I=128,O=256,D=512,M=1024,L=E|A|C|I,_=0|E|C|0,R=0|E|S|0,j=0|E|k|0,F=0|A|I,B=0|A,U=E|A|C|O,q=0|M,V=0|N,H=0|E|N,z=U|D,W=0|M,K=4,$=2,X=1,G=$|X,Y=$|K,J=X|K,Q=$,Z=X,tt=0,et=/\\r\\n?|[\\n\\u2028\\u2029]/,st=new RegExp(et.source,\"g\");function it(t){switch(t){case 10:case 13:case 8232:case 8233:return!0;default:return!1}}const rt=/(?:\\s|\\/\\/.*|\\/\\*[^]*?\\*\\/)*/g;function nt(t){switch(t){case 9:case 11:case 12:case 32:case 160:case 5760:case 8192:case 8193:case 8194:case 8195:case 8196:case 8197:case 8198:case 8199:case 8200:case 8201:case 8202:case 8239:case 8287:case 12288:case 65279:return!0;default:return!1}}class at{constructor(t,e){this.line=t,this.column=e}}class ot{constructor(t,e){this.start=t,this.end=e}}function ct(t,e){let s,i=1,r=0;st.lastIndex=0;while((s=st.exec(t))&&s.index<e)i++,r=st.lastIndex;return new at(i,e-r)}class ht{constructor(){this.sawUnambiguousESM=!1,this.ambiguousScriptDifferentAst=!1}hasPlugin(t){return this.plugins.has(t)}getPluginOption(t,e){if(this.hasPlugin(t))return this.plugins.get(t)[e]}}function lt(t){return t[t.length-1]}class pt extends ht{addComment(t){this.filename&&(t.loc.filename=this.filename),this.state.trailingComments.push(t),this.state.leadingComments.push(t)}adjustCommentsAfterTrailingComma(t,e,s){if(0===this.state.leadingComments.length)return;let i=null,r=e.length;while(null===i&&r>0)i=e[--r];if(null===i)return;for(let a=0;a<this.state.leadingComments.length;a++)this.state.leadingComments[a].end<this.state.commentPreviousNode.end&&(this.state.leadingComments.splice(a,1),a--);const n=[];for(let a=0;a<this.state.leadingComments.length;a++){const e=this.state.leadingComments[a];e.end<t.end?(n.push(e),s||(this.state.leadingComments.splice(a,1),a--)):(void 0===t.trailingComments&&(t.trailingComments=[]),t.trailingComments.push(e))}s&&(this.state.leadingComments=[]),n.length>0?i.trailingComments=n:void 0!==i.trailingComments&&(i.trailingComments=[])}processComment(t){if(\"Program\"===t.type&&t.body.length>0)return;const e=this.state.commentStack;let s,i,r,n,a;if(this.state.trailingComments.length>0)this.state.trailingComments[0].start>=t.end?(r=this.state.trailingComments,this.state.trailingComments=[]):this.state.trailingComments.length=0;else if(e.length>0){const s=lt(e);s.trailingComments&&s.trailingComments[0].start>=t.end&&(r=s.trailingComments,delete s.trailingComments)}e.length>0&&lt(e).start>=t.start&&(s=e.pop());while(e.length>0&&lt(e).start>=t.start)i=e.pop();if(!i&&s&&(i=s),s)switch(t.type){case\"ObjectExpression\":this.adjustCommentsAfterTrailingComma(t,t.properties);break;case\"ObjectPattern\":this.adjustCommentsAfterTrailingComma(t,t.properties,!0);break;case\"CallExpression\":this.adjustCommentsAfterTrailingComma(t,t.arguments);break;case\"ArrayExpression\":this.adjustCommentsAfterTrailingComma(t,t.elements);break;case\"ArrayPattern\":this.adjustCommentsAfterTrailingComma(t,t.elements,!0);break}else this.state.commentPreviousNode&&(\"ImportSpecifier\"===this.state.commentPreviousNode.type&&\"ImportSpecifier\"!==t.type||\"ExportSpecifier\"===this.state.commentPreviousNode.type&&\"ExportSpecifier\"!==t.type)&&this.adjustCommentsAfterTrailingComma(t,[this.state.commentPreviousNode]);if(i){if(i.leadingComments)if(i!==t&&i.leadingComments.length>0&&lt(i.leadingComments).end<=t.start)t.leadingComments=i.leadingComments,delete i.leadingComments;else for(n=i.leadingComments.length-2;n>=0;--n)if(i.leadingComments[n].end<=t.start){t.leadingComments=i.leadingComments.splice(0,n+1);break}}else if(this.state.leadingComments.length>0)if(lt(this.state.leadingComments).end<=t.start){if(this.state.commentPreviousNode)for(a=0;a<this.state.leadingComments.length;a++)this.state.leadingComments[a].end<this.state.commentPreviousNode.end&&(this.state.leadingComments.splice(a,1),a--);this.state.leadingComments.length>0&&(t.leadingComments=this.state.leadingComments,this.state.leadingComments=[])}else{for(n=0;n<this.state.leadingComments.length;n++)if(this.state.leadingComments[n].end>t.start)break;const e=this.state.leadingComments.slice(0,n);e.length&&(t.leadingComments=e),r=this.state.leadingComments.slice(n),0===r.length&&(r=null)}if(this.state.commentPreviousNode=t,r)if(r.length&&r[0].start>=t.start&&lt(r).end<=t.end)t.innerComments=r;else{const e=r.findIndex(e=>e.end>=t.end);e>0?(t.innerComments=r.slice(0,e),t.trailingComments=r.slice(e)):t.trailingComments=r}e.push(t)}}const ut=Object.freeze({ArgumentsDisallowedInInitializer:\"'arguments' is not allowed in class field initializer\",AsyncFunctionInSingleStatementContext:\"Async functions can only be declared at the top level or inside a block\",AwaitBindingIdentifier:\"Can not use 'await' as identifier inside an async function\",AwaitExpressionFormalParameter:\"await is not allowed in async function parameters\",AwaitNotInAsyncFunction:\"Can not use keyword 'await' outside an async function\",BadGetterArity:\"getter must not have any formal parameters\",BadSetterArity:\"setter must have exactly one formal parameter\",BadSetterRestParameter:\"setter function argument must not be a rest parameter\",ConstructorClassField:\"Classes may not have a field named 'constructor'\",ConstructorClassPrivateField:\"Classes may not have a private field named '#constructor'\",ConstructorIsAccessor:\"Class constructor may not be an accessor\",ConstructorIsAsync:\"Constructor can't be an async function\",ConstructorIsGenerator:\"Constructor can't be a generator\",DeclarationMissingInitializer:\"%0 require an initialization value\",DecoratorBeforeExport:\"Decorators must be placed *before* the 'export' keyword. You can set the 'decoratorsBeforeExport' option to false to use the 'export @decorator class {}' syntax\",DecoratorConstructor:\"Decorators can't be used with a constructor. Did you mean '@dec class { ... }'?\",DecoratorExportClass:\"Using the export keyword between a decorator and a class is not allowed. Please use `export @dec class` instead.\",DecoratorSemicolon:\"Decorators must not be followed by a semicolon\",DeletePrivateField:\"Deleting a private field is not allowed\",DestructureNamedImport:\"ES2015 named imports do not destructure. Use another statement for destructuring after the import.\",DuplicateConstructor:\"Duplicate constructor in the same class\",DuplicateDefaultExport:\"Only one default export allowed per module.\",DuplicateExport:\"`%0` has already been exported. Exported identifiers must be unique.\",DuplicateProto:\"Redefinition of __proto__ property\",DuplicateRegExpFlags:\"Duplicate regular expression flag\",ElementAfterRest:\"Rest element must be last element\",EscapedCharNotAnIdentifier:\"Invalid Unicode escape\",ExportDefaultFromAsIdentifier:\"'from' is not allowed as an identifier after 'export default'\",ForInOfLoopInitializer:\"%0 loop variable declaration may not have an initializer\",GeneratorInSingleStatementContext:\"Generators can only be declared at the top level or inside a block\",IllegalBreakContinue:\"Unsyntactic %0\",IllegalLanguageModeDirective:\"Illegal 'use strict' directive in function with non-simple parameter list\",IllegalReturn:\"'return' outside of function\",ImportCallArgumentTrailingComma:\"Trailing comma is disallowed inside import(...) arguments\",ImportCallArity:\"import() requires exactly %0\",ImportCallNotNewExpression:\"Cannot use new with import(...)\",ImportCallSpreadArgument:\"... is not allowed in import()\",ImportMetaOutsideModule:\"import.meta may appear only with 'sourceType: \\\"module\\\"'\",ImportOutsideModule:\"'import' and 'export' may appear only with 'sourceType: \\\"module\\\"'\",InvalidBigIntLiteral:\"Invalid BigIntLiteral\",InvalidCodePoint:\"Code point out of bounds\",InvalidDigit:\"Expected number in radix %0\",InvalidEscapeSequence:\"Bad character escape sequence\",InvalidEscapeSequenceTemplate:\"Invalid escape sequence in template\",InvalidEscapedReservedWord:\"Escape sequence in keyword %0\",InvalidIdentifier:\"Invalid identifier %0\",InvalidLhs:\"Invalid left-hand side in %0\",InvalidLhsBinding:\"Binding invalid left-hand side in %0\",InvalidNumber:\"Invalid number\",InvalidOrUnexpectedToken:\"Unexpected character '%0'\",InvalidParenthesizedAssignment:\"Invalid parenthesized assignment pattern\",InvalidPrivateFieldResolution:\"Private name #%0 is not defined\",InvalidPropertyBindingPattern:\"Binding member expression\",InvalidRecordProperty:\"Only properties and spread elements are allowed in record definitions\",InvalidRestAssignmentPattern:\"Invalid rest operator's argument\",LabelRedeclaration:\"Label '%0' is already declared\",LetInLexicalBinding:\"'let' is not allowed to be used as a name in 'let' or 'const' declarations.\",MalformedRegExpFlags:\"Invalid regular expression flag\",MissingClassName:\"A class name is required\",MissingEqInAssignment:\"Only '=' operator can be used for specifying default value.\",MissingUnicodeEscape:\"Expecting Unicode escape sequence \\\\uXXXX\",MixingCoalesceWithLogical:\"Nullish coalescing operator(??) requires parens when mixing with logical operators\",ModuleAttributeDifferentFromType:\"The only accepted module attribute is `type`\",ModuleAttributeInvalidValue:\"Only string literals are allowed as module attribute values\",ModuleAttributesWithDuplicateKeys:'Duplicate key \"%0\" is not allowed in module attributes',ModuleExportUndefined:\"Export '%0' is not defined\",MultipleDefaultsInSwitch:\"Multiple default clauses\",NewlineAfterThrow:\"Illegal newline after throw\",NoCatchOrFinally:\"Missing catch or finally clause\",NumberIdentifier:\"Identifier directly after number\",NumericSeparatorInEscapeSequence:\"Numeric separators are not allowed inside unicode escape sequences or hex escape sequences\",ObsoleteAwaitStar:\"await* has been removed from the async functions proposal. Use Promise.all() instead.\",OptionalChainingNoNew:\"constructors in/after an Optional Chain are not allowed\",OptionalChainingNoTemplate:\"Tagged Template Literals are not allowed in optionalChain\",ParamDupe:\"Argument name clash\",PatternHasAccessor:\"Object pattern can't contain getter or setter\",PatternHasMethod:\"Object pattern can't contain methods\",PipelineBodyNoArrow:'Unexpected arrow \"=>\" after pipeline body; arrow function in pipeline body must be parenthesized',PipelineBodySequenceExpression:\"Pipeline body may not be a comma-separated sequence expression\",PipelineHeadSequenceExpression:\"Pipeline head should not be a comma-separated sequence expression\",PipelineTopicUnused:\"Pipeline is in topic style but does not use topic reference\",PrimaryTopicNotAllowed:\"Topic reference was used in a lexical context without topic binding\",PrimaryTopicRequiresSmartPipeline:\"Primary Topic Reference found but pipelineOperator not passed 'smart' for 'proposal' option.\",PrivateInExpectedIn:\"Private names are only allowed in property accesses (`obj.#%0`) or in `in` expressions (`#%0 in obj`)\",PrivateNameRedeclaration:\"Duplicate private name #%0\",RecordExpressionBarIncorrectEndSyntaxType:\"Record expressions ending with '|}' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'\",RecordExpressionBarIncorrectStartSyntaxType:\"Record expressions starting with '{|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'\",RecordExpressionHashIncorrectStartSyntaxType:\"Record expressions starting with '#{' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'\",RecordNoProto:\"'__proto__' is not allowed in Record expressions\",RestTrailingComma:\"Unexpected trailing comma after rest element\",SloppyFunction:\"In non-strict mode code, functions can only be declared at top level, inside a block, or as the body of an if statement\",StaticPrototype:\"Classes may not have static property named prototype\",StrictDelete:\"Deleting local variable in strict mode\",StrictEvalArguments:\"Assigning to '%0' in strict mode\",StrictEvalArgumentsBinding:\"Binding '%0' in strict mode\",StrictFunction:\"In strict mode code, functions can only be declared at top level or inside a block\",StrictOctalLiteral:\"Legacy octal literals are not allowed in strict mode\",StrictWith:\"'with' in strict mode\",SuperNotAllowed:\"super() is only valid inside a class constructor of a subclass. Maybe a typo in the method name ('constructor') or not extending another class?\",SuperPrivateField:\"Private fields can't be accessed on super\",TrailingDecorator:\"Decorators must be attached to a class element\",TupleExpressionBarIncorrectEndSyntaxType:\"Tuple expressions ending with '|]' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'\",TupleExpressionBarIncorrectStartSyntaxType:\"Tuple expressions starting with '[|' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'bar'\",TupleExpressionHashIncorrectStartSyntaxType:\"Tuple expressions starting with '#[' are only allowed when the 'syntaxType' option of the 'recordAndTuple' plugin is set to 'hash'\",UnexpectedArgumentPlaceholder:\"Unexpected argument placeholder\",UnexpectedAwaitAfterPipelineBody:'Unexpected \"await\" after pipeline body; await must have parentheses in minimal proposal',UnexpectedDigitAfterHash:\"Unexpected digit after hash token\",UnexpectedImportExport:\"'import' and 'export' may only appear at the top level\",UnexpectedKeyword:\"Unexpected keyword '%0'\",UnexpectedLeadingDecorator:\"Leading decorators must be attached to a class declaration\",UnexpectedLexicalDeclaration:\"Lexical declaration cannot appear in a single-statement context\",UnexpectedNewTarget:\"new.target can only be used in functions\",UnexpectedNumericSeparator:\"A numeric separator is only allowed between two digits\",UnexpectedPrivateField:\"Private names can only be used as the name of a class element (i.e. class C { #p = 42; #m() {} } )\\n or a property of member expression (i.e. this.#p).\",UnexpectedReservedWord:\"Unexpected reserved word '%0'\",UnexpectedSuper:\"super is only allowed in object methods and classes\",UnexpectedToken:\"Unexpected token '%0'\",UnexpectedTokenUnaryExponentiation:\"Illegal expression. Wrap left hand side or entire exponentiation in parentheses.\",UnsupportedBind:\"Binding should be performed on object property.\",UnsupportedDecoratorExport:\"A decorated export must export a class declaration\",UnsupportedDefaultExport:\"Only expressions, functions or classes are allowed as the `default` export.\",UnsupportedImport:\"import can only be used in import() or import.meta\",UnsupportedMetaProperty:\"The only valid meta property for %0 is %0.%1\",UnsupportedParameterDecorator:\"Decorators cannot be used to decorate parameters\",UnsupportedPropertyDecorator:\"Decorators cannot be used to decorate object literal properties\",UnsupportedSuper:\"super can only be used with function calls (i.e. super()) or in property accesses (i.e. super.prop or super[prop])\",UnterminatedComment:\"Unterminated comment\",UnterminatedRegExp:\"Unterminated regular expression\",UnterminatedString:\"Unterminated string constant\",UnterminatedTemplate:\"Unterminated template\",VarRedeclaration:\"Identifier '%0' has already been declared\",YieldBindingIdentifier:\"Can not use 'yield' as identifier inside a generator\",YieldInParameter:\"yield is not allowed in generator parameters\",ZeroDigitNumericSeparator:\"Numeric separator can not be used after leading 0\"});class dt extends pt{getLocationForPosition(t){let e;return e=t===this.state.start?this.state.startLoc:t===this.state.lastTokStart?this.state.lastTokStartLoc:t===this.state.end?this.state.endLoc:t===this.state.lastTokEnd?this.state.lastTokEndLoc:ct(this.input,t),e}raise(t,e,...s){return this.raiseWithData(t,void 0,e,...s)}raiseWithData(t,e,s,...i){const r=this.getLocationForPosition(t),n=s.replace(/%(\\d+)/g,(t,e)=>i[e])+` (${r.line}:${r.column})`;return this._raise(Object.assign({loc:r,pos:t},e),n)}_raise(t,e){const s=new SyntaxError(e);if(Object.assign(s,t),this.options.errorRecovery)return this.isLookahead||this.state.errors.push(s),s;throw s}}function ft(t){return null!=t&&\"Property\"===t.type&&\"init\"===t.kind&&!1===t.method}var mt=t=>class extends t{estreeParseRegExpLiteral({pattern:t,flags:e}){let s=null;try{s=new RegExp(t,e)}catch(r){}const i=this.estreeParseLiteral(s);return i.regex={pattern:t,flags:e},i}estreeParseBigIntLiteral(t){const e=\"undefined\"!==typeof BigInt?BigInt(t):null,s=this.estreeParseLiteral(e);return s.bigint=String(s.value||t),s}estreeParseLiteral(t){return this.parseLiteral(t,\"Literal\")}directiveToStmt(t){const e=t.value,s=this.startNodeAt(t.start,t.loc.start),i=this.startNodeAt(e.start,e.loc.start);return i.value=e.value,i.raw=e.extra.raw,s.expression=this.finishNodeAt(i,\"Literal\",e.end,e.loc.end),s.directive=e.extra.raw.slice(1,-1),this.finishNodeAt(s,\"ExpressionStatement\",t.end,t.loc.end)}initFunction(t,e){super.initFunction(t,e),t.expression=!1}checkDeclaration(t){ft(t)?this.checkDeclaration(t.value):super.checkDeclaration(t)}checkGetterSetterParams(t){const e=t,s=\"get\"===e.kind?0:1,i=e.start;e.value.params.length!==s?\"get\"===t.kind?this.raise(i,ut.BadGetterArity):this.raise(i,ut.BadSetterArity):\"set\"===e.kind&&\"RestElement\"===e.value.params[0].type&&this.raise(i,ut.BadSetterRestParameter)}checkLVal(t,e=V,s,i,r){switch(t.type){case\"ObjectPattern\":t.properties.forEach(t=>{this.checkLVal(\"Property\"===t.type?t.value:t,e,s,\"object destructuring pattern\",r)});break;default:super.checkLVal(t,e,s,i,r)}}checkProto(t,e,s,i){t.method||super.checkProto(t,e,s,i)}isValidDirective(t){var e;return\"ExpressionStatement\"===t.type&&\"Literal\"===t.expression.type&&\"string\"===typeof t.expression.value&&!(null==(e=t.expression.extra)?void 0:e.parenthesized)}stmtToDirective(t){const e=super.stmtToDirective(t),s=t.expression.value;return e.value.value=s,e}parseBlockBody(t,e,s,i){super.parseBlockBody(t,e,s,i);const r=t.directives.map(t=>this.directiveToStmt(t));t.body=r.concat(t.body),delete t.directives}pushClassMethod(t,e,s,i,r,n){this.parseMethod(e,s,i,r,n,\"ClassMethod\",!0),e.typeParameters&&(e.value.typeParameters=e.typeParameters,delete e.typeParameters),t.body.push(e)}parseExprAtom(t){switch(this.state.type){case d.num:case d.string:return this.estreeParseLiteral(this.state.value);case d.regexp:return this.estreeParseRegExpLiteral(this.state.value);case d.bigint:return this.estreeParseBigIntLiteral(this.state.value);case d._null:return this.estreeParseLiteral(null);case d._true:return this.estreeParseLiteral(!0);case d._false:return this.estreeParseLiteral(!1);default:return super.parseExprAtom(t)}}parseLiteral(t,e,s,i){const r=super.parseLiteral(t,e,s,i);return r.raw=r.extra.raw,delete r.extra,r}parseFunctionBody(t,e,s=!1){super.parseFunctionBody(t,e,s),t.expression=\"BlockStatement\"!==t.body.type}parseMethod(t,e,s,i,r,n,a=!1){let o=this.startNode();return o.kind=t.kind,o=super.parseMethod(o,e,s,i,r,n,a),o.type=\"FunctionExpression\",delete o.kind,t.value=o,n=\"ClassMethod\"===n?\"MethodDefinition\":n,this.finishNode(t,n)}parseObjectMethod(t,e,s,i,r){const n=super.parseObjectMethod(t,e,s,i,r);return n&&(n.type=\"Property\",\"method\"===n.kind&&(n.kind=\"init\"),n.shorthand=!1),n}parseObjectProperty(t,e,s,i,r){const n=super.parseObjectProperty(t,e,s,i,r);return n&&(n.kind=\"init\",n.type=\"Property\"),n}toAssignable(t){return ft(t)?(this.toAssignable(t.value),t):super.toAssignable(t)}toAssignableObjectExpressionProp(t,e){if(\"get\"===t.kind||\"set\"===t.kind)throw this.raise(t.key.start,ut.PatternHasAccessor);if(t.method)throw this.raise(t.key.start,ut.PatternHasMethod);super.toAssignableObjectExpressionProp(t,e)}finishCallExpression(t,e){return super.finishCallExpression(t,e),\"Import\"===t.callee.type?(t.type=\"ImportExpression\",t.source=t.arguments[0],delete t.arguments,delete t.callee):\"CallExpression\"===t.type&&(t.optional=!1),t}toReferencedListDeep(t,e){t&&super.toReferencedListDeep(t,e)}parseExport(t){switch(super.parseExport(t),t.type){case\"ExportAllDeclaration\":t.exported=null;break;case\"ExportNamedDeclaration\":1===t.specifiers.length&&\"ExportNamespaceSpecifier\"===t.specifiers[0].type&&(t.type=\"ExportAllDeclaration\",t.exported=t.specifiers[0].exported,delete t.specifiers);break}return t}parseSubscript(...t){const e=super.parseSubscript(...t);return\"MemberExpression\"===e.type&&(e.optional=!1),e}};class yt{constructor(t,e,s,i){this.token=t,this.isExpr=!!e,this.preserveSpace=!!s,this.override=i}}const gt={braceStatement:new yt(\"{\",!1),braceExpression:new yt(\"{\",!0),templateQuasi:new yt(\"${\",!1),parenStatement:new yt(\"(\",!1),parenExpression:new yt(\"(\",!0),template:new yt(\"`\",!0,!0,t=>t.readTmplToken()),functionExpression:new yt(\"function\",!0),functionStatement:new yt(\"function\",!1)};d.parenR.updateContext=d.braceR.updateContext=function(){if(1===this.state.context.length)return void(this.state.exprAllowed=!0);let t=this.state.context.pop();t===gt.braceStatement&&\"function\"===this.curContext().token&&(t=this.state.context.pop()),this.state.exprAllowed=!t.isExpr},d.name.updateContext=function(t){let e=!1;t!==d.dot&&(\"of\"===this.state.value&&!this.state.exprAllowed&&t!==d._function&&t!==d._class||\"yield\"===this.state.value&&this.prodParam.hasYield)&&(e=!0),this.state.exprAllowed=e,this.state.isIterator&&(this.state.isIterator=!1)},d.braceL.updateContext=function(t){this.state.context.push(this.braceIsBlock(t)?gt.braceStatement:gt.braceExpression),this.state.exprAllowed=!0},d.dollarBraceL.updateContext=function(){this.state.context.push(gt.templateQuasi),this.state.exprAllowed=!0},d.parenL.updateContext=function(t){const e=t===d._if||t===d._for||t===d._with||t===d._while;this.state.context.push(e?gt.parenStatement:gt.parenExpression),this.state.exprAllowed=!0},d.incDec.updateContext=function(){},d._function.updateContext=d._class.updateContext=function(t){t===d.dot||t===d.questionDot||(!t.beforeExpr||t===d.semi||t===d._else||t===d._return&&et.test(this.input.slice(this.state.lastTokEnd,this.state.start))||(t===d.colon||t===d.braceL)&&this.curContext()===gt.b_stat?this.state.context.push(gt.functionStatement):this.state.context.push(gt.functionExpression)),this.state.exprAllowed=!1},d.backQuote.updateContext=function(){this.curContext()===gt.template?this.state.context.pop():this.state.context.push(gt.template),this.state.exprAllowed=!1},d.star.updateContext=function(){this.state.exprAllowed=!1};let xt=\"ªµºÀ-ÖØ-öø-ˁˆ-ˑˠ-ˤˬˮͰ-ʹͶͷͺ-ͽͿΆΈ-ΊΌΎ-ΡΣ-ϵϷ-ҁҊ-ԯԱ-Ֆՙՠ-ֈא-תׯ-ײؠ-يٮٯٱ-ۓەۥۦۮۯۺ-ۼۿܐܒ-ܯݍ-ޥޱߊ-ߪߴߵߺࠀ-ࠕࠚࠤࠨࡀ-ࡘࡠ-ࡪࢠ-ࢴࢶ-ࣇऄ-हऽॐक़-ॡॱ-ঀঅ-ঌএঐও-নপ-রলশ-হঽৎড়ঢ়য়-ৡৰৱৼਅ-ਊਏਐਓ-ਨਪ-ਰਲਲ਼ਵਸ਼ਸਹਖ਼-ੜਫ਼ੲ-ੴઅ-ઍએ-ઑઓ-નપ-રલળવ-હઽૐૠૡૹଅ-ଌଏଐଓ-ନପ-ରଲଳଵ-ହଽଡ଼ଢ଼ୟ-ୡୱஃஅ-ஊஎ-ஐஒ-கஙசஜஞடணதந-பம-ஹௐఅ-ఌఎ-ఐఒ-నప-హఽౘ-ౚౠౡಀಅ-ಌಎ-ಐಒ-ನಪ-ಳವ-ಹಽೞೠೡೱೲഄ-ഌഎ-ഐഒ-ഺഽൎൔ-ൖൟ-ൡൺ-ൿඅ-ඖක-නඳ-රලව-ෆก-ะาำเ-ๆກຂຄຆ-ຊຌ-ຣລວ-ະາຳຽເ-ໄໆໜ-ໟༀཀ-ཇཉ-ཬྈ-ྌက-ဪဿၐ-ၕၚ-ၝၡၥၦၮ-ၰၵ-ႁႎႠ-ჅჇჍა-ჺჼ-ቈቊ-ቍቐ-ቖቘቚ-ቝበ-ኈኊ-ኍነ-ኰኲ-ኵኸ-ኾዀዂ-ዅወ-ዖዘ-ጐጒ-ጕጘ-ፚᎀ-ᎏᎠ-Ᏽᏸ-ᏽᐁ-ᙬᙯ-ᙿᚁ-ᚚᚠ-ᛪᛮ-ᛸᜀ-ᜌᜎ-ᜑᜠ-ᜱᝀ-ᝑᝠ-ᝬᝮ-ᝰក-ឳៗៜᠠ-ᡸᢀ-ᢨᢪᢰ-ᣵᤀ-ᤞᥐ-ᥭᥰ-ᥴᦀ-ᦫᦰ-ᧉᨀ-ᨖᨠ-ᩔᪧᬅ-ᬳᭅ-ᭋᮃ-ᮠᮮᮯᮺ-ᯥᰀ-ᰣᱍ-ᱏᱚ-ᱽᲀ-ᲈᲐ-ᲺᲽ-Ჿᳩ-ᳬᳮ-ᳳᳵᳶᳺᴀ-ᶿḀ-ἕἘ-Ἕἠ-ὅὈ-Ὅὐ-ὗὙὛὝὟ-ώᾀ-ᾴᾶ-ᾼιῂ-ῄῆ-ῌῐ-ΐῖ-Ίῠ-Ῥῲ-ῴῶ-ῼⁱⁿₐ-ₜℂℇℊ-ℓℕ℘-ℝℤΩℨK-ℹℼ-ℿⅅ-ⅉⅎⅠ-ↈⰀ-Ⱞⰰ-ⱞⱠ-ⳤⳫ-ⳮⳲⳳⴀ-ⴥⴧⴭⴰ-ⵧⵯⶀ-ⶖⶠ-ⶦⶨ-ⶮⶰ-ⶶⶸ-ⶾⷀ-ⷆⷈ-ⷎⷐ-ⷖⷘ-ⷞ々-〇〡-〩〱-〵〸-〼ぁ-ゖ゛-ゟァ-ヺー-ヿㄅ-ㄯㄱ-ㆎㆠ-ㆿㇰ-ㇿ㐀-䶿一-鿼ꀀ-ꒌꓐ-ꓽꔀ-ꘌꘐ-ꘟꘪꘫꙀ-ꙮꙿ-ꚝꚠ-ꛯꜗ-ꜟꜢ-ꞈꞋ-ꞿꟂ-ꟊꟵ-ꠁꠃ-ꠅꠇ-ꠊꠌ-ꠢꡀ-ꡳꢂ-ꢳꣲ-ꣷꣻꣽꣾꤊ-ꤥꤰ-ꥆꥠ-ꥼꦄ-ꦲꧏꧠ-ꧤꧦ-ꧯꧺ-ꧾꨀ-ꨨꩀ-ꩂꩄ-ꩋꩠ-ꩶꩺꩾ-ꪯꪱꪵꪶꪹ-ꪽꫀꫂꫛ-ꫝꫠ-ꫪꫲ-ꫴꬁ-ꬆꬉ-ꬎꬑ-ꬖꬠ-ꬦꬨ-ꬮꬰ-ꭚꭜ-ꭩꭰ-ꯢ가-힣ힰ-ퟆퟋ-ퟻ豈-舘並-龎ﬀ-ﬆﬓ-ﬗיִײַ-ﬨשׁ-זּטּ-לּמּנּסּףּפּצּ-ﮱﯓ-ﴽﵐ-ﶏﶒ-ﷇﷰ-ﷻﹰ-ﹴﹶ-ﻼＡ-Ｚａ-ｚｦ-ﾾￂ-ￇￊ-ￏￒ-ￗￚ-ￜ\",bt=\"‌‍·̀-ͯ·҃-֑҇-ׇֽֿׁׂׅׄؐ-ًؚ-٩ٰۖ-ۜ۟-۪ۤۧۨ-ۭ۰-۹ܑܰ-݊ަ-ް߀-߉߫-߽߳ࠖ-࠙ࠛ-ࠣࠥ-ࠧࠩ-࡙࠭-࡛࣓-ࣣ࣡-ःऺ-़ा-ॏ॑-ॗॢॣ०-९ঁ-ঃ়া-ৄেৈো-্ৗৢৣ০-৯৾ਁ-ਃ਼ਾ-ੂੇੈੋ-੍ੑ੦-ੱੵઁ-ઃ઼ા-ૅે-ૉો-્ૢૣ૦-૯ૺ-૿ଁ-ଃ଼ା-ୄେୈୋ-୍୕-ୗୢୣ୦-୯ஂா-ூெ-ைொ-்ௗ௦-௯ఀ-ఄా-ౄె-ైొ-్ౕౖౢౣ౦-౯ಁ-ಃ಼ಾ-ೄೆ-ೈೊ-್ೕೖೢೣ೦-೯ഀ-ഃ഻഼ാ-ൄെ-ൈൊ-്ൗൢൣ൦-൯ඁ-ඃ්ා-ුූෘ-ෟ෦-෯ෲෳัิ-ฺ็-๎๐-๙ັິ-ຼ່-ໍ໐-໙༘༙༠-༩༹༵༷༾༿ཱ-྄྆྇ྍ-ྗྙ-ྼ࿆ါ-ှ၀-၉ၖ-ၙၞ-ၠၢ-ၤၧ-ၭၱ-ၴႂ-ႍႏ-ႝ፝-፟፩-፱ᜒ-᜔ᜲ-᜴ᝒᝓᝲᝳ឴-៓៝០-៩᠋-᠍᠐-᠙ᢩᤠ-ᤫᤰ-᤻᥆-᥏᧐-᧚ᨗ-ᨛᩕ-ᩞ᩠-᩿᩼-᪉᪐-᪙᪰-᪽ᪿᫀᬀ-ᬄ᬴-᭄᭐-᭙᭫-᭳ᮀ-ᮂᮡ-ᮭ᮰-᮹᯦-᯳ᰤ-᰷᱀-᱉᱐-᱙᳐-᳔᳒-᳨᳭᳴᳷-᳹᷀-᷹᷻-᷿‿⁀⁔⃐-⃥⃜⃡-⃰⳯-⵿⳱ⷠ-〪ⷿ-゙゚〯꘠-꘩꙯ꙴ-꙽ꚞꚟ꛰꛱ꠂ꠆ꠋꠣ-ꠧ꠬ꢀꢁꢴ-ꣅ꣐-꣙꣠-꣱ꣿ-꤉ꤦ-꤭ꥇ-꥓ꦀ-ꦃ꦳-꧀꧐-꧙ꧥ꧰-꧹ꨩ-ꨶꩃꩌꩍ꩐-꩙ꩻ-ꩽꪰꪲ-ꪴꪷꪸꪾ꪿꫁ꫫ-ꫯꫵ꫶ꯣ-ꯪ꯬꯭꯰-꯹ﬞ︀-️︠-︯︳︴﹍-﹏０-９＿\";const vt=new RegExp(\"[\"+xt+\"]\"),wt=new RegExp(\"[\"+xt+bt+\"]\");xt=bt=null;const Pt=[0,11,2,25,2,18,2,1,2,14,3,13,35,122,70,52,268,28,4,48,48,31,14,29,6,37,11,29,3,35,5,7,2,4,43,157,19,35,5,35,5,39,9,51,157,310,10,21,11,7,153,5,3,0,2,43,2,1,4,0,3,22,11,22,10,30,66,18,2,1,11,21,11,25,71,55,7,1,65,0,16,3,2,2,2,28,43,28,4,28,36,7,2,27,28,53,11,21,11,18,14,17,111,72,56,50,14,50,14,35,349,41,7,1,79,28,11,0,9,21,107,20,28,22,13,52,76,44,33,24,27,35,30,0,3,0,9,34,4,0,13,47,15,3,22,0,2,0,36,17,2,24,85,6,2,0,2,3,2,14,2,9,8,46,39,7,3,1,3,21,2,6,2,1,2,4,4,0,19,0,13,4,159,52,19,3,21,2,31,47,21,1,2,0,185,46,42,3,37,47,21,0,60,42,14,0,72,26,230,43,117,63,32,7,3,0,3,7,2,1,2,23,16,0,2,0,95,7,3,38,17,0,2,0,29,0,11,39,8,0,22,0,12,45,20,0,35,56,264,8,2,36,18,0,50,29,113,6,2,1,2,37,22,0,26,5,2,1,2,31,15,0,328,18,190,0,80,921,103,110,18,195,2749,1070,4050,582,8634,568,8,30,114,29,19,47,17,3,32,20,6,18,689,63,129,74,6,0,67,12,65,1,2,0,29,6135,9,1237,43,8,8952,286,50,2,18,3,9,395,2309,106,6,12,4,8,8,9,5991,84,2,70,2,1,3,0,3,1,3,3,2,11,2,0,2,6,2,64,2,3,3,7,2,6,2,27,2,3,2,4,2,0,4,6,2,339,3,24,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,30,2,24,2,7,2357,44,11,6,17,0,370,43,1301,196,60,67,8,0,1205,3,2,26,2,1,2,0,3,0,2,9,2,3,2,0,2,0,7,0,5,0,2,0,2,0,2,2,2,1,2,0,3,0,2,0,2,0,2,0,2,0,2,1,2,0,3,3,2,6,2,3,2,3,2,0,2,9,2,16,6,2,2,4,2,16,4421,42717,35,4148,12,221,3,5761,15,7472,3104,541,1507,4938],Tt=[509,0,227,0,150,4,294,9,1368,2,2,1,6,3,41,2,5,0,166,1,574,3,9,9,370,1,154,10,176,2,54,14,32,9,16,3,46,10,54,9,7,2,37,13,2,9,6,1,45,0,13,2,49,13,9,3,2,11,83,11,7,0,161,11,6,9,7,3,56,1,2,6,3,1,3,2,10,0,11,1,3,6,4,4,193,17,10,9,5,0,82,19,13,9,214,6,3,8,28,1,83,16,16,9,82,12,9,9,84,14,5,9,243,14,166,9,71,5,2,1,3,3,2,0,2,1,13,9,120,6,3,6,4,0,29,9,41,6,2,3,9,0,10,10,47,15,406,7,2,7,17,9,57,21,2,13,123,5,4,0,2,1,2,6,2,0,9,9,49,4,2,1,2,4,9,9,330,3,19306,9,135,4,60,6,26,9,1014,0,2,54,8,3,82,0,12,1,19628,1,5319,4,4,5,9,7,3,6,31,3,149,2,1418,49,513,54,5,49,9,0,15,0,23,4,2,14,1361,6,2,16,3,6,2,1,2,4,262,6,10,9,419,13,1495,6,110,6,6,9,4759,9,787719,239];function Et(t,e){let s=65536;for(let i=0,r=e.length;i<r;i+=2){if(s+=e[i],s>t)return!1;if(s+=e[i+1],s>=t)return!0}return!1}function At(t){return t<65?36===t:t<=90||(t<97?95===t:t<=122||(t<=65535?t>=170&&vt.test(String.fromCharCode(t)):Et(t,Pt)))}function St(t){return t<48?36===t:t<58||!(t<65)&&(t<=90||(t<97?95===t:t<=122||(t<=65535?t>=170&&wt.test(String.fromCharCode(t)):Et(t,Pt)||Et(t,Tt))))}const Ct={keyword:[\"break\",\"case\",\"catch\",\"continue\",\"debugger\",\"default\",\"do\",\"else\",\"finally\",\"for\",\"function\",\"if\",\"return\",\"switch\",\"throw\",\"try\",\"var\",\"const\",\"while\",\"with\",\"new\",\"this\",\"super\",\"class\",\"extends\",\"export\",\"import\",\"null\",\"true\",\"false\",\"in\",\"instanceof\",\"typeof\",\"void\",\"delete\"],strict:[\"implements\",\"interface\",\"let\",\"package\",\"private\",\"protected\",\"public\",\"static\",\"yield\"],strictBind:[\"eval\",\"arguments\"]},kt=new Set(Ct.keyword),Nt=new Set(Ct.strict),It=new Set(Ct.strictBind);function Ot(t,e){return e&&\"await\"===t||\"enum\"===t}function Dt(t,e){return Ot(t,e)||Nt.has(t)}function Mt(t){return It.has(t)}function Lt(t,e){return Dt(t,e)||Mt(t)}function _t(t){return kt.has(t)}const Rt=/^in(stanceof)?$/;function jt(t,e){return 64===t&&64===e}const Ft=new Set([\"_\",\"any\",\"bool\",\"boolean\",\"empty\",\"extends\",\"false\",\"interface\",\"mixed\",\"null\",\"number\",\"static\",\"string\",\"true\",\"typeof\",\"void\"]),Bt=Object.freeze({AmbiguousConditionalArrow:\"Ambiguous expression: wrap the arrow functions in parentheses to disambiguate.\",AmbiguousDeclareModuleKind:\"Found both `declare module.exports` and `declare export` in the same module. Modules can only have 1 since they are either an ES module or they are a CommonJS module\",AssignReservedType:\"Cannot overwrite reserved type %0\",DeclareClassElement:\"The `declare` modifier can only appear on class fields.\",DeclareClassFieldInitializer:\"Initializers are not allowed in fields with the `declare` modifier.\",DuplicateDeclareModuleExports:\"Duplicate `declare module.exports` statement\",EnumBooleanMemberNotInitialized:\"Boolean enum members need to be initialized. Use either `%0 = true,` or `%0 = false,` in enum `%1`.\",EnumDuplicateMemberName:\"Enum member names need to be unique, but the name `%0` has already been used before in enum `%1`.\",EnumInconsistentMemberValues:\"Enum `%0` has inconsistent member initializers. Either use no initializers, or consistently use literals (either booleans, numbers, or strings) for all member initializers.\",EnumInvalidExplicitType:\"Enum type `%1` is not valid. Use one of `boolean`, `number`, `string`, or `symbol` in enum `%0`.\",EnumInvalidExplicitTypeUnknownSupplied:\"Supplied enum type is not valid. Use one of `boolean`, `number`, `string`, or `symbol` in enum `%0`.\",EnumInvalidMemberInitializerPrimaryType:\"Enum `%0` has type `%2`, so the initializer of `%1` needs to be a %2 literal.\",EnumInvalidMemberInitializerSymbolType:\"Symbol enum members cannot be initialized. Use `%1,` in enum `%0`.\",EnumInvalidMemberInitializerUnknownType:\"The enum member initializer for `%1` needs to be a literal (either a boolean, number, or string) in enum `%0`.\",EnumInvalidMemberName:\"Enum member names cannot start with lowercase 'a' through 'z'. Instead of using `%0`, consider using `%1`, in enum `%2`.\",EnumNumberMemberNotInitialized:\"Number enum members need to be initialized, e.g. `%1 = 1` in enum `%0`.\",EnumStringMemberInconsistentlyInitailized:\"String enum members need to consistently either all use initializers, or use no initializers, in enum `%0`.\",ImportTypeShorthandOnlyInPureImport:\"The `type` and `typeof` keywords on named imports can only be used on regular `import` statements. It cannot be used with `import type` or `import typeof` statements\",InexactInsideExact:\"Explicit inexact syntax cannot appear inside an explicit exact object type\",InexactInsideNonObject:\"Explicit inexact syntax cannot appear in class or interface definitions\",InexactVariance:\"Explicit inexact syntax cannot have variance\",InvalidNonTypeImportInDeclareModule:\"Imports within a `declare module` body must always be `import type` or `import typeof`\",MissingTypeParamDefault:\"Type parameter declaration needs a default, since a preceding type parameter declaration has a default.\",NestedDeclareModule:\"`declare module` cannot be used inside another `declare module`\",NestedFlowComment:\"Cannot have a flow comment inside another flow comment\",OptionalBindingPattern:\"A binding pattern parameter cannot be optional in an implementation signature.\",SpreadVariance:\"Spread properties cannot have variance\",TypeBeforeInitializer:\"Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`\",TypeCastInPattern:\"The type cast expression is expected to be wrapped with parenthesis\",UnexpectedExplicitInexactInObject:\"Explicit inexact syntax must appear at the end of an inexact object\",UnexpectedReservedType:\"Unexpected reserved type %0\",UnexpectedReservedUnderscore:\"`_` is only allowed as a type argument to call or new\",UnexpectedSpaceBetweenModuloChecks:\"Spaces between `%` and `checks` are not allowed here.\",UnexpectedSpreadType:\"Spread operator cannot appear in class or interface definitions\",UnexpectedSubtractionOperand:'Unexpected token, expected \"number\" or \"bigint\"',UnexpectedTokenAfterTypeParameter:\"Expected an arrow function after this type parameter declaration\",UnsupportedDeclareExportKind:\"`declare export %0` is not supported. Use `%1` instead\",UnsupportedStatementInDeclareModule:\"Only declares and type imports are allowed inside declare module\",UnterminatedFlowComment:\"Unterminated flow-comment\"});function Ut(t){return\"DeclareExportAllDeclaration\"===t.type||\"DeclareExportDeclaration\"===t.type&&(!t.declaration||\"TypeAlias\"!==t.declaration.type&&\"InterfaceDeclaration\"!==t.declaration.type)}function qt(t){return\"type\"===t.importKind||\"typeof\"===t.importKind}function Vt(t){return(t.type===d.name||!!t.type.keyword)&&\"from\"!==t.value}const Ht={const:\"declare export var\",let:\"declare export var\",type:\"export type\",interface:\"export interface\"};function zt(t,e){const s=[],i=[];for(let r=0;r<t.length;r++)(e(t[r],r,t)?s:i).push(t[r]);return[s,i]}const Wt=/\\*?\\s*@((?:no)?flow)\\b/;var Kt=t=>class extends t{constructor(t,e){super(t,e),this.flowPragma=void 0}shouldParseTypes(){return this.getPluginOption(\"flow\",\"all\")||\"flow\"===this.flowPragma}shouldParseEnums(){return!!this.getPluginOption(\"flow\",\"enums\")}finishToken(t,e){return t!==d.string&&t!==d.semi&&t!==d.interpreterDirective&&void 0===this.flowPragma&&(this.flowPragma=null),super.finishToken(t,e)}addComment(t){if(void 0===this.flowPragma){const e=Wt.exec(t.value);if(e)if(\"flow\"===e[1])this.flowPragma=\"flow\";else{if(\"noflow\"!==e[1])throw new Error(\"Unexpected flow pragma\");this.flowPragma=\"noflow\"}else;}return super.addComment(t)}flowParseTypeInitialiser(t){const e=this.state.inType;this.state.inType=!0,this.expect(t||d.colon);const s=this.flowParseType();return this.state.inType=e,s}flowParsePredicate(){const t=this.startNode(),e=this.state.startLoc,s=this.state.start;this.expect(d.modulo);const i=this.state.startLoc;return this.expectContextual(\"checks\"),e.line===i.line&&e.column===i.column-1||this.raise(s,Bt.UnexpectedSpaceBetweenModuloChecks),this.eat(d.parenL)?(t.value=this.parseExpression(),this.expect(d.parenR),this.finishNode(t,\"DeclaredPredicate\")):this.finishNode(t,\"InferredPredicate\")}flowParseTypeAndPredicateInitialiser(){const t=this.state.inType;this.state.inType=!0,this.expect(d.colon);let e=null,s=null;return this.match(d.modulo)?(this.state.inType=t,s=this.flowParsePredicate()):(e=this.flowParseType(),this.state.inType=t,this.match(d.modulo)&&(s=this.flowParsePredicate())),[e,s]}flowParseDeclareClass(t){return this.next(),this.flowParseInterfaceish(t,!0),this.finishNode(t,\"DeclareClass\")}flowParseDeclareFunction(t){this.next();const e=t.id=this.parseIdentifier(),s=this.startNode(),i=this.startNode();this.isRelational(\"<\")?s.typeParameters=this.flowParseTypeParameterDeclaration():s.typeParameters=null,this.expect(d.parenL);const r=this.flowParseFunctionTypeParams();return s.params=r.params,s.rest=r.rest,this.expect(d.parenR),[s.returnType,t.predicate]=this.flowParseTypeAndPredicateInitialiser(),i.typeAnnotation=this.finishNode(s,\"FunctionTypeAnnotation\"),e.typeAnnotation=this.finishNode(i,\"TypeAnnotation\"),this.resetEndLocation(e),this.semicolon(),this.finishNode(t,\"DeclareFunction\")}flowParseDeclare(t,e){if(this.match(d._class))return this.flowParseDeclareClass(t);if(this.match(d._function))return this.flowParseDeclareFunction(t);if(this.match(d._var))return this.flowParseDeclareVariable(t);if(this.eatContextual(\"module\"))return this.match(d.dot)?this.flowParseDeclareModuleExports(t):(e&&this.raise(this.state.lastTokStart,Bt.NestedDeclareModule),this.flowParseDeclareModule(t));if(this.isContextual(\"type\"))return this.flowParseDeclareTypeAlias(t);if(this.isContextual(\"opaque\"))return this.flowParseDeclareOpaqueType(t);if(this.isContextual(\"interface\"))return this.flowParseDeclareInterface(t);if(this.match(d._export))return this.flowParseDeclareExportDeclaration(t,e);throw this.unexpected()}flowParseDeclareVariable(t){return this.next(),t.id=this.flowParseTypeAnnotatableIdentifier(!0),this.scope.declareName(t.id.name,R,t.id.start),this.semicolon(),this.finishNode(t,\"DeclareVariable\")}flowParseDeclareModule(t){this.scope.enter(f),this.match(d.string)?t.id=this.parseExprAtom():t.id=this.parseIdentifier();const e=t.body=this.startNode(),s=e.body=[];this.expect(d.braceL);while(!this.match(d.braceR)){let t=this.startNode();this.match(d._import)?(this.next(),this.isContextual(\"type\")||this.match(d._typeof)||this.raise(this.state.lastTokStart,Bt.InvalidNonTypeImportInDeclareModule),this.parseImport(t)):(this.expectContextual(\"declare\",Bt.UnsupportedStatementInDeclareModule),t=this.flowParseDeclare(t,!0)),s.push(t)}this.scope.exit(),this.expect(d.braceR),this.finishNode(e,\"BlockStatement\");let i=null,r=!1;return s.forEach(t=>{Ut(t)?(\"CommonJS\"===i&&this.raise(t.start,Bt.AmbiguousDeclareModuleKind),i=\"ES\"):\"DeclareModuleExports\"===t.type&&(r&&this.raise(t.start,Bt.DuplicateDeclareModuleExports),\"ES\"===i&&this.raise(t.start,Bt.AmbiguousDeclareModuleKind),i=\"CommonJS\",r=!0)}),t.kind=i||\"CommonJS\",this.finishNode(t,\"DeclareModule\")}flowParseDeclareExportDeclaration(t,e){if(this.expect(d._export),this.eat(d._default))return this.match(d._function)||this.match(d._class)?t.declaration=this.flowParseDeclare(this.startNode()):(t.declaration=this.flowParseType(),this.semicolon()),t.default=!0,this.finishNode(t,\"DeclareExportDeclaration\");if(this.match(d._const)||this.isLet()||(this.isContextual(\"type\")||this.isContextual(\"interface\"))&&!e){const t=this.state.value,e=Ht[t];throw this.raise(this.state.start,Bt.UnsupportedDeclareExportKind,t,e)}if(this.match(d._var)||this.match(d._function)||this.match(d._class)||this.isContextual(\"opaque\"))return t.declaration=this.flowParseDeclare(this.startNode()),t.default=!1,this.finishNode(t,\"DeclareExportDeclaration\");if(this.match(d.star)||this.match(d.braceL)||this.isContextual(\"interface\")||this.isContextual(\"type\")||this.isContextual(\"opaque\"))return t=this.parseExport(t),\"ExportNamedDeclaration\"===t.type&&(t.type=\"ExportDeclaration\",t.default=!1,delete t.exportKind),t.type=\"Declare\"+t.type,t;throw this.unexpected()}flowParseDeclareModuleExports(t){return this.next(),this.expectContextual(\"exports\"),t.typeAnnotation=this.flowParseTypeAnnotation(),this.semicolon(),this.finishNode(t,\"DeclareModuleExports\")}flowParseDeclareTypeAlias(t){return this.next(),this.flowParseTypeAlias(t),t.type=\"DeclareTypeAlias\",t}flowParseDeclareOpaqueType(t){return this.next(),this.flowParseOpaqueType(t,!0),t.type=\"DeclareOpaqueType\",t}flowParseDeclareInterface(t){return this.next(),this.flowParseInterfaceish(t),this.finishNode(t,\"DeclareInterface\")}flowParseInterfaceish(t,e=!1){if(t.id=this.flowParseRestrictedIdentifier(!e,!0),this.scope.declareName(t.id.name,e?j:_,t.id.start),this.isRelational(\"<\")?t.typeParameters=this.flowParseTypeParameterDeclaration():t.typeParameters=null,t.extends=[],t.implements=[],t.mixins=[],this.eat(d._extends))do{t.extends.push(this.flowParseInterfaceExtends())}while(!e&&this.eat(d.comma));if(this.isContextual(\"mixins\")){this.next();do{t.mixins.push(this.flowParseInterfaceExtends())}while(this.eat(d.comma))}if(this.isContextual(\"implements\")){this.next();do{t.implements.push(this.flowParseInterfaceExtends())}while(this.eat(d.comma))}t.body=this.flowParseObjectType({allowStatic:e,allowExact:!1,allowSpread:!1,allowProto:e,allowInexact:!1})}flowParseInterfaceExtends(){const t=this.startNode();return t.id=this.flowParseQualifiedTypeIdentifier(),this.isRelational(\"<\")?t.typeParameters=this.flowParseTypeParameterInstantiation():t.typeParameters=null,this.finishNode(t,\"InterfaceExtends\")}flowParseInterface(t){return this.flowParseInterfaceish(t),this.finishNode(t,\"InterfaceDeclaration\")}checkNotUnderscore(t){\"_\"===t&&this.raise(this.state.start,Bt.UnexpectedReservedUnderscore)}checkReservedType(t,e,s){Ft.has(t)&&this.raise(e,s?Bt.AssignReservedType:Bt.UnexpectedReservedType,t)}flowParseRestrictedIdentifier(t,e){return this.checkReservedType(this.state.value,this.state.start,e),this.parseIdentifier(t)}flowParseTypeAlias(t){return t.id=this.flowParseRestrictedIdentifier(!1,!0),this.scope.declareName(t.id.name,_,t.id.start),this.isRelational(\"<\")?t.typeParameters=this.flowParseTypeParameterDeclaration():t.typeParameters=null,t.right=this.flowParseTypeInitialiser(d.eq),this.semicolon(),this.finishNode(t,\"TypeAlias\")}flowParseOpaqueType(t,e){return this.expectContextual(\"type\"),t.id=this.flowParseRestrictedIdentifier(!0,!0),this.scope.declareName(t.id.name,_,t.id.start),this.isRelational(\"<\")?t.typeParameters=this.flowParseTypeParameterDeclaration():t.typeParameters=null,t.supertype=null,this.match(d.colon)&&(t.supertype=this.flowParseTypeInitialiser(d.colon)),t.impltype=null,e||(t.impltype=this.flowParseTypeInitialiser(d.eq)),this.semicolon(),this.finishNode(t,\"OpaqueType\")}flowParseTypeParameter(t=!1){const e=this.state.start,s=this.startNode(),i=this.flowParseVariance(),r=this.flowParseTypeAnnotatableIdentifier();return s.name=r.name,s.variance=i,s.bound=r.typeAnnotation,this.match(d.eq)?(this.eat(d.eq),s.default=this.flowParseType()):t&&this.raise(e,Bt.MissingTypeParamDefault),this.finishNode(s,\"TypeParameter\")}flowParseTypeParameterDeclaration(){const t=this.state.inType,e=this.startNode();e.params=[],this.state.inType=!0,this.isRelational(\"<\")||this.match(d.jsxTagStart)?this.next():this.unexpected();let s=!1;do{const t=this.flowParseTypeParameter(s);e.params.push(t),t.default&&(s=!0),this.isRelational(\">\")||this.expect(d.comma)}while(!this.isRelational(\">\"));return this.expectRelational(\">\"),this.state.inType=t,this.finishNode(e,\"TypeParameterDeclaration\")}flowParseTypeParameterInstantiation(){const t=this.startNode(),e=this.state.inType;t.params=[],this.state.inType=!0,this.expectRelational(\"<\");const s=this.state.noAnonFunctionType;this.state.noAnonFunctionType=!1;while(!this.isRelational(\">\"))t.params.push(this.flowParseType()),this.isRelational(\">\")||this.expect(d.comma);return this.state.noAnonFunctionType=s,this.expectRelational(\">\"),this.state.inType=e,this.finishNode(t,\"TypeParameterInstantiation\")}flowParseTypeParameterInstantiationCallOrNew(){const t=this.startNode(),e=this.state.inType;t.params=[],this.state.inType=!0,this.expectRelational(\"<\");while(!this.isRelational(\">\"))t.params.push(this.flowParseTypeOrImplicitInstantiation()),this.isRelational(\">\")||this.expect(d.comma);return this.expectRelational(\">\"),this.state.inType=e,this.finishNode(t,\"TypeParameterInstantiation\")}flowParseInterfaceType(){const t=this.startNode();if(this.expectContextual(\"interface\"),t.extends=[],this.eat(d._extends))do{t.extends.push(this.flowParseInterfaceExtends())}while(this.eat(d.comma));return t.body=this.flowParseObjectType({allowStatic:!1,allowExact:!1,allowSpread:!1,allowProto:!1,allowInexact:!1}),this.finishNode(t,\"InterfaceTypeAnnotation\")}flowParseObjectPropertyKey(){return this.match(d.num)||this.match(d.string)?this.parseExprAtom():this.parseIdentifier(!0)}flowParseObjectTypeIndexer(t,e,s){return t.static=e,this.lookahead().type===d.colon?(t.id=this.flowParseObjectPropertyKey(),t.key=this.flowParseTypeInitialiser()):(t.id=null,t.key=this.flowParseType()),this.expect(d.bracketR),t.value=this.flowParseTypeInitialiser(),t.variance=s,this.finishNode(t,\"ObjectTypeIndexer\")}flowParseObjectTypeInternalSlot(t,e){return t.static=e,t.id=this.flowParseObjectPropertyKey(),this.expect(d.bracketR),this.expect(d.bracketR),this.isRelational(\"<\")||this.match(d.parenL)?(t.method=!0,t.optional=!1,t.value=this.flowParseObjectTypeMethodish(this.startNodeAt(t.start,t.loc.start))):(t.method=!1,this.eat(d.question)&&(t.optional=!0),t.value=this.flowParseTypeInitialiser()),this.finishNode(t,\"ObjectTypeInternalSlot\")}flowParseObjectTypeMethodish(t){t.params=[],t.rest=null,t.typeParameters=null,this.isRelational(\"<\")&&(t.typeParameters=this.flowParseTypeParameterDeclaration()),this.expect(d.parenL);while(!this.match(d.parenR)&&!this.match(d.ellipsis))t.params.push(this.flowParseFunctionTypeParam()),this.match(d.parenR)||this.expect(d.comma);return this.eat(d.ellipsis)&&(t.rest=this.flowParseFunctionTypeParam()),this.expect(d.parenR),t.returnType=this.flowParseTypeInitialiser(),this.finishNode(t,\"FunctionTypeAnnotation\")}flowParseObjectTypeCallProperty(t,e){const s=this.startNode();return t.static=e,t.value=this.flowParseObjectTypeMethodish(s),this.finishNode(t,\"ObjectTypeCallProperty\")}flowParseObjectType({allowStatic:t,allowExact:e,allowSpread:s,allowProto:i,allowInexact:r}){const n=this.state.inType;this.state.inType=!0;const a=this.startNode();let o,c;a.callProperties=[],a.properties=[],a.indexers=[],a.internalSlots=[];let h=!1;e&&this.match(d.braceBarL)?(this.expect(d.braceBarL),o=d.braceBarR,c=!0):(this.expect(d.braceL),o=d.braceR,c=!1),a.exact=c;while(!this.match(o)){let e=!1,n=null,o=null;const l=this.startNode();if(i&&this.isContextual(\"proto\")){const e=this.lookahead();e.type!==d.colon&&e.type!==d.question&&(this.next(),n=this.state.start,t=!1)}if(t&&this.isContextual(\"static\")){const t=this.lookahead();t.type!==d.colon&&t.type!==d.question&&(this.next(),e=!0)}const p=this.flowParseVariance();if(this.eat(d.bracketL))null!=n&&this.unexpected(n),this.eat(d.bracketL)?(p&&this.unexpected(p.start),a.internalSlots.push(this.flowParseObjectTypeInternalSlot(l,e))):a.indexers.push(this.flowParseObjectTypeIndexer(l,e,p));else if(this.match(d.parenL)||this.isRelational(\"<\"))null!=n&&this.unexpected(n),p&&this.unexpected(p.start),a.callProperties.push(this.flowParseObjectTypeCallProperty(l,e));else{let t=\"init\";if(this.isContextual(\"get\")||this.isContextual(\"set\")){const e=this.lookahead();e.type!==d.name&&e.type!==d.string&&e.type!==d.num||(t=this.state.value,this.next())}const i=this.flowParseObjectTypeProperty(l,e,n,p,t,s,null!=r?r:!c);null===i?(h=!0,o=this.state.lastTokStart):a.properties.push(i)}this.flowObjectTypeSemicolon(),!o||this.match(d.braceR)||this.match(d.braceBarR)||this.raise(o,Bt.UnexpectedExplicitInexactInObject)}this.expect(o),s&&(a.inexact=h);const l=this.finishNode(a,\"ObjectTypeAnnotation\");return this.state.inType=n,l}flowParseObjectTypeProperty(t,e,s,i,r,n,a){if(this.eat(d.ellipsis)){const e=this.match(d.comma)||this.match(d.semi)||this.match(d.braceR)||this.match(d.braceBarR);return e?(n?a||this.raise(this.state.lastTokStart,Bt.InexactInsideExact):this.raise(this.state.lastTokStart,Bt.InexactInsideNonObject),i&&this.raise(i.start,Bt.InexactVariance),null):(n||this.raise(this.state.lastTokStart,Bt.UnexpectedSpreadType),null!=s&&this.unexpected(s),i&&this.raise(i.start,Bt.SpreadVariance),t.argument=this.flowParseType(),this.finishNode(t,\"ObjectTypeSpreadProperty\"))}{t.key=this.flowParseObjectPropertyKey(),t.static=e,t.proto=null!=s,t.kind=r;let n=!1;return this.isRelational(\"<\")||this.match(d.parenL)?(t.method=!0,null!=s&&this.unexpected(s),i&&this.unexpected(i.start),t.value=this.flowParseObjectTypeMethodish(this.startNodeAt(t.start,t.loc.start)),\"get\"!==r&&\"set\"!==r||this.flowCheckGetterSetterParams(t)):(\"init\"!==r&&this.unexpected(),t.method=!1,this.eat(d.question)&&(n=!0),t.value=this.flowParseTypeInitialiser(),t.variance=i),t.optional=n,this.finishNode(t,\"ObjectTypeProperty\")}}flowCheckGetterSetterParams(t){const e=\"get\"===t.kind?0:1,s=t.start,i=t.value.params.length+(t.value.rest?1:0);i!==e&&(\"get\"===t.kind?this.raise(s,ut.BadGetterArity):this.raise(s,ut.BadSetterArity)),\"set\"===t.kind&&t.value.rest&&this.raise(s,ut.BadSetterRestParameter)}flowObjectTypeSemicolon(){this.eat(d.semi)||this.eat(d.comma)||this.match(d.braceR)||this.match(d.braceBarR)||this.unexpected()}flowParseQualifiedTypeIdentifier(t,e,s){t=t||this.state.start,e=e||this.state.startLoc;let i=s||this.flowParseRestrictedIdentifier(!0);while(this.eat(d.dot)){const s=this.startNodeAt(t,e);s.qualification=i,s.id=this.flowParseRestrictedIdentifier(!0),i=this.finishNode(s,\"QualifiedTypeIdentifier\")}return i}flowParseGenericType(t,e,s){const i=this.startNodeAt(t,e);return i.typeParameters=null,i.id=this.flowParseQualifiedTypeIdentifier(t,e,s),this.isRelational(\"<\")&&(i.typeParameters=this.flowParseTypeParameterInstantiation()),this.finishNode(i,\"GenericTypeAnnotation\")}flowParseTypeofType(){const t=this.startNode();return this.expect(d._typeof),t.argument=this.flowParsePrimaryType(),this.finishNode(t,\"TypeofTypeAnnotation\")}flowParseTupleType(){const t=this.startNode();t.types=[],this.expect(d.bracketL);while(this.state.pos<this.length&&!this.match(d.bracketR)){if(t.types.push(this.flowParseType()),this.match(d.bracketR))break;this.expect(d.comma)}return this.expect(d.bracketR),this.finishNode(t,\"TupleTypeAnnotation\")}flowParseFunctionTypeParam(){let t=null,e=!1,s=null;const i=this.startNode(),r=this.lookahead();return r.type===d.colon||r.type===d.question?(t=this.parseIdentifier(),this.eat(d.question)&&(e=!0),s=this.flowParseTypeInitialiser()):s=this.flowParseType(),i.name=t,i.optional=e,i.typeAnnotation=s,this.finishNode(i,\"FunctionTypeParam\")}reinterpretTypeAsFunctionTypeParam(t){const e=this.startNodeAt(t.start,t.loc.start);return e.name=null,e.optional=!1,e.typeAnnotation=t,this.finishNode(e,\"FunctionTypeParam\")}flowParseFunctionTypeParams(t=[]){let e=null;while(!this.match(d.parenR)&&!this.match(d.ellipsis))t.push(this.flowParseFunctionTypeParam()),this.match(d.parenR)||this.expect(d.comma);return this.eat(d.ellipsis)&&(e=this.flowParseFunctionTypeParam()),{params:t,rest:e}}flowIdentToTypeAnnotation(t,e,s,i){switch(i.name){case\"any\":return this.finishNode(s,\"AnyTypeAnnotation\");case\"bool\":case\"boolean\":return this.finishNode(s,\"BooleanTypeAnnotation\");case\"mixed\":return this.finishNode(s,\"MixedTypeAnnotation\");case\"empty\":return this.finishNode(s,\"EmptyTypeAnnotation\");case\"number\":return this.finishNode(s,\"NumberTypeAnnotation\");case\"string\":return this.finishNode(s,\"StringTypeAnnotation\");case\"symbol\":return this.finishNode(s,\"SymbolTypeAnnotation\");default:return this.checkNotUnderscore(i.name),this.flowParseGenericType(t,e,i)}}flowParsePrimaryType(){const t=this.state.start,e=this.state.startLoc,s=this.startNode();let i,r,n=!1;const a=this.state.noAnonFunctionType;switch(this.state.type){case d.name:return this.isContextual(\"interface\")?this.flowParseInterfaceType():this.flowIdentToTypeAnnotation(t,e,s,this.parseIdentifier());case d.braceL:return this.flowParseObjectType({allowStatic:!1,allowExact:!1,allowSpread:!0,allowProto:!1,allowInexact:!0});case d.braceBarL:return this.flowParseObjectType({allowStatic:!1,allowExact:!0,allowSpread:!0,allowProto:!1,allowInexact:!1});case d.bracketL:return this.state.noAnonFunctionType=!1,r=this.flowParseTupleType(),this.state.noAnonFunctionType=a,r;case d.relational:if(\"<\"===this.state.value)return s.typeParameters=this.flowParseTypeParameterDeclaration(),this.expect(d.parenL),i=this.flowParseFunctionTypeParams(),s.params=i.params,s.rest=i.rest,this.expect(d.parenR),this.expect(d.arrow),s.returnType=this.flowParseType(),this.finishNode(s,\"FunctionTypeAnnotation\");break;case d.parenL:if(this.next(),!this.match(d.parenR)&&!this.match(d.ellipsis))if(this.match(d.name)){const t=this.lookahead().type;n=t!==d.question&&t!==d.colon}else n=!0;if(n){if(this.state.noAnonFunctionType=!1,r=this.flowParseType(),this.state.noAnonFunctionType=a,this.state.noAnonFunctionType||!(this.match(d.comma)||this.match(d.parenR)&&this.lookahead().type===d.arrow))return this.expect(d.parenR),r;this.eat(d.comma)}return i=r?this.flowParseFunctionTypeParams([this.reinterpretTypeAsFunctionTypeParam(r)]):this.flowParseFunctionTypeParams(),s.params=i.params,s.rest=i.rest,this.expect(d.parenR),this.expect(d.arrow),s.returnType=this.flowParseType(),s.typeParameters=null,this.finishNode(s,\"FunctionTypeAnnotation\");case d.string:return this.parseLiteral(this.state.value,\"StringLiteralTypeAnnotation\");case d._true:case d._false:return s.value=this.match(d._true),this.next(),this.finishNode(s,\"BooleanLiteralTypeAnnotation\");case d.plusMin:if(\"-\"===this.state.value){if(this.next(),this.match(d.num))return this.parseLiteral(-this.state.value,\"NumberLiteralTypeAnnotation\",s.start,s.loc.start);if(this.match(d.bigint))return this.parseLiteral(-this.state.value,\"BigIntLiteralTypeAnnotation\",s.start,s.loc.start);throw this.raise(this.state.start,Bt.UnexpectedSubtractionOperand)}throw this.unexpected();case d.num:return this.parseLiteral(this.state.value,\"NumberLiteralTypeAnnotation\");case d.bigint:return this.parseLiteral(this.state.value,\"BigIntLiteralTypeAnnotation\");case d._void:return this.next(),this.finishNode(s,\"VoidTypeAnnotation\");case d._null:return this.next(),this.finishNode(s,\"NullLiteralTypeAnnotation\");case d._this:return this.next(),this.finishNode(s,\"ThisTypeAnnotation\");case d.star:return this.next(),this.finishNode(s,\"ExistsTypeAnnotation\");default:if(\"typeof\"===this.state.type.keyword)return this.flowParseTypeofType();if(this.state.type.keyword){const t=this.state.type.label;return this.next(),super.createIdentifier(s,t)}}throw this.unexpected()}flowParsePostfixType(){const t=this.state.start,e=this.state.startLoc;let s=this.flowParsePrimaryType();while(this.match(d.bracketL)&&!this.canInsertSemicolon()){const i=this.startNodeAt(t,e);i.elementType=s,this.expect(d.bracketL),this.expect(d.bracketR),s=this.finishNode(i,\"ArrayTypeAnnotation\")}return s}flowParsePrefixType(){const t=this.startNode();return this.eat(d.question)?(t.typeAnnotation=this.flowParsePrefixType(),this.finishNode(t,\"NullableTypeAnnotation\")):this.flowParsePostfixType()}flowParseAnonFunctionWithoutParens(){const t=this.flowParsePrefixType();if(!this.state.noAnonFunctionType&&this.eat(d.arrow)){const e=this.startNodeAt(t.start,t.loc.start);return e.params=[this.reinterpretTypeAsFunctionTypeParam(t)],e.rest=null,e.returnType=this.flowParseType(),e.typeParameters=null,this.finishNode(e,\"FunctionTypeAnnotation\")}return t}flowParseIntersectionType(){const t=this.startNode();this.eat(d.bitwiseAND);const e=this.flowParseAnonFunctionWithoutParens();t.types=[e];while(this.eat(d.bitwiseAND))t.types.push(this.flowParseAnonFunctionWithoutParens());return 1===t.types.length?e:this.finishNode(t,\"IntersectionTypeAnnotation\")}flowParseUnionType(){const t=this.startNode();this.eat(d.bitwiseOR);const e=this.flowParseIntersectionType();t.types=[e];while(this.eat(d.bitwiseOR))t.types.push(this.flowParseIntersectionType());return 1===t.types.length?e:this.finishNode(t,\"UnionTypeAnnotation\")}flowParseType(){const t=this.state.inType;this.state.inType=!0;const e=this.flowParseUnionType();return this.state.inType=t,this.state.exprAllowed=this.state.exprAllowed||this.state.noAnonFunctionType,e}flowParseTypeOrImplicitInstantiation(){if(this.state.type===d.name&&\"_\"===this.state.value){const t=this.state.start,e=this.state.startLoc,s=this.parseIdentifier();return this.flowParseGenericType(t,e,s)}return this.flowParseType()}flowParseTypeAnnotation(){const t=this.startNode();return t.typeAnnotation=this.flowParseTypeInitialiser(),this.finishNode(t,\"TypeAnnotation\")}flowParseTypeAnnotatableIdentifier(t){const e=t?this.parseIdentifier():this.flowParseRestrictedIdentifier();return this.match(d.colon)&&(e.typeAnnotation=this.flowParseTypeAnnotation(),this.resetEndLocation(e)),e}typeCastToParameter(t){return t.expression.typeAnnotation=t.typeAnnotation,this.resetEndLocation(t.expression,t.typeAnnotation.end,t.typeAnnotation.loc.end),t.expression}flowParseVariance(){let t=null;return this.match(d.plusMin)&&(t=this.startNode(),\"+\"===this.state.value?t.kind=\"plus\":t.kind=\"minus\",this.next(),this.finishNode(t,\"Variance\")),t}parseFunctionBody(t,e,s=!1){return e?this.forwardNoArrowParamsConversionAt(t,()=>super.parseFunctionBody(t,!0,s)):super.parseFunctionBody(t,!1,s)}parseFunctionBodyAndFinish(t,e,s=!1){if(this.match(d.colon)){const e=this.startNode();[e.typeAnnotation,t.predicate]=this.flowParseTypeAndPredicateInitialiser(),t.returnType=e.typeAnnotation?this.finishNode(e,\"TypeAnnotation\"):null}super.parseFunctionBodyAndFinish(t,e,s)}parseStatement(t,e){if(this.state.strict&&this.match(d.name)&&\"interface\"===this.state.value){const t=this.startNode();return this.next(),this.flowParseInterface(t)}if(this.shouldParseEnums()&&this.isContextual(\"enum\")){const t=this.startNode();return this.next(),this.flowParseEnumDeclaration(t)}{const s=super.parseStatement(t,e);return void 0!==this.flowPragma||this.isValidDirective(s)||(this.flowPragma=null),s}}parseExpressionStatement(t,e){if(\"Identifier\"===e.type)if(\"declare\"===e.name){if(this.match(d._class)||this.match(d.name)||this.match(d._function)||this.match(d._var)||this.match(d._export))return this.flowParseDeclare(t)}else if(this.match(d.name)){if(\"interface\"===e.name)return this.flowParseInterface(t);if(\"type\"===e.name)return this.flowParseTypeAlias(t);if(\"opaque\"===e.name)return this.flowParseOpaqueType(t,!1)}return super.parseExpressionStatement(t,e)}shouldParseExportDeclaration(){return this.isContextual(\"type\")||this.isContextual(\"interface\")||this.isContextual(\"opaque\")||this.shouldParseEnums()&&this.isContextual(\"enum\")||super.shouldParseExportDeclaration()}isExportDefaultSpecifier(){return(!this.match(d.name)||!(\"type\"===this.state.value||\"interface\"===this.state.value||\"opaque\"===this.state.value||this.shouldParseEnums()&&\"enum\"===this.state.value))&&super.isExportDefaultSpecifier()}parseExportDefaultExpression(){if(this.shouldParseEnums()&&this.isContextual(\"enum\")){const t=this.startNode();return this.next(),this.flowParseEnumDeclaration(t)}return super.parseExportDefaultExpression()}parseConditional(t,e,s,i,r){if(!this.match(d.question))return t;if(r){const n=this.tryParse(()=>super.parseConditional(t,e,s,i));return n.node?(n.error&&(this.state=n.failState),n.node):(r.start=n.error.pos||this.state.start,t)}this.expect(d.question);const n=this.state.clone(),a=this.state.noArrowAt,o=this.startNodeAt(s,i);let{consequent:c,failed:h}=this.tryParseConditionalConsequent(),[l,p]=this.getArrowLikeExpressions(c);if(h||p.length>0){const t=[...a];if(p.length>0){this.state=n,this.state.noArrowAt=t;for(let e=0;e<p.length;e++)t.push(p[e].start);({consequent:c,failed:h}=this.tryParseConditionalConsequent()),[l,p]=this.getArrowLikeExpressions(c)}h&&l.length>1&&this.raise(n.start,Bt.AmbiguousConditionalArrow),h&&1===l.length&&(this.state=n,this.state.noArrowAt=t.concat(l[0].start),({consequent:c,failed:h}=this.tryParseConditionalConsequent()))}return this.getArrowLikeExpressions(c,!0),this.state.noArrowAt=a,this.expect(d.colon),o.test=t,o.consequent=c,o.alternate=this.forwardNoArrowParamsConversionAt(o,()=>this.parseMaybeAssign(e,void 0,void 0,void 0)),this.finishNode(o,\"ConditionalExpression\")}tryParseConditionalConsequent(){this.state.noArrowParamsConversionAt.push(this.state.start);const t=this.parseMaybeAssign(),e=!this.match(d.colon);return this.state.noArrowParamsConversionAt.pop(),{consequent:t,failed:e}}getArrowLikeExpressions(t,e){const s=[t],i=[];while(0!==s.length){const t=s.pop();\"ArrowFunctionExpression\"===t.type?(t.typeParameters||!t.returnType?this.finishArrowValidation(t):i.push(t),s.push(t.body)):\"ConditionalExpression\"===t.type&&(s.push(t.consequent),s.push(t.alternate))}return e?(i.forEach(t=>this.finishArrowValidation(t)),[i,[]]):zt(i,t=>t.params.every(t=>this.isAssignable(t,!0)))}finishArrowValidation(t){var e;this.toAssignableList(t.params,null==(e=t.extra)?void 0:e.trailingComma),this.scope.enter(y|g),super.checkParams(t,!1,!0),this.scope.exit()}forwardNoArrowParamsConversionAt(t,e){let s;return-1!==this.state.noArrowParamsConversionAt.indexOf(t.start)?(this.state.noArrowParamsConversionAt.push(this.state.start),s=e(),this.state.noArrowParamsConversionAt.pop()):s=e(),s}parseParenItem(t,e,s){if(t=super.parseParenItem(t,e,s),this.eat(d.question)&&(t.optional=!0,this.resetEndLocation(t)),this.match(d.colon)){const i=this.startNodeAt(e,s);return i.expression=t,i.typeAnnotation=this.flowParseTypeAnnotation(),this.finishNode(i,\"TypeCastExpression\")}return t}assertModuleNodeAllowed(t){\"ImportDeclaration\"===t.type&&(\"type\"===t.importKind||\"typeof\"===t.importKind)||\"ExportNamedDeclaration\"===t.type&&\"type\"===t.exportKind||\"ExportAllDeclaration\"===t.type&&\"type\"===t.exportKind||super.assertModuleNodeAllowed(t)}parseExport(t){const e=super.parseExport(t);return\"ExportNamedDeclaration\"!==e.type&&\"ExportAllDeclaration\"!==e.type||(e.exportKind=e.exportKind||\"value\"),e}parseExportDeclaration(t){if(this.isContextual(\"type\")){t.exportKind=\"type\";const e=this.startNode();return this.next(),this.match(d.braceL)?(t.specifiers=this.parseExportSpecifiers(),this.parseExportFrom(t),null):this.flowParseTypeAlias(e)}if(this.isContextual(\"opaque\")){t.exportKind=\"type\";const e=this.startNode();return this.next(),this.flowParseOpaqueType(e,!1)}if(this.isContextual(\"interface\")){t.exportKind=\"type\";const e=this.startNode();return this.next(),this.flowParseInterface(e)}if(this.shouldParseEnums()&&this.isContextual(\"enum\")){t.exportKind=\"value\";const e=this.startNode();return this.next(),this.flowParseEnumDeclaration(e)}return super.parseExportDeclaration(t)}eatExportStar(t){return!!super.eatExportStar(...arguments)||!(!this.isContextual(\"type\")||this.lookahead().type!==d.star)&&(t.exportKind=\"type\",this.next(),this.next(),!0)}maybeParseExportNamespaceSpecifier(t){const e=this.state.start,s=super.maybeParseExportNamespaceSpecifier(t);return s&&\"type\"===t.exportKind&&this.unexpected(e),s}parseClassId(t,e,s){super.parseClassId(t,e,s),this.isRelational(\"<\")&&(t.typeParameters=this.flowParseTypeParameterDeclaration())}parseClassMember(t,e,s,i){const r=this.state.start;if(this.isContextual(\"declare\")){if(this.parseClassMemberFromModifier(t,e))return;e.declare=!0}super.parseClassMember(t,e,s,i),e.declare&&(\"ClassProperty\"!==e.type&&\"ClassPrivateProperty\"!==e.type?this.raise(r,Bt.DeclareClassElement):e.value&&this.raise(e.value.start,Bt.DeclareClassFieldInitializer))}getTokenFromCode(t){const e=this.input.charCodeAt(this.state.pos+1);return 123===t&&124===e?this.finishOp(d.braceBarL,2):!this.state.inType||62!==t&&60!==t?jt(t,e)?(this.state.isIterator=!0,super.readWord()):super.getTokenFromCode(t):this.finishOp(d.relational,1)}isAssignable(t,e){switch(t.type){case\"Identifier\":case\"ObjectPattern\":case\"ArrayPattern\":case\"AssignmentPattern\":return!0;case\"ObjectExpression\":{const e=t.properties.length-1;return t.properties.every((t,s)=>\"ObjectMethod\"!==t.type&&(s===e||\"SpreadElement\"===t.type)&&this.isAssignable(t))}case\"ObjectProperty\":return this.isAssignable(t.value);case\"SpreadElement\":return this.isAssignable(t.argument);case\"ArrayExpression\":return t.elements.every(t=>this.isAssignable(t));case\"AssignmentExpression\":return\"=\"===t.operator;case\"ParenthesizedExpression\":case\"TypeCastExpression\":return this.isAssignable(t.expression);case\"MemberExpression\":case\"OptionalMemberExpression\":return!e;default:return!1}}toAssignable(t){return\"TypeCastExpression\"===t.type?super.toAssignable(this.typeCastToParameter(t)):super.toAssignable(t)}toAssignableList(t,e){for(let s=0;s<t.length;s++){const e=t[s];\"TypeCastExpression\"===(null==e?void 0:e.type)&&(t[s]=this.typeCastToParameter(e))}return super.toAssignableList(t,e)}toReferencedList(t,e){for(let i=0;i<t.length;i++){var s;const r=t[i];r&&\"TypeCastExpression\"===r.type&&!(null==(s=r.extra)?void 0:s.parenthesized)&&(t.length>1||!e)&&this.raise(r.typeAnnotation.start,Bt.TypeCastInPattern)}return t}checkLVal(t,e=V,s,i){if(\"TypeCastExpression\"!==t.type)return super.checkLVal(t,e,s,i)}parseClassProperty(t){return this.match(d.colon)&&(t.typeAnnotation=this.flowParseTypeAnnotation()),super.parseClassProperty(t)}parseClassPrivateProperty(t){return this.match(d.colon)&&(t.typeAnnotation=this.flowParseTypeAnnotation()),super.parseClassPrivateProperty(t)}isClassMethod(){return this.isRelational(\"<\")||super.isClassMethod()}isClassProperty(){return this.match(d.colon)||super.isClassProperty()}isNonstaticConstructor(t){return!this.match(d.colon)&&super.isNonstaticConstructor(t)}pushClassMethod(t,e,s,i,r,n){e.variance&&this.unexpected(e.variance.start),delete e.variance,this.isRelational(\"<\")&&(e.typeParameters=this.flowParseTypeParameterDeclaration()),super.pushClassMethod(t,e,s,i,r,n)}pushClassPrivateMethod(t,e,s,i){e.variance&&this.unexpected(e.variance.start),delete e.variance,this.isRelational(\"<\")&&(e.typeParameters=this.flowParseTypeParameterDeclaration()),super.pushClassPrivateMethod(t,e,s,i)}parseClassSuper(t){if(super.parseClassSuper(t),t.superClass&&this.isRelational(\"<\")&&(t.superTypeParameters=this.flowParseTypeParameterInstantiation()),this.isContextual(\"implements\")){this.next();const e=t.implements=[];do{const t=this.startNode();t.id=this.flowParseRestrictedIdentifier(!0),this.isRelational(\"<\")?t.typeParameters=this.flowParseTypeParameterInstantiation():t.typeParameters=null,e.push(this.finishNode(t,\"ClassImplements\"))}while(this.eat(d.comma))}}parsePropertyName(t,e){const s=this.flowParseVariance(),i=super.parsePropertyName(t,e);return t.variance=s,i}parseObjPropValue(t,e,s,i,r,n,a,o){let c;t.variance&&this.unexpected(t.variance.start),delete t.variance,this.isRelational(\"<\")&&(c=this.flowParseTypeParameterDeclaration(),this.match(d.parenL)||this.unexpected()),super.parseObjPropValue(t,e,s,i,r,n,a,o),c&&((t.value||t).typeParameters=c)}parseAssignableListItemTypes(t){return this.eat(d.question)&&(\"Identifier\"!==t.type&&this.raise(t.start,Bt.OptionalBindingPattern),t.optional=!0),this.match(d.colon)&&(t.typeAnnotation=this.flowParseTypeAnnotation()),this.resetEndLocation(t),t}parseMaybeDefault(t,e,s){const i=super.parseMaybeDefault(t,e,s);return\"AssignmentPattern\"===i.type&&i.typeAnnotation&&i.right.start<i.typeAnnotation.start&&this.raise(i.typeAnnotation.start,Bt.TypeBeforeInitializer),i}shouldParseDefaultImport(t){return qt(t)?Vt(this.state):super.shouldParseDefaultImport(t)}parseImportSpecifierLocal(t,e,s,i){e.local=qt(t)?this.flowParseRestrictedIdentifier(!0,!0):this.parseIdentifier(),this.checkLVal(e.local,_,void 0,i),t.specifiers.push(this.finishNode(e,s))}maybeParseDefaultImportSpecifier(t){t.importKind=\"value\";let e=null;if(this.match(d._typeof)?e=\"typeof\":this.isContextual(\"type\")&&(e=\"type\"),e){const s=this.lookahead();\"type\"===e&&s.type===d.star&&this.unexpected(s.start),(Vt(s)||s.type===d.braceL||s.type===d.star)&&(this.next(),t.importKind=e)}return super.maybeParseDefaultImportSpecifier(t)}parseImportSpecifier(t){const e=this.startNode(),s=this.state.start,i=this.parseIdentifier(!0);let r=null;\"type\"===i.name?r=\"type\":\"typeof\"===i.name&&(r=\"typeof\");let n=!1;if(this.isContextual(\"as\")&&!this.isLookaheadContextual(\"as\")){const t=this.parseIdentifier(!0);null===r||this.match(d.name)||this.state.type.keyword?(e.imported=i,e.importKind=null,e.local=this.parseIdentifier()):(e.imported=t,e.importKind=r,e.local=t.__clone())}else null!==r&&(this.match(d.name)||this.state.type.keyword)?(e.imported=this.parseIdentifier(!0),e.importKind=r,this.eatContextual(\"as\")?e.local=this.parseIdentifier():(n=!0,e.local=e.imported.__clone())):(n=!0,e.imported=i,e.importKind=null,e.local=e.imported.__clone());const a=qt(t),o=qt(e);a&&o&&this.raise(s,Bt.ImportTypeShorthandOnlyInPureImport),(a||o)&&this.checkReservedType(e.local.name,e.local.start,!0),!n||a||o||this.checkReservedWord(e.local.name,e.start,!0,!0),this.checkLVal(e.local,_,void 0,\"import specifier\"),t.specifiers.push(this.finishNode(e,\"ImportSpecifier\"))}parseFunctionParams(t,e){const s=t.kind;\"get\"!==s&&\"set\"!==s&&this.isRelational(\"<\")&&(t.typeParameters=this.flowParseTypeParameterDeclaration()),super.parseFunctionParams(t,e)}parseVarId(t,e){super.parseVarId(t,e),this.match(d.colon)&&(t.id.typeAnnotation=this.flowParseTypeAnnotation(),this.resetEndLocation(t.id))}parseAsyncArrowFromCallExpression(t,e){if(this.match(d.colon)){const e=this.state.noAnonFunctionType;this.state.noAnonFunctionType=!0,t.returnType=this.flowParseTypeAnnotation(),this.state.noAnonFunctionType=e}return super.parseAsyncArrowFromCallExpression(t,e)}shouldParseAsyncArrow(){return this.match(d.colon)||super.shouldParseAsyncArrow()}parseMaybeAssign(t,e,s,i){var r;let n,a=null;if(this.hasPlugin(\"jsx\")&&(this.match(d.jsxTagStart)||this.isRelational(\"<\"))){if(a=this.state.clone(),n=this.tryParse(()=>super.parseMaybeAssign(t,e,s,i),a),!n.error)return n.node;const{context:r}=this.state;r[r.length-1]===gt.j_oTag?r.length-=2:r[r.length-1]===gt.j_expr&&(r.length-=1)}if((null==(r=n)?void 0:r.error)||this.isRelational(\"<\")){var o,c,h;let r;a=a||this.state.clone();const l=this.tryParse(()=>{r=this.flowParseTypeParameterDeclaration();const n=this.forwardNoArrowParamsConversionAt(r,()=>super.parseMaybeAssign(t,e,s,i));return n.typeParameters=r,this.resetStartLocationFromNode(n,r),n},a),p=\"ArrowFunctionExpression\"===(null==(o=l.node)?void 0:o.type)?l.node:null;if(!l.error&&p)return p;if(null==(c=n)?void 0:c.node)return this.state=n.failState,n.node;if(p)return this.state=l.failState,p;if(null==(h=n)?void 0:h.thrown)throw n.error;if(l.thrown)throw l.error;throw this.raise(r.start,Bt.UnexpectedTokenAfterTypeParameter)}return super.parseMaybeAssign(t,e,s,i)}parseArrow(t){if(this.match(d.colon)){const e=this.tryParse(()=>{const e=this.state.noAnonFunctionType;this.state.noAnonFunctionType=!0;const s=this.startNode();return[s.typeAnnotation,t.predicate]=this.flowParseTypeAndPredicateInitialiser(),this.state.noAnonFunctionType=e,this.canInsertSemicolon()&&this.unexpected(),this.match(d.arrow)||this.unexpected(),s});if(e.thrown)return null;e.error&&(this.state=e.failState),t.returnType=e.node.typeAnnotation?this.finishNode(e.node,\"TypeAnnotation\"):null}return super.parseArrow(t)}shouldParseArrow(){return this.match(d.colon)||super.shouldParseArrow()}setArrowFunctionParameters(t,e){-1!==this.state.noArrowParamsConversionAt.indexOf(t.start)?t.params=e:super.setArrowFunctionParameters(t,e)}checkParams(t,e,s){if(!s||-1===this.state.noArrowParamsConversionAt.indexOf(t.start))return super.checkParams(...arguments)}parseParenAndDistinguishExpression(t){return super.parseParenAndDistinguishExpression(t&&-1===this.state.noArrowAt.indexOf(this.state.start))}parseSubscripts(t,e,s,i){if(\"Identifier\"===t.type&&\"async\"===t.name&&-1!==this.state.noArrowAt.indexOf(e)){this.next();const i=this.startNodeAt(e,s);i.callee=t,i.arguments=this.parseCallExpressionArguments(d.parenR,!1),t=this.finishNode(i,\"CallExpression\")}else if(\"Identifier\"===t.type&&\"async\"===t.name&&this.isRelational(\"<\")){const r=this.state.clone(),n=this.tryParse(t=>this.parseAsyncArrowWithTypeParameters(e,s)||t(),r);if(!n.error&&!n.aborted)return n.node;const a=this.tryParse(()=>super.parseSubscripts(t,e,s,i),r);if(a.node&&!a.error)return a.node;if(n.node)return this.state=n.failState,n.node;if(a.node)return this.state=a.failState,a.node;throw n.error||a.error}return super.parseSubscripts(t,e,s,i)}parseSubscript(t,e,s,i,r){if(this.match(d.questionDot)&&this.isLookaheadRelational(\"<\")){if(r.optionalChainMember=!0,i)return r.stop=!0,t;this.next();const n=this.startNodeAt(e,s);return n.callee=t,n.typeArguments=this.flowParseTypeParameterInstantiation(),this.expect(d.parenL),n.arguments=this.parseCallExpressionArguments(d.parenR,!1),n.optional=!0,this.finishCallExpression(n,!0)}if(!i&&this.shouldParseTypes()&&this.isRelational(\"<\")){const i=this.startNodeAt(e,s);i.callee=t;const n=this.tryParse(()=>(i.typeArguments=this.flowParseTypeParameterInstantiationCallOrNew(),this.expect(d.parenL),i.arguments=this.parseCallExpressionArguments(d.parenR,!1),r.optionalChainMember&&(i.optional=!1),this.finishCallExpression(i,r.optionalChainMember)));if(n.node)return n.error&&(this.state=n.failState),n.node}return super.parseSubscript(t,e,s,i,r)}parseNewArguments(t){let e=null;this.shouldParseTypes()&&this.isRelational(\"<\")&&(e=this.tryParse(()=>this.flowParseTypeParameterInstantiationCallOrNew()).node),t.typeArguments=e,super.parseNewArguments(t)}parseAsyncArrowWithTypeParameters(t,e){const s=this.startNodeAt(t,e);if(this.parseFunctionParams(s),this.parseArrow(s))return this.parseArrowExpression(s,void 0,!0)}readToken_mult_modulo(t){const e=this.input.charCodeAt(this.state.pos+1);if(42===t&&47===e&&this.state.hasFlowComment)return this.state.hasFlowComment=!1,this.state.pos+=2,void this.nextToken();super.readToken_mult_modulo(t)}readToken_pipe_amp(t){const e=this.input.charCodeAt(this.state.pos+1);124!==t||125!==e?super.readToken_pipe_amp(t):this.finishOp(d.braceBarR,2)}parseTopLevel(t,e){const s=super.parseTopLevel(t,e);return this.state.hasFlowComment&&this.raise(this.state.pos,Bt.UnterminatedFlowComment),s}skipBlockComment(){if(this.hasPlugin(\"flowComments\")&&this.skipFlowComment())return this.state.hasFlowComment&&this.unexpected(null,Bt.NestedFlowComment),this.hasFlowCommentCompletion(),this.state.pos+=this.skipFlowComment(),void(this.state.hasFlowComment=!0);if(this.state.hasFlowComment){const t=this.input.indexOf(\"*-/\",this.state.pos+=2);if(-1===t)throw this.raise(this.state.pos-2,ut.UnterminatedComment);this.state.pos=t+3}else super.skipBlockComment()}skipFlowComment(){const{pos:t}=this.state;let e=2;while([32,9].includes(this.input.charCodeAt(t+e)))e++;const s=this.input.charCodeAt(e+t),i=this.input.charCodeAt(e+t+1);return 58===s&&58===i?e+2:\"flow-include\"===this.input.slice(e+t,e+t+12)?e+12:58===s&&58!==i&&e}hasFlowCommentCompletion(){const t=this.input.indexOf(\"*/\",this.state.pos);if(-1===t)throw this.raise(this.state.pos,ut.UnterminatedComment)}flowEnumErrorBooleanMemberNotInitialized(t,{enumName:e,memberName:s}){this.raise(t,Bt.EnumBooleanMemberNotInitialized,s,e)}flowEnumErrorInvalidMemberName(t,{enumName:e,memberName:s}){const i=s[0].toUpperCase()+s.slice(1);this.raise(t,Bt.EnumInvalidMemberName,s,i,e)}flowEnumErrorDuplicateMemberName(t,{enumName:e,memberName:s}){this.raise(t,Bt.EnumDuplicateMemberName,s,e)}flowEnumErrorInconsistentMemberValues(t,{enumName:e}){this.raise(t,Bt.EnumInconsistentMemberValues,e)}flowEnumErrorInvalidExplicitType(t,{enumName:e,suppliedType:s}){return this.raise(t,null===s?Bt.EnumInvalidExplicitTypeUnknownSupplied:Bt.EnumInvalidExplicitType,e,s)}flowEnumErrorInvalidMemberInitializer(t,{enumName:e,explicitType:s,memberName:i}){let r=null;switch(s){case\"boolean\":case\"number\":case\"string\":r=Bt.EnumInvalidMemberInitializerPrimaryType;break;case\"symbol\":r=Bt.EnumInvalidMemberInitializerSymbolType;break;default:r=Bt.EnumInvalidMemberInitializerUnknownType}return this.raise(t,r,e,i,s)}flowEnumErrorNumberMemberNotInitialized(t,{enumName:e,memberName:s}){this.raise(t,Bt.EnumNumberMemberNotInitialized,e,s)}flowEnumErrorStringMemberInconsistentlyInitailized(t,{enumName:e}){this.raise(t,Bt.EnumStringMemberInconsistentlyInitailized,e)}flowEnumMemberInit(){const t=this.state.start,e=()=>this.match(d.comma)||this.match(d.braceR);switch(this.state.type){case d.num:{const s=this.parseLiteral(this.state.value,\"NumericLiteral\");return e()?{type:\"number\",pos:s.start,value:s}:{type:\"invalid\",pos:t}}case d.string:{const s=this.parseLiteral(this.state.value,\"StringLiteral\");return e()?{type:\"string\",pos:s.start,value:s}:{type:\"invalid\",pos:t}}case d._true:case d._false:{const s=this.parseBooleanLiteral();return e()?{type:\"boolean\",pos:s.start,value:s}:{type:\"invalid\",pos:t}}default:return{type:\"invalid\",pos:t}}}flowEnumMemberRaw(){const t=this.state.start,e=this.parseIdentifier(!0),s=this.eat(d.eq)?this.flowEnumMemberInit():{type:\"none\",pos:t};return{id:e,init:s}}flowEnumCheckExplicitTypeMismatch(t,e,s){const{explicitType:i}=e;null!==i&&i!==s&&this.flowEnumErrorInvalidMemberInitializer(t,e)}flowEnumMembers({enumName:t,explicitType:e}){const s=new Set,i={booleanMembers:[],numberMembers:[],stringMembers:[],defaultedMembers:[]};while(!this.match(d.braceR)){const r=this.startNode(),{id:n,init:a}=this.flowEnumMemberRaw(),o=n.name;if(\"\"===o)continue;/^[a-z]/.test(o)&&this.flowEnumErrorInvalidMemberName(n.start,{enumName:t,memberName:o}),s.has(o)&&this.flowEnumErrorDuplicateMemberName(n.start,{enumName:t,memberName:o}),s.add(o);const c={enumName:t,explicitType:e,memberName:o};switch(r.id=n,a.type){case\"boolean\":this.flowEnumCheckExplicitTypeMismatch(a.pos,c,\"boolean\"),r.init=a.value,i.booleanMembers.push(this.finishNode(r,\"EnumBooleanMember\"));break;case\"number\":this.flowEnumCheckExplicitTypeMismatch(a.pos,c,\"number\"),r.init=a.value,i.numberMembers.push(this.finishNode(r,\"EnumNumberMember\"));break;case\"string\":this.flowEnumCheckExplicitTypeMismatch(a.pos,c,\"string\"),r.init=a.value,i.stringMembers.push(this.finishNode(r,\"EnumStringMember\"));break;case\"invalid\":throw this.flowEnumErrorInvalidMemberInitializer(a.pos,c);case\"none\":switch(e){case\"boolean\":this.flowEnumErrorBooleanMemberNotInitialized(a.pos,c);break;case\"number\":this.flowEnumErrorNumberMemberNotInitialized(a.pos,c);break;default:i.defaultedMembers.push(this.finishNode(r,\"EnumDefaultedMember\"))}}this.match(d.braceR)||this.expect(d.comma)}return i}flowEnumStringMembers(t,e,{enumName:s}){if(0===t.length)return e;if(0===e.length)return t;if(e.length>t.length){for(let e=0;e<t.length;e++){const i=t[e];this.flowEnumErrorStringMemberInconsistentlyInitailized(i.start,{enumName:s})}return e}for(let i=0;i<e.length;i++){const t=e[i];this.flowEnumErrorStringMemberInconsistentlyInitailized(t.start,{enumName:s})}return t}flowEnumParseExplicitType({enumName:t}){if(this.eatContextual(\"of\")){if(!this.match(d.name))throw this.flowEnumErrorInvalidExplicitType(this.state.start,{enumName:t,suppliedType:null});const{value:e}=this.state;return this.next(),\"boolean\"!==e&&\"number\"!==e&&\"string\"!==e&&\"symbol\"!==e&&this.flowEnumErrorInvalidExplicitType(this.state.start,{enumName:t,suppliedType:e}),e}return null}flowEnumBody(t,{enumName:e,nameLoc:s}){const i=this.flowEnumParseExplicitType({enumName:e});this.expect(d.braceL);const r=this.flowEnumMembers({enumName:e,explicitType:i});switch(i){case\"boolean\":return t.explicitType=!0,t.members=r.booleanMembers,this.expect(d.braceR),this.finishNode(t,\"EnumBooleanBody\");case\"number\":return t.explicitType=!0,t.members=r.numberMembers,this.expect(d.braceR),this.finishNode(t,\"EnumNumberBody\");case\"string\":return t.explicitType=!0,t.members=this.flowEnumStringMembers(r.stringMembers,r.defaultedMembers,{enumName:e}),this.expect(d.braceR),this.finishNode(t,\"EnumStringBody\");case\"symbol\":return t.members=r.defaultedMembers,this.expect(d.braceR),this.finishNode(t,\"EnumSymbolBody\");default:{const i=()=>(t.members=[],this.expect(d.braceR),this.finishNode(t,\"EnumStringBody\"));t.explicitType=!1;const n=r.booleanMembers.length,a=r.numberMembers.length,o=r.stringMembers.length,c=r.defaultedMembers.length;if(n||a||o||c){if(n||a){if(!a&&!o&&n>=c){for(let t=0,s=r.defaultedMembers;t<s.length;t++){const i=s[t];this.flowEnumErrorBooleanMemberNotInitialized(i.start,{enumName:e,memberName:i.id.name})}return t.members=r.booleanMembers,this.expect(d.braceR),this.finishNode(t,\"EnumBooleanBody\")}if(!n&&!o&&a>=c){for(let t=0,s=r.defaultedMembers;t<s.length;t++){const i=s[t];this.flowEnumErrorNumberMemberNotInitialized(i.start,{enumName:e,memberName:i.id.name})}return t.members=r.numberMembers,this.expect(d.braceR),this.finishNode(t,\"EnumNumberBody\")}return this.flowEnumErrorInconsistentMemberValues(s,{enumName:e}),i()}return t.members=this.flowEnumStringMembers(r.stringMembers,r.defaultedMembers,{enumName:e}),this.expect(d.braceR),this.finishNode(t,\"EnumStringBody\")}return i()}}}flowParseEnumDeclaration(t){const e=this.parseIdentifier();return t.id=e,t.body=this.flowEnumBody(this.startNode(),{enumName:e.name,nameLoc:e.start}),this.finishNode(t,\"EnumDeclaration\")}updateContext(t){this.match(d.name)&&\"of\"===this.state.value&&t===d.name&&\"interface\"===this.input.slice(this.state.lastTokStart,this.state.lastTokEnd)?this.state.exprAllowed=!1:super.updateContext(t)}};const $t={quot:'\"',amp:\"&\",apos:\"'\",lt:\"<\",gt:\">\",nbsp:\" \",iexcl:\"¡\",cent:\"¢\",pound:\"£\",curren:\"¤\",yen:\"¥\",brvbar:\"¦\",sect:\"§\",uml:\"¨\",copy:\"©\",ordf:\"ª\",laquo:\"«\",not:\"¬\",shy:\"­\",reg:\"®\",macr:\"¯\",deg:\"°\",plusmn:\"±\",sup2:\"²\",sup3:\"³\",acute:\"´\",micro:\"µ\",para:\"¶\",middot:\"·\",cedil:\"¸\",sup1:\"¹\",ordm:\"º\",raquo:\"»\",frac14:\"¼\",frac12:\"½\",frac34:\"¾\",iquest:\"¿\",Agrave:\"À\",Aacute:\"Á\",Acirc:\"Â\",Atilde:\"Ã\",Auml:\"Ä\",Aring:\"Å\",AElig:\"Æ\",Ccedil:\"Ç\",Egrave:\"È\",Eacute:\"É\",Ecirc:\"Ê\",Euml:\"Ë\",Igrave:\"Ì\",Iacute:\"Í\",Icirc:\"Î\",Iuml:\"Ï\",ETH:\"Ð\",Ntilde:\"Ñ\",Ograve:\"Ò\",Oacute:\"Ó\",Ocirc:\"Ô\",Otilde:\"Õ\",Ouml:\"Ö\",times:\"×\",Oslash:\"Ø\",Ugrave:\"Ù\",Uacute:\"Ú\",Ucirc:\"Û\",Uuml:\"Ü\",Yacute:\"Ý\",THORN:\"Þ\",szlig:\"ß\",agrave:\"à\",aacute:\"á\",acirc:\"â\",atilde:\"ã\",auml:\"ä\",aring:\"å\",aelig:\"æ\",ccedil:\"ç\",egrave:\"è\",eacute:\"é\",ecirc:\"ê\",euml:\"ë\",igrave:\"ì\",iacute:\"í\",icirc:\"î\",iuml:\"ï\",eth:\"ð\",ntilde:\"ñ\",ograve:\"ò\",oacute:\"ó\",ocirc:\"ô\",otilde:\"õ\",ouml:\"ö\",divide:\"÷\",oslash:\"ø\",ugrave:\"ù\",uacute:\"ú\",ucirc:\"û\",uuml:\"ü\",yacute:\"ý\",thorn:\"þ\",yuml:\"ÿ\",OElig:\"Œ\",oelig:\"œ\",Scaron:\"Š\",scaron:\"š\",Yuml:\"Ÿ\",fnof:\"ƒ\",circ:\"ˆ\",tilde:\"˜\",Alpha:\"Α\",Beta:\"Β\",Gamma:\"Γ\",Delta:\"Δ\",Epsilon:\"Ε\",Zeta:\"Ζ\",Eta:\"Η\",Theta:\"Θ\",Iota:\"Ι\",Kappa:\"Κ\",Lambda:\"Λ\",Mu:\"Μ\",Nu:\"Ν\",Xi:\"Ξ\",Omicron:\"Ο\",Pi:\"Π\",Rho:\"Ρ\",Sigma:\"Σ\",Tau:\"Τ\",Upsilon:\"Υ\",Phi:\"Φ\",Chi:\"Χ\",Psi:\"Ψ\",Omega:\"Ω\",alpha:\"α\",beta:\"β\",gamma:\"γ\",delta:\"δ\",epsilon:\"ε\",zeta:\"ζ\",eta:\"η\",theta:\"θ\",iota:\"ι\",kappa:\"κ\",lambda:\"λ\",mu:\"μ\",nu:\"ν\",xi:\"ξ\",omicron:\"ο\",pi:\"π\",rho:\"ρ\",sigmaf:\"ς\",sigma:\"σ\",tau:\"τ\",upsilon:\"υ\",phi:\"φ\",chi:\"χ\",psi:\"ψ\",omega:\"ω\",thetasym:\"ϑ\",upsih:\"ϒ\",piv:\"ϖ\",ensp:\" \",emsp:\" \",thinsp:\" \",zwnj:\"‌\",zwj:\"‍\",lrm:\"‎\",rlm:\"‏\",ndash:\"–\",mdash:\"—\",lsquo:\"‘\",rsquo:\"’\",sbquo:\"‚\",ldquo:\"“\",rdquo:\"”\",bdquo:\"„\",dagger:\"†\",Dagger:\"‡\",bull:\"•\",hellip:\"…\",permil:\"‰\",prime:\"′\",Prime:\"″\",lsaquo:\"‹\",rsaquo:\"›\",oline:\"‾\",frasl:\"⁄\",euro:\"€\",image:\"ℑ\",weierp:\"℘\",real:\"ℜ\",trade:\"™\",alefsym:\"ℵ\",larr:\"←\",uarr:\"↑\",rarr:\"→\",darr:\"↓\",harr:\"↔\",crarr:\"↵\",lArr:\"⇐\",uArr:\"⇑\",rArr:\"⇒\",dArr:\"⇓\",hArr:\"⇔\",forall:\"∀\",part:\"∂\",exist:\"∃\",empty:\"∅\",nabla:\"∇\",isin:\"∈\",notin:\"∉\",ni:\"∋\",prod:\"∏\",sum:\"∑\",minus:\"−\",lowast:\"∗\",radic:\"√\",prop:\"∝\",infin:\"∞\",ang:\"∠\",and:\"∧\",or:\"∨\",cap:\"∩\",cup:\"∪\",int:\"∫\",there4:\"∴\",sim:\"∼\",cong:\"≅\",asymp:\"≈\",ne:\"≠\",equiv:\"≡\",le:\"≤\",ge:\"≥\",sub:\"⊂\",sup:\"⊃\",nsub:\"⊄\",sube:\"⊆\",supe:\"⊇\",oplus:\"⊕\",otimes:\"⊗\",perp:\"⊥\",sdot:\"⋅\",lceil:\"⌈\",rceil:\"⌉\",lfloor:\"⌊\",rfloor:\"⌋\",lang:\"〈\",rang:\"〉\",loz:\"◊\",spades:\"♠\",clubs:\"♣\",hearts:\"♥\",diams:\"♦\"},Xt=/^[\\da-fA-F]+$/,Gt=/^\\d+$/,Yt=Object.freeze({AttributeIsEmpty:\"JSX attributes must only be assigned a non-empty expression\",MissingClosingTagFragment:\"Expected corresponding JSX closing tag for <>\",MissingClosingTagElement:\"Expected corresponding JSX closing tag for <%0>\",UnsupportedJsxValue:\"JSX value should be either an expression or a quoted JSX text\",UnterminatedJsxContent:\"Unterminated JSX contents\",UnwrappedAdjacentJSXElements:\"Adjacent JSX elements must be wrapped in an enclosing tag. Did you want a JSX fragment <>...</>?\"});function Jt(t){return!!t&&(\"JSXOpeningFragment\"===t.type||\"JSXClosingFragment\"===t.type)}function Qt(t){if(\"JSXIdentifier\"===t.type)return t.name;if(\"JSXNamespacedName\"===t.type)return t.namespace.name+\":\"+t.name.name;if(\"JSXMemberExpression\"===t.type)return Qt(t.object)+\".\"+Qt(t.property);throw new Error(\"Node had unexpected type: \"+t.type)}gt.j_oTag=new yt(\"<tag\",!1),gt.j_cTag=new yt(\"</tag\",!1),gt.j_expr=new yt(\"<tag>...</tag>\",!0,!0),d.jsxName=new h(\"jsxName\"),d.jsxText=new h(\"jsxText\",{beforeExpr:!0}),d.jsxTagStart=new h(\"jsxTagStart\",{startsExpr:!0}),d.jsxTagEnd=new h(\"jsxTagEnd\"),d.jsxTagStart.updateContext=function(){this.state.context.push(gt.j_expr),this.state.context.push(gt.j_oTag),this.state.exprAllowed=!1},d.jsxTagEnd.updateContext=function(t){const e=this.state.context.pop();e===gt.j_oTag&&t===d.slash||e===gt.j_cTag?(this.state.context.pop(),this.state.exprAllowed=this.curContext()===gt.j_expr):this.state.exprAllowed=!0};var Zt=t=>class extends t{jsxReadToken(){let t=\"\",e=this.state.pos;for(;;){if(this.state.pos>=this.length)throw this.raise(this.state.start,Yt.UnterminatedJsxContent);const s=this.input.charCodeAt(this.state.pos);switch(s){case 60:case 123:return this.state.pos===this.state.start?60===s&&this.state.exprAllowed?(++this.state.pos,this.finishToken(d.jsxTagStart)):super.getTokenFromCode(s):(t+=this.input.slice(e,this.state.pos),this.finishToken(d.jsxText,t));case 38:t+=this.input.slice(e,this.state.pos),t+=this.jsxReadEntity(),e=this.state.pos;break;default:it(s)?(t+=this.input.slice(e,this.state.pos),t+=this.jsxReadNewLine(!0),e=this.state.pos):++this.state.pos}}}jsxReadNewLine(t){const e=this.input.charCodeAt(this.state.pos);let s;return++this.state.pos,13===e&&10===this.input.charCodeAt(this.state.pos)?(++this.state.pos,s=t?\"\\n\":\"\\r\\n\"):s=String.fromCharCode(e),++this.state.curLine,this.state.lineStart=this.state.pos,s}jsxReadString(t){let e=\"\",s=++this.state.pos;for(;;){if(this.state.pos>=this.length)throw this.raise(this.state.start,ut.UnterminatedString);const i=this.input.charCodeAt(this.state.pos);if(i===t)break;38===i?(e+=this.input.slice(s,this.state.pos),e+=this.jsxReadEntity(),s=this.state.pos):it(i)?(e+=this.input.slice(s,this.state.pos),e+=this.jsxReadNewLine(!1),s=this.state.pos):++this.state.pos}return e+=this.input.slice(s,this.state.pos++),this.finishToken(d.string,e)}jsxReadEntity(){let t,e=\"\",s=0,i=this.input[this.state.pos];const r=++this.state.pos;while(this.state.pos<this.length&&s++<10){if(i=this.input[this.state.pos++],\";\"===i){\"#\"===e[0]?\"x\"===e[1]?(e=e.substr(2),Xt.test(e)&&(t=String.fromCodePoint(parseInt(e,16)))):(e=e.substr(1),Gt.test(e)&&(t=String.fromCodePoint(parseInt(e,10)))):t=$t[e];break}e+=i}return t||(this.state.pos=r,\"&\")}jsxReadWord(){let t;const e=this.state.pos;do{t=this.input.charCodeAt(++this.state.pos)}while(St(t)||45===t);return this.finishToken(d.jsxName,this.input.slice(e,this.state.pos))}jsxParseIdentifier(){const t=this.startNode();return this.match(d.jsxName)?t.name=this.state.value:this.state.type.keyword?t.name=this.state.type.keyword:this.unexpected(),this.next(),this.finishNode(t,\"JSXIdentifier\")}jsxParseNamespacedName(){const t=this.state.start,e=this.state.startLoc,s=this.jsxParseIdentifier();if(!this.eat(d.colon))return s;const i=this.startNodeAt(t,e);return i.namespace=s,i.name=this.jsxParseIdentifier(),this.finishNode(i,\"JSXNamespacedName\")}jsxParseElementName(){const t=this.state.start,e=this.state.startLoc;let s=this.jsxParseNamespacedName();if(\"JSXNamespacedName\"===s.type)return s;while(this.eat(d.dot)){const i=this.startNodeAt(t,e);i.object=s,i.property=this.jsxParseIdentifier(),s=this.finishNode(i,\"JSXMemberExpression\")}return s}jsxParseAttributeValue(){let t;switch(this.state.type){case d.braceL:return t=this.startNode(),this.next(),t=this.jsxParseExpressionContainer(t),\"JSXEmptyExpression\"===t.expression.type&&this.raise(t.start,Yt.AttributeIsEmpty),t;case d.jsxTagStart:case d.string:return this.parseExprAtom();default:throw this.raise(this.state.start,Yt.UnsupportedJsxValue)}}jsxParseEmptyExpression(){const t=this.startNodeAt(this.state.lastTokEnd,this.state.lastTokEndLoc);return this.finishNodeAt(t,\"JSXEmptyExpression\",this.state.start,this.state.startLoc)}jsxParseSpreadChild(t){return this.next(),t.expression=this.parseExpression(),this.expect(d.braceR),this.finishNode(t,\"JSXSpreadChild\")}jsxParseExpressionContainer(t){return this.match(d.braceR)?t.expression=this.jsxParseEmptyExpression():t.expression=this.parseExpression(),this.expect(d.braceR),this.finishNode(t,\"JSXExpressionContainer\")}jsxParseAttribute(){const t=this.startNode();return this.eat(d.braceL)?(this.expect(d.ellipsis),t.argument=this.parseMaybeAssign(),this.expect(d.braceR),this.finishNode(t,\"JSXSpreadAttribute\")):(t.name=this.jsxParseNamespacedName(),t.value=this.eat(d.eq)?this.jsxParseAttributeValue():null,this.finishNode(t,\"JSXAttribute\"))}jsxParseOpeningElementAt(t,e){const s=this.startNodeAt(t,e);return this.match(d.jsxTagEnd)?(this.expect(d.jsxTagEnd),this.finishNode(s,\"JSXOpeningFragment\")):(s.name=this.jsxParseElementName(),this.jsxParseOpeningElementAfterName(s))}jsxParseOpeningElementAfterName(t){const e=[];while(!this.match(d.slash)&&!this.match(d.jsxTagEnd))e.push(this.jsxParseAttribute());return t.attributes=e,t.selfClosing=this.eat(d.slash),this.expect(d.jsxTagEnd),this.finishNode(t,\"JSXOpeningElement\")}jsxParseClosingElementAt(t,e){const s=this.startNodeAt(t,e);return this.match(d.jsxTagEnd)?(this.expect(d.jsxTagEnd),this.finishNode(s,\"JSXClosingFragment\")):(s.name=this.jsxParseElementName(),this.expect(d.jsxTagEnd),this.finishNode(s,\"JSXClosingElement\"))}jsxParseElementAt(t,e){const s=this.startNodeAt(t,e),i=[],r=this.jsxParseOpeningElementAt(t,e);let n=null;if(!r.selfClosing){t:for(;;)switch(this.state.type){case d.jsxTagStart:if(t=this.state.start,e=this.state.startLoc,this.next(),this.eat(d.slash)){n=this.jsxParseClosingElementAt(t,e);break t}i.push(this.jsxParseElementAt(t,e));break;case d.jsxText:i.push(this.parseExprAtom());break;case d.braceL:{const t=this.startNode();this.next(),this.match(d.ellipsis)?i.push(this.jsxParseSpreadChild(t)):i.push(this.jsxParseExpressionContainer(t));break}default:throw this.unexpected()}Jt(r)&&!Jt(n)?this.raise(n.start,Yt.MissingClosingTagFragment):!Jt(r)&&Jt(n)?this.raise(n.start,Yt.MissingClosingTagElement,Qt(r.name)):Jt(r)||Jt(n)||Qt(n.name)!==Qt(r.name)&&this.raise(n.start,Yt.MissingClosingTagElement,Qt(r.name))}if(Jt(r)?(s.openingFragment=r,s.closingFragment=n):(s.openingElement=r,s.closingElement=n),s.children=i,this.isRelational(\"<\"))throw this.raise(this.state.start,Yt.UnwrappedAdjacentJSXElements);return Jt(r)?this.finishNode(s,\"JSXFragment\"):this.finishNode(s,\"JSXElement\")}jsxParseElement(){const t=this.state.start,e=this.state.startLoc;return this.next(),this.jsxParseElementAt(t,e)}parseExprAtom(t){return this.match(d.jsxText)?this.parseLiteral(this.state.value,\"JSXText\"):this.match(d.jsxTagStart)?this.jsxParseElement():this.isRelational(\"<\")&&33!==this.input.charCodeAt(this.state.pos)?(this.finishToken(d.jsxTagStart),this.jsxParseElement()):super.parseExprAtom(t)}getTokenFromCode(t){if(this.state.inPropertyName)return super.getTokenFromCode(t);const e=this.curContext();if(e===gt.j_expr)return this.jsxReadToken();if(e===gt.j_oTag||e===gt.j_cTag){if(At(t))return this.jsxReadWord();if(62===t)return++this.state.pos,this.finishToken(d.jsxTagEnd);if((34===t||39===t)&&e===gt.j_oTag)return this.jsxReadString(t)}return 60===t&&this.state.exprAllowed&&33!==this.input.charCodeAt(this.state.pos+1)?(++this.state.pos,this.finishToken(d.jsxTagStart)):super.getTokenFromCode(t)}updateContext(t){if(this.match(d.braceL)){const e=this.curContext();e===gt.j_oTag?this.state.context.push(gt.braceExpression):e===gt.j_expr?this.state.context.push(gt.templateQuasi):super.updateContext(t),this.state.exprAllowed=!0}else{if(!this.match(d.slash)||t!==d.jsxTagStart)return super.updateContext(t);this.state.context.length-=2,this.state.context.push(gt.j_cTag),this.state.exprAllowed=!1}}};class te{constructor(t){this.var=[],this.lexical=[],this.functions=[],this.flags=t}}class ee{constructor(t,e){this.scopeStack=[],this.undefinedExports=new Map,this.undefinedPrivateNames=new Map,this.raise=t,this.inModule=e}get inFunction(){return(this.currentVarScope().flags&y)>0}get allowSuper(){return(this.currentThisScope().flags&b)>0}get allowDirectSuper(){return(this.currentThisScope().flags&v)>0}get inClass(){return(this.currentThisScope().flags&w)>0}get inNonArrowFunction(){return(this.currentThisScope().flags&y)>0}get treatFunctionsAsVar(){return this.treatFunctionsAsVarInScope(this.currentScope())}createScope(t){return new te(t)}enter(t){this.scopeStack.push(this.createScope(t))}exit(){this.scopeStack.pop()}treatFunctionsAsVarInScope(t){return!!(t.flags&y||!this.inModule&&t.flags&m)}declareName(t,e,s){let i=this.currentScope();if(e&C||e&k)this.checkRedeclarationInScope(i,t,e,s),e&k?i.functions.push(t):i.lexical.push(t),e&C&&this.maybeExportDefined(i,t);else if(e&S)for(let r=this.scopeStack.length-1;r>=0;--r)if(i=this.scopeStack[r],this.checkRedeclarationInScope(i,t,e,s),i.var.push(t),this.maybeExportDefined(i,t),i.flags&T)break;this.inModule&&i.flags&m&&this.undefinedExports.delete(t)}maybeExportDefined(t,e){this.inModule&&t.flags&m&&this.undefinedExports.delete(e)}checkRedeclarationInScope(t,e,s,i){this.isRedeclaredInScope(t,e,s)&&this.raise(i,ut.VarRedeclaration,e)}isRedeclaredInScope(t,e,s){return!!(s&E)&&(s&C?t.lexical.indexOf(e)>-1||t.functions.indexOf(e)>-1||t.var.indexOf(e)>-1:s&k?t.lexical.indexOf(e)>-1||!this.treatFunctionsAsVarInScope(t)&&t.var.indexOf(e)>-1:t.lexical.indexOf(e)>-1&&!(t.flags&x&&t.lexical[0]===e)||!this.treatFunctionsAsVarInScope(t)&&t.functions.indexOf(e)>-1)}checkLocalExport(t){-1===this.scopeStack[0].lexical.indexOf(t.name)&&-1===this.scopeStack[0].var.indexOf(t.name)&&-1===this.scopeStack[0].functions.indexOf(t.name)&&this.undefinedExports.set(t.name,t.start)}currentScope(){return this.scopeStack[this.scopeStack.length-1]}currentVarScope(){for(let t=this.scopeStack.length-1;;t--){const e=this.scopeStack[t];if(e.flags&T)return e}}currentThisScope(){for(let t=this.scopeStack.length-1;;t--){const e=this.scopeStack[t];if((e.flags&T||e.flags&w)&&!(e.flags&g))return e}}}class se extends te{constructor(...t){super(...t),this.types=[],this.enums=[],this.constEnums=[],this.classes=[],this.exportOnlyBindings=[]}}class ie extends ee{createScope(t){return new se(t)}declareName(t,e,s){const i=this.currentScope();if(e&M)return this.maybeExportDefined(i,t),void i.exportOnlyBindings.push(t);super.declareName(...arguments),e&A&&(e&E||(this.checkRedeclarationInScope(i,t,e,s),this.maybeExportDefined(i,t)),i.types.push(t)),e&O&&i.enums.push(t),e&D&&i.constEnums.push(t),e&I&&i.classes.push(t)}isRedeclaredInScope(t,e,s){if(t.enums.indexOf(e)>-1){if(s&O){const i=!!(s&D),r=t.constEnums.indexOf(e)>-1;return i!==r}return!0}return s&I&&t.classes.indexOf(e)>-1?t.lexical.indexOf(e)>-1&&!!(s&E):!!(s&A&&t.types.indexOf(e)>-1)||super.isRedeclaredInScope(...arguments)}checkLocalExport(t){-1===this.scopeStack[0].types.indexOf(t.name)&&-1===this.scopeStack[0].exportOnlyBindings.indexOf(t.name)&&super.checkLocalExport(t)}}const re=0,ne=1,ae=2,oe=4;class ce{constructor(){this.stacks=[]}enter(t){this.stacks.push(t)}exit(){this.stacks.pop()}currentFlags(){return this.stacks[this.stacks.length-1]}get hasAwait(){return(this.currentFlags()&ae)>0}get hasYield(){return(this.currentFlags()&ne)>0}get hasReturn(){return(this.currentFlags()&oe)>0}}function he(t,e){return(t?ae:0)|(e?ne:0)}function le(t){if(null==t)throw new Error(`Unexpected ${t} value.`);return t}function pe(t){if(!t)throw new Error(\"Assert fail\")}const ue=Object.freeze({ClassMethodHasDeclare:\"Class methods cannot have the 'declare' modifier\",ClassMethodHasReadonly:\"Class methods cannot have the 'readonly' modifier\",DeclareClassFieldHasInitializer:\"'declare' class fields cannot have an initializer\",DuplicateModifier:\"Duplicate modifier: '%0'\",EmptyHeritageClauseType:\"'%0' list cannot be empty.\",IndexSignatureHasAbstract:\"Index signatures cannot have the 'abstract' modifier\",IndexSignatureHasAccessibility:\"Index signatures cannot have an accessibility modifier ('%0')\",IndexSignatureHasStatic:\"Index signatures cannot have the 'static' modifier\",OptionalTypeBeforeRequired:\"A required element cannot follow an optional element.\",PatternIsOptional:\"A binding pattern parameter cannot be optional in an implementation signature.\",PrivateElementHasAbstract:\"Private elements cannot have the 'abstract' modifier.\",PrivateElementHasAccessibility:\"Private elements cannot have an accessibility modifier ('%0')\",TemplateTypeHasSubstitution:\"Template literal types cannot have any substitution\",TypeAnnotationAfterAssign:\"Type annotations must come before default assignments, e.g. instead of `age = 25: number` use `age: number = 25`\",UnexpectedReadonly:\"'readonly' type modifier is only permitted on array and tuple literal types.\",UnexpectedTypeAnnotation:\"Did not expect a type annotation here.\",UnexpectedTypeCastInParameter:\"Unexpected type cast in parameter position.\",UnsupportedImportTypeArgument:\"Argument in a type import must be a string literal\",UnsupportedParameterPropertyKind:\"A parameter property may not be declared using a binding pattern.\",UnsupportedSignatureParameterKind:\"Name in a signature must be an Identifier, ObjectPattern or ArrayPattern, instead got %0\"});function de(t){switch(t){case\"any\":return\"TSAnyKeyword\";case\"boolean\":return\"TSBooleanKeyword\";case\"bigint\":return\"TSBigIntKeyword\";case\"never\":return\"TSNeverKeyword\";case\"number\":return\"TSNumberKeyword\";case\"object\":return\"TSObjectKeyword\";case\"string\":return\"TSStringKeyword\";case\"symbol\":return\"TSSymbolKeyword\";case\"undefined\":return\"TSUndefinedKeyword\";case\"unknown\":return\"TSUnknownKeyword\";default:return}}var fe=t=>class extends t{getScopeHandler(){return ie}tsIsIdentifier(){return this.match(d.name)}tsNextTokenCanFollowModifier(){return this.next(),!this.hasPrecedingLineBreak()&&!this.match(d.parenL)&&!this.match(d.parenR)&&!this.match(d.colon)&&!this.match(d.eq)&&!this.match(d.question)&&!this.match(d.bang)}tsParseModifier(t){if(!this.match(d.name))return;const e=this.state.value;return-1!==t.indexOf(e)&&this.tsTryParse(this.tsNextTokenCanFollowModifier.bind(this))?e:void 0}tsParseModifiers(t,e){for(;;){const s=this.state.start,i=this.tsParseModifier(e);if(!i)break;Object.hasOwnProperty.call(t,i)&&this.raise(s,ue.DuplicateModifier,i),t[i]=!0}}tsIsListTerminator(t){switch(t){case\"EnumMembers\":case\"TypeMembers\":return this.match(d.braceR);case\"HeritageClauseElement\":return this.match(d.braceL);case\"TupleElementTypes\":return this.match(d.bracketR);case\"TypeParametersOrArguments\":return this.isRelational(\">\")}throw new Error(\"Unreachable\")}tsParseList(t,e){const s=[];while(!this.tsIsListTerminator(t))s.push(e());return s}tsParseDelimitedList(t,e){return le(this.tsParseDelimitedListWorker(t,e,!0))}tsParseDelimitedListWorker(t,e,s){const i=[];for(;;){if(this.tsIsListTerminator(t))break;const r=e();if(null==r)return;if(i.push(r),!this.eat(d.comma)){if(this.tsIsListTerminator(t))break;return void(s&&this.expect(d.comma))}}return i}tsParseBracketedList(t,e,s,i){i||(s?this.expect(d.bracketL):this.expectRelational(\"<\"));const r=this.tsParseDelimitedList(t,e);return s?this.expect(d.bracketR):this.expectRelational(\">\"),r}tsParseImportType(){const t=this.startNode();return this.expect(d._import),this.expect(d.parenL),this.match(d.string)||this.raise(this.state.start,ue.UnsupportedImportTypeArgument),t.argument=this.parseExprAtom(),this.expect(d.parenR),this.eat(d.dot)&&(t.qualifier=this.tsParseEntityName(!0)),this.isRelational(\"<\")&&(t.typeParameters=this.tsParseTypeArguments()),this.finishNode(t,\"TSImportType\")}tsParseEntityName(t){let e=this.parseIdentifier();while(this.eat(d.dot)){const s=this.startNodeAtNode(e);s.left=e,s.right=this.parseIdentifier(t),e=this.finishNode(s,\"TSQualifiedName\")}return e}tsParseTypeReference(){const t=this.startNode();return t.typeName=this.tsParseEntityName(!1),!this.hasPrecedingLineBreak()&&this.isRelational(\"<\")&&(t.typeParameters=this.tsParseTypeArguments()),this.finishNode(t,\"TSTypeReference\")}tsParseThisTypePredicate(t){this.next();const e=this.startNodeAtNode(t);return e.parameterName=t,e.typeAnnotation=this.tsParseTypeAnnotation(!1),this.finishNode(e,\"TSTypePredicate\")}tsParseThisTypeNode(){const t=this.startNode();return this.next(),this.finishNode(t,\"TSThisType\")}tsParseTypeQuery(){const t=this.startNode();return this.expect(d._typeof),this.match(d._import)?t.exprName=this.tsParseImportType():t.exprName=this.tsParseEntityName(!0),this.finishNode(t,\"TSTypeQuery\")}tsParseTypeParameter(){const t=this.startNode();return t.name=this.parseIdentifierName(t.start),t.constraint=this.tsEatThenParseType(d._extends),t.default=this.tsEatThenParseType(d.eq),this.finishNode(t,\"TSTypeParameter\")}tsTryParseTypeParameters(){if(this.isRelational(\"<\"))return this.tsParseTypeParameters()}tsParseTypeParameters(){const t=this.startNode();return this.isRelational(\"<\")||this.match(d.jsxTagStart)?this.next():this.unexpected(),t.params=this.tsParseBracketedList(\"TypeParametersOrArguments\",this.tsParseTypeParameter.bind(this),!1,!0),this.finishNode(t,\"TSTypeParameterDeclaration\")}tsTryNextParseConstantContext(){return this.lookahead().type===d._const?(this.next(),this.tsParseTypeReference()):null}tsFillSignature(t,e){const s=t===d.arrow;e.typeParameters=this.tsTryParseTypeParameters(),this.expect(d.parenL),e.parameters=this.tsParseBindingListForSignature(),(s||this.match(t))&&(e.typeAnnotation=this.tsParseTypeOrTypePredicateAnnotation(t))}tsParseBindingListForSignature(){return this.parseBindingList(d.parenR,41).map(t=>(\"Identifier\"!==t.type&&\"RestElement\"!==t.type&&\"ObjectPattern\"!==t.type&&\"ArrayPattern\"!==t.type&&this.raise(t.start,ue.UnsupportedSignatureParameterKind,t.type),t))}tsParseTypeMemberSemicolon(){this.eat(d.comma)||this.semicolon()}tsParseSignatureMember(t,e){return this.tsFillSignature(d.colon,e),this.tsParseTypeMemberSemicolon(),this.finishNode(e,t)}tsIsUnambiguouslyIndexSignature(){return this.next(),this.eat(d.name)&&this.match(d.colon)}tsTryParseIndexSignature(t){if(!this.match(d.bracketL)||!this.tsLookAhead(this.tsIsUnambiguouslyIndexSignature.bind(this)))return;this.expect(d.bracketL);const e=this.parseIdentifier();e.typeAnnotation=this.tsParseTypeAnnotation(),this.resetEndLocation(e),this.expect(d.bracketR),t.parameters=[e];const s=this.tsTryParseTypeAnnotation();return s&&(t.typeAnnotation=s),this.tsParseTypeMemberSemicolon(),this.finishNode(t,\"TSIndexSignature\")}tsParsePropertyOrMethodSignature(t,e){this.eat(d.question)&&(t.optional=!0);const s=t;if(e||!this.match(d.parenL)&&!this.isRelational(\"<\")){const t=s;e&&(t.readonly=!0);const i=this.tsTryParseTypeAnnotation();return i&&(t.typeAnnotation=i),this.tsParseTypeMemberSemicolon(),this.finishNode(t,\"TSPropertySignature\")}{const t=s;return this.tsFillSignature(d.colon,t),this.tsParseTypeMemberSemicolon(),this.finishNode(t,\"TSMethodSignature\")}}tsParseTypeMember(){const t=this.startNode();if(this.match(d.parenL)||this.isRelational(\"<\"))return this.tsParseSignatureMember(\"TSCallSignatureDeclaration\",t);if(this.match(d._new)){const e=this.startNode();return this.next(),this.match(d.parenL)||this.isRelational(\"<\")?this.tsParseSignatureMember(\"TSConstructSignatureDeclaration\",t):(t.key=this.createIdentifier(e,\"new\"),this.tsParsePropertyOrMethodSignature(t,!1))}const e=!!this.tsParseModifier([\"readonly\"]),s=this.tsTryParseIndexSignature(t);return s?(e&&(t.readonly=!0),s):(this.parsePropertyName(t,!1),this.tsParsePropertyOrMethodSignature(t,e))}tsParseTypeLiteral(){const t=this.startNode();return t.members=this.tsParseObjectTypeMembers(),this.finishNode(t,\"TSTypeLiteral\")}tsParseObjectTypeMembers(){this.expect(d.braceL);const t=this.tsParseList(\"TypeMembers\",this.tsParseTypeMember.bind(this));return this.expect(d.braceR),t}tsIsStartOfMappedType(){return this.next(),this.eat(d.plusMin)?this.isContextual(\"readonly\"):(this.isContextual(\"readonly\")&&this.next(),!!this.match(d.bracketL)&&(this.next(),!!this.tsIsIdentifier()&&(this.next(),this.match(d._in))))}tsParseMappedTypeParameter(){const t=this.startNode();return t.name=this.parseIdentifierName(t.start),t.constraint=this.tsExpectThenParseType(d._in),this.finishNode(t,\"TSTypeParameter\")}tsParseMappedType(){const t=this.startNode();return this.expect(d.braceL),this.match(d.plusMin)?(t.readonly=this.state.value,this.next(),this.expectContextual(\"readonly\")):this.eatContextual(\"readonly\")&&(t.readonly=!0),this.expect(d.bracketL),t.typeParameter=this.tsParseMappedTypeParameter(),this.expect(d.bracketR),this.match(d.plusMin)?(t.optional=this.state.value,this.next(),this.expect(d.question)):this.eat(d.question)&&(t.optional=!0),t.typeAnnotation=this.tsTryParseType(),this.semicolon(),this.expect(d.braceR),this.finishNode(t,\"TSMappedType\")}tsParseTupleType(){const t=this.startNode();t.elementTypes=this.tsParseBracketedList(\"TupleElementTypes\",this.tsParseTupleElementType.bind(this),!0,!1);let e=!1;return t.elementTypes.forEach(t=>{\"TSOptionalType\"===t.type?e=!0:e&&\"TSRestType\"!==t.type&&this.raise(t.start,ue.OptionalTypeBeforeRequired)}),this.finishNode(t,\"TSTupleType\")}tsParseTupleElementType(){if(this.match(d.ellipsis)){const t=this.startNode();return this.next(),t.typeAnnotation=this.tsParseType(),this.match(d.comma)&&93!==this.lookaheadCharCode()&&this.raiseRestNotLast(this.state.start),this.finishNode(t,\"TSRestType\")}const t=this.tsParseType();if(this.eat(d.question)){const e=this.startNodeAtNode(t);return e.typeAnnotation=t,this.finishNode(e,\"TSOptionalType\")}return t}tsParseParenthesizedType(){const t=this.startNode();return this.expect(d.parenL),t.typeAnnotation=this.tsParseType(),this.expect(d.parenR),this.finishNode(t,\"TSParenthesizedType\")}tsParseFunctionOrConstructorType(t){const e=this.startNode();return\"TSConstructorType\"===t&&this.expect(d._new),this.tsFillSignature(d.arrow,e),this.finishNode(e,t)}tsParseLiteralTypeNode(){const t=this.startNode();return t.literal=(()=>{switch(this.state.type){case d.num:case d.bigint:case d.string:case d._true:case d._false:return this.parseExprAtom();default:throw this.unexpected()}})(),this.finishNode(t,\"TSLiteralType\")}tsParseTemplateLiteralType(){const t=this.startNode(),e=this.parseTemplate(!1);return e.expressions.length>0&&this.raise(e.expressions[0].start,ue.TemplateTypeHasSubstitution),t.literal=e,this.finishNode(t,\"TSLiteralType\")}tsParseThisTypeOrThisTypePredicate(){const t=this.tsParseThisTypeNode();return this.isContextual(\"is\")&&!this.hasPrecedingLineBreak()?this.tsParseThisTypePredicate(t):t}tsParseNonArrayType(){switch(this.state.type){case d.name:case d._void:case d._null:{const t=this.match(d._void)?\"TSVoidKeyword\":this.match(d._null)?\"TSNullKeyword\":de(this.state.value);if(void 0!==t&&46!==this.lookaheadCharCode()){const e=this.startNode();return this.next(),this.finishNode(e,t)}return this.tsParseTypeReference()}case d.string:case d.num:case d.bigint:case d._true:case d._false:return this.tsParseLiteralTypeNode();case d.plusMin:if(\"-\"===this.state.value){const t=this.startNode(),e=this.lookahead();if(e.type!==d.num&&e.type!==d.bigint)throw this.unexpected();return t.literal=this.parseMaybeUnary(),this.finishNode(t,\"TSLiteralType\")}break;case d._this:return this.tsParseThisTypeOrThisTypePredicate();case d._typeof:return this.tsParseTypeQuery();case d._import:return this.tsParseImportType();case d.braceL:return this.tsLookAhead(this.tsIsStartOfMappedType.bind(this))?this.tsParseMappedType():this.tsParseTypeLiteral();case d.bracketL:return this.tsParseTupleType();case d.parenL:return this.tsParseParenthesizedType();case d.backQuote:return this.tsParseTemplateLiteralType()}throw this.unexpected()}tsParseArrayTypeOrHigher(){let t=this.tsParseNonArrayType();while(!this.hasPrecedingLineBreak()&&this.eat(d.bracketL))if(this.match(d.bracketR)){const e=this.startNodeAtNode(t);e.elementType=t,this.expect(d.bracketR),t=this.finishNode(e,\"TSArrayType\")}else{const e=this.startNodeAtNode(t);e.objectType=t,e.indexType=this.tsParseType(),this.expect(d.bracketR),t=this.finishNode(e,\"TSIndexedAccessType\")}return t}tsParseTypeOperator(t){const e=this.startNode();return this.expectContextual(t),e.operator=t,e.typeAnnotation=this.tsParseTypeOperatorOrHigher(),\"readonly\"===t&&this.tsCheckTypeAnnotationForReadOnly(e),this.finishNode(e,\"TSTypeOperator\")}tsCheckTypeAnnotationForReadOnly(t){switch(t.typeAnnotation.type){case\"TSTupleType\":case\"TSArrayType\":return;default:this.raise(t.start,ue.UnexpectedReadonly)}}tsParseInferType(){const t=this.startNode();this.expectContextual(\"infer\");const e=this.startNode();return e.name=this.parseIdentifierName(e.start),t.typeParameter=this.finishNode(e,\"TSTypeParameter\"),this.finishNode(t,\"TSInferType\")}tsParseTypeOperatorOrHigher(){const t=[\"keyof\",\"unique\",\"readonly\"].find(t=>this.isContextual(t));return t?this.tsParseTypeOperator(t):this.isContextual(\"infer\")?this.tsParseInferType():this.tsParseArrayTypeOrHigher()}tsParseUnionOrIntersectionType(t,e,s){this.eat(s);let i=e();if(this.match(s)){const r=[i];while(this.eat(s))r.push(e());const n=this.startNodeAtNode(i);n.types=r,i=this.finishNode(n,t)}return i}tsParseIntersectionTypeOrHigher(){return this.tsParseUnionOrIntersectionType(\"TSIntersectionType\",this.tsParseTypeOperatorOrHigher.bind(this),d.bitwiseAND)}tsParseUnionTypeOrHigher(){return this.tsParseUnionOrIntersectionType(\"TSUnionType\",this.tsParseIntersectionTypeOrHigher.bind(this),d.bitwiseOR)}tsIsStartOfFunctionType(){return!!this.isRelational(\"<\")||this.match(d.parenL)&&this.tsLookAhead(this.tsIsUnambiguouslyStartOfFunctionType.bind(this))}tsSkipParameterStart(){if(this.match(d.name)||this.match(d._this))return this.next(),!0;if(this.match(d.braceL)){let t=1;this.next();while(t>0)this.match(d.braceL)?++t:this.match(d.braceR)&&--t,this.next();return!0}if(this.match(d.bracketL)){let t=1;this.next();while(t>0)this.match(d.bracketL)?++t:this.match(d.bracketR)&&--t,this.next();return!0}return!1}tsIsUnambiguouslyStartOfFunctionType(){if(this.next(),this.match(d.parenR)||this.match(d.ellipsis))return!0;if(this.tsSkipParameterStart()){if(this.match(d.colon)||this.match(d.comma)||this.match(d.question)||this.match(d.eq))return!0;if(this.match(d.parenR)&&(this.next(),this.match(d.arrow)))return!0}return!1}tsParseTypeOrTypePredicateAnnotation(t){return this.tsInType(()=>{const e=this.startNode();this.expect(t);const s=this.tsTryParse(this.tsParseTypePredicateAsserts.bind(this));if(s&&this.match(d._this)){let t=this.tsParseThisTypeOrThisTypePredicate();if(\"TSThisType\"===t.type){const s=this.startNodeAtNode(e);s.parameterName=t,s.asserts=!0,t=this.finishNode(s,\"TSTypePredicate\")}else t.asserts=!0;return e.typeAnnotation=t,this.finishNode(e,\"TSTypeAnnotation\")}const i=this.tsIsIdentifier()&&this.tsTryParse(this.tsParseTypePredicatePrefix.bind(this));if(!i){if(!s)return this.tsParseTypeAnnotation(!1,e);const t=this.startNodeAtNode(e);return t.parameterName=this.parseIdentifier(),t.asserts=s,e.typeAnnotation=this.finishNode(t,\"TSTypePredicate\"),this.finishNode(e,\"TSTypeAnnotation\")}const r=this.tsParseTypeAnnotation(!1),n=this.startNodeAtNode(e);return n.parameterName=i,n.typeAnnotation=r,n.asserts=s,e.typeAnnotation=this.finishNode(n,\"TSTypePredicate\"),this.finishNode(e,\"TSTypeAnnotation\")})}tsTryParseTypeOrTypePredicateAnnotation(){return this.match(d.colon)?this.tsParseTypeOrTypePredicateAnnotation(d.colon):void 0}tsTryParseTypeAnnotation(){return this.match(d.colon)?this.tsParseTypeAnnotation():void 0}tsTryParseType(){return this.tsEatThenParseType(d.colon)}tsParseTypePredicatePrefix(){const t=this.parseIdentifier();if(this.isContextual(\"is\")&&!this.hasPrecedingLineBreak())return this.next(),t}tsParseTypePredicateAsserts(){if(!this.match(d.name)||\"asserts\"!==this.state.value||this.hasPrecedingLineBreak())return!1;const t=this.state.containsEsc;return this.next(),!(!this.match(d.name)&&!this.match(d._this))&&(t&&this.raise(this.state.lastTokStart,ut.InvalidEscapedReservedWord,\"asserts\"),!0)}tsParseTypeAnnotation(t=!0,e=this.startNode()){return this.tsInType(()=>{t&&this.expect(d.colon),e.typeAnnotation=this.tsParseType()}),this.finishNode(e,\"TSTypeAnnotation\")}tsParseType(){pe(this.state.inType);const t=this.tsParseNonConditionalType();if(this.hasPrecedingLineBreak()||!this.eat(d._extends))return t;const e=this.startNodeAtNode(t);return e.checkType=t,e.extendsType=this.tsParseNonConditionalType(),this.expect(d.question),e.trueType=this.tsParseType(),this.expect(d.colon),e.falseType=this.tsParseType(),this.finishNode(e,\"TSConditionalType\")}tsParseNonConditionalType(){return this.tsIsStartOfFunctionType()?this.tsParseFunctionOrConstructorType(\"TSFunctionType\"):this.match(d._new)?this.tsParseFunctionOrConstructorType(\"TSConstructorType\"):this.tsParseUnionTypeOrHigher()}tsParseTypeAssertion(){const t=this.startNode(),e=this.tsTryNextParseConstantContext();return t.typeAnnotation=e||this.tsNextThenParseType(),this.expectRelational(\">\"),t.expression=this.parseMaybeUnary(),this.finishNode(t,\"TSTypeAssertion\")}tsParseHeritageClause(t){const e=this.state.start,s=this.tsParseDelimitedList(\"HeritageClauseElement\",this.tsParseExpressionWithTypeArguments.bind(this));return s.length||this.raise(e,ue.EmptyHeritageClauseType,t),s}tsParseExpressionWithTypeArguments(){const t=this.startNode();return t.expression=this.tsParseEntityName(!1),this.isRelational(\"<\")&&(t.typeParameters=this.tsParseTypeArguments()),this.finishNode(t,\"TSExpressionWithTypeArguments\")}tsParseInterfaceDeclaration(t){t.id=this.parseIdentifier(),this.checkLVal(t.id,F,void 0,\"typescript interface declaration\"),t.typeParameters=this.tsTryParseTypeParameters(),this.eat(d._extends)&&(t.extends=this.tsParseHeritageClause(\"extends\"));const e=this.startNode();return e.body=this.tsInType(this.tsParseObjectTypeMembers.bind(this)),t.body=this.finishNode(e,\"TSInterfaceBody\"),this.finishNode(t,\"TSInterfaceDeclaration\")}tsParseTypeAliasDeclaration(t){return t.id=this.parseIdentifier(),this.checkLVal(t.id,B,void 0,\"typescript type alias\"),t.typeParameters=this.tsTryParseTypeParameters(),t.typeAnnotation=this.tsExpectThenParseType(d.eq),this.semicolon(),this.finishNode(t,\"TSTypeAliasDeclaration\")}tsInNoContext(t){const e=this.state.context;this.state.context=[e[0]];try{return t()}finally{this.state.context=e}}tsInType(t){const e=this.state.inType;this.state.inType=!0;try{return t()}finally{this.state.inType=e}}tsEatThenParseType(t){return this.match(t)?this.tsNextThenParseType():void 0}tsExpectThenParseType(t){return this.tsDoThenParseType(()=>this.expect(t))}tsNextThenParseType(){return this.tsDoThenParseType(()=>this.next())}tsDoThenParseType(t){return this.tsInType(()=>(t(),this.tsParseType()))}tsParseEnumMember(){const t=this.startNode();return t.id=this.match(d.string)?this.parseExprAtom():this.parseIdentifier(!0),this.eat(d.eq)&&(t.initializer=this.parseMaybeAssign()),this.finishNode(t,\"TSEnumMember\")}tsParseEnumDeclaration(t,e){return e&&(t.const=!0),t.id=this.parseIdentifier(),this.checkLVal(t.id,e?z:U,void 0,\"typescript enum declaration\"),this.expect(d.braceL),t.members=this.tsParseDelimitedList(\"EnumMembers\",this.tsParseEnumMember.bind(this)),this.expect(d.braceR),this.finishNode(t,\"TSEnumDeclaration\")}tsParseModuleBlock(){const t=this.startNode();return this.scope.enter(f),this.expect(d.braceL),this.parseBlockOrModuleBlockBody(t.body=[],void 0,!0,d.braceR),this.scope.exit(),this.finishNode(t,\"TSModuleBlock\")}tsParseModuleOrNamespaceDeclaration(t,e=!1){if(t.id=this.parseIdentifier(),e||this.checkLVal(t.id,W,null,\"module or namespace declaration\"),this.eat(d.dot)){const e=this.startNode();this.tsParseModuleOrNamespaceDeclaration(e,!0),t.body=e}else this.scope.enter(P),this.prodParam.enter(re),t.body=this.tsParseModuleBlock(),this.prodParam.exit(),this.scope.exit();return this.finishNode(t,\"TSModuleDeclaration\")}tsParseAmbientExternalModuleDeclaration(t){return this.isContextual(\"global\")?(t.global=!0,t.id=this.parseIdentifier()):this.match(d.string)?t.id=this.parseExprAtom():this.unexpected(),this.match(d.braceL)?(this.scope.enter(P),this.prodParam.enter(re),t.body=this.tsParseModuleBlock(),this.prodParam.exit(),this.scope.exit()):this.semicolon(),this.finishNode(t,\"TSModuleDeclaration\")}tsParseImportEqualsDeclaration(t,e){return t.isExport=e||!1,t.id=this.parseIdentifier(),this.checkLVal(t.id,_,void 0,\"import equals declaration\"),this.expect(d.eq),t.moduleReference=this.tsParseModuleReference(),this.semicolon(),this.finishNode(t,\"TSImportEqualsDeclaration\")}tsIsExternalModuleReference(){return this.isContextual(\"require\")&&40===this.lookaheadCharCode()}tsParseModuleReference(){return this.tsIsExternalModuleReference()?this.tsParseExternalModuleReference():this.tsParseEntityName(!1)}tsParseExternalModuleReference(){const t=this.startNode();if(this.expectContextual(\"require\"),this.expect(d.parenL),!this.match(d.string))throw this.unexpected();return t.expression=this.parseExprAtom(),this.expect(d.parenR),this.finishNode(t,\"TSExternalModuleReference\")}tsLookAhead(t){const e=this.state.clone(),s=t();return this.state=e,s}tsTryParseAndCatch(t){const e=this.tryParse(e=>t()||e());if(!e.aborted&&e.node)return e.error&&(this.state=e.failState),e.node}tsTryParse(t){const e=this.state.clone(),s=t();return void 0!==s&&!1!==s?s:void(this.state=e)}tsTryParseDeclare(t){if(this.isLineTerminator())return;let e,s=this.state.type;switch(this.isContextual(\"let\")&&(s=d._var,e=\"let\"),s){case d._function:return this.parseFunctionStatement(t,!1,!0);case d._class:return t.declare=!0,this.parseClass(t,!0,!1);case d._const:if(this.match(d._const)&&this.isLookaheadContextual(\"enum\"))return this.expect(d._const),this.expectContextual(\"enum\"),this.tsParseEnumDeclaration(t,!0);case d._var:return e=e||this.state.value,this.parseVarStatement(t,e);case d.name:{const e=this.state.value;return\"global\"===e?this.tsParseAmbientExternalModuleDeclaration(t):this.tsParseDeclaration(t,e,!0)}}}tsTryParseExportDeclaration(){return this.tsParseDeclaration(this.startNode(),this.state.value,!0)}tsParseExpressionStatement(t,e){switch(e.name){case\"declare\":{const e=this.tsTryParseDeclare(t);if(e)return e.declare=!0,e;break}case\"global\":if(this.match(d.braceL)){this.scope.enter(P),this.prodParam.enter(re);const s=t;return s.global=!0,s.id=e,s.body=this.tsParseModuleBlock(),this.scope.exit(),this.prodParam.exit(),this.finishNode(s,\"TSModuleDeclaration\")}break;default:return this.tsParseDeclaration(t,e.name,!1)}}tsParseDeclaration(t,e,s){switch(e){case\"abstract\":if(this.tsCheckLineTerminatorAndMatch(d._class,s)){const e=t;return e.abstract=!0,s&&(this.next(),this.match(d._class)||this.unexpected(null,d._class)),this.parseClass(e,!0,!1)}break;case\"enum\":if(s||this.match(d.name))return s&&this.next(),this.tsParseEnumDeclaration(t,!1);break;case\"interface\":if(this.tsCheckLineTerminatorAndMatch(d.name,s))return s&&this.next(),this.tsParseInterfaceDeclaration(t);break;case\"module\":if(s&&this.next(),this.match(d.string))return this.tsParseAmbientExternalModuleDeclaration(t);if(this.tsCheckLineTerminatorAndMatch(d.name,s))return this.tsParseModuleOrNamespaceDeclaration(t);break;case\"namespace\":if(this.tsCheckLineTerminatorAndMatch(d.name,s))return s&&this.next(),this.tsParseModuleOrNamespaceDeclaration(t);break;case\"type\":if(this.tsCheckLineTerminatorAndMatch(d.name,s))return s&&this.next(),this.tsParseTypeAliasDeclaration(t);break}}tsCheckLineTerminatorAndMatch(t,e){return(e||this.match(t))&&!this.isLineTerminator()}tsTryParseGenericAsyncArrowFunction(t,e){if(!this.isRelational(\"<\"))return;const s=this.state.maybeInArrowParameters,i=this.state.yieldPos,r=this.state.awaitPos;this.state.maybeInArrowParameters=!0,this.state.yieldPos=-1,this.state.awaitPos=-1;const n=this.tsTryParseAndCatch(()=>{const s=this.startNodeAt(t,e);return s.typeParameters=this.tsParseTypeParameters(),super.parseFunctionParams(s),s.returnType=this.tsTryParseTypeOrTypePredicateAnnotation(),this.expect(d.arrow),s});return this.state.maybeInArrowParameters=s,this.state.yieldPos=i,this.state.awaitPos=r,n?this.parseArrowExpression(n,null,!0):void 0}tsParseTypeArguments(){const t=this.startNode();return t.params=this.tsInType(()=>this.tsInNoContext(()=>(this.expectRelational(\"<\"),this.tsParseDelimitedList(\"TypeParametersOrArguments\",this.tsParseType.bind(this))))),this.state.exprAllowed=!1,this.expectRelational(\">\"),this.finishNode(t,\"TSTypeParameterInstantiation\")}tsIsDeclarationStart(){if(this.match(d.name))switch(this.state.value){case\"abstract\":case\"declare\":case\"enum\":case\"interface\":case\"module\":case\"namespace\":case\"type\":return!0}return!1}isExportDefaultSpecifier(){return!this.tsIsDeclarationStart()&&super.isExportDefaultSpecifier()}parseAssignableListItem(t,e){const s=this.state.start,i=this.state.startLoc;let r,n=!1;t&&(r=this.parseAccessModifier(),n=!!this.tsParseModifier([\"readonly\"]));const a=this.parseMaybeDefault();this.parseAssignableListItemTypes(a);const o=this.parseMaybeDefault(a.start,a.loc.start,a);if(r||n){const t=this.startNodeAt(s,i);return e.length&&(t.decorators=e),r&&(t.accessibility=r),n&&(t.readonly=n),\"Identifier\"!==o.type&&\"AssignmentPattern\"!==o.type&&this.raise(t.start,ue.UnsupportedParameterPropertyKind),t.parameter=o,this.finishNode(t,\"TSParameterProperty\")}return e.length&&(a.decorators=e),o}parseFunctionBodyAndFinish(t,e,s=!1){this.match(d.colon)&&(t.returnType=this.tsParseTypeOrTypePredicateAnnotation(d.colon));const i=\"FunctionDeclaration\"===e?\"TSDeclareFunction\":\"ClassMethod\"===e?\"TSDeclareMethod\":void 0;i&&!this.match(d.braceL)&&this.isLineTerminator()?this.finishNode(t,i):super.parseFunctionBodyAndFinish(t,e,s)}registerFunctionStatementId(t){!t.body&&t.id?this.checkLVal(t.id,q,null,\"function name\"):super.registerFunctionStatementId(...arguments)}parseSubscript(t,e,s,i,r){if(!this.hasPrecedingLineBreak()&&this.match(d.bang)){this.state.exprAllowed=!1,this.next();const i=this.startNodeAt(e,s);return i.expression=t,this.finishNode(i,\"TSNonNullExpression\")}if(this.isRelational(\"<\")){const n=this.tsTryParseAndCatch(()=>{if(!i&&this.atPossibleAsyncArrow(t)){const t=this.tsTryParseGenericAsyncArrowFunction(e,s);if(t)return t}const n=this.startNodeAt(e,s);n.callee=t;const a=this.tsParseTypeArguments();if(a){if(!i&&this.eat(d.parenL))return n.arguments=this.parseCallExpressionArguments(d.parenR,!1),n.typeParameters=a,this.finishCallExpression(n,r.optionalChainMember);if(this.match(d.backQuote))return this.parseTaggedTemplateExpression(e,s,t,r,a)}this.unexpected()});if(n)return n}return super.parseSubscript(t,e,s,i,r)}parseNewArguments(t){if(this.isRelational(\"<\")){const e=this.tsTryParseAndCatch(()=>{const t=this.tsParseTypeArguments();return this.match(d.parenL)||this.unexpected(),t});e&&(t.typeParameters=e)}super.parseNewArguments(t)}parseExprOp(t,e,s,i,r){if(le(d._in.binop)>i&&!this.hasPrecedingLineBreak()&&this.isContextual(\"as\")){const n=this.startNodeAt(e,s);n.expression=t;const a=this.tsTryNextParseConstantContext();return n.typeAnnotation=a||this.tsNextThenParseType(),this.finishNode(n,\"TSAsExpression\"),this.parseExprOp(n,e,s,i,r)}return super.parseExprOp(t,e,s,i,r)}checkReservedWord(t,e,s,i){}checkDuplicateExports(){}parseImport(t){if(this.match(d.name)||this.match(d.star)||this.match(d.braceL)){const e=this.lookahead();if(this.match(d.name)&&e.type===d.eq)return this.tsParseImportEqualsDeclaration(t);!this.isContextual(\"type\")||e.type===d.comma||e.type===d.name&&\"from\"===e.value?t.importKind=\"value\":(t.importKind=\"type\",this.next())}const e=super.parseImport(t);return\"type\"===e.importKind&&e.specifiers.length>1&&\"ImportDefaultSpecifier\"===e.specifiers[0].type&&this.raise(e.start,\"A type-only import can specify a default import or named bindings, but not both.\"),e}parseExport(t){if(this.match(d._import))return this.expect(d._import),this.tsParseImportEqualsDeclaration(t,!0);if(this.eat(d.eq)){const e=t;return e.expression=this.parseExpression(),this.semicolon(),this.finishNode(e,\"TSExportAssignment\")}if(this.eatContextual(\"as\")){const e=t;return this.expectContextual(\"namespace\"),e.id=this.parseIdentifier(),this.semicolon(),this.finishNode(e,\"TSNamespaceExportDeclaration\")}return this.isContextual(\"type\")&&this.lookahead().type===d.braceL?(this.next(),t.exportKind=\"type\"):t.exportKind=\"value\",super.parseExport(t)}isAbstractClass(){return this.isContextual(\"abstract\")&&this.lookahead().type===d._class}parseExportDefaultExpression(){if(this.isAbstractClass()){const t=this.startNode();return this.next(),this.parseClass(t,!0,!0),t.abstract=!0,t}if(\"interface\"===this.state.value){const t=this.tsParseDeclaration(this.startNode(),this.state.value,!0);if(t)return t}return super.parseExportDefaultExpression()}parseStatementContent(t,e){if(this.state.type===d._const){const t=this.lookahead();if(t.type===d.name&&\"enum\"===t.value){const t=this.startNode();return this.expect(d._const),this.expectContextual(\"enum\"),this.tsParseEnumDeclaration(t,!0)}}return super.parseStatementContent(t,e)}parseAccessModifier(){return this.tsParseModifier([\"public\",\"protected\",\"private\"])}parseClassMember(t,e,s,i){this.tsParseModifiers(e,[\"declare\"]);const r=this.parseAccessModifier();r&&(e.accessibility=r),this.tsParseModifiers(e,[\"declare\"]),super.parseClassMember(t,e,s,i)}parseClassMemberWithIsStatic(t,e,s,i,r){this.tsParseModifiers(e,[\"abstract\",\"readonly\",\"declare\"]);const n=this.tsTryParseIndexSignature(e);if(n)return t.body.push(n),e.abstract&&this.raise(e.start,ue.IndexSignatureHasAbstract),i&&this.raise(e.start,ue.IndexSignatureHasStatic),void(e.accessibility&&this.raise(e.start,ue.IndexSignatureHasAccessibility,e.accessibility));super.parseClassMemberWithIsStatic(t,e,s,i,r)}parsePostMemberNameModifiers(t){const e=this.eat(d.question);e&&(t.optional=!0),t.readonly&&this.match(d.parenL)&&this.raise(t.start,ue.ClassMethodHasReadonly),t.declare&&this.match(d.parenL)&&this.raise(t.start,ue.ClassMethodHasDeclare)}parseExpressionStatement(t,e){const s=\"Identifier\"===e.type?this.tsParseExpressionStatement(t,e):void 0;return s||super.parseExpressionStatement(t,e)}shouldParseExportDeclaration(){return!!this.tsIsDeclarationStart()||super.shouldParseExportDeclaration()}parseConditional(t,e,s,i,r){if(!r||!this.match(d.question))return super.parseConditional(t,e,s,i,r);const n=this.tryParse(()=>super.parseConditional(t,e,s,i));return n.node?(n.error&&(this.state=n.failState),n.node):(r.start=n.error.pos||this.state.start,t)}parseParenItem(t,e,s){if(t=super.parseParenItem(t,e,s),this.eat(d.question)&&(t.optional=!0,this.resetEndLocation(t)),this.match(d.colon)){const i=this.startNodeAt(e,s);return i.expression=t,i.typeAnnotation=this.tsParseTypeAnnotation(),this.finishNode(i,\"TSTypeCastExpression\")}return t}parseExportDeclaration(t){const e=this.state.start,s=this.state.startLoc,i=this.eatContextual(\"declare\");let r;return this.match(d.name)&&(r=this.tsTryParseExportDeclaration()),r||(r=super.parseExportDeclaration(t)),r&&(\"TSInterfaceDeclaration\"===r.type||\"TSTypeAliasDeclaration\"===r.type||i)&&(t.exportKind=\"type\"),r&&i&&(this.resetStartLocation(r,e,s),r.declare=!0),r}parseClassId(t,e,s){if((!e||s)&&this.isContextual(\"implements\"))return;super.parseClassId(t,e,s,t.declare?q:L);const i=this.tsTryParseTypeParameters();i&&(t.typeParameters=i)}parseClassPropertyAnnotation(t){!t.optional&&this.eat(d.bang)&&(t.definite=!0);const e=this.tsTryParseTypeAnnotation();e&&(t.typeAnnotation=e)}parseClassProperty(t){return this.parseClassPropertyAnnotation(t),t.declare&&this.match(d.equal)&&this.raise(this.state.start,ue.DeclareClassFieldHasInitializer),super.parseClassProperty(t)}parseClassPrivateProperty(t){return t.abstract&&this.raise(t.start,ue.PrivateElementHasAbstract),t.accessibility&&this.raise(t.start,ue.PrivateElementHasAccessibility,t.accessibility),this.parseClassPropertyAnnotation(t),super.parseClassPrivateProperty(t)}pushClassMethod(t,e,s,i,r,n){const a=this.tsTryParseTypeParameters();a&&(e.typeParameters=a),super.pushClassMethod(t,e,s,i,r,n)}pushClassPrivateMethod(t,e,s,i){const r=this.tsTryParseTypeParameters();r&&(e.typeParameters=r),super.pushClassPrivateMethod(t,e,s,i)}parseClassSuper(t){super.parseClassSuper(t),t.superClass&&this.isRelational(\"<\")&&(t.superTypeParameters=this.tsParseTypeArguments()),this.eatContextual(\"implements\")&&(t.implements=this.tsParseHeritageClause(\"implements\"))}parseObjPropValue(t,...e){const s=this.tsTryParseTypeParameters();s&&(t.typeParameters=s),super.parseObjPropValue(t,...e)}parseFunctionParams(t,e){const s=this.tsTryParseTypeParameters();s&&(t.typeParameters=s),super.parseFunctionParams(t,e)}parseVarId(t,e){super.parseVarId(t,e),\"Identifier\"===t.id.type&&this.eat(d.bang)&&(t.definite=!0);const s=this.tsTryParseTypeAnnotation();s&&(t.id.typeAnnotation=s,this.resetEndLocation(t.id))}parseAsyncArrowFromCallExpression(t,e){return this.match(d.colon)&&(t.returnType=this.tsParseTypeAnnotation()),super.parseAsyncArrowFromCallExpression(t,e)}parseMaybeAssign(...t){var e,s,i,r,n,a,o;let c,h,l,p;if(this.match(d.jsxTagStart)){if(c=this.state.clone(),h=this.tryParse(()=>super.parseMaybeAssign(...t),c),!h.error)return h.node;const{context:e}=this.state;e[e.length-1]===gt.j_oTag?e.length-=2:e[e.length-1]===gt.j_expr&&(e.length-=1)}if(!(null==(e=h)?void 0:e.error)&&!this.isRelational(\"<\"))return super.parseMaybeAssign(...t);c=c||this.state.clone();const u=this.tryParse(e=>{var s;p=this.tsParseTypeParameters();const i=super.parseMaybeAssign(...t);return(\"ArrowFunctionExpression\"!==i.type||i.extra&&i.extra.parenthesized)&&e(),0!==(null==(s=p)?void 0:s.params.length)&&this.resetStartLocationFromNode(i,p),i.typeParameters=p,i},c);if(!u.error&&!u.aborted)return u.node;if(!h&&(pe(!this.hasPlugin(\"jsx\")),l=this.tryParse(()=>super.parseMaybeAssign(...t),c),!l.error))return l.node;if(null==(s=h)?void 0:s.node)return this.state=h.failState,h.node;if(u.node)return this.state=u.failState,u.node;if(null==(i=l)?void 0:i.node)return this.state=l.failState,l.node;if(null==(r=h)?void 0:r.thrown)throw h.error;if(u.thrown)throw u.error;if(null==(n=l)?void 0:n.thrown)throw l.error;throw(null==(a=h)?void 0:a.error)||u.error||(null==(o=l)?void 0:o.error)}parseMaybeUnary(t){return!this.hasPlugin(\"jsx\")&&this.isRelational(\"<\")?this.tsParseTypeAssertion():super.parseMaybeUnary(t)}parseArrow(t){if(this.match(d.colon)){const e=this.tryParse(t=>{const e=this.tsParseTypeOrTypePredicateAnnotation(d.colon);return!this.canInsertSemicolon()&&this.match(d.arrow)||t(),e});if(e.aborted)return;e.thrown||(e.error&&(this.state=e.failState),t.returnType=e.node)}return super.parseArrow(t)}parseAssignableListItemTypes(t){this.eat(d.question)&&(\"Identifier\"!==t.type&&this.raise(t.start,ue.PatternIsOptional),t.optional=!0);const e=this.tsTryParseTypeAnnotation();return e&&(t.typeAnnotation=e),this.resetEndLocation(t),t}toAssignable(t){switch(t.type){case\"TSTypeCastExpression\":return super.toAssignable(this.typeCastToParameter(t));case\"TSParameterProperty\":return super.toAssignable(t);case\"TSAsExpression\":case\"TSNonNullExpression\":case\"TSTypeAssertion\":return t.expression=this.toAssignable(t.expression),t;default:return super.toAssignable(t)}}checkLVal(t,e=V,s,i){switch(t.type){case\"TSTypeCastExpression\":return;case\"TSParameterProperty\":return void this.checkLVal(t.parameter,e,s,\"parameter property\");case\"TSAsExpression\":case\"TSNonNullExpression\":case\"TSTypeAssertion\":return void this.checkLVal(t.expression,e,s,i);default:return void super.checkLVal(t,e,s,i)}}parseBindingAtom(){switch(this.state.type){case d._this:return this.parseIdentifier(!0);default:return super.parseBindingAtom()}}parseMaybeDecoratorArguments(t){if(this.isRelational(\"<\")){const e=this.tsParseTypeArguments();if(this.match(d.parenL)){const s=super.parseMaybeDecoratorArguments(t);return s.typeParameters=e,s}this.unexpected(this.state.start,d.parenL)}return super.parseMaybeDecoratorArguments(t)}isClassMethod(){return this.isRelational(\"<\")||super.isClassMethod()}isClassProperty(){return this.match(d.bang)||this.match(d.colon)||super.isClassProperty()}parseMaybeDefault(...t){const e=super.parseMaybeDefault(...t);return\"AssignmentPattern\"===e.type&&e.typeAnnotation&&e.right.start<e.typeAnnotation.start&&this.raise(e.typeAnnotation.start,ue.TypeAnnotationAfterAssign),e}getTokenFromCode(t){return!this.state.inType||62!==t&&60!==t?super.getTokenFromCode(t):this.finishOp(d.relational,1)}toAssignableList(t){for(let e=0;e<t.length;e++){const s=t[e];if(s)switch(s.type){case\"TSTypeCastExpression\":t[e]=this.typeCastToParameter(s);break;case\"TSAsExpression\":case\"TSTypeAssertion\":this.state.maybeInArrowParameters?this.raise(s.start,ue.UnexpectedTypeCastInParameter):t[e]=this.typeCastToParameter(s);break}}return super.toAssignableList(...arguments)}typeCastToParameter(t){return t.expression.typeAnnotation=t.typeAnnotation,this.resetEndLocation(t.expression,t.typeAnnotation.end,t.typeAnnotation.loc.end),t.expression}toReferencedList(t,e){for(let s=0;s<t.length;s++){const e=t[s];\"TSTypeCastExpression\"===(null==e?void 0:e.type)&&this.raise(e.start,ue.UnexpectedTypeAnnotation)}return t}shouldParseArrow(){return this.match(d.colon)||super.shouldParseArrow()}shouldParseAsyncArrow(){return this.match(d.colon)||super.shouldParseAsyncArrow()}canHaveLeadingDecorator(){return super.canHaveLeadingDecorator()||this.isAbstractClass()}jsxParseOpeningElementAfterName(t){if(this.isRelational(\"<\")){const e=this.tsTryParseAndCatch(()=>this.tsParseTypeArguments());e&&(t.typeParameters=e)}return super.jsxParseOpeningElementAfterName(t)}getGetterSetterExpectedParamCount(t){const e=super.getGetterSetterExpectedParamCount(t),s=t.params[0],i=s&&\"Identifier\"===s.type&&\"this\"===s.name;return i?e+1:e}};d.placeholder=new h(\"%%\",{startsExpr:!0});var me=t=>class extends t{parsePlaceholder(t){if(this.match(d.placeholder)){const e=this.startNode();return this.next(),this.assertNoSpace(\"Unexpected space in placeholder.\"),e.name=super.parseIdentifier(!0),this.assertNoSpace(\"Unexpected space in placeholder.\"),this.expect(d.placeholder),this.finishPlaceholder(e,t)}}finishPlaceholder(t,e){const s=!(!t.expectedNode||\"Placeholder\"!==t.type);return t.expectedNode=e,s?t:this.finishNode(t,\"Placeholder\")}getTokenFromCode(t){return 37===t&&37===this.input.charCodeAt(this.state.pos+1)?this.finishOp(d.placeholder,2):super.getTokenFromCode(...arguments)}parseExprAtom(){return this.parsePlaceholder(\"Expression\")||super.parseExprAtom(...arguments)}parseIdentifier(){return this.parsePlaceholder(\"Identifier\")||super.parseIdentifier(...arguments)}checkReservedWord(t){void 0!==t&&super.checkReservedWord(...arguments)}parseBindingAtom(){return this.parsePlaceholder(\"Pattern\")||super.parseBindingAtom(...arguments)}checkLVal(t){\"Placeholder\"!==t.type&&super.checkLVal(...arguments)}toAssignable(t){return t&&\"Placeholder\"===t.type&&\"Expression\"===t.expectedNode?(t.expectedNode=\"Pattern\",t):super.toAssignable(...arguments)}verifyBreakContinue(t){t.label&&\"Placeholder\"===t.label.type||super.verifyBreakContinue(...arguments)}parseExpressionStatement(t,e){if(\"Placeholder\"!==e.type||e.extra&&e.extra.parenthesized)return super.parseExpressionStatement(...arguments);if(this.match(d.colon)){const s=t;return s.label=this.finishPlaceholder(e,\"Identifier\"),this.next(),s.body=this.parseStatement(\"label\"),this.finishNode(s,\"LabeledStatement\")}return this.semicolon(),t.name=e.name,this.finishPlaceholder(t,\"Statement\")}parseBlock(){return this.parsePlaceholder(\"BlockStatement\")||super.parseBlock(...arguments)}parseFunctionId(){return this.parsePlaceholder(\"Identifier\")||super.parseFunctionId(...arguments)}parseClass(t,e,s){const i=e?\"ClassDeclaration\":\"ClassExpression\";this.next(),this.takeDecorators(t);const r=this.parsePlaceholder(\"Identifier\");if(r)if(this.match(d._extends)||this.match(d.placeholder)||this.match(d.braceL))t.id=r;else{if(s||!e)return t.id=null,t.body=this.finishPlaceholder(r,\"ClassBody\"),this.finishNode(t,i);this.unexpected(null,\"A class name is required\")}else this.parseClassId(t,e,s);return this.parseClassSuper(t),t.body=this.parsePlaceholder(\"ClassBody\")||this.parseClassBody(!!t.superClass),this.finishNode(t,i)}parseExport(t){const e=this.parsePlaceholder(\"Identifier\");if(!e)return super.parseExport(...arguments);if(!this.isContextual(\"from\")&&!this.match(d.comma))return t.specifiers=[],t.source=null,t.declaration=this.finishPlaceholder(e,\"Declaration\"),this.finishNode(t,\"ExportNamedDeclaration\");this.expectPlugin(\"exportDefaultFrom\");const s=this.startNode();return s.exported=e,t.specifiers=[this.finishNode(s,\"ExportDefaultSpecifier\")],super.parseExport(t)}isExportDefaultSpecifier(){if(this.match(d._default)){const t=this.nextTokenStart();if(this.isUnparsedContextual(t,\"from\")&&this.input.startsWith(d.placeholder.label,this.nextTokenStartSince(t+4)))return!0}return super.isExportDefaultSpecifier()}maybeParseExportDefaultSpecifier(t){return!!(t.specifiers&&t.specifiers.length>0)||super.maybeParseExportDefaultSpecifier(...arguments)}checkExport(t){const{specifiers:e}=t;(null==e?void 0:e.length)&&(t.specifiers=e.filter(t=>\"Placeholder\"===t.exported.type)),super.checkExport(t),t.specifiers=e}parseImport(t){const e=this.parsePlaceholder(\"Identifier\");if(!e)return super.parseImport(...arguments);if(t.specifiers=[],!this.isContextual(\"from\")&&!this.match(d.comma))return t.source=this.finishPlaceholder(e,\"StringLiteral\"),this.semicolon(),this.finishNode(t,\"ImportDeclaration\");const s=this.startNodeAtNode(e);if(s.local=e,this.finishNode(s,\"ImportDefaultSpecifier\"),t.specifiers.push(s),this.eat(d.comma)){const e=this.maybeParseStarImportSpecifier(t);e||this.parseNamedImportSpecifiers(t)}return this.expectContextual(\"from\"),t.source=this.parseImportSource(),this.semicolon(),this.finishNode(t,\"ImportDeclaration\")}parseImportSource(){return this.parsePlaceholder(\"StringLiteral\")||super.parseImportSource(...arguments)}},ye=t=>class extends t{parseV8Intrinsic(){if(this.match(d.modulo)){const t=this.state.start,e=this.startNode();if(this.eat(d.modulo),this.match(d.name)){const t=this.parseIdentifierName(this.state.start),s=this.createIdentifier(e,t);if(s.type=\"V8IntrinsicIdentifier\",this.match(d.parenL))return s}this.unexpected(t)}}parseExprAtom(){return this.parseV8Intrinsic()||super.parseExprAtom(...arguments)}};function ge(t,e){return t.some(t=>Array.isArray(t)?t[0]===e:t===e)}function xe(t,e,s){const i=t.find(t=>Array.isArray(t)?t[0]===e:t===e);return i&&Array.isArray(i)?i[1][s]:null}const be=[\"minimal\",\"smart\",\"fsharp\"],ve=[\"hash\",\"bar\"];function we(t){if(ge(t,\"decorators\")){if(ge(t,\"decorators-legacy\"))throw new Error(\"Cannot use the decorators and decorators-legacy plugin together\");const e=xe(t,\"decorators\",\"decoratorsBeforeExport\");if(null==e)throw new Error(\"The 'decorators' plugin requires a 'decoratorsBeforeExport' option, whose value must be a boolean. If you are migrating from Babylon/Babel 6 or want to use the old decorators proposal, you should use the 'decorators-legacy' plugin instead of 'decorators'.\");if(\"boolean\"!==typeof e)throw new Error(\"'decoratorsBeforeExport' must be a boolean.\")}if(ge(t,\"flow\")&&ge(t,\"typescript\"))throw new Error(\"Cannot combine flow and typescript plugins.\");if(ge(t,\"placeholders\")&&ge(t,\"v8intrinsic\"))throw new Error(\"Cannot combine placeholders and v8intrinsic plugins.\");if(ge(t,\"pipelineOperator\")&&!be.includes(xe(t,\"pipelineOperator\",\"proposal\")))throw new Error(\"'pipelineOperator' requires 'proposal' option whose value should be one of: \"+be.map(t=>`'${t}'`).join(\", \"));if(ge(t,\"moduleAttributes\")){const e=xe(t,\"moduleAttributes\",\"version\");if(\"may-2020\"!==e)throw new Error(\"The 'moduleAttributes' plugin requires a 'version' option, representing the last proposal update. Currently, the only supported value is 'may-2020'.\")}if(ge(t,\"recordAndTuple\")&&!ve.includes(xe(t,\"recordAndTuple\",\"syntaxType\")))throw new Error(\"'recordAndTuple' requires 'syntaxType' option whose value should be one of: \"+ve.map(t=>`'${t}'`).join(\", \"))}const Pe={estree:mt,jsx:Zt,flow:Kt,typescript:fe,v8intrinsic:ye,placeholders:me},Te=Object.keys(Pe),Ee={sourceType:\"script\",sourceFilename:void 0,startLine:1,allowAwaitOutsideFunction:!1,allowReturnOutsideFunction:!1,allowImportExportEverywhere:!1,allowSuperOutsideMethod:!1,allowUndeclaredExports:!1,plugins:[],strictMode:null,ranges:!1,tokens:!1,createParenthesizedExpressions:!1,errorRecovery:!1};function Ae(t){const e={};for(let s=0,i=Object.keys(Ee);s<i.length;s++){const r=i[s];e[r]=t&&null!=t[r]?t[r]:Ee[r]}return e}class Se{constructor(){this.errors=[],this.potentialArrowAt=-1,this.noArrowAt=[],this.noArrowParamsConversionAt=[],this.inParameters=!1,this.maybeInArrowParameters=!1,this.maybeInAsyncArrowHead=!1,this.inPipeline=!1,this.inType=!1,this.noAnonFunctionType=!1,this.inPropertyName=!1,this.hasFlowComment=!1,this.isIterator=!1,this.topicContext={maxNumOfResolvableTopics:0,maxTopicIndex:null},this.soloAwait=!1,this.inFSharpPipelineDirectBody=!1,this.labels=[],this.decoratorStack=[[]],this.yieldPos=-1,this.awaitPos=-1,this.comments=[],this.trailingComments=[],this.leadingComments=[],this.commentStack=[],this.commentPreviousNode=null,this.pos=0,this.lineStart=0,this.type=d.eof,this.value=null,this.start=0,this.end=0,this.lastTokEndLoc=null,this.lastTokStartLoc=null,this.lastTokStart=0,this.lastTokEnd=0,this.context=[gt.braceStatement],this.exprAllowed=!0,this.containsEsc=!1,this.octalPositions=[],this.exportedIdentifiers=[],this.tokensLength=0}init(t){this.strict=!1!==t.strictMode&&\"module\"===t.sourceType,this.curLine=t.startLine,this.startLoc=this.endLoc=this.curPosition()}curPosition(){return new at(this.curLine,this.pos-this.lineStart)}clone(t){const e=new Se,s=Object.keys(this);for(let i=0,r=s.length;i<r;i++){const r=s[i];let n=this[r];!t&&Array.isArray(n)&&(n=n.slice()),e[r]=n}return e}}var Ce=function(t){return t>=48&&t<=57};const ke=new Set([\"g\",\"m\",\"s\",\"i\",\"y\",\"u\"]),Ne={decBinOct:[46,66,69,79,95,98,101,111],hex:[46,88,95,120]},Ie={bin:[48,49]};Ie.oct=[...Ie.bin,50,51,52,53,54,55],Ie.dec=[...Ie.oct,56,57],Ie.hex=[...Ie.dec,65,66,67,68,69,70,97,98,99,100,101,102];class Oe{constructor(t){this.type=t.type,this.value=t.value,this.start=t.start,this.end=t.end,this.loc=new ot(t.startLoc,t.endLoc)}}class De extends dt{constructor(t,e){super(),this.tokens=[],this.state=new Se,this.state.init(t),this.input=e,this.length=e.length,this.isLookahead=!1}pushToken(t){this.tokens.length=this.state.tokensLength,this.tokens.push(t),++this.state.tokensLength}next(){this.isLookahead||(this.checkKeywordEscapes(),this.options.tokens&&this.pushToken(new Oe(this.state))),this.state.lastTokEnd=this.state.end,this.state.lastTokStart=this.state.start,this.state.lastTokEndLoc=this.state.endLoc,this.state.lastTokStartLoc=this.state.startLoc,this.nextToken()}eat(t){return!!this.match(t)&&(this.next(),!0)}match(t){return this.state.type===t}lookahead(){const t=this.state;this.state=t.clone(!0),this.isLookahead=!0,this.next(),this.isLookahead=!1;const e=this.state;return this.state=t,e}nextTokenStart(){return this.nextTokenStartSince(this.state.pos)}nextTokenStartSince(t){rt.lastIndex=t;const e=rt.exec(this.input);return t+e[0].length}lookaheadCharCode(){return this.input.charCodeAt(this.nextTokenStart())}setStrict(t){if(this.state.strict=t,this.match(d.num)||this.match(d.string)){this.state.pos=this.state.start;while(this.state.pos<this.state.lineStart)this.state.lineStart=this.input.lastIndexOf(\"\\n\",this.state.lineStart-2)+1,--this.state.curLine;this.nextToken()}}curContext(){return this.state.context[this.state.context.length-1]}nextToken(){const t=this.curContext();if((null==t?void 0:t.preserveSpace)||this.skipSpace(),this.state.octalPositions=[],this.state.start=this.state.pos,this.state.startLoc=this.state.curPosition(),this.state.pos>=this.length)return void this.finishToken(d.eof);const e=null==t?void 0:t.override;e?e(this):this.getTokenFromCode(this.input.codePointAt(this.state.pos))}pushComment(t,e,s,i,r,n){const a={type:t?\"CommentBlock\":\"CommentLine\",value:e,start:s,end:i,loc:new ot(r,n)};this.options.tokens&&this.pushToken(a),this.state.comments.push(a),this.addComment(a)}skipBlockComment(){const t=this.state.curPosition(),e=this.state.pos,s=this.input.indexOf(\"*/\",this.state.pos+2);if(-1===s)throw this.raise(e,ut.UnterminatedComment);let i;this.state.pos=s+2,st.lastIndex=e;while((i=st.exec(this.input))&&i.index<this.state.pos)++this.state.curLine,this.state.lineStart=i.index+i[0].length;this.isLookahead||this.pushComment(!0,this.input.slice(e+2,s),e,this.state.pos,t,this.state.curPosition())}skipLineComment(t){const e=this.state.pos,s=this.state.curPosition();let i=this.input.charCodeAt(this.state.pos+=t);if(this.state.pos<this.length)while(!it(i)&&++this.state.pos<this.length)i=this.input.charCodeAt(this.state.pos);this.isLookahead||this.pushComment(!1,this.input.slice(e+t,this.state.pos),e,this.state.pos,s,this.state.curPosition())}skipSpace(){t:while(this.state.pos<this.length){const t=this.input.charCodeAt(this.state.pos);switch(t){case 32:case 160:case 9:++this.state.pos;break;case 13:10===this.input.charCodeAt(this.state.pos+1)&&++this.state.pos;case 10:case 8232:case 8233:++this.state.pos,++this.state.curLine,this.state.lineStart=this.state.pos;break;case 47:switch(this.input.charCodeAt(this.state.pos+1)){case 42:this.skipBlockComment();break;case 47:this.skipLineComment(2);break;default:break t}break;default:if(!nt(t))break t;++this.state.pos}}}finishToken(t,e){this.state.end=this.state.pos,this.state.endLoc=this.state.curPosition();const s=this.state.type;this.state.type=t,this.state.value=e,this.isLookahead||this.updateContext(s)}readToken_numberSign(){if(0===this.state.pos&&this.readToken_interpreter())return;const t=this.state.pos+1,e=this.input.charCodeAt(t);if(e>=48&&e<=57)throw this.raise(this.state.pos,ut.UnexpectedDigitAfterHash);if(123===e||91===e&&this.hasPlugin(\"recordAndTuple\")){if(this.expectPlugin(\"recordAndTuple\"),\"hash\"!==this.getPluginOption(\"recordAndTuple\",\"syntaxType\"))throw this.raise(this.state.pos,123===e?ut.RecordExpressionHashIncorrectStartSyntaxType:ut.TupleExpressionHashIncorrectStartSyntaxType);123===e?this.finishToken(d.braceHashL):this.finishToken(d.bracketHashL),this.state.pos+=2}else this.finishOp(d.hash,1)}readToken_dot(){const t=this.input.charCodeAt(this.state.pos+1);t>=48&&t<=57?this.readNumber(!0):46===t&&46===this.input.charCodeAt(this.state.pos+2)?(this.state.pos+=3,this.finishToken(d.ellipsis)):(++this.state.pos,this.finishToken(d.dot))}readToken_slash(){if(this.state.exprAllowed&&!this.state.inType)return++this.state.pos,void this.readRegexp();const t=this.input.charCodeAt(this.state.pos+1);61===t?this.finishOp(d.assign,2):this.finishOp(d.slash,1)}readToken_interpreter(){if(0!==this.state.pos||this.length<2)return!1;let t=this.input.charCodeAt(this.state.pos+1);if(33!==t)return!1;const e=this.state.pos;this.state.pos+=1;while(!it(t)&&++this.state.pos<this.length)t=this.input.charCodeAt(this.state.pos);const s=this.input.slice(e+2,this.state.pos);return this.finishToken(d.interpreterDirective,s),!0}readToken_mult_modulo(t){let e=42===t?d.star:d.modulo,s=1,i=this.input.charCodeAt(this.state.pos+1);const r=this.state.exprAllowed;42===t&&42===i&&(s++,i=this.input.charCodeAt(this.state.pos+2),e=d.exponent),61!==i||r||(s++,e=d.assign),this.finishOp(e,s)}readToken_pipe_amp(t){const e=this.input.charCodeAt(this.state.pos+1);if(e!==t){if(124===t){if(62===e)return void this.finishOp(d.pipeline,2);if(this.hasPlugin(\"recordAndTuple\")&&125===e){if(\"bar\"!==this.getPluginOption(\"recordAndTuple\",\"syntaxType\"))throw this.raise(this.state.pos,ut.RecordExpressionBarIncorrectEndSyntaxType);return void this.finishOp(d.braceBarR,2)}if(this.hasPlugin(\"recordAndTuple\")&&93===e){if(\"bar\"!==this.getPluginOption(\"recordAndTuple\",\"syntaxType\"))throw this.raise(this.state.pos,ut.TupleExpressionBarIncorrectEndSyntaxType);return void this.finishOp(d.bracketBarR,2)}}61!==e?this.finishOp(124===t?d.bitwiseOR:d.bitwiseAND,1):this.finishOp(d.assign,2)}else 61===this.input.charCodeAt(this.state.pos+2)?this.finishOp(d.assign,3):this.finishOp(124===t?d.logicalOR:d.logicalAND,2)}readToken_caret(){const t=this.input.charCodeAt(this.state.pos+1);61===t?this.finishOp(d.assign,2):this.finishOp(d.bitwiseXOR,1)}readToken_plus_min(t){const e=this.input.charCodeAt(this.state.pos+1);if(e===t)return 45!==e||this.inModule||62!==this.input.charCodeAt(this.state.pos+2)||0!==this.state.lastTokEnd&&!et.test(this.input.slice(this.state.lastTokEnd,this.state.pos))?void this.finishOp(d.incDec,2):(this.skipLineComment(3),this.skipSpace(),void this.nextToken());61===e?this.finishOp(d.assign,2):this.finishOp(d.plusMin,1)}readToken_lt_gt(t){const e=this.input.charCodeAt(this.state.pos+1);let s=1;return e===t?(s=62===t&&62===this.input.charCodeAt(this.state.pos+2)?3:2,61===this.input.charCodeAt(this.state.pos+s)?void this.finishOp(d.assign,s+1):void this.finishOp(d.bitShift,s)):33!==e||60!==t||this.inModule||45!==this.input.charCodeAt(this.state.pos+2)||45!==this.input.charCodeAt(this.state.pos+3)?(61===e&&(s=2),void this.finishOp(d.relational,s)):(this.skipLineComment(4),this.skipSpace(),void this.nextToken())}readToken_eq_excl(t){const e=this.input.charCodeAt(this.state.pos+1);if(61!==e)return 61===t&&62===e?(this.state.pos+=2,void this.finishToken(d.arrow)):void this.finishOp(61===t?d.eq:d.bang,1);this.finishOp(d.equality,61===this.input.charCodeAt(this.state.pos+2)?3:2)}readToken_question(){const t=this.input.charCodeAt(this.state.pos+1),e=this.input.charCodeAt(this.state.pos+2);63!==t||this.state.inType?46!==t||e>=48&&e<=57?(++this.state.pos,this.finishToken(d.question)):(this.state.pos+=2,this.finishToken(d.questionDot)):61===e?this.finishOp(d.assign,3):this.finishOp(d.nullishCoalescing,2)}getTokenFromCode(t){switch(t){case 46:return void this.readToken_dot();case 40:return++this.state.pos,void this.finishToken(d.parenL);case 41:return++this.state.pos,void this.finishToken(d.parenR);case 59:return++this.state.pos,void this.finishToken(d.semi);case 44:return++this.state.pos,void this.finishToken(d.comma);case 91:if(this.hasPlugin(\"recordAndTuple\")&&124===this.input.charCodeAt(this.state.pos+1)){if(\"bar\"!==this.getPluginOption(\"recordAndTuple\",\"syntaxType\"))throw this.raise(this.state.pos,ut.TupleExpressionBarIncorrectStartSyntaxType);this.finishToken(d.bracketBarL),this.state.pos+=2}else++this.state.pos,this.finishToken(d.bracketL);return;case 93:return++this.state.pos,void this.finishToken(d.bracketR);case 123:if(this.hasPlugin(\"recordAndTuple\")&&124===this.input.charCodeAt(this.state.pos+1)){if(\"bar\"!==this.getPluginOption(\"recordAndTuple\",\"syntaxType\"))throw this.raise(this.state.pos,ut.RecordExpressionBarIncorrectStartSyntaxType);this.finishToken(d.braceBarL),this.state.pos+=2}else++this.state.pos,this.finishToken(d.braceL);return;case 125:return++this.state.pos,void this.finishToken(d.braceR);case 58:return void(this.hasPlugin(\"functionBind\")&&58===this.input.charCodeAt(this.state.pos+1)?this.finishOp(d.doubleColon,2):(++this.state.pos,this.finishToken(d.colon)));case 63:return void this.readToken_question();case 96:return++this.state.pos,void this.finishToken(d.backQuote);case 48:{const t=this.input.charCodeAt(this.state.pos+1);if(120===t||88===t)return void this.readRadixNumber(16);if(111===t||79===t)return void this.readRadixNumber(8);if(98===t||66===t)return void this.readRadixNumber(2)}case 49:case 50:case 51:case 52:case 53:case 54:case 55:case 56:case 57:return void this.readNumber(!1);case 34:case 39:return void this.readString(t);case 47:return void this.readToken_slash();case 37:case 42:return void this.readToken_mult_modulo(t);case 124:case 38:return void this.readToken_pipe_amp(t);case 94:return void this.readToken_caret();case 43:case 45:return void this.readToken_plus_min(t);case 60:case 62:return void this.readToken_lt_gt(t);case 61:case 33:return void this.readToken_eq_excl(t);case 126:return void this.finishOp(d.tilde,1);case 64:return++this.state.pos,void this.finishToken(d.at);case 35:return void this.readToken_numberSign();case 92:return void this.readWord();default:if(At(t))return void this.readWord()}throw this.raise(this.state.pos,ut.InvalidOrUnexpectedToken,String.fromCodePoint(t))}finishOp(t,e){const s=this.input.slice(this.state.pos,this.state.pos+e);this.state.pos+=e,this.finishToken(t,s)}readRegexp(){const t=this.state.pos;let e,s;for(;;){if(this.state.pos>=this.length)throw this.raise(t,ut.UnterminatedRegExp);const i=this.input.charAt(this.state.pos);if(et.test(i))throw this.raise(t,ut.UnterminatedRegExp);if(e)e=!1;else{if(\"[\"===i)s=!0;else if(\"]\"===i&&s)s=!1;else if(\"/\"===i&&!s)break;e=\"\\\\\"===i}++this.state.pos}const i=this.input.slice(t,this.state.pos);++this.state.pos;let r=\"\";while(this.state.pos<this.length){const t=this.input[this.state.pos],e=this.input.codePointAt(this.state.pos);if(ke.has(t))r.indexOf(t)>-1&&this.raise(this.state.pos+1,ut.DuplicateRegExpFlags);else{if(!St(e)&&92!==e)break;this.raise(this.state.pos+1,ut.MalformedRegExpFlags)}++this.state.pos,r+=t}this.finishToken(d.regexp,{pattern:i,flags:r})}readInt(t,e,s,i=!0){const r=this.state.pos,n=16===t?Ne.hex:Ne.decBinOct,a=16===t?Ie.hex:10===t?Ie.dec:8===t?Ie.oct:Ie.bin;let o=!1,c=0;for(let h=0,l=null==e?1/0:e;h<l;++h){const e=this.input.charCodeAt(this.state.pos);let r;if(this.hasPlugin(\"numericSeparator\")&&95===e){const t=this.input.charCodeAt(this.state.pos-1),e=this.input.charCodeAt(this.state.pos+1);(-1===a.indexOf(e)||n.indexOf(t)>-1||n.indexOf(e)>-1||Number.isNaN(e))&&this.raise(this.state.pos,ut.UnexpectedNumericSeparator),i||this.raise(this.state.pos,ut.NumericSeparatorInEscapeSequence),++this.state.pos}else{if(r=e>=97?e-97+10:e>=65?e-65+10:Ce(e)?e-48:1/0,r>=t)if(this.options.errorRecovery&&r<=9)r=0,this.raise(this.state.start+h+2,ut.InvalidDigit,t);else{if(!s)break;r=0,o=!0}++this.state.pos,c=c*t+r}}return this.state.pos===r||null!=e&&this.state.pos-r!==e||o?null:c}readRadixNumber(t){const e=this.state.pos;let s=!1;this.state.pos+=2;const i=this.readInt(t);null==i&&this.raise(this.state.start+2,ut.InvalidDigit,t);const r=this.input.charCodeAt(this.state.pos);if(95===r&&this.expectPlugin(\"numericSeparator\",this.state.pos),110===r&&(++this.state.pos,s=!0),At(this.input.codePointAt(this.state.pos)))throw this.raise(this.state.pos,ut.NumberIdentifier);if(s){const t=this.input.slice(e,this.state.pos).replace(/[_n]/g,\"\");this.finishToken(d.bigint,t)}else this.finishToken(d.num,i)}readNumber(t){const e=this.state.pos;let s=!1,i=!1,r=!1;t||null!==this.readInt(10)||this.raise(e,ut.InvalidNumber);let n=this.state.pos-e>=2&&48===this.input.charCodeAt(e);n&&(this.state.strict&&this.raise(e,ut.StrictOctalLiteral),/[89]/.test(this.input.slice(e,this.state.pos))&&(n=!1,r=!0));let a=this.input.charCodeAt(this.state.pos);if(46!==a||n||(++this.state.pos,this.readInt(10),s=!0,a=this.input.charCodeAt(this.state.pos)),69!==a&&101!==a||n||(a=this.input.charCodeAt(++this.state.pos),43!==a&&45!==a||++this.state.pos,null===this.readInt(10)&&this.raise(e,ut.InvalidNumber),s=!0,a=this.input.charCodeAt(this.state.pos)),this.hasPlugin(\"numericSeparator\")&&(n||r)){const t=this.input.slice(e,this.state.pos).indexOf(\"_\");t>0&&this.raise(t+e,ut.ZeroDigitNumericSeparator)}if(95===a&&this.expectPlugin(\"numericSeparator\",this.state.pos),110===a&&((s||n||r)&&this.raise(e,ut.InvalidBigIntLiteral),++this.state.pos,i=!0),At(this.input.codePointAt(this.state.pos)))throw this.raise(this.state.pos,ut.NumberIdentifier);const o=this.input.slice(e,this.state.pos).replace(/[_n]/g,\"\");if(i)return void this.finishToken(d.bigint,o);const c=n?parseInt(o,8):parseFloat(o);this.finishToken(d.num,c)}readCodePoint(t){const e=this.input.charCodeAt(this.state.pos);let s;if(123===e){const e=++this.state.pos;if(s=this.readHexChar(this.input.indexOf(\"}\",this.state.pos)-this.state.pos,!0,t),++this.state.pos,null!==s&&s>1114111){if(!t)return null;this.raise(e,ut.InvalidCodePoint)}}else s=this.readHexChar(4,!1,t);return s}readString(t){let e=\"\",s=++this.state.pos;for(;;){if(this.state.pos>=this.length)throw this.raise(this.state.start,ut.UnterminatedString);const i=this.input.charCodeAt(this.state.pos);if(i===t)break;if(92===i)e+=this.input.slice(s,this.state.pos),e+=this.readEscapedChar(!1),s=this.state.pos;else if(8232===i||8233===i)++this.state.pos,++this.state.curLine,this.state.lineStart=this.state.pos;else{if(it(i))throw this.raise(this.state.start,ut.UnterminatedString);++this.state.pos}}e+=this.input.slice(s,this.state.pos++),this.finishToken(d.string,e)}readTmplToken(){let t=\"\",e=this.state.pos,s=!1;for(;;){if(this.state.pos>=this.length)throw this.raise(this.state.start,ut.UnterminatedTemplate);const i=this.input.charCodeAt(this.state.pos);if(96===i||36===i&&123===this.input.charCodeAt(this.state.pos+1))return this.state.pos===this.state.start&&this.match(d.template)?36===i?(this.state.pos+=2,void this.finishToken(d.dollarBraceL)):(++this.state.pos,void this.finishToken(d.backQuote)):(t+=this.input.slice(e,this.state.pos),void this.finishToken(d.template,s?null:t));if(92===i){t+=this.input.slice(e,this.state.pos);const i=this.readEscapedChar(!0);null===i?s=!0:t+=i,e=this.state.pos}else if(it(i)){switch(t+=this.input.slice(e,this.state.pos),++this.state.pos,i){case 13:10===this.input.charCodeAt(this.state.pos)&&++this.state.pos;case 10:t+=\"\\n\";break;default:t+=String.fromCharCode(i);break}++this.state.curLine,this.state.lineStart=this.state.pos,e=this.state.pos}else++this.state.pos}}readEscapedChar(t){const e=!t,s=this.input.charCodeAt(++this.state.pos);switch(++this.state.pos,s){case 110:return\"\\n\";case 114:return\"\\r\";case 120:{const t=this.readHexChar(2,!1,e);return null===t?null:String.fromCharCode(t)}case 117:{const t=this.readCodePoint(e);return null===t?null:String.fromCodePoint(t)}case 116:return\"\\t\";case 98:return\"\\b\";case 118:return\"\\v\";case 102:return\"\\f\";case 13:10===this.input.charCodeAt(this.state.pos)&&++this.state.pos;case 10:this.state.lineStart=this.state.pos,++this.state.curLine;case 8232:case 8233:return\"\";case 56:case 57:if(t)return null;default:if(s>=48&&s<=55){const e=this.state.pos-1,s=this.input.substr(this.state.pos-1,3).match(/^[0-7]+/);let i=s[0],r=parseInt(i,8);r>255&&(i=i.slice(0,-1),r=parseInt(i,8)),this.state.pos+=i.length-1;const n=this.input.charCodeAt(this.state.pos);if(\"0\"!==i||56===n||57===n){if(t)return null;this.state.strict?this.raise(e,ut.StrictOctalLiteral):this.state.octalPositions.push(e)}return String.fromCharCode(r)}return String.fromCharCode(s)}}readHexChar(t,e,s){const i=this.state.pos,r=this.readInt(16,t,e,!1);return null===r&&(s?this.raise(i,ut.InvalidEscapeSequence):this.state.pos=i-1),r}readWord1(){let t=\"\";this.state.containsEsc=!1;const e=this.state.pos;let s=this.state.pos;while(this.state.pos<this.length){const i=this.input.codePointAt(this.state.pos);if(St(i))this.state.pos+=i<=65535?1:2;else if(this.state.isIterator&&64===i)++this.state.pos;else{if(92!==i)break;{this.state.containsEsc=!0,t+=this.input.slice(s,this.state.pos);const i=this.state.pos,r=this.state.pos===e?At:St;if(117!==this.input.charCodeAt(++this.state.pos)){this.raise(this.state.pos,ut.MissingUnicodeEscape);continue}++this.state.pos;const n=this.readCodePoint(!0);null!==n&&(r(n)||this.raise(i,ut.EscapedCharNotAnIdentifier),t+=String.fromCodePoint(n)),s=this.state.pos}}}return t+this.input.slice(s,this.state.pos)}isIterator(t){return\"@@iterator\"===t||\"@@asyncIterator\"===t}readWord(){const t=this.readWord1(),e=l.get(t)||d.name;!this.state.isIterator||this.isIterator(t)&&this.state.inType||this.raise(this.state.pos,ut.InvalidIdentifier,t),this.finishToken(e,t)}checkKeywordEscapes(){const t=this.state.type.keyword;t&&this.state.containsEsc&&this.raise(this.state.start,ut.InvalidEscapedReservedWord,t)}braceIsBlock(t){const e=this.curContext();return e===gt.functionExpression||e===gt.functionStatement||(t!==d.colon||e!==gt.braceStatement&&e!==gt.braceExpression?t===d._return||t===d.name&&this.state.exprAllowed?et.test(this.input.slice(this.state.lastTokEnd,this.state.start)):t===d._else||t===d.semi||t===d.eof||t===d.parenR||t===d.arrow||(t===d.braceL?e===gt.braceStatement:t!==d._var&&t!==d._const&&t!==d.name&&(t===d.relational||!this.state.exprAllowed)):!e.isExpr)}updateContext(t){const e=this.state.type;let s;!e.keyword||t!==d.dot&&t!==d.questionDot?(s=e.updateContext)?s.call(this,t):this.state.exprAllowed=e.beforeExpr:this.state.exprAllowed=!1}}class Me extends De{addExtra(t,e,s){if(!t)return;const i=t.extra=t.extra||{};i[e]=s}isRelational(t){return this.match(d.relational)&&this.state.value===t}isLookaheadRelational(t){const e=this.nextTokenStart();if(this.input.charAt(e)===t){if(e+1===this.input.length)return!0;const s=this.input.charCodeAt(e+1);return s!==t.charCodeAt(0)&&61!==s}return!1}expectRelational(t){this.isRelational(t)?this.next():this.unexpected(null,d.relational)}isContextual(t){return this.match(d.name)&&this.state.value===t&&!this.state.containsEsc}isUnparsedContextual(t,e){const s=t+e.length;return this.input.slice(t,s)===e&&(s===this.input.length||!St(this.input.charCodeAt(s)))}isLookaheadContextual(t){const e=this.nextTokenStart();return this.isUnparsedContextual(e,t)}eatContextual(t){return this.isContextual(t)&&this.eat(d.name)}expectContextual(t,e){this.eatContextual(t)||this.unexpected(null,e)}canInsertSemicolon(){return this.match(d.eof)||this.match(d.braceR)||this.hasPrecedingLineBreak()}hasPrecedingLineBreak(){return et.test(this.input.slice(this.state.lastTokEnd,this.state.start))}isLineTerminator(){return this.eat(d.semi)||this.canInsertSemicolon()}semicolon(){this.isLineTerminator()||this.unexpected(null,d.semi)}expect(t,e){this.eat(t)||this.unexpected(e,t)}assertNoSpace(t=\"Unexpected space.\"){this.state.start>this.state.lastTokEnd&&this.raise(this.state.lastTokEnd,t)}unexpected(t,e=\"Unexpected token\"){throw\"string\"!==typeof e&&(e=`Unexpected token, expected \"${e.label}\"`),this.raise(null!=t?t:this.state.start,e)}expectPlugin(t,e){if(!this.hasPlugin(t))throw this.raiseWithData(null!=e?e:this.state.start,{missingPlugin:[t]},`This experimental syntax requires enabling the parser plugin: '${t}'`);return!0}expectOnePlugin(t,e){if(!t.some(t=>this.hasPlugin(t)))throw this.raiseWithData(null!=e?e:this.state.start,{missingPlugin:t},`This experimental syntax requires enabling one of the following parser plugin(s): '${t.join(\", \")}'`)}checkYieldAwaitInDefaultParams(){-1!==this.state.yieldPos&&(-1===this.state.awaitPos||this.state.yieldPos<this.state.awaitPos)&&this.raise(this.state.yieldPos,ut.YieldBindingIdentifier),-1!==this.state.awaitPos&&this.raise(this.state.awaitPos,ut.AwaitBindingIdentifier)}tryParse(t,e=this.state.clone()){const s={node:null};try{const i=t((t=null)=>{throw s.node=t,s});if(this.state.errors.length>e.errors.length){const t=this.state;return this.state=e,{node:i,error:t.errors[e.errors.length],thrown:!1,aborted:!1,failState:t}}return{node:i,error:null,thrown:!1,aborted:!1,failState:null}}catch(i){const t=this.state;if(this.state=e,i instanceof SyntaxError)return{node:null,error:i,thrown:!0,aborted:!1,failState:t};if(i===s)return{node:s.node,error:null,thrown:!1,aborted:!0,failState:t};throw i}}checkExpressionErrors(t,e){if(!t)return!1;const{shorthandAssign:s,doubleProto:i}=t;if(!e)return s>=0||i>=0;s>=0&&this.unexpected(s),i>=0&&this.raise(i,ut.DuplicateProto)}isLiteralPropertyName(){return this.match(d.name)||!!this.state.type.keyword||this.match(d.string)||this.match(d.num)||this.match(d.bigint)}}class Le{constructor(){this.shorthandAssign=-1,this.doubleProto=-1}}class _e{constructor(t,e,s){this.type=\"\",this.start=e,this.end=0,this.loc=new ot(s),(null==t?void 0:t.options.ranges)&&(this.range=[e,0]),(null==t?void 0:t.filename)&&(this.loc.filename=t.filename)}__clone(){const t=new _e,e=Object.keys(this);for(let s=0,i=e.length;s<i;s++){const i=e[s];\"leadingComments\"!==i&&\"trailingComments\"!==i&&\"innerComments\"!==i&&(t[i]=this[i])}return t}}class Re extends Me{startNode(){return new _e(this,this.state.start,this.state.startLoc)}startNodeAt(t,e){return new _e(this,t,e)}startNodeAtNode(t){return this.startNodeAt(t.start,t.loc.start)}finishNode(t,e){return this.finishNodeAt(t,e,this.state.lastTokEnd,this.state.lastTokEndLoc)}finishNodeAt(t,e,s,i){return t.type=e,t.end=s,t.loc.end=i,this.options.ranges&&(t.range[1]=s),this.processComment(t),t}resetStartLocation(t,e,s){t.start=e,t.loc.start=s,this.options.ranges&&(t.range[0]=e)}resetEndLocation(t,e=this.state.lastTokEnd,s=this.state.lastTokEndLoc){t.end=e,t.loc.end=s,this.options.ranges&&(t.range[1]=e)}resetStartLocationFromNode(t,e){this.resetStartLocation(t,e.start,e.loc.start)}}const je=t=>\"ParenthesizedExpression\"===t.type?je(t.expression):t;class Fe extends Re{toAssignable(t){var e,s;let i=void 0;switch((\"ParenthesizedExpression\"===t.type||(null==(e=t.extra)?void 0:e.parenthesized))&&(i=je(t),\"Identifier\"!==i.type&&\"MemberExpression\"!==i.type&&this.raise(t.start,ut.InvalidParenthesizedAssignment)),t.type){case\"Identifier\":case\"ObjectPattern\":case\"ArrayPattern\":case\"AssignmentPattern\":break;case\"ObjectExpression\":t.type=\"ObjectPattern\";for(let e=0,s=t.properties.length,i=s-1;e<s;e++){var r;const s=t.properties[e],n=e===i;this.toAssignableObjectExpressionProp(s,n),n&&\"RestElement\"===s.type&&(null==(r=t.extra)?void 0:r.trailingComma)&&this.raiseRestNotLast(t.extra.trailingComma)}break;case\"ObjectProperty\":this.toAssignable(t.value);break;case\"SpreadElement\":{this.checkToRestConversion(t),t.type=\"RestElement\";const e=t.argument;this.toAssignable(e);break}case\"ArrayExpression\":t.type=\"ArrayPattern\",this.toAssignableList(t.elements,null==(s=t.extra)?void 0:s.trailingComma);break;case\"AssignmentExpression\":\"=\"!==t.operator&&this.raise(t.left.end,ut.MissingEqInAssignment),t.type=\"AssignmentPattern\",delete t.operator,this.toAssignable(t.left);break;case\"ParenthesizedExpression\":this.toAssignable(i);break}return t}toAssignableObjectExpressionProp(t,e){if(\"ObjectMethod\"===t.type){const e=\"get\"===t.kind||\"set\"===t.kind?ut.PatternHasAccessor:ut.PatternHasMethod;this.raise(t.key.start,e)}else\"SpreadElement\"!==t.type||e?this.toAssignable(t):this.raiseRestNotLast(t.start)}toAssignableList(t,e){let s=t.length;if(s){const i=t[s-1];if(\"RestElement\"===(null==i?void 0:i.type))--s;else if(\"SpreadElement\"===(null==i?void 0:i.type)){i.type=\"RestElement\";const t=i.argument;this.toAssignable(t),\"Identifier\"!==t.type&&\"MemberExpression\"!==t.type&&\"ArrayPattern\"!==t.type&&\"ObjectPattern\"!==t.type&&this.unexpected(t.start),e&&this.raiseTrailingCommaAfterRest(e),--s}}for(let i=0;i<s;i++){const e=t[i];e&&(this.toAssignable(e),\"RestElement\"===e.type&&this.raiseRestNotLast(e.start))}return t}toReferencedList(t,e){return t}toReferencedListDeep(t,e){this.toReferencedList(t,e);for(let s=0;s<t.length;s++){const e=t[s];\"ArrayExpression\"===(null==e?void 0:e.type)&&this.toReferencedListDeep(e.elements)}}parseSpread(t,e){const s=this.startNode();return this.next(),s.argument=this.parseMaybeAssign(!1,t,void 0,e),this.finishNode(s,\"SpreadElement\")}parseRestBinding(){const t=this.startNode();return this.next(),t.argument=this.parseBindingAtom(),this.finishNode(t,\"RestElement\")}parseBindingAtom(){switch(this.state.type){case d.bracketL:{const t=this.startNode();return this.next(),t.elements=this.parseBindingList(d.bracketR,93,!0),this.finishNode(t,\"ArrayPattern\")}case d.braceL:return this.parseObj(d.braceR,!0)}return this.parseIdentifier()}parseBindingList(t,e,s,i){const r=[];let n=!0;while(!this.eat(t))if(n?n=!1:this.expect(d.comma),s&&this.match(d.comma))r.push(null);else{if(this.eat(t))break;if(this.match(d.ellipsis)){r.push(this.parseAssignableListItemTypes(this.parseRestBinding())),this.checkCommaAfterRest(e),this.expect(t);break}{const t=[];this.match(d.at)&&this.hasPlugin(\"decorators\")&&this.raise(this.state.start,ut.UnsupportedParameterDecorator);while(this.match(d.at))t.push(this.parseDecorator());r.push(this.parseAssignableListItem(i,t))}}return r}parseAssignableListItem(t,e){const s=this.parseMaybeDefault();this.parseAssignableListItemTypes(s);const i=this.parseMaybeDefault(s.start,s.loc.start,s);return e.length&&(s.decorators=e),i}parseAssignableListItemTypes(t){return t}parseMaybeDefault(t,e,s){if(e=e||this.state.startLoc,t=t||this.state.start,s=s||this.parseBindingAtom(),!this.eat(d.eq))return s;const i=this.startNodeAt(t,e);return i.left=s,i.right=this.parseMaybeAssign(),this.finishNode(i,\"AssignmentPattern\")}checkLVal(t,e=V,s,i,r,n=!1){switch(t.type){case\"Identifier\":if(this.state.strict&&(n?Lt(t.name,this.inModule):Mt(t.name))&&this.raise(t.start,e===V?ut.StrictEvalArguments:ut.StrictEvalArgumentsBinding,t.name),s){const e=\"_\"+t.name;s[e]?this.raise(t.start,ut.ParamDupe):s[e]=!0}r&&\"let\"===t.name&&this.raise(t.start,ut.LetInLexicalBinding),e&V||this.scope.declareName(t.name,e,t.start);break;case\"MemberExpression\":e!==V&&this.raise(t.start,ut.InvalidPropertyBindingPattern);break;case\"ObjectPattern\":for(let i=0,n=t.properties;i<n.length;i++){let t=n[i];if(\"ObjectProperty\"===t.type)t=t.value;else if(\"ObjectMethod\"===t.type)continue;this.checkLVal(t,e,s,\"object destructuring pattern\",r)}break;case\"ArrayPattern\":for(let i=0,n=t.elements;i<n.length;i++){const t=n[i];t&&this.checkLVal(t,e,s,\"array destructuring pattern\",r)}break;case\"AssignmentPattern\":this.checkLVal(t.left,e,s,\"assignment pattern\");break;case\"RestElement\":this.checkLVal(t.argument,e,s,\"rest element\");break;case\"ParenthesizedExpression\":this.checkLVal(t.expression,e,s,\"parenthesized expression\");break;default:this.raise(t.start,e===V?ut.InvalidLhs:ut.InvalidLhsBinding,i)}}checkToRestConversion(t){\"Identifier\"!==t.argument.type&&\"MemberExpression\"!==t.argument.type&&this.raise(t.argument.start,ut.InvalidRestAssignmentPattern)}checkCommaAfterRest(t){this.match(d.comma)&&(this.lookaheadCharCode()===t?this.raiseTrailingCommaAfterRest(this.state.start):this.raiseRestNotLast(this.state.start))}raiseRestNotLast(t){throw this.raise(t,ut.ElementAfterRest)}raiseTrailingCommaAfterRest(t){this.raise(t,ut.RestTrailingComma)}}class Be extends Fe{checkProto(t,e,s,i){if(\"SpreadElement\"===t.type||\"ObjectMethod\"===t.type||t.computed||t.shorthand)return;const r=t.key,n=\"Identifier\"===r.type?r.name:r.value;if(\"__proto__\"===n){if(e)return void this.raise(r.start,ut.RecordNoProto);s.used&&(i?-1===i.doubleProto&&(i.doubleProto=r.start):this.raise(r.start,ut.DuplicateProto)),s.used=!0}}getExpression(){let t=re;this.hasPlugin(\"topLevelAwait\")&&this.inModule&&(t|=ae),this.scope.enter(m),this.prodParam.enter(t),this.nextToken();const e=this.parseExpression();return this.match(d.eof)||this.unexpected(),e.comments=this.state.comments,e.errors=this.state.errors,e}parseExpression(t,e){const s=this.state.start,i=this.state.startLoc,r=this.parseMaybeAssign(t,e);if(this.match(d.comma)){const n=this.startNodeAt(s,i);n.expressions=[r];while(this.eat(d.comma))n.expressions.push(this.parseMaybeAssign(t,e));return this.toReferencedList(n.expressions),this.finishNode(n,\"SequenceExpression\")}return r}parseMaybeAssign(t,e,s,i){const r=this.state.start,n=this.state.startLoc;if(this.isContextual(\"yield\")){if(this.prodParam.hasYield){let e=this.parseYield(t);return s&&(e=s.call(this,e,r,n)),e}this.state.exprAllowed=!1}let a;e?a=!1:(e=new Le,a=!0),(this.match(d.parenL)||this.match(d.name))&&(this.state.potentialArrowAt=this.state.start);let o=this.parseMaybeConditional(t,e,i);if(s&&(o=s.call(this,o,r,n)),this.state.type.isAssign){const s=this.startNodeAt(r,n),i=this.state.value;return s.operator=i,\"??=\"===i&&this.expectPlugin(\"logicalAssignment\"),\"||=\"!==i&&\"&&=\"!==i||this.expectPlugin(\"logicalAssignment\"),this.match(d.eq)?(s.left=this.toAssignable(o),e.doubleProto=-1):s.left=o,e.shorthandAssign>=s.left.start&&(e.shorthandAssign=-1),this.checkLVal(o,void 0,void 0,\"assignment expression\"),this.next(),s.right=this.parseMaybeAssign(t),this.finishNode(s,\"AssignmentExpression\")}return a&&this.checkExpressionErrors(e,!0),o}parseMaybeConditional(t,e,s){const i=this.state.start,r=this.state.startLoc,n=this.state.potentialArrowAt,a=this.parseExprOps(t,e);return\"ArrowFunctionExpression\"===a.type&&a.start===n||this.checkExpressionErrors(e,!1)?a:this.parseConditional(a,t,i,r,s)}parseConditional(t,e,s,i,r){if(this.eat(d.question)){const r=this.startNodeAt(s,i);return r.test=t,r.consequent=this.parseMaybeAssign(),this.expect(d.colon),r.alternate=this.parseMaybeAssign(e),this.finishNode(r,\"ConditionalExpression\")}return t}parseExprOps(t,e){const s=this.state.start,i=this.state.startLoc,r=this.state.potentialArrowAt,n=this.parseMaybeUnary(e);return\"ArrowFunctionExpression\"===n.type&&n.start===r||this.checkExpressionErrors(e,!1)?n:this.parseExprOp(n,s,i,-1,t)}parseExprOp(t,e,s,i,r){let n=this.state.type.binop;if(null!=n&&(!r||!this.match(d._in))&&n>i){const a=this.state.value;if(\"|>\"===a&&this.state.inFSharpPipelineDirectBody)return t;const o=this.startNodeAt(e,s);o.left=t,o.operator=a,\"**\"!==a||\"UnaryExpression\"!==t.type||!this.options.createParenthesizedExpressions&&t.extra&&t.extra.parenthesized||this.raise(t.argument.start,ut.UnexpectedTokenUnaryExponentiation);const c=this.state.type,h=c===d.logicalOR||c===d.logicalAND,l=c===d.nullishCoalescing;if(c===d.pipeline?(this.expectPlugin(\"pipelineOperator\"),this.state.inPipeline=!0,this.checkPipelineAtInfixOperator(t,e)):l&&(n=d.logicalAND.binop),this.next(),c===d.pipeline&&\"minimal\"===this.getPluginOption(\"pipelineOperator\",\"proposal\")&&this.match(d.name)&&\"await\"===this.state.value&&this.prodParam.hasAwait)throw this.raise(this.state.start,ut.UnexpectedAwaitAfterPipelineBody);o.right=this.parseExprOpRightExpr(c,n,r),this.finishNode(o,h||l?\"LogicalExpression\":\"BinaryExpression\");const p=this.state.type;if(l&&(p===d.logicalOR||p===d.logicalAND)||h&&p===d.nullishCoalescing)throw this.raise(this.state.start,ut.MixingCoalesceWithLogical);return this.parseExprOp(o,e,s,i,r)}return t}parseExprOpRightExpr(t,e,s){const i=this.state.start,r=this.state.startLoc;switch(t){case d.pipeline:switch(this.getPluginOption(\"pipelineOperator\",\"proposal\")){case\"smart\":return this.withTopicPermittingContext(()=>this.parseSmartPipelineBody(this.parseExprOpBaseRightExpr(t,e,s),i,r));case\"fsharp\":return this.withSoloAwaitPermittingContext(()=>this.parseFSharpPipelineBody(e,s))}default:return this.parseExprOpBaseRightExpr(t,e,s)}}parseExprOpBaseRightExpr(t,e,s){const i=this.state.start,r=this.state.startLoc;return this.parseExprOp(this.parseMaybeUnary(),i,r,t.rightAssociative?e-1:e,s)}parseMaybeUnary(t){if(this.isContextual(\"await\")&&this.isAwaitAllowed())return this.parseAwait();if(this.state.type.prefix){const e=this.startNode(),s=this.match(d.incDec);if(e.operator=this.state.value,e.prefix=!0,\"throw\"===e.operator&&this.expectPlugin(\"throwExpressions\"),this.next(),e.argument=this.parseMaybeUnary(),this.checkExpressionErrors(t,!0),s)this.checkLVal(e.argument,void 0,void 0,\"prefix operation\");else if(this.state.strict&&\"delete\"===e.operator){const t=e.argument;\"Identifier\"===t.type?this.raise(e.start,ut.StrictDelete):\"MemberExpression\"!==t.type&&\"OptionalMemberExpression\"!==t.type||\"PrivateName\"!==t.property.type||this.raise(e.start,ut.DeletePrivateField)}return this.finishNode(e,s?\"UpdateExpression\":\"UnaryExpression\")}const e=this.state.start,s=this.state.startLoc;let i=this.parseExprSubscripts(t);if(this.checkExpressionErrors(t,!1))return i;while(this.state.type.postfix&&!this.canInsertSemicolon()){const t=this.startNodeAt(e,s);t.operator=this.state.value,t.prefix=!1,t.argument=i,this.checkLVal(i,void 0,void 0,\"postfix operation\"),this.next(),i=this.finishNode(t,\"UpdateExpression\")}return i}parseExprSubscripts(t){const e=this.state.start,s=this.state.startLoc,i=this.state.potentialArrowAt,r=this.parseExprAtom(t);return\"ArrowFunctionExpression\"===r.type&&r.start===i?r:this.parseSubscripts(r,e,s)}parseSubscripts(t,e,s,i){const r={optionalChainMember:!1,maybeAsyncArrow:this.atPossibleAsyncArrow(t),stop:!1};do{const n=this.state.maybeInAsyncArrowHead;r.maybeAsyncArrow&&(this.state.maybeInAsyncArrowHead=!0),t=this.parseSubscript(t,e,s,i,r),r.maybeAsyncArrow=!1,this.state.maybeInAsyncArrowHead=n}while(!r.stop);return t}parseSubscript(t,e,s,i,r){if(!i&&this.eat(d.doubleColon)){const n=this.startNodeAt(e,s);return n.object=t,n.callee=this.parseNoCallExpr(),r.stop=!0,this.parseSubscripts(this.finishNode(n,\"BindExpression\"),e,s,i)}let n=!1;if(this.match(d.questionDot)){if(r.optionalChainMember=n=!0,i&&40===this.lookaheadCharCode())return r.stop=!0,t;this.next()}const a=this.eat(d.bracketL);if(n&&!this.match(d.parenL)&&!this.match(d.backQuote)||a||this.eat(d.dot)){const i=this.startNodeAt(e,s);return i.object=t,i.property=a?this.parseExpression():this.parseMaybePrivateName(!0),i.computed=a,\"PrivateName\"===i.property.type&&(\"Super\"===i.object.type&&this.raise(e,ut.SuperPrivateField),this.classScope.usePrivateName(i.property.id.name,i.property.start)),a&&this.expect(d.bracketR),r.optionalChainMember?(i.optional=n,this.finishNode(i,\"OptionalMemberExpression\")):this.finishNode(i,\"MemberExpression\")}if(!i&&this.match(d.parenL)){const i=this.state.maybeInArrowParameters,a=this.state.yieldPos,o=this.state.awaitPos;this.state.maybeInArrowParameters=!0,this.state.yieldPos=-1,this.state.awaitPos=-1,this.next();let c=this.startNodeAt(e,s);return c.callee=t,r.optionalChainMember&&(c.optional=n),c.arguments=n?this.parseCallExpressionArguments(d.parenR,!1):this.parseCallExpressionArguments(d.parenR,r.maybeAsyncArrow,\"Import\"===t.type,\"Super\"!==t.type,c),this.finishCallExpression(c,r.optionalChainMember),r.maybeAsyncArrow&&this.shouldParseAsyncArrow()&&!n?(r.stop=!0,c=this.parseAsyncArrowFromCallExpression(this.startNodeAt(e,s),c),this.checkYieldAwaitInDefaultParams(),this.state.yieldPos=a,this.state.awaitPos=o):(this.toReferencedListDeep(c.arguments),-1!==a&&(this.state.yieldPos=a),(this.isAwaitAllowed()||i)&&-1===o||(this.state.awaitPos=o)),this.state.maybeInArrowParameters=i,c}return this.match(d.backQuote)?this.parseTaggedTemplateExpression(e,s,t,r):(r.stop=!0,t)}parseTaggedTemplateExpression(t,e,s,i,r){const n=this.startNodeAt(t,e);return n.tag=s,n.quasi=this.parseTemplate(!0),r&&(n.typeParameters=r),i.optionalChainMember&&this.raise(t,ut.OptionalChainingNoTemplate),this.finishNode(n,\"TaggedTemplateExpression\")}atPossibleAsyncArrow(t){return\"Identifier\"===t.type&&\"async\"===t.name&&this.state.lastTokEnd===t.end&&!this.canInsertSemicolon()&&t.end-t.start===5&&t.start===this.state.potentialArrowAt}finishCallExpression(t,e){if(\"Import\"===t.callee.type)if(2===t.arguments.length&&this.expectPlugin(\"moduleAttributes\"),0===t.arguments.length||t.arguments.length>2)this.raise(t.start,ut.ImportCallArity,this.hasPlugin(\"moduleAttributes\")?\"one or two arguments\":\"one argument\");else for(let s=0,i=t.arguments;s<i.length;s++){const t=i[s];\"SpreadElement\"===t.type&&this.raise(t.start,ut.ImportCallSpreadArgument)}return this.finishNode(t,e?\"OptionalCallExpression\":\"CallExpression\")}parseCallExpressionArguments(t,e,s,i,r){const n=[];let a,o=!0;const c=this.state.inFSharpPipelineDirectBody;this.state.inFSharpPipelineDirectBody=!1;while(!this.eat(t)){if(o)o=!1;else if(this.expect(d.comma),this.match(t)){s&&!this.hasPlugin(\"moduleAttributes\")&&this.raise(this.state.lastTokStart,ut.ImportCallArgumentTrailingComma),r&&this.addExtra(r,\"trailingComma\",this.state.lastTokStart),this.next();break}this.match(d.parenL)&&!a&&(a=this.state.start),n.push(this.parseExprListItem(!1,e?new Le:void 0,e?{start:0}:void 0,i))}return e&&a&&this.shouldParseAsyncArrow()&&this.unexpected(),this.state.inFSharpPipelineDirectBody=c,n}shouldParseAsyncArrow(){return this.match(d.arrow)&&!this.canInsertSemicolon()}parseAsyncArrowFromCallExpression(t,e){var s;return this.expect(d.arrow),this.parseArrowExpression(t,e.arguments,!0,null==(s=e.extra)?void 0:s.trailingComma),t}parseNoCallExpr(){const t=this.state.start,e=this.state.startLoc;return this.parseSubscripts(this.parseExprAtom(),t,e,!0)}parseExprAtom(t){this.state.type===d.slash&&this.readRegexp();const e=this.state.potentialArrowAt===this.state.start;let s;switch(this.state.type){case d._super:return s=this.startNode(),this.next(),!this.match(d.parenL)||this.scope.allowDirectSuper||this.options.allowSuperOutsideMethod?this.scope.allowSuper||this.options.allowSuperOutsideMethod||this.raise(s.start,ut.UnexpectedSuper):this.raise(s.start,ut.SuperNotAllowed),this.match(d.parenL)||this.match(d.bracketL)||this.match(d.dot)||this.raise(s.start,ut.UnsupportedSuper),this.finishNode(s,\"Super\");case d._import:return s=this.startNode(),this.next(),this.match(d.dot)?this.parseImportMetaProperty(s):(this.match(d.parenL)||this.raise(this.state.lastTokStart,ut.UnsupportedImport),this.finishNode(s,\"Import\"));case d._this:return s=this.startNode(),this.next(),this.finishNode(s,\"ThisExpression\");case d.name:{s=this.startNode();const t=this.state.containsEsc,i=this.parseIdentifier();if(!t&&\"async\"===i.name&&this.match(d._function)&&!this.canInsertSemicolon()){const t=this.state.context.length-1;if(this.state.context[t]!==gt.functionStatement)throw new Error(\"Internal error\");return this.state.context[t]=gt.functionExpression,this.next(),this.parseFunction(s,void 0,!0)}if(e&&!t&&\"async\"===i.name&&this.match(d.name)&&!this.canInsertSemicolon()){const t=this.state.maybeInArrowParameters,e=this.state.maybeInAsyncArrowHead,i=this.state.yieldPos,r=this.state.awaitPos;this.state.maybeInArrowParameters=!0,this.state.maybeInAsyncArrowHead=!0,this.state.yieldPos=-1,this.state.awaitPos=-1;const n=[this.parseIdentifier()];return this.expect(d.arrow),this.checkYieldAwaitInDefaultParams(),this.state.maybeInArrowParameters=t,this.state.maybeInAsyncArrowHead=e,this.state.yieldPos=i,this.state.awaitPos=r,this.parseArrowExpression(s,n,!0),s}return e&&this.match(d.arrow)&&!this.canInsertSemicolon()?(this.next(),this.parseArrowExpression(s,[i],!1),s):i}case d._do:{this.expectPlugin(\"doExpressions\");const t=this.startNode();this.next();const e=this.state.labels;return this.state.labels=[],t.body=this.parseBlock(),this.state.labels=e,this.finishNode(t,\"DoExpression\")}case d.regexp:{const t=this.state.value;return s=this.parseLiteral(t.value,\"RegExpLiteral\"),s.pattern=t.pattern,s.flags=t.flags,s}case d.num:return this.parseLiteral(this.state.value,\"NumericLiteral\");case d.bigint:return this.parseLiteral(this.state.value,\"BigIntLiteral\");case d.string:return this.parseLiteral(this.state.value,\"StringLiteral\");case d._null:return s=this.startNode(),this.next(),this.finishNode(s,\"NullLiteral\");case d._true:case d._false:return this.parseBooleanLiteral();case d.parenL:return this.parseParenAndDistinguishExpression(e);case d.bracketBarL:case d.bracketHashL:{this.expectPlugin(\"recordAndTuple\");const e=this.state.inFSharpPipelineDirectBody,i=this.state.type===d.bracketBarL?d.bracketBarR:d.bracketR;return this.state.inFSharpPipelineDirectBody=!1,s=this.startNode(),this.next(),s.elements=this.parseExprList(i,!1,t,s),this.state.inFSharpPipelineDirectBody=e,this.finishNode(s,\"TupleExpression\")}case d.bracketL:{const e=this.state.inFSharpPipelineDirectBody;return this.state.inFSharpPipelineDirectBody=!1,s=this.startNode(),this.next(),s.elements=this.parseExprList(d.bracketR,!0,t,s),this.state.maybeInArrowParameters||this.toReferencedList(s.elements),this.state.inFSharpPipelineDirectBody=e,this.finishNode(s,\"ArrayExpression\")}case d.braceBarL:case d.braceHashL:{this.expectPlugin(\"recordAndTuple\");const e=this.state.inFSharpPipelineDirectBody,s=this.state.type===d.braceBarL?d.braceBarR:d.braceR;this.state.inFSharpPipelineDirectBody=!1;const i=this.parseObj(s,!1,!0,t);return this.state.inFSharpPipelineDirectBody=e,i}case d.braceL:{const e=this.state.inFSharpPipelineDirectBody;this.state.inFSharpPipelineDirectBody=!1;const s=this.parseObj(d.braceR,!1,!1,t);return this.state.inFSharpPipelineDirectBody=e,s}case d._function:return this.parseFunctionExpression();case d.at:this.parseDecorators();case d._class:return s=this.startNode(),this.takeDecorators(s),this.parseClass(s,!1);case d._new:return this.parseNew();case d.backQuote:return this.parseTemplate(!1);case d.doubleColon:{s=this.startNode(),this.next(),s.object=null;const t=s.callee=this.parseNoCallExpr();if(\"MemberExpression\"===t.type)return this.finishNode(s,\"BindExpression\");throw this.raise(t.start,ut.UnsupportedBind)}case d.hash:{if(this.state.inPipeline)return s=this.startNode(),\"smart\"!==this.getPluginOption(\"pipelineOperator\",\"proposal\")&&this.raise(s.start,ut.PrimaryTopicRequiresSmartPipeline),this.next(),this.primaryTopicReferenceIsAllowedInCurrentTopicContext()||this.raise(s.start,ut.PrimaryTopicNotAllowed),this.registerTopicReference(),this.finishNode(s,\"PipelinePrimaryTopicReference\");const t=this.input.codePointAt(this.state.end);if(At(t)||92===t){const t=this.state.start;if(s=this.parseMaybePrivateName(!0),this.match(d._in))this.expectPlugin(\"privateIn\"),this.classScope.usePrivateName(s.id.name,s.start);else{if(!this.hasPlugin(\"privateIn\"))throw this.unexpected(t);this.raise(this.state.start,ut.PrivateInExpectedIn,s.id.name)}return s}}case d.relational:if(\"<\"===this.state.value){const t=this.input.codePointAt(this.nextTokenStart());(At(t)||62===t)&&this.expectOnePlugin([\"jsx\",\"flow\",\"typescript\"])}default:throw this.unexpected()}}parseBooleanLiteral(){const t=this.startNode();return t.value=this.match(d._true),this.next(),this.finishNode(t,\"BooleanLiteral\")}parseMaybePrivateName(t){const e=this.match(d.hash);if(e){this.expectOnePlugin([\"classPrivateProperties\",\"classPrivateMethods\"]),t||this.raise(this.state.pos,ut.UnexpectedPrivateField);const e=this.startNode();return this.next(),this.assertNoSpace(\"Unexpected space between # and identifier\"),e.id=this.parseIdentifier(!0),this.finishNode(e,\"PrivateName\")}return this.parseIdentifier(!0)}parseFunctionExpression(){const t=this.startNode();let e=this.startNode();return this.next(),e=this.createIdentifier(e,\"function\"),this.prodParam.hasYield&&this.eat(d.dot)?this.parseMetaProperty(t,e,\"sent\"):this.parseFunction(t)}parseMetaProperty(t,e,s){t.meta=e,\"function\"===e.name&&\"sent\"===s&&(this.isContextual(s)?this.expectPlugin(\"functionSent\"):this.hasPlugin(\"functionSent\")||this.unexpected());const i=this.state.containsEsc;return t.property=this.parseIdentifier(!0),(t.property.name!==s||i)&&this.raise(t.property.start,ut.UnsupportedMetaProperty,e.name,s),this.finishNode(t,\"MetaProperty\")}parseImportMetaProperty(t){const e=this.createIdentifier(this.startNodeAtNode(t),\"import\");return this.expect(d.dot),this.isContextual(\"meta\")&&(this.inModule||this.raiseWithData(e.start,{code:\"BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED\"},ut.ImportMetaOutsideModule),this.sawUnambiguousESM=!0),this.parseMetaProperty(t,e,\"meta\")}parseLiteral(t,e,s,i){s=s||this.state.start,i=i||this.state.startLoc;const r=this.startNodeAt(s,i);return this.addExtra(r,\"rawValue\",t),this.addExtra(r,\"raw\",this.input.slice(s,this.state.end)),r.value=t,this.next(),this.finishNode(r,e)}parseParenAndDistinguishExpression(t){const e=this.state.start,s=this.state.startLoc;let i;this.expect(d.parenL);const r=this.state.maybeInArrowParameters,n=this.state.yieldPos,a=this.state.awaitPos,o=this.state.inFSharpPipelineDirectBody;this.state.maybeInArrowParameters=!0,this.state.yieldPos=-1,this.state.awaitPos=-1,this.state.inFSharpPipelineDirectBody=!1;const c=this.state.start,h=this.state.startLoc,l=[],p=new Le,u={start:0};let f,m,y=!0;while(!this.match(d.parenR)){if(y)y=!1;else if(this.expect(d.comma,u.start||null),this.match(d.parenR)){m=this.state.start;break}if(this.match(d.ellipsis)){const t=this.state.start,e=this.state.startLoc;f=this.state.start,l.push(this.parseParenItem(this.parseRestBinding(),t,e)),this.checkCommaAfterRest(41);break}l.push(this.parseMaybeAssign(!1,p,this.parseParenItem,u))}const g=this.state.start,x=this.state.startLoc;this.expect(d.parenR),this.state.maybeInArrowParameters=r,this.state.inFSharpPipelineDirectBody=o;let b=this.startNodeAt(e,s);if(t&&this.shouldParseArrow()&&(b=this.parseArrow(b))){this.isAwaitAllowed()||this.state.maybeInAsyncArrowHead||(this.state.awaitPos=a),this.checkYieldAwaitInDefaultParams(),this.state.yieldPos=n,this.state.awaitPos=a;for(let t=0;t<l.length;t++){const e=l[t];e.extra&&e.extra.parenthesized&&this.unexpected(e.extra.parenStart)}return this.parseArrowExpression(b,l,!1),b}if(-1!==n&&(this.state.yieldPos=n),-1!==a&&(this.state.awaitPos=a),l.length||this.unexpected(this.state.lastTokStart),m&&this.unexpected(m),f&&this.unexpected(f),this.checkExpressionErrors(p,!0),u.start&&this.unexpected(u.start),this.toReferencedListDeep(l,!0),l.length>1?(i=this.startNodeAt(c,h),i.expressions=l,this.finishNodeAt(i,\"SequenceExpression\",g,x)):i=l[0],!this.options.createParenthesizedExpressions)return this.addExtra(i,\"parenthesized\",!0),this.addExtra(i,\"parenStart\",e),i;const v=this.startNodeAt(e,s);return v.expression=i,this.finishNode(v,\"ParenthesizedExpression\"),v}shouldParseArrow(){return!this.canInsertSemicolon()}parseArrow(t){if(this.eat(d.arrow))return t}parseParenItem(t,e,s){return t}parseNew(){const t=this.startNode();let e=this.startNode();if(this.next(),e=this.createIdentifier(e,\"new\"),this.eat(d.dot)){const s=this.parseMetaProperty(t,e,\"target\");if(!this.scope.inNonArrowFunction&&!this.scope.inClass){let t=ut.UnexpectedNewTarget;this.hasPlugin(\"classProperties\")&&(t+=\" or class properties\"),this.raise(s.start,t)}return s}return t.callee=this.parseNoCallExpr(),\"Import\"===t.callee.type?this.raise(t.callee.start,ut.ImportCallNotNewExpression):\"OptionalMemberExpression\"===t.callee.type||\"OptionalCallExpression\"===t.callee.type?this.raise(this.state.lastTokEnd,ut.OptionalChainingNoNew):this.eat(d.questionDot)&&this.raise(this.state.start,ut.OptionalChainingNoNew),this.parseNewArguments(t),this.finishNode(t,\"NewExpression\")}parseNewArguments(t){if(this.eat(d.parenL)){const e=this.parseExprList(d.parenR);this.toReferencedList(e),t.arguments=e}else t.arguments=[]}parseTemplateElement(t){const e=this.startNode();return null===this.state.value&&(t||this.raise(this.state.start+1,ut.InvalidEscapeSequenceTemplate)),e.value={raw:this.input.slice(this.state.start,this.state.end).replace(/\\r\\n?/g,\"\\n\"),cooked:this.state.value},this.next(),e.tail=this.match(d.backQuote),this.finishNode(e,\"TemplateElement\")}parseTemplate(t){const e=this.startNode();this.next(),e.expressions=[];let s=this.parseTemplateElement(t);e.quasis=[s];while(!s.tail)this.expect(d.dollarBraceL),e.expressions.push(this.parseExpression()),this.expect(d.braceR),e.quasis.push(s=this.parseTemplateElement(t));return this.next(),this.finishNode(e,\"TemplateLiteral\")}parseObj(t,e,s,i){const r=Object.create(null);let n=!0;const a=this.startNode();a.properties=[],this.next();while(!this.eat(t)){if(n)n=!1;else if(this.expect(d.comma),this.match(t)){this.addExtra(a,\"trailingComma\",this.state.lastTokStart),this.next();break}const o=this.parseObjectMember(e,i);e||this.checkProto(o,s,r,i),s&&\"ObjectProperty\"!==o.type&&\"SpreadElement\"!==o.type&&this.raise(o.start,ut.InvalidRecordProperty),o.shorthand&&this.addExtra(o,\"shorthand\",!0),a.properties.push(o)}let o=\"ObjectExpression\";return e?o=\"ObjectPattern\":s&&(o=\"RecordExpression\"),this.finishNode(a,o)}isAsyncProp(t){return!t.computed&&\"Identifier\"===t.key.type&&\"async\"===t.key.name&&(this.isLiteralPropertyName()||this.match(d.bracketL)||this.match(d.star))&&!this.hasPrecedingLineBreak()}parseObjectMember(t,e){let s=[];if(this.match(d.at)){this.hasPlugin(\"decorators\")&&this.raise(this.state.start,ut.UnsupportedPropertyDecorator);while(this.match(d.at))s.push(this.parseDecorator())}const i=this.startNode();let r,n,a=!1,o=!1;if(this.match(d.ellipsis))return s.length&&this.unexpected(),t?(this.next(),i.argument=this.parseIdentifier(),this.checkCommaAfterRest(125),this.finishNode(i,\"RestElement\")):this.parseSpread();s.length&&(i.decorators=s,s=[]),i.method=!1,(t||e)&&(r=this.state.start,n=this.state.startLoc),t||(a=this.eat(d.star));const c=this.state.containsEsc;return this.parsePropertyName(i,!1),t||c||a||!this.isAsyncProp(i)?o=!1:(o=!0,a=this.eat(d.star),this.parsePropertyName(i,!1)),this.parseObjPropValue(i,r,n,a,o,t,e,c),i}isGetterOrSetterMethod(t,e){return!e&&!t.computed&&\"Identifier\"===t.key.type&&(\"get\"===t.key.name||\"set\"===t.key.name)&&(this.isLiteralPropertyName()||this.match(d.bracketL))}getGetterSetterExpectedParamCount(t){return\"get\"===t.kind?0:1}checkGetterSetterParams(t){const e=this.getGetterSetterExpectedParamCount(t),s=t.start;t.params.length!==e&&(\"get\"===t.kind?this.raise(s,ut.BadGetterArity):this.raise(s,ut.BadSetterArity)),\"set\"===t.kind&&\"RestElement\"===t.params[t.params.length-1].type&&this.raise(s,ut.BadSetterRestParameter)}parseObjectMethod(t,e,s,i,r){return s||e||this.match(d.parenL)?(i&&this.unexpected(),t.kind=\"method\",t.method=!0,this.parseMethod(t,e,s,!1,!1,\"ObjectMethod\")):!r&&this.isGetterOrSetterMethod(t,i)?((e||s)&&this.unexpected(),t.kind=t.key.name,this.parsePropertyName(t,!1),this.parseMethod(t,!1,!1,!1,!1,\"ObjectMethod\"),this.checkGetterSetterParams(t),t):void 0}parseObjectProperty(t,e,s,i,r){return t.shorthand=!1,this.eat(d.colon)?(t.value=i?this.parseMaybeDefault(this.state.start,this.state.startLoc):this.parseMaybeAssign(!1,r),this.finishNode(t,\"ObjectProperty\")):t.computed||\"Identifier\"!==t.key.type?void 0:(this.checkReservedWord(t.key.name,t.key.start,!0,!0),i?t.value=this.parseMaybeDefault(e,s,t.key.__clone()):this.match(d.eq)&&r?(-1===r.shorthandAssign&&(r.shorthandAssign=this.state.start),t.value=this.parseMaybeDefault(e,s,t.key.__clone())):t.value=t.key.__clone(),t.shorthand=!0,this.finishNode(t,\"ObjectProperty\"))}parseObjPropValue(t,e,s,i,r,n,a,o){const c=this.parseObjectMethod(t,i,r,n,o)||this.parseObjectProperty(t,e,s,n,a);return c||this.unexpected(),c}parsePropertyName(t,e){if(this.eat(d.bracketL))t.computed=!0,t.key=this.parseMaybeAssign(),this.expect(d.bracketR);else{const s=this.state.inPropertyName;this.state.inPropertyName=!0,t.key=this.match(d.num)||this.match(d.string)||this.match(d.bigint)?this.parseExprAtom():this.parseMaybePrivateName(e),\"PrivateName\"!==t.key.type&&(t.computed=!1),this.state.inPropertyName=s}return t.key}initFunction(t,e){t.id=null,t.generator=!1,t.async=!!e}parseMethod(t,e,s,i,r,n,a=!1){const o=this.state.yieldPos,c=this.state.awaitPos;this.state.yieldPos=-1,this.state.awaitPos=-1,this.initFunction(t,s),t.generator=!!e;const h=i;return this.scope.enter(y|b|(a?w:0)|(r?v:0)),this.prodParam.enter(he(s,t.generator)),this.parseFunctionParams(t,h),this.parseFunctionBodyAndFinish(t,n,!0),this.prodParam.exit(),this.scope.exit(),this.state.yieldPos=o,this.state.awaitPos=c,t}parseArrowExpression(t,e,s,i){this.scope.enter(y|g),this.prodParam.enter(he(s,!1)),this.initFunction(t,s);const r=this.state.maybeInArrowParameters,n=this.state.yieldPos,a=this.state.awaitPos;return e&&(this.state.maybeInArrowParameters=!0,this.setArrowFunctionParameters(t,e,i)),this.state.maybeInArrowParameters=!1,this.state.yieldPos=-1,this.state.awaitPos=-1,this.parseFunctionBody(t,!0),this.prodParam.exit(),this.scope.exit(),this.state.maybeInArrowParameters=r,this.state.yieldPos=n,this.state.awaitPos=a,this.finishNode(t,\"ArrowFunctionExpression\")}setArrowFunctionParameters(t,e,s){t.params=this.toAssignableList(e,s)}parseFunctionBodyAndFinish(t,e,s=!1){this.parseFunctionBody(t,!1,s),this.finishNode(t,e)}parseFunctionBody(t,e,s=!1){const i=e&&!this.match(d.braceL),r=this.state.inParameters;if(this.state.inParameters=!1,i)t.body=this.parseMaybeAssign(),this.checkParams(t,!1,e,!1);else{const i=this.state.strict,r=this.state.labels;this.state.labels=[],this.prodParam.enter(this.prodParam.currentFlags()|oe),t.body=this.parseBlock(!0,!1,r=>{const n=!this.isSimpleParamList(t.params);if(r&&n){const e=\"method\"!==t.kind&&\"constructor\"!==t.kind||!t.key?t.start:t.key.end;this.raise(e,ut.IllegalLanguageModeDirective)}const a=!i&&this.state.strict;this.checkParams(t,!this.state.strict&&!e&&!s&&!n,e,a),this.state.strict&&t.id&&this.checkLVal(t.id,H,void 0,\"function name\",void 0,a)}),this.prodParam.exit(),this.state.labels=r}this.state.inParameters=r}isSimpleParamList(t){for(let e=0,s=t.length;e<s;e++)if(\"Identifier\"!==t[e].type)return!1;return!0}checkParams(t,e,s,i=!0){const r=Object.create(null);for(let n=0;n<t.params.length;n++)this.checkLVal(t.params[n],R,e?null:r,\"function parameter list\",void 0,i)}parseExprList(t,e,s,i){const r=[];let n=!0;while(!this.eat(t)){if(n)n=!1;else if(this.expect(d.comma),this.match(t)){i&&this.addExtra(i,\"trailingComma\",this.state.lastTokStart),this.next();break}r.push(this.parseExprListItem(e,s))}return r}parseExprListItem(t,e,s,i){let r;if(this.match(d.comma))t||this.raise(this.state.pos,ut.UnexpectedToken,\",\"),r=null;else if(this.match(d.ellipsis)){const t=this.state.start,i=this.state.startLoc;r=this.parseParenItem(this.parseSpread(e,s),t,i)}else if(this.match(d.question)){this.expectPlugin(\"partialApplication\"),i||this.raise(this.state.start,ut.UnexpectedArgumentPlaceholder);const t=this.startNode();this.next(),r=this.finishNode(t,\"ArgumentPlaceholder\")}else r=this.parseMaybeAssign(!1,e,this.parseParenItem,s);return r}parseIdentifier(t){const e=this.startNode(),s=this.parseIdentifierName(e.start,t);return this.createIdentifier(e,s)}createIdentifier(t,e){return t.name=e,t.loc.identifierName=e,this.finishNode(t,\"Identifier\")}parseIdentifierName(t,e){let s;if(this.match(d.name))s=this.state.value;else{if(!this.state.type.keyword)throw this.unexpected();{s=this.state.type.keyword;const t=this.state.context;\"class\"!==s&&\"function\"!==s||\"function\"!==t[t.length-1].token||t.pop()}}return e?this.state.type=d.name:this.checkReservedWord(s,this.state.start,!!this.state.type.keyword,!1),this.next(),s}checkReservedWord(t,e,s,i){if(this.prodParam.hasYield&&\"yield\"===t)return void this.raise(e,ut.YieldBindingIdentifier);if(\"await\"===t){if(this.prodParam.hasAwait)return void this.raise(e,ut.AwaitBindingIdentifier);-1===this.state.awaitPos&&(this.state.maybeInAsyncArrowHead||this.isAwaitAllowed())&&(this.state.awaitPos=this.state.start)}if(this.scope.inClass&&!this.scope.inNonArrowFunction&&\"arguments\"===t)return void this.raise(e,ut.ArgumentsDisallowedInInitializer);if(s&&_t(t))return void this.raise(e,ut.UnexpectedKeyword,t);const r=this.state.strict?i?Lt:Dt:Ot;r(t,this.inModule)&&(this.prodParam.hasAwait||\"await\"!==t?this.raise(e,ut.UnexpectedReservedWord,t):this.raise(e,ut.AwaitNotInAsyncFunction))}isAwaitAllowed(){return this.scope.inFunction?this.prodParam.hasAwait:!!this.options.allowAwaitOutsideFunction||!!this.hasPlugin(\"topLevelAwait\")&&(this.inModule&&this.prodParam.hasAwait)}parseAwait(){const t=this.startNode();return this.next(),this.state.inParameters?this.raise(t.start,ut.AwaitExpressionFormalParameter):-1===this.state.awaitPos&&(this.state.awaitPos=t.start),this.eat(d.star)&&this.raise(t.start,ut.ObsoleteAwaitStar),this.scope.inFunction||this.options.allowAwaitOutsideFunction||(this.hasPrecedingLineBreak()||this.match(d.plusMin)||this.match(d.parenL)||this.match(d.bracketL)||this.match(d.backQuote)||this.match(d.regexp)||this.match(d.slash)||this.hasPlugin(\"v8intrinsic\")&&this.match(d.modulo)?this.ambiguousScriptDifferentAst=!0:this.sawUnambiguousESM=!0),this.state.soloAwait||(t.argument=this.parseMaybeUnary()),this.finishNode(t,\"AwaitExpression\")}parseYield(t){const e=this.startNode();return this.state.inParameters?this.raise(e.start,ut.YieldInParameter):-1===this.state.yieldPos&&(this.state.yieldPos=e.start),this.next(),this.match(d.semi)||!this.match(d.star)&&!this.state.type.startsExpr||this.hasPrecedingLineBreak()?(e.delegate=!1,e.argument=null):(e.delegate=this.eat(d.star),e.argument=this.parseMaybeAssign(t)),this.finishNode(e,\"YieldExpression\")}checkPipelineAtInfixOperator(t,e){\"smart\"===this.getPluginOption(\"pipelineOperator\",\"proposal\")&&\"SequenceExpression\"===t.type&&this.raise(e,ut.PipelineHeadSequenceExpression)}parseSmartPipelineBody(t,e,s){const i=this.checkSmartPipelineBodyStyle(t);return this.checkSmartPipelineBodyEarlyErrors(t,i,e),this.parseSmartPipelineBodyInStyle(t,i,e,s)}checkSmartPipelineBodyEarlyErrors(t,e,s){if(this.match(d.arrow))throw this.raise(this.state.start,ut.PipelineBodyNoArrow);\"PipelineTopicExpression\"===e&&\"SequenceExpression\"===t.type&&this.raise(s,ut.PipelineBodySequenceExpression)}parseSmartPipelineBodyInStyle(t,e,s,i){const r=this.startNodeAt(s,i);switch(e){case\"PipelineBareFunction\":r.callee=t;break;case\"PipelineBareConstructor\":r.callee=t.callee;break;case\"PipelineBareAwaitedFunction\":r.callee=t.argument;break;case\"PipelineTopicExpression\":this.topicReferenceWasUsedInCurrentTopicContext()||this.raise(s,ut.PipelineTopicUnused),r.expression=t;break;default:throw new Error(`Internal @babel/parser error: Unknown pipeline style (${e})`)}return this.finishNode(r,e)}checkSmartPipelineBodyStyle(t){switch(t.type){default:return this.isSimpleReference(t)?\"PipelineBareFunction\":\"PipelineTopicExpression\"}}isSimpleReference(t){switch(t.type){case\"MemberExpression\":return!t.computed&&this.isSimpleReference(t.object);case\"Identifier\":return!0;default:return!1}}withTopicPermittingContext(t){const e=this.state.topicContext;this.state.topicContext={maxNumOfResolvableTopics:1,maxTopicIndex:null};try{return t()}finally{this.state.topicContext=e}}withTopicForbiddingContext(t){const e=this.state.topicContext;this.state.topicContext={maxNumOfResolvableTopics:0,maxTopicIndex:null};try{return t()}finally{this.state.topicContext=e}}withSoloAwaitPermittingContext(t){const e=this.state.soloAwait;this.state.soloAwait=!0;try{return t()}finally{this.state.soloAwait=e}}registerTopicReference(){this.state.topicContext.maxTopicIndex=0}primaryTopicReferenceIsAllowedInCurrentTopicContext(){return this.state.topicContext.maxNumOfResolvableTopics>=1}topicReferenceWasUsedInCurrentTopicContext(){return null!=this.state.topicContext.maxTopicIndex&&this.state.topicContext.maxTopicIndex>=0}parseFSharpPipelineBody(t,e){const s=this.state.start,i=this.state.startLoc;this.state.potentialArrowAt=this.state.start;const r=this.state.inFSharpPipelineDirectBody;this.state.inFSharpPipelineDirectBody=!0;const n=this.parseExprOp(this.parseMaybeUnary(),s,i,t,e);return this.state.inFSharpPipelineDirectBody=r,n}}const Ue={kind:\"loop\"},qe={kind:\"switch\"},Ve=0,He=1,ze=2,We=4;class Ke extends Be{parseTopLevel(t,e){if(e.sourceType=this.options.sourceType,e.interpreter=this.parseInterpreterDirective(),this.parseBlockBody(e,!0,!0,d.eof),this.inModule&&!this.options.allowUndeclaredExports&&this.scope.undefinedExports.size>0)for(let s=0,i=Array.from(this.scope.undefinedExports);s<i.length;s++){const[t]=i[s],e=this.scope.undefinedExports.get(t);this.raise(e,ut.ModuleExportUndefined,t)}return t.program=this.finishNode(e,\"Program\"),t.comments=this.state.comments,this.options.tokens&&(t.tokens=this.tokens),this.finishNode(t,\"File\")}stmtToDirective(t){const e=t.expression,s=this.startNodeAt(e.start,e.loc.start),i=this.startNodeAt(t.start,t.loc.start),r=this.input.slice(e.start,e.end),n=s.value=r.slice(1,-1);return this.addExtra(s,\"raw\",r),this.addExtra(s,\"rawValue\",n),i.value=this.finishNodeAt(s,\"DirectiveLiteral\",e.end,e.loc.end),this.finishNodeAt(i,\"Directive\",t.end,t.loc.end)}parseInterpreterDirective(){if(!this.match(d.interpreterDirective))return null;const t=this.startNode();return t.value=this.state.value,this.next(),this.finishNode(t,\"InterpreterDirective\")}isLet(t){if(!this.isContextual(\"let\"))return!1;const e=this.nextTokenStart(),s=this.input.charCodeAt(e);if(91===s)return!0;if(t)return!1;if(123===s)return!0;if(At(s)){let t=e+1;while(St(this.input.charCodeAt(t)))++t;const s=this.input.slice(e,t);if(!Rt.test(s))return!0}return!1}parseStatement(t,e){return this.match(d.at)&&this.parseDecorators(!0),this.parseStatementContent(t,e)}parseStatementContent(t,e){let s=this.state.type;const i=this.startNode();let r;switch(this.isLet(t)&&(s=d._var,r=\"let\"),s){case d._break:case d._continue:return this.parseBreakContinueStatement(i,s.keyword);case d._debugger:return this.parseDebuggerStatement(i);case d._do:return this.parseDoStatement(i);case d._for:return this.parseForStatement(i);case d._function:if(46===this.lookaheadCharCode())break;return t&&(this.state.strict?this.raise(this.state.start,ut.StrictFunction):\"if\"!==t&&\"label\"!==t&&this.raise(this.state.start,ut.SloppyFunction)),this.parseFunctionStatement(i,!1,!t);case d._class:return t&&this.unexpected(),this.parseClass(i,!0);case d._if:return this.parseIfStatement(i);case d._return:return this.parseReturnStatement(i);case d._switch:return this.parseSwitchStatement(i);case d._throw:return this.parseThrowStatement(i);case d._try:return this.parseTryStatement(i);case d._const:case d._var:return r=r||this.state.value,t&&\"var\"!==r&&this.raise(this.state.start,ut.UnexpectedLexicalDeclaration),this.parseVarStatement(i,r);case d._while:return this.parseWhileStatement(i);case d._with:return this.parseWithStatement(i);case d.braceL:return this.parseBlock();case d.semi:return this.parseEmptyStatement(i);case d._export:case d._import:{const t=this.lookaheadCharCode();if(40===t||46===t)break;let r;return this.options.allowImportExportEverywhere||e||this.raise(this.state.start,ut.UnexpectedImportExport),this.next(),s===d._import?(r=this.parseImport(i),\"ImportDeclaration\"!==r.type||r.importKind&&\"value\"!==r.importKind||(this.sawUnambiguousESM=!0)):(r=this.parseExport(i),(\"ExportNamedDeclaration\"!==r.type||r.exportKind&&\"value\"!==r.exportKind)&&(\"ExportAllDeclaration\"!==r.type||r.exportKind&&\"value\"!==r.exportKind)&&\"ExportDefaultDeclaration\"!==r.type||(this.sawUnambiguousESM=!0)),this.assertModuleNodeAllowed(i),r}default:if(this.isAsyncFunction())return t&&this.raise(this.state.start,ut.AsyncFunctionInSingleStatementContext),this.next(),this.parseFunctionStatement(i,!0,!t)}const n=this.state.value,a=this.parseExpression();return s===d.name&&\"Identifier\"===a.type&&this.eat(d.colon)?this.parseLabeledStatement(i,n,a,t):this.parseExpressionStatement(i,a)}assertModuleNodeAllowed(t){this.options.allowImportExportEverywhere||this.inModule||this.raiseWithData(t.start,{code:\"BABEL_PARSER_SOURCETYPE_MODULE_REQUIRED\"},ut.ImportOutsideModule)}takeDecorators(t){const e=this.state.decoratorStack[this.state.decoratorStack.length-1];e.length&&(t.decorators=e,this.resetStartLocationFromNode(t,e[0]),this.state.decoratorStack[this.state.decoratorStack.length-1]=[])}canHaveLeadingDecorator(){return this.match(d._class)}parseDecorators(t){const e=this.state.decoratorStack[this.state.decoratorStack.length-1];while(this.match(d.at)){const t=this.parseDecorator();e.push(t)}if(this.match(d._export))t||this.unexpected(),this.hasPlugin(\"decorators\")&&!this.getPluginOption(\"decorators\",\"decoratorsBeforeExport\")&&this.raise(this.state.start,ut.DecoratorExportClass);else if(!this.canHaveLeadingDecorator())throw this.raise(this.state.start,ut.UnexpectedLeadingDecorator)}parseDecorator(){this.expectOnePlugin([\"decorators-legacy\",\"decorators\"]);const t=this.startNode();if(this.next(),this.hasPlugin(\"decorators\")){this.state.decoratorStack.push([]);const e=this.state.start,s=this.state.startLoc;let i;if(this.eat(d.parenL))i=this.parseExpression(),this.expect(d.parenR);else{i=this.parseIdentifier(!1);while(this.eat(d.dot)){const t=this.startNodeAt(e,s);t.object=i,t.property=this.parseIdentifier(!0),t.computed=!1,i=this.finishNode(t,\"MemberExpression\")}}t.expression=this.parseMaybeDecoratorArguments(i),this.state.decoratorStack.pop()}else t.expression=this.parseExprSubscripts();return this.finishNode(t,\"Decorator\")}parseMaybeDecoratorArguments(t){if(this.eat(d.parenL)){const e=this.startNodeAtNode(t);return e.callee=t,e.arguments=this.parseCallExpressionArguments(d.parenR,!1),this.toReferencedList(e.arguments),this.finishNode(e,\"CallExpression\")}return t}parseBreakContinueStatement(t,e){const s=\"break\"===e;return this.next(),this.isLineTerminator()?t.label=null:(t.label=this.parseIdentifier(),this.semicolon()),this.verifyBreakContinue(t,e),this.finishNode(t,s?\"BreakStatement\":\"ContinueStatement\")}verifyBreakContinue(t,e){const s=\"break\"===e;let i;for(i=0;i<this.state.labels.length;++i){const e=this.state.labels[i];if(null==t.label||e.name===t.label.name){if(null!=e.kind&&(s||\"loop\"===e.kind))break;if(t.label&&s)break}}i===this.state.labels.length&&this.raise(t.start,ut.IllegalBreakContinue,e)}parseDebuggerStatement(t){return this.next(),this.semicolon(),this.finishNode(t,\"DebuggerStatement\")}parseHeaderExpression(){this.expect(d.parenL);const t=this.parseExpression();return this.expect(d.parenR),t}parseDoStatement(t){return this.next(),this.state.labels.push(Ue),t.body=this.withTopicForbiddingContext(()=>this.parseStatement(\"do\")),this.state.labels.pop(),this.expect(d._while),t.test=this.parseHeaderExpression(),this.eat(d.semi),this.finishNode(t,\"DoWhileStatement\")}parseForStatement(t){this.next(),this.state.labels.push(Ue);let e=-1;if(this.isAwaitAllowed()&&this.eatContextual(\"await\")&&(e=this.state.lastTokStart),this.scope.enter(f),this.expect(d.parenL),this.match(d.semi))return e>-1&&this.unexpected(e),this.parseFor(t,null);const s=this.isLet();if(this.match(d._var)||this.match(d._const)||s){const i=this.startNode(),r=s?\"let\":this.state.value;return this.next(),this.parseVar(i,!0,r),this.finishNode(i,\"VariableDeclaration\"),(this.match(d._in)||this.isContextual(\"of\"))&&1===i.declarations.length?this.parseForIn(t,i,e):(e>-1&&this.unexpected(e),this.parseFor(t,i))}const i=new Le,r=this.parseExpression(!0,i);if(this.match(d._in)||this.isContextual(\"of\")){this.toAssignable(r);const s=this.isContextual(\"of\")?\"for-of statement\":\"for-in statement\";return this.checkLVal(r,void 0,void 0,s),this.parseForIn(t,r,e)}return this.checkExpressionErrors(i,!0),e>-1&&this.unexpected(e),this.parseFor(t,r)}parseFunctionStatement(t,e,s){return this.next(),this.parseFunction(t,He|(s?0:ze),e)}parseIfStatement(t){return this.next(),t.test=this.parseHeaderExpression(),t.consequent=this.parseStatement(\"if\"),t.alternate=this.eat(d._else)?this.parseStatement(\"if\"):null,this.finishNode(t,\"IfStatement\")}parseReturnStatement(t){return this.prodParam.hasReturn||this.options.allowReturnOutsideFunction||this.raise(this.state.start,ut.IllegalReturn),this.next(),this.isLineTerminator()?t.argument=null:(t.argument=this.parseExpression(),this.semicolon()),this.finishNode(t,\"ReturnStatement\")}parseSwitchStatement(t){this.next(),t.discriminant=this.parseHeaderExpression();const e=t.cases=[];let s,i;for(this.expect(d.braceL),this.state.labels.push(qe),this.scope.enter(f);!this.match(d.braceR);)if(this.match(d._case)||this.match(d._default)){const t=this.match(d._case);s&&this.finishNode(s,\"SwitchCase\"),e.push(s=this.startNode()),s.consequent=[],this.next(),t?s.test=this.parseExpression():(i&&this.raise(this.state.lastTokStart,ut.MultipleDefaultsInSwitch),i=!0,s.test=null),this.expect(d.colon)}else s?s.consequent.push(this.parseStatement(null)):this.unexpected();return this.scope.exit(),s&&this.finishNode(s,\"SwitchCase\"),this.next(),this.state.labels.pop(),this.finishNode(t,\"SwitchStatement\")}parseThrowStatement(t){return this.next(),et.test(this.input.slice(this.state.lastTokEnd,this.state.start))&&this.raise(this.state.lastTokEnd,ut.NewlineAfterThrow),t.argument=this.parseExpression(),this.semicolon(),this.finishNode(t,\"ThrowStatement\")}parseTryStatement(t){if(this.next(),t.block=this.parseBlock(),t.handler=null,this.match(d._catch)){const e=this.startNode();if(this.next(),this.match(d.parenL)){this.expect(d.parenL),e.param=this.parseBindingAtom();const t=\"Identifier\"===e.param.type;this.scope.enter(t?x:0),this.checkLVal(e.param,_,null,\"catch clause\"),this.expect(d.parenR)}else e.param=null,this.scope.enter(f);e.body=this.withTopicForbiddingContext(()=>this.parseBlock(!1,!1)),this.scope.exit(),t.handler=this.finishNode(e,\"CatchClause\")}return t.finalizer=this.eat(d._finally)?this.parseBlock():null,t.handler||t.finalizer||this.raise(t.start,ut.NoCatchOrFinally),this.finishNode(t,\"TryStatement\")}parseVarStatement(t,e){return this.next(),this.parseVar(t,!1,e),this.semicolon(),this.finishNode(t,\"VariableDeclaration\")}parseWhileStatement(t){return this.next(),t.test=this.parseHeaderExpression(),this.state.labels.push(Ue),t.body=this.withTopicForbiddingContext(()=>this.parseStatement(\"while\")),this.state.labels.pop(),this.finishNode(t,\"WhileStatement\")}parseWithStatement(t){return this.state.strict&&this.raise(this.state.start,ut.StrictWith),this.next(),t.object=this.parseHeaderExpression(),t.body=this.withTopicForbiddingContext(()=>this.parseStatement(\"with\")),this.finishNode(t,\"WithStatement\")}parseEmptyStatement(t){return this.next(),this.finishNode(t,\"EmptyStatement\")}parseLabeledStatement(t,e,s,i){for(let n=0,a=this.state.labels;n<a.length;n++){const t=a[n];t.name===e&&this.raise(s.start,ut.LabelRedeclaration,e)}const r=this.state.type.isLoop?\"loop\":this.match(d._switch)?\"switch\":null;for(let n=this.state.labels.length-1;n>=0;n--){const e=this.state.labels[n];if(e.statementStart!==t.start)break;e.statementStart=this.state.start,e.kind=r}return this.state.labels.push({name:e,kind:r,statementStart:this.state.start}),t.body=this.parseStatement(i?-1===i.indexOf(\"label\")?i+\"label\":i:\"label\"),this.state.labels.pop(),t.label=s,this.finishNode(t,\"LabeledStatement\")}parseExpressionStatement(t,e){return t.expression=e,this.semicolon(),this.finishNode(t,\"ExpressionStatement\")}parseBlock(t=!1,e=!0,s){const i=this.startNode();return this.expect(d.braceL),e&&this.scope.enter(f),this.parseBlockBody(i,t,!1,d.braceR,s),e&&this.scope.exit(),this.finishNode(i,\"BlockStatement\")}isValidDirective(t){return\"ExpressionStatement\"===t.type&&\"StringLiteral\"===t.expression.type&&!t.expression.extra.parenthesized}parseBlockBody(t,e,s,i,r){const n=t.body=[],a=t.directives=[];this.parseBlockOrModuleBlockBody(n,e?a:void 0,s,i,r)}parseBlockOrModuleBlockBody(t,e,s,i,r){const n=[],a=this.state.strict;let o=!1,c=!1;while(!this.match(i)){!c&&this.state.octalPositions.length&&n.push(...this.state.octalPositions);const i=this.parseStatement(null,s);if(e&&!c&&this.isValidDirective(i)){const t=this.stmtToDirective(i);e.push(t),o||\"use strict\"!==t.value.value||(o=!0,this.setStrict(!0))}else c=!0,t.push(i)}if(this.state.strict&&n.length)for(let h=0;h<n.length;h++){const t=n[h];this.raise(t,ut.StrictOctalLiteral)}r&&r.call(this,o),a||this.setStrict(!1),this.next()}parseFor(t,e){return t.init=e,this.expect(d.semi),t.test=this.match(d.semi)?null:this.parseExpression(),this.expect(d.semi),t.update=this.match(d.parenR)?null:this.parseExpression(),this.expect(d.parenR),t.body=this.withTopicForbiddingContext(()=>this.parseStatement(\"for\")),this.scope.exit(),this.state.labels.pop(),this.finishNode(t,\"ForStatement\")}parseForIn(t,e,s){const i=this.match(d._in);return this.next(),i?s>-1&&this.unexpected(s):t.await=s>-1,\"VariableDeclaration\"!==e.type||null==e.declarations[0].init||i&&!this.state.strict&&\"var\"===e.kind&&\"Identifier\"===e.declarations[0].id.type?\"AssignmentPattern\"===e.type&&this.raise(e.start,ut.InvalidLhs,\"for-loop\"):this.raise(e.start,ut.ForInOfLoopInitializer,i?\"for-in\":\"for-of\"),t.left=e,t.right=i?this.parseExpression():this.parseMaybeAssign(),this.expect(d.parenR),t.body=this.withTopicForbiddingContext(()=>this.parseStatement(\"for\")),this.scope.exit(),this.state.labels.pop(),this.finishNode(t,i?\"ForInStatement\":\"ForOfStatement\")}parseVar(t,e,s){const i=t.declarations=[],r=this.hasPlugin(\"typescript\");for(t.kind=s;;){const t=this.startNode();if(this.parseVarId(t,s),this.eat(d.eq)?t.init=this.parseMaybeAssign(e):(\"const\"!==s||this.match(d._in)||this.isContextual(\"of\")?\"Identifier\"===t.id.type||e&&(this.match(d._in)||this.isContextual(\"of\"))||this.raise(this.state.lastTokEnd,ut.DeclarationMissingInitializer,\"Complex binding patterns\"):r||this.unexpected(),t.init=null),i.push(this.finishNode(t,\"VariableDeclarator\")),!this.eat(d.comma))break}return t}parseVarId(t,e){t.id=this.parseBindingAtom(),this.checkLVal(t.id,\"var\"===e?R:_,void 0,\"variable declaration\",\"var\"!==e)}parseFunction(t,e=Ve,s=!1){const i=e&He,r=e&ze,n=!!i&&!(e&We);this.initFunction(t,s),this.match(d.star)&&r&&this.raise(this.state.start,ut.GeneratorInSingleStatementContext),t.generator=this.eat(d.star),i&&(t.id=this.parseFunctionId(n));const a=this.state.maybeInArrowParameters,o=this.state.yieldPos,c=this.state.awaitPos;return this.state.maybeInArrowParameters=!1,this.state.yieldPos=-1,this.state.awaitPos=-1,this.scope.enter(y),this.prodParam.enter(he(s,t.generator)),i||(t.id=this.parseFunctionId()),this.parseFunctionParams(t),this.withTopicForbiddingContext(()=>{this.parseFunctionBodyAndFinish(t,i?\"FunctionDeclaration\":\"FunctionExpression\")}),this.prodParam.exit(),this.scope.exit(),i&&!r&&this.registerFunctionStatementId(t),this.state.maybeInArrowParameters=a,this.state.yieldPos=o,this.state.awaitPos=c,t}parseFunctionId(t){return t||this.match(d.name)?this.parseIdentifier():null}parseFunctionParams(t,e){const s=this.state.inParameters;this.state.inParameters=!0,this.expect(d.parenL),t.params=this.parseBindingList(d.parenR,41,!1,e),this.state.inParameters=s,this.checkYieldAwaitInDefaultParams()}registerFunctionStatementId(t){t.id&&this.scope.declareName(t.id.name,this.state.strict||t.generator||t.async?this.scope.treatFunctionsAsVar?R:_:j,t.id.start)}parseClass(t,e,s){this.next(),this.takeDecorators(t);const i=this.state.strict;return this.state.strict=!0,this.parseClassId(t,e,s),this.parseClassSuper(t),t.body=this.parseClassBody(!!t.superClass,i),this.state.strict=i,this.finishNode(t,e?\"ClassDeclaration\":\"ClassExpression\")}isClassProperty(){return this.match(d.eq)||this.match(d.semi)||this.match(d.braceR)}isClassMethod(){return this.match(d.parenL)}isNonstaticConstructor(t){return!t.computed&&!t.static&&(\"constructor\"===t.key.name||\"constructor\"===t.key.value)}parseClassBody(t,e){this.classScope.enter();const s={hadConstructor:!1};let i=[];const r=this.startNode();if(r.body=[],this.expect(d.braceL),this.withTopicForbiddingContext(()=>{while(!this.match(d.braceR)){if(this.eat(d.semi)){if(i.length>0)throw this.raise(this.state.lastTokEnd,ut.DecoratorSemicolon);continue}if(this.match(d.at)){i.push(this.parseDecorator());continue}const e=this.startNode();i.length&&(e.decorators=i,this.resetStartLocationFromNode(e,i[0]),i=[]),this.parseClassMember(r,e,s,t),\"constructor\"===e.kind&&e.decorators&&e.decorators.length>0&&this.raise(e.start,ut.DecoratorConstructor)}}),e||(this.state.strict=!1),this.next(),i.length)throw this.raise(this.state.start,ut.TrailingDecorator);return this.classScope.exit(),this.finishNode(r,\"ClassBody\")}parseClassMemberFromModifier(t,e){const s=this.state.containsEsc,i=this.parseIdentifier(!0);if(this.isClassMethod()){const s=e;return s.kind=\"method\",s.computed=!1,s.key=i,s.static=!1,this.pushClassMethod(t,s,!1,!1,!1,!1),!0}if(this.isClassProperty()){const s=e;return s.computed=!1,s.key=i,s.static=!1,t.body.push(this.parseClassProperty(s)),!0}if(s)throw this.unexpected();return!1}parseClassMember(t,e,s,i){const r=this.isContextual(\"static\");r&&this.parseClassMemberFromModifier(t,e)||this.parseClassMemberWithIsStatic(t,e,s,r,i)}parseClassMemberWithIsStatic(t,e,s,i,r){const n=e,a=e,o=e,c=e,h=n,l=n;if(e.static=i,this.eat(d.star))return h.kind=\"method\",this.parseClassPropertyName(h),\"PrivateName\"===h.key.type?void this.pushClassPrivateMethod(t,a,!0,!1):(this.isNonstaticConstructor(n)&&this.raise(n.key.start,ut.ConstructorIsGenerator),void this.pushClassMethod(t,n,!0,!1,!1,!1));const p=this.state.containsEsc,u=this.parseClassPropertyName(e),f=\"PrivateName\"===u.type,m=\"Identifier\"===u.type,y=this.state.start;if(this.parsePostMemberNameModifiers(l),this.isClassMethod()){if(h.kind=\"method\",f)return void this.pushClassPrivateMethod(t,a,!1,!1);const e=this.isNonstaticConstructor(n);let i=!1;e&&(n.kind=\"constructor\",s.hadConstructor&&!this.hasPlugin(\"typescript\")&&this.raise(u.start,ut.DuplicateConstructor),s.hadConstructor=!0,i=r),this.pushClassMethod(t,n,!1,!1,e,i)}else if(this.isClassProperty())f?this.pushClassPrivateProperty(t,c):this.pushClassProperty(t,o);else if(!m||\"async\"!==u.name||p||this.isLineTerminator())!m||\"get\"!==u.name&&\"set\"!==u.name||p||this.match(d.star)&&this.isLineTerminator()?this.isLineTerminator()?f?this.pushClassPrivateProperty(t,c):this.pushClassProperty(t,o):this.unexpected():(h.kind=u.name,this.parseClassPropertyName(n),\"PrivateName\"===h.key.type?this.pushClassPrivateMethod(t,a,!1,!1):(this.isNonstaticConstructor(n)&&this.raise(n.key.start,ut.ConstructorIsAccessor),this.pushClassMethod(t,n,!1,!1,!1,!1)),this.checkGetterSetterParams(n));else{const e=this.eat(d.star);l.optional&&this.unexpected(y),h.kind=\"method\",this.parseClassPropertyName(h),this.parsePostMemberNameModifiers(l),\"PrivateName\"===h.key.type?this.pushClassPrivateMethod(t,a,e,!0):(this.isNonstaticConstructor(n)&&this.raise(n.key.start,ut.ConstructorIsAsync),this.pushClassMethod(t,n,e,!0,!1,!1))}}parseClassPropertyName(t){const e=this.parsePropertyName(t,!0);return t.computed||!t.static||\"prototype\"!==e.name&&\"prototype\"!==e.value||this.raise(e.start,ut.StaticPrototype),\"PrivateName\"===e.type&&\"constructor\"===e.id.name&&this.raise(e.start,ut.ConstructorClassPrivateField),e}pushClassProperty(t,e){e.computed||\"constructor\"!==e.key.name&&\"constructor\"!==e.key.value||this.raise(e.key.start,ut.ConstructorClassField),t.body.push(this.parseClassProperty(e))}pushClassPrivateProperty(t,e){this.expectPlugin(\"classPrivateProperties\",e.key.start);const s=this.parseClassPrivateProperty(e);t.body.push(s),this.classScope.declarePrivateName(s.key.id.name,tt,s.key.start)}pushClassMethod(t,e,s,i,r,n){t.body.push(this.parseMethod(e,s,i,r,n,\"ClassMethod\",!0))}pushClassPrivateMethod(t,e,s,i){this.expectPlugin(\"classPrivateMethods\",e.key.start);const r=this.parseMethod(e,s,i,!1,!1,\"ClassPrivateMethod\",!0);t.body.push(r);const n=\"get\"===r.kind?r.static?Y:Q:\"set\"===r.kind?r.static?J:Z:tt;this.classScope.declarePrivateName(r.key.id.name,n,r.key.start)}parsePostMemberNameModifiers(t){}parseAccessModifier(){}parseClassPrivateProperty(t){return this.scope.enter(w|b),this.prodParam.enter(re),t.value=this.eat(d.eq)?this.parseMaybeAssign():null,this.semicolon(),this.prodParam.exit(),this.scope.exit(),this.finishNode(t,\"ClassPrivateProperty\")}parseClassProperty(t){return t.typeAnnotation||this.expectPlugin(\"classProperties\"),this.scope.enter(w|b),this.prodParam.enter(re),this.match(d.eq)?(this.expectPlugin(\"classProperties\"),this.next(),t.value=this.parseMaybeAssign()):t.value=null,this.semicolon(),this.prodParam.exit(),this.scope.exit(),this.finishNode(t,\"ClassProperty\")}parseClassId(t,e,s,i=L){this.match(d.name)?(t.id=this.parseIdentifier(),e&&this.checkLVal(t.id,i,void 0,\"class name\")):s||!e?t.id=null:this.unexpected(null,ut.MissingClassName)}parseClassSuper(t){t.superClass=this.eat(d._extends)?this.parseExprSubscripts():null}parseExport(t){const e=this.maybeParseExportDefaultSpecifier(t),s=!e||this.eat(d.comma),i=s&&this.eatExportStar(t),r=i&&this.maybeParseExportNamespaceSpecifier(t),n=s&&(!r||this.eat(d.comma)),a=e||i;if(i&&!r)return e&&this.unexpected(),this.parseExportFrom(t,!0),this.finishNode(t,\"ExportAllDeclaration\");const o=this.maybeParseExportNamedSpecifiers(t);if(e&&s&&!i&&!o||r&&n&&!o)throw this.unexpected(null,d.braceL);let c;if(a||o?(c=!1,this.parseExportFrom(t,a)):c=this.maybeParseExportDeclaration(t),a||o||c)return this.checkExport(t,!0,!1,!!t.source),this.finishNode(t,\"ExportNamedDeclaration\");if(this.eat(d._default))return t.declaration=this.parseExportDefaultExpression(),this.checkExport(t,!0,!0),this.finishNode(t,\"ExportDefaultDeclaration\");throw this.unexpected(null,d.braceL)}eatExportStar(t){return this.eat(d.star)}maybeParseExportDefaultSpecifier(t){if(this.isExportDefaultSpecifier()){this.expectPlugin(\"exportDefaultFrom\");const e=this.startNode();return e.exported=this.parseIdentifier(!0),t.specifiers=[this.finishNode(e,\"ExportDefaultSpecifier\")],!0}return!1}maybeParseExportNamespaceSpecifier(t){if(this.isContextual(\"as\")){t.specifiers||(t.specifiers=[]);const e=this.startNodeAt(this.state.lastTokStart,this.state.lastTokStartLoc);return this.next(),e.exported=this.parseIdentifier(!0),t.specifiers.push(this.finishNode(e,\"ExportNamespaceSpecifier\")),!0}return!1}maybeParseExportNamedSpecifiers(t){return!!this.match(d.braceL)&&(t.specifiers||(t.specifiers=[]),t.specifiers.push(...this.parseExportSpecifiers()),t.source=null,t.declaration=null,!0)}maybeParseExportDeclaration(t){if(this.shouldParseExportDeclaration()){if(this.isContextual(\"async\")){const t=this.nextTokenStart();this.isUnparsedContextual(t,\"function\")||this.unexpected(t,d._function)}return t.specifiers=[],t.source=null,t.declaration=this.parseExportDeclaration(t),!0}return!1}isAsyncFunction(){if(!this.isContextual(\"async\"))return!1;const t=this.nextTokenStart();return!et.test(this.input.slice(this.state.pos,t))&&this.isUnparsedContextual(t,\"function\")}parseExportDefaultExpression(){const t=this.startNode(),e=this.isAsyncFunction();if(this.match(d._function)||e)return this.next(),e&&this.next(),this.parseFunction(t,He|We,e);if(this.match(d._class))return this.parseClass(t,!0,!0);if(this.match(d.at))return this.hasPlugin(\"decorators\")&&this.getPluginOption(\"decorators\",\"decoratorsBeforeExport\")&&this.raise(this.state.start,ut.DecoratorBeforeExport),this.parseDecorators(!1),this.parseClass(t,!0,!0);if(this.match(d._const)||this.match(d._var)||this.isLet())throw this.raise(this.state.start,ut.UnsupportedDefaultExport);{const t=this.parseMaybeAssign();return this.semicolon(),t}}parseExportDeclaration(t){return this.parseStatement(null)}isExportDefaultSpecifier(){if(this.match(d.name)){const t=this.state.value;if(\"async\"===t||\"let\"===t)return!1;if((\"type\"===t||\"interface\"===t)&&!this.state.containsEsc){const t=this.lookahead();if(t.type===d.name&&\"from\"!==t.value||t.type===d.braceL)return this.expectOnePlugin([\"flow\",\"typescript\"]),!1}}else if(!this.match(d._default))return!1;const t=this.nextTokenStart(),e=this.isUnparsedContextual(t,\"from\");if(44===this.input.charCodeAt(t)||this.match(d.name)&&e)return!0;if(this.match(d._default)&&e){const e=this.input.charCodeAt(this.nextTokenStartSince(t+4));return 34===e||39===e}return!1}parseExportFrom(t,e){this.eatContextual(\"from\")?(t.source=this.parseImportSource(),this.checkExport(t)):e?this.unexpected():t.source=null,this.semicolon()}shouldParseExportDeclaration(){if(this.match(d.at)&&(this.expectOnePlugin([\"decorators\",\"decorators-legacy\"]),this.hasPlugin(\"decorators\"))){if(!this.getPluginOption(\"decorators\",\"decoratorsBeforeExport\"))return!0;this.unexpected(this.state.start,ut.DecoratorBeforeExport)}return\"var\"===this.state.type.keyword||\"const\"===this.state.type.keyword||\"function\"===this.state.type.keyword||\"class\"===this.state.type.keyword||this.isLet()||this.isAsyncFunction()}checkExport(t,e,s,i){if(e)if(s){if(this.checkDuplicateExports(t,\"default\"),this.hasPlugin(\"exportDefaultFrom\")){var r;const e=t.declaration;\"Identifier\"!==e.type||\"from\"!==e.name||e.end-e.start!==4||(null==(r=e.extra)?void 0:r.parenthesized)||this.raise(e.start,ut.ExportDefaultFromAsIdentifier)}}else if(t.specifiers&&t.specifiers.length)for(let a=0,o=t.specifiers;a<o.length;a++){const t=o[a];this.checkDuplicateExports(t,t.exported.name),!i&&t.local&&(this.checkReservedWord(t.local.name,t.local.start,!0,!1),this.scope.checkLocalExport(t.local))}else if(t.declaration)if(\"FunctionDeclaration\"===t.declaration.type||\"ClassDeclaration\"===t.declaration.type){const e=t.declaration.id;if(!e)throw new Error(\"Assertion failure\");this.checkDuplicateExports(t,e.name)}else if(\"VariableDeclaration\"===t.declaration.type)for(let a=0,o=t.declaration.declarations;a<o.length;a++){const t=o[a];this.checkDeclaration(t.id)}const n=this.state.decoratorStack[this.state.decoratorStack.length-1];if(n.length){const e=t.declaration&&(\"ClassDeclaration\"===t.declaration.type||\"ClassExpression\"===t.declaration.type);if(!t.declaration||!e)throw this.raise(t.start,ut.UnsupportedDecoratorExport);this.takeDecorators(t.declaration)}}checkDeclaration(t){if(\"Identifier\"===t.type)this.checkDuplicateExports(t,t.name);else if(\"ObjectPattern\"===t.type)for(let e=0,s=t.properties;e<s.length;e++){const t=s[e];this.checkDeclaration(t)}else if(\"ArrayPattern\"===t.type)for(let e=0,s=t.elements;e<s.length;e++){const t=s[e];t&&this.checkDeclaration(t)}else\"ObjectProperty\"===t.type?this.checkDeclaration(t.value):\"RestElement\"===t.type?this.checkDeclaration(t.argument):\"AssignmentPattern\"===t.type&&this.checkDeclaration(t.left)}checkDuplicateExports(t,e){this.state.exportedIdentifiers.indexOf(e)>-1&&this.raise(t.start,\"default\"===e?ut.DuplicateDefaultExport:ut.DuplicateExport,e),this.state.exportedIdentifiers.push(e)}parseExportSpecifiers(){const t=[];let e=!0;this.expect(d.braceL);while(!this.eat(d.braceR)){if(e)e=!1;else if(this.expect(d.comma),this.eat(d.braceR))break;const s=this.startNode();s.local=this.parseIdentifier(!0),s.exported=this.eatContextual(\"as\")?this.parseIdentifier(!0):s.local.__clone(),t.push(this.finishNode(s,\"ExportSpecifier\"))}return t}parseImport(t){if(t.specifiers=[],!this.match(d.string)){const e=this.maybeParseDefaultImportSpecifier(t),s=!e||this.eat(d.comma),i=s&&this.maybeParseStarImportSpecifier(t);s&&!i&&this.parseNamedImportSpecifiers(t),this.expectContextual(\"from\")}t.source=this.parseImportSource();const e=this.maybeParseModuleAttributes();return e&&(t.attributes=e),this.semicolon(),this.finishNode(t,\"ImportDeclaration\")}parseImportSource(){return this.match(d.string)||this.unexpected(),this.parseExprAtom()}shouldParseDefaultImport(t){return this.match(d.name)}parseImportSpecifierLocal(t,e,s,i){e.local=this.parseIdentifier(),this.checkLVal(e.local,_,void 0,i),t.specifiers.push(this.finishNode(e,s))}maybeParseModuleAttributes(){if(!this.match(d._with)||this.hasPrecedingLineBreak())return this.hasPlugin(\"moduleAttributes\")?[]:null;this.expectPlugin(\"moduleAttributes\"),this.next();const t=[],e=new Set;do{const s=this.startNode();if(s.key=this.parseIdentifier(!0),\"type\"!==s.key.name&&this.raise(s.key.start,ut.ModuleAttributeDifferentFromType,s.key.name),e.has(s.key.name)&&this.raise(s.key.start,ut.ModuleAttributesWithDuplicateKeys,s.key.name),e.add(s.key.name),this.expect(d.colon),!this.match(d.string))throw this.unexpected(this.state.start,ut.ModuleAttributeInvalidValue);s.value=this.parseLiteral(this.state.value,\"StringLiteral\"),this.finishNode(s,\"ImportAttribute\"),t.push(s)}while(this.eat(d.comma));return t}maybeParseDefaultImportSpecifier(t){return!!this.shouldParseDefaultImport(t)&&(this.parseImportSpecifierLocal(t,this.startNode(),\"ImportDefaultSpecifier\",\"default import specifier\"),!0)}maybeParseStarImportSpecifier(t){if(this.match(d.star)){const e=this.startNode();return this.next(),this.expectContextual(\"as\"),this.parseImportSpecifierLocal(t,e,\"ImportNamespaceSpecifier\",\"import namespace specifier\"),!0}return!1}parseNamedImportSpecifiers(t){let e=!0;this.expect(d.braceL);while(!this.eat(d.braceR)){if(e)e=!1;else{if(this.eat(d.colon))throw this.raise(this.state.start,ut.DestructureNamedImport);if(this.expect(d.comma),this.eat(d.braceR))break}this.parseImportSpecifier(t)}}parseImportSpecifier(t){const e=this.startNode();e.imported=this.parseIdentifier(!0),this.eatContextual(\"as\")?e.local=this.parseIdentifier():(this.checkReservedWord(e.imported.name,e.start,!0,!0),e.local=e.imported.__clone()),this.checkLVal(e.local,_,void 0,\"import specifier\"),t.specifiers.push(this.finishNode(e,\"ImportSpecifier\"))}}class $e{constructor(){this.privateNames=new Set,this.loneAccessors=new Map,this.undefinedPrivateNames=new Map}}class Xe{constructor(t){this.stack=[],this.undefinedPrivateNames=new Map,this.raise=t}current(){return this.stack[this.stack.length-1]}enter(){this.stack.push(new $e)}exit(){const t=this.stack.pop(),e=this.current();for(let s=0,i=Array.from(t.undefinedPrivateNames);s<i.length;s++){const[t,r]=i[s];e?e.undefinedPrivateNames.has(t)||e.undefinedPrivateNames.set(t,r):this.raise(r,ut.InvalidPrivateFieldResolution,t)}}declarePrivateName(t,e,s){const i=this.current();let r=i.privateNames.has(t);if(e&G){const s=r&&i.loneAccessors.get(t);if(s){const n=s&K,a=e&K,o=s&G,c=e&G;r=o===c||n!==a,r||i.loneAccessors.delete(t)}else r||i.loneAccessors.set(t,e)}r&&this.raise(s,ut.PrivateNameRedeclaration,t),i.privateNames.add(t),i.undefinedPrivateNames.delete(t)}usePrivateName(t,e){let s;for(let i=0,r=this.stack;i<r.length;i++)if(s=r[i],s.privateNames.has(t))return;s?s.undefinedPrivateNames.set(t,e):this.raise(e,ut.InvalidPrivateFieldResolution,t)}}class Ge extends Ke{constructor(t,e){t=Ae(t),super(t,e);const s=this.getScopeHandler();this.options=t,this.inModule=\"module\"===this.options.sourceType,this.scope=new s(this.raise.bind(this),this.inModule),this.prodParam=new ce,this.classScope=new Xe(this.raise.bind(this)),this.plugins=Ye(this.options.plugins),this.filename=t.sourceFilename}getScopeHandler(){return ee}parse(){let t=re;this.hasPlugin(\"topLevelAwait\")&&this.inModule&&(t|=ae),this.scope.enter(m),this.prodParam.enter(t);const e=this.startNode(),s=this.startNode();return this.nextToken(),e.errors=null,this.parseTopLevel(e,s),e.errors=this.state.errors,e}}function Ye(t){const e=new Map;for(let s=0;s<t.length;s++){const i=t[s],[r,n]=Array.isArray(i)?i:[i,{}];e.has(r)||e.set(r,n||{})}return e}function Je(t,e){var s;if(\"unambiguous\"!==(null==(s=e)?void 0:s.sourceType))return Ze(e,t).parse();e=Object.assign({},e);try{e.sourceType=\"module\";const s=Ze(e,t),r=s.parse();if(s.sawUnambiguousESM)return r;if(s.ambiguousScriptDifferentAst)try{return e.sourceType=\"script\",Ze(e,t).parse()}catch(i){}else r.program.sourceType=\"script\";return r}catch(r){try{return e.sourceType=\"script\",Ze(e,t).parse()}catch(n){}throw r}}function Qe(t,e){const s=Ze(e,t);return s.options.strictMode&&(s.state.strict=!0),s.getExpression()}function Ze(t,e){let s=Ge;return(null==t?void 0:t.plugins)&&(we(t.plugins),s=es(t.plugins)),new s(t,e)}const ts={};function es(t){const e=Te.filter(e=>ge(t,e)),s=e.join(\"/\");let i=ts[s];if(!i){i=Ge;for(let t=0;t<e.length;t++){const s=e[t];i=Pe[s](i)}ts[s]=i}return i}e.parse=Je,e.parseExpression=Qe,e.tokTypes=d},\"19aa\":function(t,e){t.exports=function(t,e,s){if(!(t instanceof e))throw TypeError(\"Incorrect \"+(s?s+\" \":\"\")+\"invocation\");return t}},\"1be4\":function(t,e,s){var i=s(\"d066\");t.exports=i(\"document\",\"documentElement\")},\"1c0b\":function(t,e){t.exports=function(t){if(\"function\"!=typeof t)throw TypeError(String(t)+\" is not a function\");return t}},\"1c7e\":function(t,e,s){var i=s(\"b622\"),r=i(\"iterator\"),n=!1;try{var a=0,o={next:function(){return{done:!!a++}},return:function(){n=!0}};o[r]=function(){return this},Array.from(o,(function(){throw 2}))}catch(c){}t.exports=function(t,e){if(!e&&!n)return!1;var s=!1;try{var i={};i[r]=function(){return{next:function(){return{done:s=!0}}}},t(i)}catch(c){}return s}},\"1cdc\":function(t,e,s){var i=s(\"342f\");t.exports=/(iphone|ipod|ipad).*applewebkit/i.test(i)},\"1d80\":function(t,e){t.exports=function(t){if(void 0==t)throw TypeError(\"Can't call method on \"+t);return t}},\"1dde\":function(t,e,s){var i=s(\"d039\"),r=s(\"b622\"),n=s(\"2d00\"),a=r(\"species\");t.exports=function(t){return n>=51||!i((function(){var e=[],s=e.constructor={};return s[a]=function(){return{foo:1}},1!==e[t](Boolean).foo}))}},\"21a1\":function(t,e,s){(function(e){(function(e,s){t.exports=s()})(0,(function(){\"use strict\";\"undefined\"!==typeof window?window:\"undefined\"!==typeof e||\"undefined\"!==typeof self&&self;function t(t,e){return e={exports:{}},t(e,e.exports),e.exports}var s=t((function(t,e){(function(e,s){t.exports=s()})(0,(function(){function t(t){var e=t&&\"object\"===typeof t;return e&&\"[object RegExp]\"!==Object.prototype.toString.call(t)&&\"[object Date]\"!==Object.prototype.toString.call(t)}function e(t){return Array.isArray(t)?[]:{}}function s(s,i){var r=i&&!0===i.clone;return r&&t(s)?n(e(s),s,i):s}function i(e,i,r){var a=e.slice();return i.forEach((function(i,o){\"undefined\"===typeof a[o]?a[o]=s(i,r):t(i)?a[o]=n(e[o],i,r):-1===e.indexOf(i)&&a.push(s(i,r))})),a}function r(e,i,r){var a={};return t(e)&&Object.keys(e).forEach((function(t){a[t]=s(e[t],r)})),Object.keys(i).forEach((function(o){t(i[o])&&e[o]?a[o]=n(e[o],i[o],r):a[o]=s(i[o],r)})),a}function n(t,e,n){var a=Array.isArray(e),o=n||{arrayMerge:i},c=o.arrayMerge||i;return a?Array.isArray(t)?c(t,e,n):s(e,n):r(t,e,n)}return n.all=function(t,e){if(!Array.isArray(t)||t.length<2)throw new Error(\"first argument should be an array with at least two elements\");return t.reduce((function(t,s){return n(t,s,e)}))},n}))}));function i(t){return t=t||Object.create(null),{on:function(e,s){(t[e]||(t[e]=[])).push(s)},off:function(e,s){t[e]&&t[e].splice(t[e].indexOf(s)>>>0,1)},emit:function(e,s){(t[e]||[]).map((function(t){t(s)})),(t[\"*\"]||[]).map((function(t){t(e,s)}))}}}var r=t((function(t,e){var s={svg:{name:\"xmlns\",uri:\"http://www.w3.org/2000/svg\"},xlink:{name:\"xmlns:xlink\",uri:\"http://www.w3.org/1999/xlink\"}};e.default=s,t.exports=e.default})),n=function(t){return Object.keys(t).map((function(e){var s=t[e].toString().replace(/\"/g,\"&quot;\");return e+'=\"'+s+'\"'})).join(\" \")},a=r.svg,o=r.xlink,c={};c[a.name]=a.uri,c[o.name]=o.uri;var h,l=function(t,e){void 0===t&&(t=\"\");var i=s(c,e||{}),r=n(i);return\"<svg \"+r+\">\"+t+\"</svg>\"},p=r.svg,u=r.xlink,d={attrs:(h={style:[\"position: absolute\",\"width: 0\",\"height: 0\"].join(\"; \"),\"aria-hidden\":\"true\"},h[p.name]=p.uri,h[u.name]=u.uri,h)},f=function(t){this.config=s(d,t||{}),this.symbols=[]};f.prototype.add=function(t){var e=this,s=e.symbols,i=this.find(t.id);return i?(s[s.indexOf(i)]=t,!1):(s.push(t),!0)},f.prototype.remove=function(t){var e=this,s=e.symbols,i=this.find(t);return!!i&&(s.splice(s.indexOf(i),1),i.destroy(),!0)},f.prototype.find=function(t){return this.symbols.filter((function(e){return e.id===t}))[0]||null},f.prototype.has=function(t){return null!==this.find(t)},f.prototype.stringify=function(){var t=this.config,e=t.attrs,s=this.symbols.map((function(t){return t.stringify()})).join(\"\");return l(s,e)},f.prototype.toString=function(){return this.stringify()},f.prototype.destroy=function(){this.symbols.forEach((function(t){return t.destroy()}))};var m=function(t){var e=t.id,s=t.viewBox,i=t.content;this.id=e,this.viewBox=s,this.content=i};m.prototype.stringify=function(){return this.content},m.prototype.toString=function(){return this.stringify()},m.prototype.destroy=function(){var t=this;[\"id\",\"viewBox\",\"content\"].forEach((function(e){return delete t[e]}))};var y=function(t){var e=!!document.importNode,s=(new DOMParser).parseFromString(t,\"image/svg+xml\").documentElement;return e?document.importNode(s,!0):s},g=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var s={isMounted:{}};return s.isMounted.get=function(){return!!this.node},e.createFromExistingNode=function(t){return new e({id:t.getAttribute(\"id\"),viewBox:t.getAttribute(\"viewBox\"),content:t.outerHTML})},e.prototype.destroy=function(){this.isMounted&&this.unmount(),t.prototype.destroy.call(this)},e.prototype.mount=function(t){if(this.isMounted)return this.node;var e=\"string\"===typeof t?document.querySelector(t):t,s=this.render();return this.node=s,e.appendChild(s),s},e.prototype.render=function(){var t=this.stringify();return y(l(t)).childNodes[0]},e.prototype.unmount=function(){this.node.parentNode.removeChild(this.node)},Object.defineProperties(e.prototype,s),e}(m),x={autoConfigure:!0,mountTo:\"body\",syncUrlsWithBaseTag:!1,listenLocationChangeEvent:!0,locationChangeEvent:\"locationChange\",locationChangeAngularEmitter:!1,usagesToUpdate:\"use[*|href]\",moveGradientsOutsideSymbol:!1},b=function(t){return Array.prototype.slice.call(t,0)},v={isChrome:function(){return/chrome/i.test(navigator.userAgent)},isFirefox:function(){return/firefox/i.test(navigator.userAgent)},isIE:function(){return/msie/i.test(navigator.userAgent)||/trident/i.test(navigator.userAgent)},isEdge:function(){return/edge/i.test(navigator.userAgent)}},w=function(t,e){var s=document.createEvent(\"CustomEvent\");s.initCustomEvent(t,!1,!1,e),window.dispatchEvent(s)},P=function(t){var e=[];return b(t.querySelectorAll(\"style\")).forEach((function(t){t.textContent+=\"\",e.push(t)})),e},T=function(t){return(t||window.location.href).split(\"#\")[0]},E=function(t){angular.module(\"ng\").run([\"$rootScope\",function(e){e.$on(\"$locationChangeSuccess\",(function(e,s,i){w(t,{oldUrl:i,newUrl:s})}))}])},A=\"linearGradient, radialGradient, pattern, mask, clipPath\",S=function(t,e){return void 0===e&&(e=A),b(t.querySelectorAll(\"symbol\")).forEach((function(t){b(t.querySelectorAll(e)).forEach((function(e){t.parentNode.insertBefore(e,t)}))})),t};function C(t,e){var s=b(t).reduce((function(t,s){if(!s.attributes)return t;var i=b(s.attributes),r=e?i.filter(e):i;return t.concat(r)}),[]);return s}var k=r.xlink.uri,N=\"xlink:href\",I=/[{}|\\\\\\^\\[\\]`\"<>]/g;function O(t){return t.replace(I,(function(t){return\"%\"+t[0].charCodeAt(0).toString(16).toUpperCase()}))}function D(t){return t.replace(/[.*+?^${}()|[\\]\\\\]/g,\"\\\\$&\")}function M(t,e,s){return b(t).forEach((function(t){var i=t.getAttribute(N);if(i&&0===i.indexOf(e)){var r=i.replace(e,s);t.setAttributeNS(k,N,r)}})),t}var L,_=[\"clipPath\",\"colorProfile\",\"src\",\"cursor\",\"fill\",\"filter\",\"marker\",\"markerStart\",\"markerMid\",\"markerEnd\",\"mask\",\"stroke\",\"style\"],R=_.map((function(t){return\"[\"+t+\"]\"})).join(\",\"),j=function(t,e,s,i){var r=O(s),n=O(i),a=t.querySelectorAll(R),o=C(a,(function(t){var e=t.localName,s=t.value;return-1!==_.indexOf(e)&&-1!==s.indexOf(\"url(\"+r)}));o.forEach((function(t){return t.value=t.value.replace(new RegExp(D(r),\"g\"),n)})),M(e,r,n)},F={MOUNT:\"mount\",SYMBOL_MOUNT:\"symbol_mount\"},B=function(t){function e(e){var r=this;void 0===e&&(e={}),t.call(this,s(x,e));var n=i();this._emitter=n,this.node=null;var a=this,o=a.config;if(o.autoConfigure&&this._autoConfigure(e),o.syncUrlsWithBaseTag){var c=document.getElementsByTagName(\"base\")[0].getAttribute(\"href\");n.on(F.MOUNT,(function(){return r.updateUrls(\"#\",c)}))}var h=this._handleLocationChange.bind(this);this._handleLocationChange=h,o.listenLocationChangeEvent&&window.addEventListener(o.locationChangeEvent,h),o.locationChangeAngularEmitter&&E(o.locationChangeEvent),n.on(F.MOUNT,(function(t){o.moveGradientsOutsideSymbol&&S(t)})),n.on(F.SYMBOL_MOUNT,(function(t){o.moveGradientsOutsideSymbol&&S(t.parentNode),(v.isIE()||v.isEdge())&&P(t)}))}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={isMounted:{}};return r.isMounted.get=function(){return!!this.node},e.prototype._autoConfigure=function(t){var e=this,s=e.config;\"undefined\"===typeof t.syncUrlsWithBaseTag&&(s.syncUrlsWithBaseTag=\"undefined\"!==typeof document.getElementsByTagName(\"base\")[0]),\"undefined\"===typeof t.locationChangeAngularEmitter&&(s.locationChangeAngularEmitter=\"undefined\"!==typeof window.angular),\"undefined\"===typeof t.moveGradientsOutsideSymbol&&(s.moveGradientsOutsideSymbol=v.isFirefox())},e.prototype._handleLocationChange=function(t){var e=t.detail,s=e.oldUrl,i=e.newUrl;this.updateUrls(s,i)},e.prototype.add=function(e){var s=this,i=t.prototype.add.call(this,e);return this.isMounted&&i&&(e.mount(s.node),this._emitter.emit(F.SYMBOL_MOUNT,e.node)),i},e.prototype.attach=function(t){var e=this,s=this;if(s.isMounted)return s.node;var i=\"string\"===typeof t?document.querySelector(t):t;return s.node=i,this.symbols.forEach((function(t){t.mount(s.node),e._emitter.emit(F.SYMBOL_MOUNT,t.node)})),b(i.querySelectorAll(\"symbol\")).forEach((function(t){var e=g.createFromExistingNode(t);e.node=t,s.add(e)})),this._emitter.emit(F.MOUNT,i),i},e.prototype.destroy=function(){var t=this,e=t.config,s=t.symbols,i=t._emitter;s.forEach((function(t){return t.destroy()})),i.off(\"*\"),window.removeEventListener(e.locationChangeEvent,this._handleLocationChange),this.isMounted&&this.unmount()},e.prototype.mount=function(t,e){void 0===t&&(t=this.config.mountTo),void 0===e&&(e=!1);var s=this;if(s.isMounted)return s.node;var i=\"string\"===typeof t?document.querySelector(t):t,r=s.render();return this.node=r,e&&i.childNodes[0]?i.insertBefore(r,i.childNodes[0]):i.appendChild(r),this._emitter.emit(F.MOUNT,r),r},e.prototype.render=function(){return y(this.stringify())},e.prototype.unmount=function(){this.node.parentNode.removeChild(this.node)},e.prototype.updateUrls=function(t,e){if(!this.isMounted)return!1;var s=document.querySelectorAll(this.config.usagesToUpdate);return j(this.node,s,T(t)+\"#\",T(e)+\"#\"),!0},Object.defineProperties(e.prototype,r),e}(f),U=t((function(t){\n/*!\n  * domready (c) Dustin Diaz 2014 - License MIT\n  */\n!function(e,s){t.exports=s()}(0,(function(){var t,e=[],s=document,i=s.documentElement.doScroll,r=\"DOMContentLoaded\",n=(i?/^loaded|^c/:/^loaded|^i|^c/).test(s.readyState);return n||s.addEventListener(r,t=function(){s.removeEventListener(r,t),n=1;while(t=e.shift())t()}),function(t){n?setTimeout(t,0):e.push(t)}}))})),q=\"__SVG_SPRITE_NODE__\",V=\"__SVG_SPRITE__\",H=!!window[V];H?L=window[V]:(L=new B({attrs:{id:q}}),window[V]=L);var z=function(){var t=document.getElementById(q);t?L.attach(t):L.mount(document.body,!0)};document.body?z():U(z);var W=L;return W}))}).call(this,s(\"c8ba\"))},\"21a6\":function(t,e,s){(function(s){var i,r,n;(function(s,a){r=[],i=a,n=\"function\"===typeof i?i.apply(e,r):i,void 0===n||(t.exports=n)})(0,(function(){\"use strict\";function e(t,e){return\"undefined\"==typeof e?e={autoBom:!1}:\"object\"!=typeof e&&(console.warn(\"Deprecated: Expected third argument to be a object\"),e={autoBom:!e}),e.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(t.type)?new Blob([\"\\ufeff\",t],{type:t.type}):t}function i(t,e,s){var i=new XMLHttpRequest;i.open(\"GET\",t),i.responseType=\"blob\",i.onload=function(){o(i.response,e,s)},i.onerror=function(){console.error(\"could not download file\")},i.send()}function r(t){var e=new XMLHttpRequest;e.open(\"HEAD\",t,!1);try{e.send()}catch(t){}return 200<=e.status&&299>=e.status}function n(t){try{t.dispatchEvent(new MouseEvent(\"click\"))}catch(i){var e=document.createEvent(\"MouseEvents\");e.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),t.dispatchEvent(e)}}var a=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof s&&s.global===s?s:void 0,o=a.saveAs||(\"object\"!=typeof window||window!==a?function(){}:\"download\"in HTMLAnchorElement.prototype?function(t,e,s){var o=a.URL||a.webkitURL,c=document.createElement(\"a\");e=e||t.name||\"download\",c.download=e,c.rel=\"noopener\",\"string\"==typeof t?(c.href=t,c.origin===location.origin?n(c):r(c.href)?i(t,e,s):n(c,c.target=\"_blank\")):(c.href=o.createObjectURL(t),setTimeout((function(){o.revokeObjectURL(c.href)}),4e4),setTimeout((function(){n(c)}),0))}:\"msSaveOrOpenBlob\"in navigator?function(t,s,a){if(s=s||t.name||\"download\",\"string\"!=typeof t)navigator.msSaveOrOpenBlob(e(t,a),s);else if(r(t))i(t,s,a);else{var o=document.createElement(\"a\");o.href=t,o.target=\"_blank\",setTimeout((function(){n(o)}))}}:function(t,e,s,r){if(r=r||open(\"\",\"_blank\"),r&&(r.document.title=r.document.body.innerText=\"downloading...\"),\"string\"==typeof t)return i(t,e,s);var n=\"application/octet-stream\"===t.type,o=/constructor/i.test(a.HTMLElement)||a.safari,c=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((c||n&&o)&&\"object\"==typeof FileReader){var h=new FileReader;h.onloadend=function(){var t=h.result;t=c?t:t.replace(/^data:[^;]*;/,\"data:attachment/file;\"),r?r.location.href=t:location=t,r=null},h.readAsDataURL(t)}else{var l=a.URL||a.webkitURL,p=l.createObjectURL(t);r?r.location=p:location.href=p,r=null,setTimeout((function(){l.revokeObjectURL(p)}),4e4)}});a.saveAs=o.saveAs=o,t.exports=o}))}).call(this,s(\"c8ba\"))},2266:function(t,e,s){var i=s(\"825a\"),r=s(\"e95a\"),n=s(\"50c4\"),a=s(\"0366\"),o=s(\"35a1\"),c=s(\"9bdd\"),h=function(t,e){this.stopped=t,this.result=e},l=t.exports=function(t,e,s,l,p){var u,d,f,m,y,g,x,b=a(e,s,l?2:1);if(p)u=t;else{if(d=o(t),\"function\"!=typeof d)throw TypeError(\"Target is not iterable\");if(r(d)){for(f=0,m=n(t.length);m>f;f++)if(y=l?b(i(x=t[f])[0],x[1]):b(t[f]),y&&y instanceof h)return y;return new h(!1)}u=d.call(t)}g=u.next;while(!(x=g.call(u)).done)if(y=c(u,b,x.value,l),\"object\"==typeof y&&y&&y instanceof h)return y;return new h(!1)};l.stop=function(t){return new h(!0,t)}},\"23cb\":function(t,e,s){var i=s(\"a691\"),r=Math.max,n=Math.min;t.exports=function(t,e){var s=i(t);return s<0?r(s+e,0):n(s,e)}},\"23e7\":function(t,e,s){var i=s(\"da84\"),r=s(\"06cf\").f,n=s(\"9112\"),a=s(\"6eeb\"),o=s(\"ce4e\"),c=s(\"e893\"),h=s(\"94ca\");t.exports=function(t,e){var s,l,p,u,d,f,m=t.target,y=t.global,g=t.stat;if(l=y?i:g?i[m]||o(m,{}):(i[m]||{}).prototype,l)for(p in e){if(d=e[p],t.noTargetGet?(f=r(l,p),u=f&&f.value):u=l[p],s=h(y?p:m+(g?\".\":\"#\")+p,t.forced),!s&&void 0!==u){if(typeof d===typeof u)continue;c(d,u)}(t.sham||u&&u.sham)&&n(d,\"sham\",!0),a(l,p,d,t)}}},\"241c\":function(t,e,s){var i=s(\"ca84\"),r=s(\"7839\"),n=r.concat(\"length\",\"prototype\");e.f=Object.getOwnPropertyNames||function(t){return i(t,n)}},\"25f0\":function(t,e,s){\"use strict\";var i=s(\"6eeb\"),r=s(\"825a\"),n=s(\"d039\"),a=s(\"ad6d\"),o=\"toString\",c=RegExp.prototype,h=c[o],l=n((function(){return\"/a/b\"!=h.call({source:\"a\",flags:\"b\"})})),p=h.name!=o;(l||p)&&i(RegExp.prototype,o,(function(){var t=r(this),e=String(t.source),s=t.flags,i=String(void 0===s&&t instanceof RegExp&&!(\"flags\"in c)?a.call(t):s);return\"/\"+e+\"/\"+i}),{unsafe:!0})},2626:function(t,e,s){\"use strict\";var i=s(\"d066\"),r=s(\"9bf2\"),n=s(\"b622\"),a=s(\"83ab\"),o=n(\"species\");t.exports=function(t){var e=i(t),s=r.f;a&&e&&!e[o]&&s(e,o,{configurable:!0,get:function(){return this}})}},2877:function(t,e,s){\"use strict\";function i(t,e,s,i,r,n,a,o){var c,h=\"function\"===typeof t?t.options:t;if(e&&(h.render=e,h.staticRenderFns=s,h._compiled=!0),i&&(h.functional=!0),n&&(h._scopeId=\"data-v-\"+n),a?(c=function(t){t=t||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext,t||\"undefined\"===typeof __VUE_SSR_CONTEXT__||(t=__VUE_SSR_CONTEXT__),r&&r.call(this,t),t&&t._registeredComponents&&t._registeredComponents.add(a)},h._ssrRegister=c):r&&(c=o?function(){r.call(this,(h.functional?this.parent:this).$root.$options.shadowRoot)}:r),c)if(h.functional){h._injectStyles=c;var l=h.render;h.render=function(t,e){return c.call(e),l(t,e)}}else{var p=h.beforeCreate;h.beforeCreate=p?[].concat(p,c):[c]}return{exports:t,options:h}}s.d(e,\"a\",(function(){return i}))},\"28a0\":function(t,e){\"function\"===typeof Object.create?t.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:t.exports=function(t,e){t.super_=e;var s=function(){};s.prototype=e.prototype,t.prototype=new s,t.prototype.constructor=t}},\"2cf4\":function(t,e,s){var i,r,n,a=s(\"da84\"),o=s(\"d039\"),c=s(\"c6b6\"),h=s(\"0366\"),l=s(\"1be4\"),p=s(\"cc12\"),u=s(\"1cdc\"),d=a.location,f=a.setImmediate,m=a.clearImmediate,y=a.process,g=a.MessageChannel,x=a.Dispatch,b=0,v={},w=\"onreadystatechange\",P=function(t){if(v.hasOwnProperty(t)){var e=v[t];delete v[t],e()}},T=function(t){return function(){P(t)}},E=function(t){P(t.data)},A=function(t){a.postMessage(t+\"\",d.protocol+\"//\"+d.host)};f&&m||(f=function(t){var e=[],s=1;while(arguments.length>s)e.push(arguments[s++]);return v[++b]=function(){(\"function\"==typeof t?t:Function(t)).apply(void 0,e)},i(b),b},m=function(t){delete v[t]},\"process\"==c(y)?i=function(t){y.nextTick(T(t))}:x&&x.now?i=function(t){x.now(T(t))}:g&&!u?(r=new g,n=r.port2,r.port1.onmessage=E,i=h(n.postMessage,n,1)):!a.addEventListener||\"function\"!=typeof postMessage||a.importScripts||o(A)||\"file:\"===d.protocol?i=w in p(\"script\")?function(t){l.appendChild(p(\"script\"))[w]=function(){l.removeChild(this),P(t)}}:function(t){setTimeout(T(t),0)}:(i=A,a.addEventListener(\"message\",E,!1))),t.exports={set:f,clear:m}},\"2d00\":function(t,e,s){var i,r,n=s(\"da84\"),a=s(\"342f\"),o=n.process,c=o&&o.versions,h=c&&c.v8;h?(i=h.split(\".\"),r=i[0]+i[1]):a&&(i=a.match(/Edge\\/(\\d+)/),(!i||i[1]>=74)&&(i=a.match(/Chrome\\/(\\d+)/),i&&(r=i[1]))),t.exports=r&&+r},3022:function(t,e,s){(function(t){var i=Object.getOwnPropertyDescriptors||function(t){for(var e=Object.keys(t),s={},i=0;i<e.length;i++)s[e[i]]=Object.getOwnPropertyDescriptor(t,e[i]);return s},r=/%[sdj%]/g;e.format=function(t){if(!P(t)){for(var e=[],s=0;s<arguments.length;s++)e.push(o(arguments[s]));return e.join(\" \")}s=1;for(var i=arguments,n=i.length,a=String(t).replace(r,(function(t){if(\"%%\"===t)return\"%\";if(s>=n)return t;switch(t){case\"%s\":return String(i[s++]);case\"%d\":return Number(i[s++]);case\"%j\":try{return JSON.stringify(i[s++])}catch(e){return\"[Circular]\"}default:return t}})),c=i[s];s<n;c=i[++s])b(c)||!S(c)?a+=\" \"+c:a+=\" \"+o(c);return a},e.deprecate=function(s,i){if(\"undefined\"!==typeof t&&!0===t.noDeprecation)return s;if(\"undefined\"===typeof t)return function(){return e.deprecate(s,i).apply(this,arguments)};var r=!1;function n(){if(!r){if(t.throwDeprecation)throw new Error(i);t.traceDeprecation?console.trace(i):console.error(i),r=!0}return s.apply(this,arguments)}return n};var n,a={};function o(t,s){var i={seen:[],stylize:h};return arguments.length>=3&&(i.depth=arguments[2]),arguments.length>=4&&(i.colors=arguments[3]),x(s)?i.showHidden=s:s&&e._extend(i,s),E(i.showHidden)&&(i.showHidden=!1),E(i.depth)&&(i.depth=2),E(i.colors)&&(i.colors=!1),E(i.customInspect)&&(i.customInspect=!0),i.colors&&(i.stylize=c),p(i,t,i.depth)}function c(t,e){var s=o.styles[e];return s?\"\u001b[\"+o.colors[s][0]+\"m\"+t+\"\u001b[\"+o.colors[s][1]+\"m\":t}function h(t,e){return t}function l(t){var e={};return t.forEach((function(t,s){e[t]=!0})),e}function p(t,s,i){if(t.customInspect&&s&&N(s.inspect)&&s.inspect!==e.inspect&&(!s.constructor||s.constructor.prototype!==s)){var r=s.inspect(i,t);return P(r)||(r=p(t,r,i)),r}var n=u(t,s);if(n)return n;var a=Object.keys(s),o=l(a);if(t.showHidden&&(a=Object.getOwnPropertyNames(s)),k(s)&&(a.indexOf(\"message\")>=0||a.indexOf(\"description\")>=0))return d(s);if(0===a.length){if(N(s)){var c=s.name?\": \"+s.name:\"\";return t.stylize(\"[Function\"+c+\"]\",\"special\")}if(A(s))return t.stylize(RegExp.prototype.toString.call(s),\"regexp\");if(C(s))return t.stylize(Date.prototype.toString.call(s),\"date\");if(k(s))return d(s)}var h,x=\"\",b=!1,v=[\"{\",\"}\"];if(g(s)&&(b=!0,v=[\"[\",\"]\"]),N(s)){var w=s.name?\": \"+s.name:\"\";x=\" [Function\"+w+\"]\"}return A(s)&&(x=\" \"+RegExp.prototype.toString.call(s)),C(s)&&(x=\" \"+Date.prototype.toUTCString.call(s)),k(s)&&(x=\" \"+d(s)),0!==a.length||b&&0!=s.length?i<0?A(s)?t.stylize(RegExp.prototype.toString.call(s),\"regexp\"):t.stylize(\"[Object]\",\"special\"):(t.seen.push(s),h=b?f(t,s,i,o,a):a.map((function(e){return m(t,s,i,o,e,b)})),t.seen.pop(),y(h,x,v)):v[0]+x+v[1]}function u(t,e){if(E(e))return t.stylize(\"undefined\",\"undefined\");if(P(e)){var s=\"'\"+JSON.stringify(e).replace(/^\"|\"$/g,\"\").replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"')+\"'\";return t.stylize(s,\"string\")}return w(e)?t.stylize(\"\"+e,\"number\"):x(e)?t.stylize(\"\"+e,\"boolean\"):b(e)?t.stylize(\"null\",\"null\"):void 0}function d(t){return\"[\"+Error.prototype.toString.call(t)+\"]\"}function f(t,e,s,i,r){for(var n=[],a=0,o=e.length;a<o;++a)_(e,String(a))?n.push(m(t,e,s,i,String(a),!0)):n.push(\"\");return r.forEach((function(r){r.match(/^\\d+$/)||n.push(m(t,e,s,i,r,!0))})),n}function m(t,e,s,i,r,n){var a,o,c;if(c=Object.getOwnPropertyDescriptor(e,r)||{value:e[r]},c.get?o=c.set?t.stylize(\"[Getter/Setter]\",\"special\"):t.stylize(\"[Getter]\",\"special\"):c.set&&(o=t.stylize(\"[Setter]\",\"special\")),_(i,r)||(a=\"[\"+r+\"]\"),o||(t.seen.indexOf(c.value)<0?(o=b(s)?p(t,c.value,null):p(t,c.value,s-1),o.indexOf(\"\\n\")>-1&&(o=n?o.split(\"\\n\").map((function(t){return\"  \"+t})).join(\"\\n\").substr(2):\"\\n\"+o.split(\"\\n\").map((function(t){return\"   \"+t})).join(\"\\n\"))):o=t.stylize(\"[Circular]\",\"special\")),E(a)){if(n&&r.match(/^\\d+$/))return o;a=JSON.stringify(\"\"+r),a.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)?(a=a.substr(1,a.length-2),a=t.stylize(a,\"name\")):(a=a.replace(/'/g,\"\\\\'\").replace(/\\\\\"/g,'\"').replace(/(^\"|\"$)/g,\"'\"),a=t.stylize(a,\"string\"))}return a+\": \"+o}function y(t,e,s){var i=t.reduce((function(t,e){return e.indexOf(\"\\n\")>=0&&0,t+e.replace(/\\u001b\\[\\d\\d?m/g,\"\").length+1}),0);return i>60?s[0]+(\"\"===e?\"\":e+\"\\n \")+\" \"+t.join(\",\\n  \")+\" \"+s[1]:s[0]+e+\" \"+t.join(\", \")+\" \"+s[1]}function g(t){return Array.isArray(t)}function x(t){return\"boolean\"===typeof t}function b(t){return null===t}function v(t){return null==t}function w(t){return\"number\"===typeof t}function P(t){return\"string\"===typeof t}function T(t){return\"symbol\"===typeof t}function E(t){return void 0===t}function A(t){return S(t)&&\"[object RegExp]\"===O(t)}function S(t){return\"object\"===typeof t&&null!==t}function C(t){return S(t)&&\"[object Date]\"===O(t)}function k(t){return S(t)&&(\"[object Error]\"===O(t)||t instanceof Error)}function N(t){return\"function\"===typeof t}function I(t){return null===t||\"boolean\"===typeof t||\"number\"===typeof t||\"string\"===typeof t||\"symbol\"===typeof t||\"undefined\"===typeof t}function O(t){return Object.prototype.toString.call(t)}function D(t){return t<10?\"0\"+t.toString(10):t.toString(10)}e.debuglog=function(s){if(E(n)&&(n=Object({NODE_ENV:\"production\",BASE_URL:\"/form-generator/\"}).NODE_DEBUG||\"\"),s=s.toUpperCase(),!a[s])if(new RegExp(\"\\\\b\"+s+\"\\\\b\",\"i\").test(n)){var i=t.pid;a[s]=function(){var t=e.format.apply(e,arguments);console.error(\"%s %d: %s\",s,i,t)}}else a[s]=function(){};return a[s]},e.inspect=o,o.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},o.styles={special:\"cyan\",number:\"yellow\",boolean:\"yellow\",undefined:\"grey\",null:\"bold\",string:\"green\",date:\"magenta\",regexp:\"red\"},e.isArray=g,e.isBoolean=x,e.isNull=b,e.isNullOrUndefined=v,e.isNumber=w,e.isString=P,e.isSymbol=T,e.isUndefined=E,e.isRegExp=A,e.isObject=S,e.isDate=C,e.isError=k,e.isFunction=N,e.isPrimitive=I,e.isBuffer=s(\"d60a\");var M=[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"];function L(){var t=new Date,e=[D(t.getHours()),D(t.getMinutes()),D(t.getSeconds())].join(\":\");return[t.getDate(),M[t.getMonth()],e].join(\" \")}function _(t,e){return Object.prototype.hasOwnProperty.call(t,e)}e.log=function(){console.log(\"%s - %s\",L(),e.format.apply(e,arguments))},e.inherits=s(\"28a0\"),e._extend=function(t,e){if(!e||!S(e))return t;var s=Object.keys(e),i=s.length;while(i--)t[s[i]]=e[s[i]];return t};var R=\"undefined\"!==typeof Symbol?Symbol(\"util.promisify.custom\"):void 0;function j(t,e){if(!t){var s=new Error(\"Promise was rejected with a falsy value\");s.reason=t,t=s}return e(t)}function F(e){if(\"function\"!==typeof e)throw new TypeError('The \"original\" argument must be of type Function');function s(){for(var s=[],i=0;i<arguments.length;i++)s.push(arguments[i]);var r=s.pop();if(\"function\"!==typeof r)throw new TypeError(\"The last argument must be of type Function\");var n=this,a=function(){return r.apply(n,arguments)};e.apply(this,s).then((function(e){t.nextTick(a,null,e)}),(function(e){t.nextTick(j,e,a)}))}return Object.setPrototypeOf(s,Object.getPrototypeOf(e)),Object.defineProperties(s,i(e)),s}e.promisify=function(t){if(\"function\"!==typeof t)throw new TypeError('The \"original\" argument must be of type Function');if(R&&t[R]){var e=t[R];if(\"function\"!==typeof e)throw new TypeError('The \"util.promisify.custom\" argument must be of type Function');return Object.defineProperty(e,R,{value:e,enumerable:!1,writable:!1,configurable:!0}),e}function e(){for(var e,s,i=new Promise((function(t,i){e=t,s=i})),r=[],n=0;n<arguments.length;n++)r.push(arguments[n]);r.push((function(t,i){t?s(t):e(i)}));try{t.apply(this,r)}catch(a){s(a)}return i}return Object.setPrototypeOf(e,Object.getPrototypeOf(t)),R&&Object.defineProperty(e,R,{value:e,enumerable:!1,writable:!1,configurable:!0}),Object.defineProperties(e,i(t))},e.promisify.custom=R,e.callbackify=F}).call(this,s(\"4362\"))},\"310e\":function(t,e,s){t.exports=function(t){var e={};function s(i){if(e[i])return e[i].exports;var r=e[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,s),r.l=!0,r.exports}return s.m=t,s.c=e,s.d=function(t,e,i){s.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},s.r=function(t){\"undefined\"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},s.t=function(t,e){if(1&e&&(t=s(t)),8&e)return t;if(4&e&&\"object\"===typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(s.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var r in t)s.d(i,r,function(e){return t[e]}.bind(null,r));return i},s.n=function(t){var e=t&&t.__esModule?function(){return t[\"default\"]}:function(){return t};return s.d(e,\"a\",e),e},s.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},s.p=\"\",s(s.s=\"fb15\")}({\"01f9\":function(t,e,s){\"use strict\";var i=s(\"2d00\"),r=s(\"5ca1\"),n=s(\"2aba\"),a=s(\"32e9\"),o=s(\"84f2\"),c=s(\"41a0\"),h=s(\"7f20\"),l=s(\"38fd\"),p=s(\"2b4c\")(\"iterator\"),u=!([].keys&&\"next\"in[].keys()),d=\"@@iterator\",f=\"keys\",m=\"values\",y=function(){return this};t.exports=function(t,e,s,g,x,b,v){c(s,e,g);var w,P,T,E=function(t){if(!u&&t in k)return k[t];switch(t){case f:return function(){return new s(this,t)};case m:return function(){return new s(this,t)}}return function(){return new s(this,t)}},A=e+\" Iterator\",S=x==m,C=!1,k=t.prototype,N=k[p]||k[d]||x&&k[x],I=N||E(x),O=x?S?E(\"entries\"):I:void 0,D=\"Array\"==e&&k.entries||N;if(D&&(T=l(D.call(new t)),T!==Object.prototype&&T.next&&(h(T,A,!0),i||\"function\"==typeof T[p]||a(T,p,y))),S&&N&&N.name!==m&&(C=!0,I=function(){return N.call(this)}),i&&!v||!u&&!C&&k[p]||a(k,p,I),o[e]=I,o[A]=y,x)if(w={values:S?I:E(m),keys:b?I:E(f),entries:O},v)for(P in w)P in k||n(k,P,w[P]);else r(r.P+r.F*(u||C),e,w);return w}},\"02f4\":function(t,e,s){var i=s(\"4588\"),r=s(\"be13\");t.exports=function(t){return function(e,s){var n,a,o=String(r(e)),c=i(s),h=o.length;return c<0||c>=h?t?\"\":void 0:(n=o.charCodeAt(c),n<55296||n>56319||c+1===h||(a=o.charCodeAt(c+1))<56320||a>57343?t?o.charAt(c):n:t?o.slice(c,c+2):a-56320+(n-55296<<10)+65536)}}},\"0390\":function(t,e,s){\"use strict\";var i=s(\"02f4\")(!0);t.exports=function(t,e,s){return e+(s?i(t,e).length:1)}},\"0bfb\":function(t,e,s){\"use strict\";var i=s(\"cb7c\");t.exports=function(){var t=i(this),e=\"\";return t.global&&(e+=\"g\"),t.ignoreCase&&(e+=\"i\"),t.multiline&&(e+=\"m\"),t.unicode&&(e+=\"u\"),t.sticky&&(e+=\"y\"),e}},\"0d58\":function(t,e,s){var i=s(\"ce10\"),r=s(\"e11e\");t.exports=Object.keys||function(t){return i(t,r)}},1495:function(t,e,s){var i=s(\"86cc\"),r=s(\"cb7c\"),n=s(\"0d58\");t.exports=s(\"9e1e\")?Object.defineProperties:function(t,e){r(t);var s,a=n(e),o=a.length,c=0;while(o>c)i.f(t,s=a[c++],e[s]);return t}},\"214f\":function(t,e,s){\"use strict\";s(\"b0c5\");var i=s(\"2aba\"),r=s(\"32e9\"),n=s(\"79e5\"),a=s(\"be13\"),o=s(\"2b4c\"),c=s(\"520a\"),h=o(\"species\"),l=!n((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$<a>\")})),p=function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var s=\"ab\".split(t);return 2===s.length&&\"a\"===s[0]&&\"b\"===s[1]}();t.exports=function(t,e,s){var u=o(t),d=!n((function(){var e={};return e[u]=function(){return 7},7!=\"\"[t](e)})),f=d?!n((function(){var e=!1,s=/a/;return s.exec=function(){return e=!0,null},\"split\"===t&&(s.constructor={},s.constructor[h]=function(){return s}),s[u](\"\"),!e})):void 0;if(!d||!f||\"replace\"===t&&!l||\"split\"===t&&!p){var m=/./[u],y=s(a,u,\"\"[t],(function(t,e,s,i,r){return e.exec===c?d&&!r?{done:!0,value:m.call(e,s,i)}:{done:!0,value:t.call(s,e,i)}:{done:!1}})),g=y[0],x=y[1];i(String.prototype,t,g),r(RegExp.prototype,u,2==e?function(t,e){return x.call(t,this,e)}:function(t){return x.call(t,this)})}}},\"230e\":function(t,e,s){var i=s(\"d3f4\"),r=s(\"7726\").document,n=i(r)&&i(r.createElement);t.exports=function(t){return n?r.createElement(t):{}}},\"23c6\":function(t,e,s){var i=s(\"2d95\"),r=s(\"2b4c\")(\"toStringTag\"),n=\"Arguments\"==i(function(){return arguments}()),a=function(t,e){try{return t[e]}catch(s){}};t.exports=function(t){var e,s,o;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(s=a(e=Object(t),r))?s:n?i(e):\"Object\"==(o=i(e))&&\"function\"==typeof e.callee?\"Arguments\":o}},2621:function(t,e){e.f=Object.getOwnPropertySymbols},\"2aba\":function(t,e,s){var i=s(\"7726\"),r=s(\"32e9\"),n=s(\"69a8\"),a=s(\"ca5a\")(\"src\"),o=s(\"fa5b\"),c=\"toString\",h=(\"\"+o).split(c);s(\"8378\").inspectSource=function(t){return o.call(t)},(t.exports=function(t,e,s,o){var c=\"function\"==typeof s;c&&(n(s,\"name\")||r(s,\"name\",e)),t[e]!==s&&(c&&(n(s,a)||r(s,a,t[e]?\"\"+t[e]:h.join(String(e)))),t===i?t[e]=s:o?t[e]?t[e]=s:r(t,e,s):(delete t[e],r(t,e,s)))})(Function.prototype,c,(function(){return\"function\"==typeof this&&this[a]||o.call(this)}))},\"2aeb\":function(t,e,s){var i=s(\"cb7c\"),r=s(\"1495\"),n=s(\"e11e\"),a=s(\"613b\")(\"IE_PROTO\"),o=function(){},c=\"prototype\",h=function(){var t,e=s(\"230e\")(\"iframe\"),i=n.length,r=\"<\",a=\">\";e.style.display=\"none\",s(\"fab2\").appendChild(e),e.src=\"javascript:\",t=e.contentWindow.document,t.open(),t.write(r+\"script\"+a+\"document.F=Object\"+r+\"/script\"+a),t.close(),h=t.F;while(i--)delete h[c][n[i]];return h()};t.exports=Object.create||function(t,e){var s;return null!==t?(o[c]=i(t),s=new o,o[c]=null,s[a]=t):s=h(),void 0===e?s:r(s,e)}},\"2b4c\":function(t,e,s){var i=s(\"5537\")(\"wks\"),r=s(\"ca5a\"),n=s(\"7726\").Symbol,a=\"function\"==typeof n,o=t.exports=function(t){return i[t]||(i[t]=a&&n[t]||(a?n:r)(\"Symbol.\"+t))};o.store=i},\"2d00\":function(t,e){t.exports=!1},\"2d95\":function(t,e){var s={}.toString;t.exports=function(t){return s.call(t).slice(8,-1)}},\"2fdb\":function(t,e,s){\"use strict\";var i=s(\"5ca1\"),r=s(\"d2c8\"),n=\"includes\";i(i.P+i.F*s(\"5147\")(n),\"String\",{includes:function(t){return!!~r(this,t,n).indexOf(t,arguments.length>1?arguments[1]:void 0)}})},\"32e9\":function(t,e,s){var i=s(\"86cc\"),r=s(\"4630\");t.exports=s(\"9e1e\")?function(t,e,s){return i.f(t,e,r(1,s))}:function(t,e,s){return t[e]=s,t}},\"38fd\":function(t,e,s){var i=s(\"69a8\"),r=s(\"4bf8\"),n=s(\"613b\")(\"IE_PROTO\"),a=Object.prototype;t.exports=Object.getPrototypeOf||function(t){return t=r(t),i(t,n)?t[n]:\"function\"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?a:null}},\"41a0\":function(t,e,s){\"use strict\";var i=s(\"2aeb\"),r=s(\"4630\"),n=s(\"7f20\"),a={};s(\"32e9\")(a,s(\"2b4c\")(\"iterator\"),(function(){return this})),t.exports=function(t,e,s){t.prototype=i(a,{next:r(1,s)}),n(t,e+\" Iterator\")}},\"456d\":function(t,e,s){var i=s(\"4bf8\"),r=s(\"0d58\");s(\"5eda\")(\"keys\",(function(){return function(t){return r(i(t))}}))},4588:function(t,e){var s=Math.ceil,i=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?i:s)(t)}},4630:function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},\"4bf8\":function(t,e,s){var i=s(\"be13\");t.exports=function(t){return Object(i(t))}},5147:function(t,e,s){var i=s(\"2b4c\")(\"match\");t.exports=function(t){var e=/./;try{\"/./\"[t](e)}catch(s){try{return e[i]=!1,!\"/./\"[t](e)}catch(r){}}return!0}},\"520a\":function(t,e,s){\"use strict\";var i=s(\"0bfb\"),r=RegExp.prototype.exec,n=String.prototype.replace,a=r,o=\"lastIndex\",c=function(){var t=/a/,e=/b*/g;return r.call(t,\"a\"),r.call(e,\"a\"),0!==t[o]||0!==e[o]}(),h=void 0!==/()??/.exec(\"\")[1],l=c||h;l&&(a=function(t){var e,s,a,l,p=this;return h&&(s=new RegExp(\"^\"+p.source+\"$(?!\\\\s)\",i.call(p))),c&&(e=p[o]),a=r.call(p,t),c&&a&&(p[o]=p.global?a.index+a[0].length:e),h&&a&&a.length>1&&n.call(a[0],s,(function(){for(l=1;l<arguments.length-2;l++)void 0===arguments[l]&&(a[l]=void 0)})),a}),t.exports=a},\"52a7\":function(t,e){e.f={}.propertyIsEnumerable},5537:function(t,e,s){var i=s(\"8378\"),r=s(\"7726\"),n=\"__core-js_shared__\",a=r[n]||(r[n]={});(t.exports=function(t,e){return a[t]||(a[t]=void 0!==e?e:{})})(\"versions\",[]).push({version:i.version,mode:s(\"2d00\")?\"pure\":\"global\",copyright:\"© 2019 Denis Pushkarev (zloirock.ru)\"})},\"5ca1\":function(t,e,s){var i=s(\"7726\"),r=s(\"8378\"),n=s(\"32e9\"),a=s(\"2aba\"),o=s(\"9b43\"),c=\"prototype\",h=function(t,e,s){var l,p,u,d,f=t&h.F,m=t&h.G,y=t&h.S,g=t&h.P,x=t&h.B,b=m?i:y?i[e]||(i[e]={}):(i[e]||{})[c],v=m?r:r[e]||(r[e]={}),w=v[c]||(v[c]={});for(l in m&&(s=e),s)p=!f&&b&&void 0!==b[l],u=(p?b:s)[l],d=x&&p?o(u,i):g&&\"function\"==typeof u?o(Function.call,u):u,b&&a(b,l,u,t&h.U),v[l]!=u&&n(v,l,d),g&&w[l]!=u&&(w[l]=u)};i.core=r,h.F=1,h.G=2,h.S=4,h.P=8,h.B=16,h.W=32,h.U=64,h.R=128,t.exports=h},\"5eda\":function(t,e,s){var i=s(\"5ca1\"),r=s(\"8378\"),n=s(\"79e5\");t.exports=function(t,e){var s=(r.Object||{})[t]||Object[t],a={};a[t]=e(s),i(i.S+i.F*n((function(){s(1)})),\"Object\",a)}},\"5f1b\":function(t,e,s){\"use strict\";var i=s(\"23c6\"),r=RegExp.prototype.exec;t.exports=function(t,e){var s=t.exec;if(\"function\"===typeof s){var n=s.call(t,e);if(\"object\"!==typeof n)throw new TypeError(\"RegExp exec method returned something other than an Object or null\");return n}if(\"RegExp\"!==i(t))throw new TypeError(\"RegExp#exec called on incompatible receiver\");return r.call(t,e)}},\"613b\":function(t,e,s){var i=s(\"5537\")(\"keys\"),r=s(\"ca5a\");t.exports=function(t){return i[t]||(i[t]=r(t))}},\"626a\":function(t,e,s){var i=s(\"2d95\");t.exports=Object(\"z\").propertyIsEnumerable(0)?Object:function(t){return\"String\"==i(t)?t.split(\"\"):Object(t)}},6762:function(t,e,s){\"use strict\";var i=s(\"5ca1\"),r=s(\"c366\")(!0);i(i.P,\"Array\",{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),s(\"9c6c\")(\"includes\")},6821:function(t,e,s){var i=s(\"626a\"),r=s(\"be13\");t.exports=function(t){return i(r(t))}},\"69a8\":function(t,e){var s={}.hasOwnProperty;t.exports=function(t,e){return s.call(t,e)}},\"6a99\":function(t,e,s){var i=s(\"d3f4\");t.exports=function(t,e){if(!i(t))return t;var s,r;if(e&&\"function\"==typeof(s=t.toString)&&!i(r=s.call(t)))return r;if(\"function\"==typeof(s=t.valueOf)&&!i(r=s.call(t)))return r;if(!e&&\"function\"==typeof(s=t.toString)&&!i(r=s.call(t)))return r;throw TypeError(\"Can't convert object to primitive value\")}},7333:function(t,e,s){\"use strict\";var i=s(\"9e1e\"),r=s(\"0d58\"),n=s(\"2621\"),a=s(\"52a7\"),o=s(\"4bf8\"),c=s(\"626a\"),h=Object.assign;t.exports=!h||s(\"79e5\")((function(){var t={},e={},s=Symbol(),i=\"abcdefghijklmnopqrst\";return t[s]=7,i.split(\"\").forEach((function(t){e[t]=t})),7!=h({},t)[s]||Object.keys(h({},e)).join(\"\")!=i}))?function(t,e){var s=o(t),h=arguments.length,l=1,p=n.f,u=a.f;while(h>l){var d,f=c(arguments[l++]),m=p?r(f).concat(p(f)):r(f),y=m.length,g=0;while(y>g)d=m[g++],i&&!u.call(f,d)||(s[d]=f[d])}return s}:h},7726:function(t,e){var s=t.exports=\"undefined\"!=typeof window&&window.Math==Math?window:\"undefined\"!=typeof self&&self.Math==Math?self:Function(\"return this\")();\"number\"==typeof __g&&(__g=s)},\"77f1\":function(t,e,s){var i=s(\"4588\"),r=Math.max,n=Math.min;t.exports=function(t,e){return t=i(t),t<0?r(t+e,0):n(t,e)}},\"79e5\":function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},\"7f20\":function(t,e,s){var i=s(\"86cc\").f,r=s(\"69a8\"),n=s(\"2b4c\")(\"toStringTag\");t.exports=function(t,e,s){t&&!r(t=s?t:t.prototype,n)&&i(t,n,{configurable:!0,value:e})}},8378:function(t,e){var s=t.exports={version:\"2.6.11\"};\"number\"==typeof __e&&(__e=s)},\"84f2\":function(t,e){t.exports={}},\"86cc\":function(t,e,s){var i=s(\"cb7c\"),r=s(\"c69a\"),n=s(\"6a99\"),a=Object.defineProperty;e.f=s(\"9e1e\")?Object.defineProperty:function(t,e,s){if(i(t),e=n(e,!0),i(s),r)try{return a(t,e,s)}catch(o){}if(\"get\"in s||\"set\"in s)throw TypeError(\"Accessors not supported!\");return\"value\"in s&&(t[e]=s.value),t}},\"9b43\":function(t,e,s){var i=s(\"d8e8\");t.exports=function(t,e,s){if(i(t),void 0===e)return t;switch(s){case 1:return function(s){return t.call(e,s)};case 2:return function(s,i){return t.call(e,s,i)};case 3:return function(s,i,r){return t.call(e,s,i,r)}}return function(){return t.apply(e,arguments)}}},\"9c6c\":function(t,e,s){var i=s(\"2b4c\")(\"unscopables\"),r=Array.prototype;void 0==r[i]&&s(\"32e9\")(r,i,{}),t.exports=function(t){r[i][t]=!0}},\"9def\":function(t,e,s){var i=s(\"4588\"),r=Math.min;t.exports=function(t){return t>0?r(i(t),9007199254740991):0}},\"9e1e\":function(t,e,s){t.exports=!s(\"79e5\")((function(){return 7!=Object.defineProperty({},\"a\",{get:function(){return 7}}).a}))},a352:function(t,e){t.exports=s(\"aa47\")},a481:function(t,e,s){\"use strict\";var i=s(\"cb7c\"),r=s(\"4bf8\"),n=s(\"9def\"),a=s(\"4588\"),o=s(\"0390\"),c=s(\"5f1b\"),h=Math.max,l=Math.min,p=Math.floor,u=/\\$([$&`']|\\d\\d?|<[^>]*>)/g,d=/\\$([$&`']|\\d\\d?)/g,f=function(t){return void 0===t?t:String(t)};s(\"214f\")(\"replace\",2,(function(t,e,s,m){return[function(i,r){var n=t(this),a=void 0==i?void 0:i[e];return void 0!==a?a.call(i,n,r):s.call(String(n),i,r)},function(t,e){var r=m(s,t,this,e);if(r.done)return r.value;var p=i(t),u=String(this),d=\"function\"===typeof e;d||(e=String(e));var g=p.global;if(g){var x=p.unicode;p.lastIndex=0}var b=[];while(1){var v=c(p,u);if(null===v)break;if(b.push(v),!g)break;var w=String(v[0]);\"\"===w&&(p.lastIndex=o(u,n(p.lastIndex),x))}for(var P=\"\",T=0,E=0;E<b.length;E++){v=b[E];for(var A=String(v[0]),S=h(l(a(v.index),u.length),0),C=[],k=1;k<v.length;k++)C.push(f(v[k]));var N=v.groups;if(d){var I=[A].concat(C,S,u);void 0!==N&&I.push(N);var O=String(e.apply(void 0,I))}else O=y(A,u,S,C,N,e);S>=T&&(P+=u.slice(T,S)+O,T=S+A.length)}return P+u.slice(T)}];function y(t,e,i,n,a,o){var c=i+t.length,h=n.length,l=d;return void 0!==a&&(a=r(a),l=u),s.call(o,l,(function(s,r){var o;switch(r.charAt(0)){case\"$\":return\"$\";case\"&\":return t;case\"`\":return e.slice(0,i);case\"'\":return e.slice(c);case\"<\":o=a[r.slice(1,-1)];break;default:var l=+r;if(0===l)return s;if(l>h){var u=p(l/10);return 0===u?s:u<=h?void 0===n[u-1]?r.charAt(1):n[u-1]+r.charAt(1):s}o=n[l-1]}return void 0===o?\"\":o}))}}))},aae3:function(t,e,s){var i=s(\"d3f4\"),r=s(\"2d95\"),n=s(\"2b4c\")(\"match\");t.exports=function(t){var e;return i(t)&&(void 0!==(e=t[n])?!!e:\"RegExp\"==r(t))}},ac6a:function(t,e,s){for(var i=s(\"cadf\"),r=s(\"0d58\"),n=s(\"2aba\"),a=s(\"7726\"),o=s(\"32e9\"),c=s(\"84f2\"),h=s(\"2b4c\"),l=h(\"iterator\"),p=h(\"toStringTag\"),u=c.Array,d={CSSRuleList:!0,CSSStyleDeclaration:!1,CSSValueList:!1,ClientRectList:!1,DOMRectList:!1,DOMStringList:!1,DOMTokenList:!0,DataTransferItemList:!1,FileList:!1,HTMLAllCollection:!1,HTMLCollection:!1,HTMLFormElement:!1,HTMLSelectElement:!1,MediaList:!0,MimeTypeArray:!1,NamedNodeMap:!1,NodeList:!0,PaintRequestList:!1,Plugin:!1,PluginArray:!1,SVGLengthList:!1,SVGNumberList:!1,SVGPathSegList:!1,SVGPointList:!1,SVGStringList:!1,SVGTransformList:!1,SourceBufferList:!1,StyleSheetList:!0,TextTrackCueList:!1,TextTrackList:!1,TouchList:!1},f=r(d),m=0;m<f.length;m++){var y,g=f[m],x=d[g],b=a[g],v=b&&b.prototype;if(v&&(v[l]||o(v,l,u),v[p]||o(v,p,g),c[g]=u,x))for(y in i)v[y]||n(v,y,i[y],!0)}},b0c5:function(t,e,s){\"use strict\";var i=s(\"520a\");s(\"5ca1\")({target:\"RegExp\",proto:!0,forced:i!==/./.exec},{exec:i})},be13:function(t,e){t.exports=function(t){if(void 0==t)throw TypeError(\"Can't call method on  \"+t);return t}},c366:function(t,e,s){var i=s(\"6821\"),r=s(\"9def\"),n=s(\"77f1\");t.exports=function(t){return function(e,s,a){var o,c=i(e),h=r(c.length),l=n(a,h);if(t&&s!=s){while(h>l)if(o=c[l++],o!=o)return!0}else for(;h>l;l++)if((t||l in c)&&c[l]===s)return t||l||0;return!t&&-1}}},c649:function(t,e,s){\"use strict\";(function(t){s.d(e,\"c\",(function(){return h})),s.d(e,\"a\",(function(){return o})),s.d(e,\"b\",(function(){return r})),s.d(e,\"d\",(function(){return c}));s(\"a481\");function i(){return\"undefined\"!==typeof window?window.console:t.console}var r=i();function n(t){var e=Object.create(null);return function(s){var i=e[s];return i||(e[s]=t(s))}}var a=/-(\\w)/g,o=n((function(t){return t.replace(a,(function(t,e){return e?e.toUpperCase():\"\"}))}));function c(t){null!==t.parentElement&&t.parentElement.removeChild(t)}function h(t,e,s){var i=0===s?t.children[0]:t.children[s-1].nextSibling;t.insertBefore(e,i)}}).call(this,s(\"c8ba\"))},c69a:function(t,e,s){t.exports=!s(\"9e1e\")&&!s(\"79e5\")((function(){return 7!=Object.defineProperty(s(\"230e\")(\"div\"),\"a\",{get:function(){return 7}}).a}))},c8ba:function(t,e){var s;s=function(){return this}();try{s=s||new Function(\"return this\")()}catch(i){\"object\"===typeof window&&(s=window)}t.exports=s},ca5a:function(t,e){var s=0,i=Math.random();t.exports=function(t){return\"Symbol(\".concat(void 0===t?\"\":t,\")_\",(++s+i).toString(36))}},cadf:function(t,e,s){\"use strict\";var i=s(\"9c6c\"),r=s(\"d53b\"),n=s(\"84f2\"),a=s(\"6821\");t.exports=s(\"01f9\")(Array,\"Array\",(function(t,e){this._t=a(t),this._i=0,this._k=e}),(function(){var t=this._t,e=this._k,s=this._i++;return!t||s>=t.length?(this._t=void 0,r(1)):r(0,\"keys\"==e?s:\"values\"==e?t[s]:[s,t[s]])}),\"values\"),n.Arguments=n.Array,i(\"keys\"),i(\"values\"),i(\"entries\")},cb7c:function(t,e,s){var i=s(\"d3f4\");t.exports=function(t){if(!i(t))throw TypeError(t+\" is not an object!\");return t}},ce10:function(t,e,s){var i=s(\"69a8\"),r=s(\"6821\"),n=s(\"c366\")(!1),a=s(\"613b\")(\"IE_PROTO\");t.exports=function(t,e){var s,o=r(t),c=0,h=[];for(s in o)s!=a&&i(o,s)&&h.push(s);while(e.length>c)i(o,s=e[c++])&&(~n(h,s)||h.push(s));return h}},d2c8:function(t,e,s){var i=s(\"aae3\"),r=s(\"be13\");t.exports=function(t,e,s){if(i(e))throw TypeError(\"String#\"+s+\" doesn't accept regex!\");return String(r(t))}},d3f4:function(t,e){t.exports=function(t){return\"object\"===typeof t?null!==t:\"function\"===typeof t}},d53b:function(t,e){t.exports=function(t,e){return{value:e,done:!!t}}},d8e8:function(t,e){t.exports=function(t){if(\"function\"!=typeof t)throw TypeError(t+\" is not a function!\");return t}},e11e:function(t,e){t.exports=\"constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf\".split(\",\")},f559:function(t,e,s){\"use strict\";var i=s(\"5ca1\"),r=s(\"9def\"),n=s(\"d2c8\"),a=\"startsWith\",o=\"\"[a];i(i.P+i.F*s(\"5147\")(a),\"String\",{startsWith:function(t){var e=n(this,t,a),s=r(Math.min(arguments.length>1?arguments[1]:void 0,e.length)),i=String(t);return o?o.call(e,i,s):e.slice(s,s+i.length)===i}})},f6fd:function(t,e){(function(t){var e=\"currentScript\",s=t.getElementsByTagName(\"script\");e in t||Object.defineProperty(t,e,{get:function(){try{throw new Error}catch(i){var t,e=(/.*at [^\\(]*\\((.*):.+:.+\\)$/gi.exec(i.stack)||[!1])[1];for(t in s)if(s[t].src==e||\"interactive\"==s[t].readyState)return s[t];return null}}})})(document)},f751:function(t,e,s){var i=s(\"5ca1\");i(i.S+i.F,\"Object\",{assign:s(\"7333\")})},fa5b:function(t,e,s){t.exports=s(\"5537\")(\"native-function-to-string\",Function.toString)},fab2:function(t,e,s){var i=s(\"7726\").document;t.exports=i&&i.documentElement},fb15:function(t,e,s){\"use strict\";var i;(s.r(e),\"undefined\"!==typeof window)&&(s(\"f6fd\"),(i=window.document.currentScript)&&(i=i.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/))&&(s.p=i[1]));s(\"f751\"),s(\"f559\"),s(\"ac6a\"),s(\"cadf\"),s(\"456d\");function r(t){if(Array.isArray(t))return t}function n(t,e){if(\"undefined\"!==typeof Symbol&&Symbol.iterator in Object(t)){var s=[],i=!0,r=!1,n=void 0;try{for(var a,o=t[Symbol.iterator]();!(i=(a=o.next()).done);i=!0)if(s.push(a.value),e&&s.length===e)break}catch(c){r=!0,n=c}finally{try{i||null==o[\"return\"]||o[\"return\"]()}finally{if(r)throw n}}return s}}function a(t,e){(null==e||e>t.length)&&(e=t.length);for(var s=0,i=new Array(e);s<e;s++)i[s]=t[s];return i}function o(t,e){if(t){if(\"string\"===typeof t)return a(t,e);var s=Object.prototype.toString.call(t).slice(8,-1);return\"Object\"===s&&t.constructor&&(s=t.constructor.name),\"Map\"===s||\"Set\"===s?Array.from(t):\"Arguments\"===s||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(s)?a(t,e):void 0}}function c(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}function h(t,e){return r(t)||n(t,e)||o(t,e)||c()}s(\"6762\"),s(\"2fdb\");function l(t){if(Array.isArray(t))return a(t)}function p(t){if(\"undefined\"!==typeof Symbol&&Symbol.iterator in Object(t))return Array.from(t)}function u(){throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\")}function d(t){return l(t)||p(t)||o(t)||u()}var f=s(\"a352\"),m=s.n(f),y=s(\"c649\");function g(t,e,s){return void 0===s||(t=t||{},t[e]=s),t}function x(t,e){return t.map((function(t){return t.elm})).indexOf(e)}function b(t,e,s,i){if(!t)return[];var r=t.map((function(t){return t.elm})),n=e.length-i,a=d(e).map((function(t,e){return e>=n?r.length:r.indexOf(t)}));return s?a.filter((function(t){return-1!==t})):a}function v(t,e){var s=this;this.$nextTick((function(){return s.$emit(t.toLowerCase(),e)}))}function w(t){var e=this;return function(s){null!==e.realList&&e[\"onDrag\"+t](s),v.call(e,t,s)}}function P(t){return[\"transition-group\",\"TransitionGroup\"].includes(t)}function T(t){if(!t||1!==t.length)return!1;var e=h(t,1),s=e[0].componentOptions;return!!s&&P(s.tag)}function E(t,e,s){return t[s]||(e[s]?e[s]():void 0)}function A(t,e,s){var i=0,r=0,n=E(e,s,\"header\");n&&(i=n.length,t=t?[].concat(d(n),d(t)):d(n));var a=E(e,s,\"footer\");return a&&(r=a.length,t=t?[].concat(d(t),d(a)):d(a)),{children:t,headerOffset:i,footerOffset:r}}function S(t,e){var s=null,i=function(t,e){s=g(s,t,e)},r=Object.keys(t).filter((function(t){return\"id\"===t||t.startsWith(\"data-\")})).reduce((function(e,s){return e[s]=t[s],e}),{});if(i(\"attrs\",r),!e)return s;var n=e.on,a=e.props,o=e.attrs;return i(\"on\",n),i(\"props\",a),Object.assign(s.attrs,o),s}var C=[\"Start\",\"Add\",\"Remove\",\"Update\",\"End\"],k=[\"Choose\",\"Unchoose\",\"Sort\",\"Filter\",\"Clone\"],N=[\"Move\"].concat(C,k).map((function(t){return\"on\"+t})),I=null,O={options:Object,list:{type:Array,required:!1,default:null},value:{type:Array,required:!1,default:null},noTransitionOnDrag:{type:Boolean,default:!1},clone:{type:Function,default:function(t){return t}},element:{type:String,default:\"div\"},tag:{type:String,default:null},move:{type:Function,default:null},componentData:{type:Object,required:!1,default:null}},D={name:\"draggable\",inheritAttrs:!1,props:O,data:function(){return{transitionMode:!1,noneFunctionalComponentMode:!1}},render:function(t){var e=this.$slots.default;this.transitionMode=T(e);var s=A(e,this.$slots,this.$scopedSlots),i=s.children,r=s.headerOffset,n=s.footerOffset;this.headerOffset=r,this.footerOffset=n;var a=S(this.$attrs,this.componentData);return t(this.getTag(),a,i)},created:function(){null!==this.list&&null!==this.value&&y[\"b\"].error(\"Value and list props are mutually exclusive! Please set one or another.\"),\"div\"!==this.element&&y[\"b\"].warn(\"Element props is deprecated please use tag props instead. See https://github.com/SortableJS/Vue.Draggable/blob/master/documentation/migrate.md#element-props\"),void 0!==this.options&&y[\"b\"].warn(\"Options props is deprecated, add sortable options directly as vue.draggable item, or use v-bind. See https://github.com/SortableJS/Vue.Draggable/blob/master/documentation/migrate.md#options-props\")},mounted:function(){var t=this;if(this.noneFunctionalComponentMode=this.getTag().toLowerCase()!==this.$el.nodeName.toLowerCase()&&!this.getIsFunctional(),this.noneFunctionalComponentMode&&this.transitionMode)throw new Error(\"Transition-group inside component is not supported. Please alter tag value or remove transition-group. Current tag value: \".concat(this.getTag()));var e={};C.forEach((function(s){e[\"on\"+s]=w.call(t,s)})),k.forEach((function(s){e[\"on\"+s]=v.bind(t,s)}));var s=Object.keys(this.$attrs).reduce((function(e,s){return e[Object(y[\"a\"])(s)]=t.$attrs[s],e}),{}),i=Object.assign({},this.options,s,e,{onMove:function(e,s){return t.onDragMove(e,s)}});!(\"draggable\"in i)&&(i.draggable=\">*\"),this._sortable=new m.a(this.rootContainer,i),this.computeIndexes()},beforeDestroy:function(){void 0!==this._sortable&&this._sortable.destroy()},computed:{rootContainer:function(){return this.transitionMode?this.$el.children[0]:this.$el},realList:function(){return this.list?this.list:this.value}},watch:{options:{handler:function(t){this.updateOptions(t)},deep:!0},$attrs:{handler:function(t){this.updateOptions(t)},deep:!0},realList:function(){this.computeIndexes()}},methods:{getIsFunctional:function(){var t=this._vnode.fnOptions;return t&&t.functional},getTag:function(){return this.tag||this.element},updateOptions:function(t){for(var e in t){var s=Object(y[\"a\"])(e);-1===N.indexOf(s)&&this._sortable.option(s,t[e])}},getChildrenNodes:function(){if(this.noneFunctionalComponentMode)return this.$children[0].$slots.default;var t=this.$slots.default;return this.transitionMode?t[0].child.$slots.default:t},computeIndexes:function(){var t=this;this.$nextTick((function(){t.visibleIndexes=b(t.getChildrenNodes(),t.rootContainer.children,t.transitionMode,t.footerOffset)}))},getUnderlyingVm:function(t){var e=x(this.getChildrenNodes()||[],t);if(-1===e)return null;var s=this.realList[e];return{index:e,element:s}},getUnderlyingPotencialDraggableComponent:function(t){var e=t.__vue__;return e&&e.$options&&P(e.$options._componentTag)?e.$parent:!(\"realList\"in e)&&1===e.$children.length&&\"realList\"in e.$children[0]?e.$children[0]:e},emitChanges:function(t){var e=this;this.$nextTick((function(){e.$emit(\"change\",t)}))},alterList:function(t){if(this.list)t(this.list);else{var e=d(this.value);t(e),this.$emit(\"input\",e)}},spliceList:function(){var t=arguments,e=function(e){return e.splice.apply(e,d(t))};this.alterList(e)},updatePosition:function(t,e){var s=function(s){return s.splice(e,0,s.splice(t,1)[0])};this.alterList(s)},getRelatedContextFromMoveEvent:function(t){var e=t.to,s=t.related,i=this.getUnderlyingPotencialDraggableComponent(e);if(!i)return{component:i};var r=i.realList,n={list:r,component:i};if(e!==s&&r&&i.getUnderlyingVm){var a=i.getUnderlyingVm(s);if(a)return Object.assign(a,n)}return n},getVmIndex:function(t){var e=this.visibleIndexes,s=e.length;return t>s-1?s:e[t]},getComponent:function(){return this.$slots.default[0].componentInstance},resetTransitionData:function(t){if(this.noTransitionOnDrag&&this.transitionMode){var e=this.getChildrenNodes();e[t].data=null;var s=this.getComponent();s.children=[],s.kept=void 0}},onDragStart:function(t){this.context=this.getUnderlyingVm(t.item),t.item._underlying_vm_=this.clone(this.context.element),I=t.item},onDragAdd:function(t){var e=t.item._underlying_vm_;if(void 0!==e){Object(y[\"d\"])(t.item);var s=this.getVmIndex(t.newIndex);this.spliceList(s,0,e),this.computeIndexes();var i={element:e,newIndex:s};this.emitChanges({added:i})}},onDragRemove:function(t){if(Object(y[\"c\"])(this.rootContainer,t.item,t.oldIndex),\"clone\"!==t.pullMode){var e=this.context.index;this.spliceList(e,1);var s={element:this.context.element,oldIndex:e};this.resetTransitionData(e),this.emitChanges({removed:s})}else Object(y[\"d\"])(t.clone)},onDragUpdate:function(t){Object(y[\"d\"])(t.item),Object(y[\"c\"])(t.from,t.item,t.oldIndex);var e=this.context.index,s=this.getVmIndex(t.newIndex);this.updatePosition(e,s);var i={element:this.context.element,oldIndex:e,newIndex:s};this.emitChanges({moved:i})},updateProperty:function(t,e){t.hasOwnProperty(e)&&(t[e]+=this.headerOffset)},computeFutureIndex:function(t,e){if(!t.element)return 0;var s=d(e.to.children).filter((function(t){return\"none\"!==t.style[\"display\"]})),i=s.indexOf(e.related),r=t.component.getVmIndex(i),n=-1!==s.indexOf(I);return n||!e.willInsertAfter?r:r+1},onDragMove:function(t,e){var s=this.move;if(!s||!this.realList)return!0;var i=this.getRelatedContextFromMoveEvent(t),r=this.context,n=this.computeFutureIndex(i,t);Object.assign(r,{futureIndex:n});var a=Object.assign({},t,{relatedContext:i,draggedContext:r});return s(a,e)},onDragEnd:function(){this.computeIndexes(),I=null}}};\"undefined\"!==typeof window&&\"Vue\"in window&&window.Vue.component(\"draggable\",D);var M=D;e[\"default\"]=M}})[\"default\"]},\"342f\":function(t,e,s){var i=s(\"d066\");t.exports=i(\"navigator\",\"userAgent\")||\"\"},\"35a1\":function(t,e,s){var i=s(\"f5df\"),r=s(\"3f8c\"),n=s(\"b622\"),a=n(\"iterator\");t.exports=function(t){if(void 0!=t)return t[a]||t[\"@@iterator\"]||r[i(t)]}},\"37e8\":function(t,e,s){var i=s(\"83ab\"),r=s(\"9bf2\"),n=s(\"825a\"),a=s(\"df75\");t.exports=i?Object.defineProperties:function(t,e){n(t);var s,i=a(e),o=i.length,c=0;while(o>c)r.f(t,s=i[c++],e[s]);return t}},\"3bbe\":function(t,e,s){var i=s(\"861d\");t.exports=function(t){if(!i(t)&&null!==t)throw TypeError(\"Can't set \"+String(t)+\" as a prototype\");return t}},\"3ca3\":function(t,e,s){\"use strict\";var i=s(\"6547\").charAt,r=s(\"69f3\"),n=s(\"7dd0\"),a=\"String Iterator\",o=r.set,c=r.getterFor(a);n(String,\"String\",(function(t){o(this,{type:a,string:String(t),index:0})}),(function(){var t,e=c(this),s=e.string,r=e.index;return r>=s.length?{value:void 0,done:!0}:(t=i(s,r),e.index+=t.length,{value:t,done:!1})}))},\"3f8c\":function(t,e){t.exports={}},4160:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"17c2\");i({target:\"Array\",proto:!0,forced:[].forEach!=r},{forEach:r})},\"428f\":function(t,e,s){var i=s(\"da84\");t.exports=i},4362:function(t,e,s){e.nextTick=function(t){var e=Array.prototype.slice.call(arguments);e.shift(),setTimeout((function(){t.apply(null,e)}),0)},e.platform=e.arch=e.execPath=e.title=\"browser\",e.pid=1,e.browser=!0,e.env={},e.argv=[],e.binding=function(t){throw new Error(\"No such module. (Possibly not yet loaded)\")},function(){var t,i=\"/\";e.cwd=function(){return i},e.chdir=function(e){t||(t=s(\"df7c\")),i=t.resolve(e,i)}}(),e.exit=e.kill=e.umask=e.dlopen=e.uptime=e.memoryUsage=e.uvCounters=function(){},e.features={}},\"44ad\":function(t,e,s){var i=s(\"d039\"),r=s(\"c6b6\"),n=\"\".split;t.exports=i((function(){return!Object(\"z\").propertyIsEnumerable(0)}))?function(t){return\"String\"==r(t)?n.call(t,\"\"):Object(t)}:Object},\"44d2\":function(t,e,s){var i=s(\"b622\"),r=s(\"7c73\"),n=s(\"9bf2\"),a=i(\"unscopables\"),o=Array.prototype;void 0==o[a]&&n.f(o,a,{configurable:!0,value:r(null)}),t.exports=function(t){o[a][t]=!0}},\"44de\":function(t,e,s){var i=s(\"da84\");t.exports=function(t,e){var s=i.console;s&&s.error&&(1===arguments.length?s.error(t):s.error(t,e))}},\"44e7\":function(t,e,s){var i=s(\"861d\"),r=s(\"c6b6\"),n=s(\"b622\"),a=n(\"match\");t.exports=function(t){var e;return i(t)&&(void 0!==(e=t[a])?!!e:\"RegExp\"==r(t))}},\"45fc\":function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"b727\").some,n=s(\"a640\"),a=s(\"ae40\"),o=n(\"some\"),c=a(\"some\");i({target:\"Array\",proto:!0,forced:!o||!c},{some:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}})},4840:function(t,e,s){var i=s(\"825a\"),r=s(\"1c0b\"),n=s(\"b622\"),a=n(\"species\");t.exports=function(t,e){var s,n=i(t).constructor;return void 0===n||void 0==(s=i(n)[a])?e:r(s)}},4930:function(t,e,s){var i=s(\"d039\");t.exports=!!Object.getOwnPropertySymbols&&!i((function(){return!String(Symbol())}))},\"4d63\":function(t,e,s){var i=s(\"83ab\"),r=s(\"da84\"),n=s(\"94ca\"),a=s(\"7156\"),o=s(\"9bf2\").f,c=s(\"241c\").f,h=s(\"44e7\"),l=s(\"ad6d\"),p=s(\"9f7f\"),u=s(\"6eeb\"),d=s(\"d039\"),f=s(\"69f3\").set,m=s(\"2626\"),y=s(\"b622\"),g=y(\"match\"),x=r.RegExp,b=x.prototype,v=/a/g,w=/a/g,P=new x(v)!==v,T=p.UNSUPPORTED_Y,E=i&&n(\"RegExp\",!P||T||d((function(){return w[g]=!1,x(v)!=v||x(w)==w||\"/a/i\"!=x(v,\"i\")})));if(E){var A=function(t,e){var s,i=this instanceof A,r=h(t),n=void 0===e;if(!i&&r&&t.constructor===A&&n)return t;P?r&&!n&&(t=t.source):t instanceof A&&(n&&(e=l.call(t)),t=t.source),T&&(s=!!e&&e.indexOf(\"y\")>-1,s&&(e=e.replace(/y/g,\"\")));var o=a(P?new x(t,e):x(t,e),i?this:b,A);return T&&s&&f(o,{sticky:s}),o},S=function(t){t in A||o(A,t,{configurable:!0,get:function(){return x[t]},set:function(e){x[t]=e}})},C=c(x),k=0;while(C.length>k)S(C[k++]);b.constructor=A,A.prototype=b,u(r,\"RegExp\",A)}m(\"RegExp\")},\"4d64\":function(t,e,s){var i=s(\"fc6a\"),r=s(\"50c4\"),n=s(\"23cb\"),a=function(t){return function(e,s,a){var o,c=i(e),h=r(c.length),l=n(a,h);if(t&&s!=s){while(h>l)if(o=c[l++],o!=o)return!0}else for(;h>l;l++)if((t||l in c)&&c[l]===s)return t||l||0;return!t&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},\"4de4\":function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"b727\").filter,n=s(\"1dde\"),a=s(\"ae40\"),o=n(\"filter\"),c=a(\"filter\");i({target:\"Array\",proto:!0,forced:!o||!c},{filter:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}})},\"50c4\":function(t,e,s){var i=s(\"a691\"),r=Math.min;t.exports=function(t){return t>0?r(i(t),9007199254740991):0}},5135:function(t,e){var s={}.hasOwnProperty;t.exports=function(t,e){return s.call(t,e)}},5319:function(t,e,s){\"use strict\";var i=s(\"d784\"),r=s(\"825a\"),n=s(\"7b0b\"),a=s(\"50c4\"),o=s(\"a691\"),c=s(\"1d80\"),h=s(\"8aa5\"),l=s(\"14c3\"),p=Math.max,u=Math.min,d=Math.floor,f=/\\$([$&'`]|\\d\\d?|<[^>]*>)/g,m=/\\$([$&'`]|\\d\\d?)/g,y=function(t){return void 0===t?t:String(t)};i(\"replace\",2,(function(t,e,s,i){var g=i.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,x=i.REPLACE_KEEPS_$0,b=g?\"$\":\"$0\";return[function(s,i){var r=c(this),n=void 0==s?void 0:s[t];return void 0!==n?n.call(s,r,i):e.call(String(r),s,i)},function(t,i){if(!g&&x||\"string\"===typeof i&&-1===i.indexOf(b)){var n=s(e,t,this,i);if(n.done)return n.value}var c=r(t),d=String(this),f=\"function\"===typeof i;f||(i=String(i));var m=c.global;if(m){var w=c.unicode;c.lastIndex=0}var P=[];while(1){var T=l(c,d);if(null===T)break;if(P.push(T),!m)break;var E=String(T[0]);\"\"===E&&(c.lastIndex=h(d,a(c.lastIndex),w))}for(var A=\"\",S=0,C=0;C<P.length;C++){T=P[C];for(var k=String(T[0]),N=p(u(o(T.index),d.length),0),I=[],O=1;O<T.length;O++)I.push(y(T[O]));var D=T.groups;if(f){var M=[k].concat(I,N,d);void 0!==D&&M.push(D);var L=String(i.apply(void 0,M))}else L=v(k,d,N,I,D,i);N>=S&&(A+=d.slice(S,N)+L,S=N+k.length)}return A+d.slice(S)}];function v(t,s,i,r,a,o){var c=i+t.length,h=r.length,l=m;return void 0!==a&&(a=n(a),l=f),e.call(o,l,(function(e,n){var o;switch(n.charAt(0)){case\"$\":return\"$\";case\"&\":return t;case\"`\":return s.slice(0,i);case\"'\":return s.slice(c);case\"<\":o=a[n.slice(1,-1)];break;default:var l=+n;if(0===l)return e;if(l>h){var p=d(l/10);return 0===p?e:p<=h?void 0===r[p-1]?n.charAt(1):r[p-1]+n.charAt(1):e}o=r[l-1]}return void 0===o?\"\":o}))}}))},\"53ca\":function(t,e,s){\"use strict\";s.d(e,\"a\",(function(){return i}));s(\"a4d3\"),s(\"e01a\"),s(\"d28b\"),s(\"d3b7\"),s(\"3ca3\"),s(\"ddb0\");function i(t){return i=\"function\"===typeof Symbol&&\"symbol\"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},i(t)}},5530:function(t,e,s){\"use strict\";s.d(e,\"a\",(function(){return n}));s(\"a4d3\"),s(\"4de4\"),s(\"4160\"),s(\"e439\"),s(\"dbb4\"),s(\"b64b\"),s(\"159b\");var i=s(\"ade3\");function r(t,e){var s=Object.keys(t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(t);e&&(i=i.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),s.push.apply(s,i)}return s}function n(t){for(var e=1;e<arguments.length;e++){var s=null!=arguments[e]?arguments[e]:{};e%2?r(Object(s),!0).forEach((function(e){Object(i[\"a\"])(t,e,s[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(s)):r(Object(s)).forEach((function(e){Object.defineProperty(t,e,Object.getOwnPropertyDescriptor(s,e))}))}return t}},5692:function(t,e,s){var i=s(\"c430\"),r=s(\"c6cd\");(t.exports=function(t,e){return r[t]||(r[t]=void 0!==e?e:{})})(\"versions\",[]).push({version:\"3.6.5\",mode:i?\"pure\":\"global\",copyright:\"© 2020 Denis Pushkarev (zloirock.ru)\"})},\"56ef\":function(t,e,s){var i=s(\"d066\"),r=s(\"241c\"),n=s(\"7418\"),a=s(\"825a\");t.exports=i(\"Reflect\",\"ownKeys\")||function(t){var e=r.f(a(t)),s=n.f;return s?e.concat(s(t)):e}},\"5a34\":function(t,e,s){var i=s(\"44e7\");t.exports=function(t){if(i(t))throw TypeError(\"The method doesn't accept regular expressions\");return t}},\"5c6c\":function(t,e){t.exports=function(t,e){return{enumerable:!(1&t),configurable:!(2&t),writable:!(4&t),value:e}}},\"60da\":function(t,e,s){\"use strict\";var i=s(\"83ab\"),r=s(\"d039\"),n=s(\"df75\"),a=s(\"7418\"),o=s(\"d1e7\"),c=s(\"7b0b\"),h=s(\"44ad\"),l=Object.assign,p=Object.defineProperty;t.exports=!l||r((function(){if(i&&1!==l({b:1},l(p({},\"a\",{enumerable:!0,get:function(){p(this,\"b\",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var t={},e={},s=Symbol(),r=\"abcdefghijklmnopqrst\";return t[s]=7,r.split(\"\").forEach((function(t){e[t]=t})),7!=l({},t)[s]||n(l({},e)).join(\"\")!=r}))?function(t,e){var s=c(t),r=arguments.length,l=1,p=a.f,u=o.f;while(r>l){var d,f=h(arguments[l++]),m=p?n(f).concat(p(f)):n(f),y=m.length,g=0;while(y>g)d=m[g++],i&&!u.call(f,d)||(s[d]=f[d])}return s}:l},6547:function(t,e,s){var i=s(\"a691\"),r=s(\"1d80\"),n=function(t){return function(e,s){var n,a,o=String(r(e)),c=i(s),h=o.length;return c<0||c>=h?t?\"\":void 0:(n=o.charCodeAt(c),n<55296||n>56319||c+1===h||(a=o.charCodeAt(c+1))<56320||a>57343?t?o.charAt(c):n:t?o.slice(c,c+2):a-56320+(n-55296<<10)+65536)}};t.exports={codeAt:n(!1),charAt:n(!0)}},\"65f0\":function(t,e,s){var i=s(\"861d\"),r=s(\"e8b5\"),n=s(\"b622\"),a=n(\"species\");t.exports=function(t,e){var s;return r(t)&&(s=t.constructor,\"function\"!=typeof s||s!==Array&&!r(s.prototype)?i(s)&&(s=s[a],null===s&&(s=void 0)):s=void 0),new(void 0===s?Array:s)(0===e?0:e)}},\"69f3\":function(t,e,s){var i,r,n,a=s(\"7f9a\"),o=s(\"da84\"),c=s(\"861d\"),h=s(\"9112\"),l=s(\"5135\"),p=s(\"f772\"),u=s(\"d012\"),d=o.WeakMap,f=function(t){return n(t)?r(t):i(t,{})},m=function(t){return function(e){var s;if(!c(e)||(s=r(e)).type!==t)throw TypeError(\"Incompatible receiver, \"+t+\" required\");return s}};if(a){var y=new d,g=y.get,x=y.has,b=y.set;i=function(t,e){return b.call(y,t,e),e},r=function(t){return g.call(y,t)||{}},n=function(t){return x.call(y,t)}}else{var v=p(\"state\");u[v]=!0,i=function(t,e){return h(t,v,e),e},r=function(t){return l(t,v)?t[v]:{}},n=function(t){return l(t,v)}}t.exports={set:i,get:r,has:n,enforce:f,getterFor:m}},\"6eeb\":function(t,e,s){var i=s(\"da84\"),r=s(\"9112\"),n=s(\"5135\"),a=s(\"ce4e\"),o=s(\"8925\"),c=s(\"69f3\"),h=c.get,l=c.enforce,p=String(String).split(\"String\");(t.exports=function(t,e,s,o){var c=!!o&&!!o.unsafe,h=!!o&&!!o.enumerable,u=!!o&&!!o.noTargetGet;\"function\"==typeof s&&(\"string\"!=typeof e||n(s,\"name\")||r(s,\"name\",e),l(s).source=p.join(\"string\"==typeof e?e:\"\")),t!==i?(c?!u&&t[e]&&(h=!0):delete t[e],h?t[e]=s:r(t,e,s)):h?t[e]=s:a(e,s)})(Function.prototype,\"toString\",(function(){return\"function\"==typeof this&&h(this).source||o(this)}))},7156:function(t,e,s){var i=s(\"861d\"),r=s(\"d2bb\");t.exports=function(t,e,s){var n,a;return r&&\"function\"==typeof(n=e.constructor)&&n!==s&&i(a=n.prototype)&&a!==s.prototype&&r(t,a),t}},7418:function(t,e){e.f=Object.getOwnPropertySymbols},\"746f\":function(t,e,s){var i=s(\"428f\"),r=s(\"5135\"),n=s(\"e538\"),a=s(\"9bf2\").f;t.exports=function(t){var e=i.Symbol||(i.Symbol={});r(e,t)||a(e,t,{value:n.f(t)})}},7839:function(t,e){t.exports=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"]},\"7b0b\":function(t,e,s){var i=s(\"1d80\");t.exports=function(t){return Object(i(t))}},\"7c73\":function(t,e,s){var i,r=s(\"825a\"),n=s(\"37e8\"),a=s(\"7839\"),o=s(\"d012\"),c=s(\"1be4\"),h=s(\"cc12\"),l=s(\"f772\"),p=\">\",u=\"<\",d=\"prototype\",f=\"script\",m=l(\"IE_PROTO\"),y=function(){},g=function(t){return u+f+p+t+u+\"/\"+f+p},x=function(t){t.write(g(\"\")),t.close();var e=t.parentWindow.Object;return t=null,e},b=function(){var t,e=h(\"iframe\"),s=\"java\"+f+\":\";return e.style.display=\"none\",c.appendChild(e),e.src=String(s),t=e.contentWindow.document,t.open(),t.write(g(\"document.F=Object\")),t.close(),t.F},v=function(){try{i=document.domain&&new ActiveXObject(\"htmlfile\")}catch(e){}v=i?x(i):b();var t=a.length;while(t--)delete v[d][a[t]];return v()};o[m]=!0,t.exports=Object.create||function(t,e){var s;return null!==t?(y[d]=r(t),s=new y,y[d]=null,s[m]=t):s=v(),void 0===e?s:n(s,e)}},\"7db0\":function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"b727\").find,n=s(\"44d2\"),a=s(\"ae40\"),o=\"find\",c=!0,h=a(o);o in[]&&Array(1)[o]((function(){c=!1})),i({target:\"Array\",proto:!0,forced:c||!h},{find:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),n(o)},\"7dd0\":function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"9ed3\"),n=s(\"e163\"),a=s(\"d2bb\"),o=s(\"d44e\"),c=s(\"9112\"),h=s(\"6eeb\"),l=s(\"b622\"),p=s(\"c430\"),u=s(\"3f8c\"),d=s(\"ae93\"),f=d.IteratorPrototype,m=d.BUGGY_SAFARI_ITERATORS,y=l(\"iterator\"),g=\"keys\",x=\"values\",b=\"entries\",v=function(){return this};t.exports=function(t,e,s,l,d,w,P){r(s,e,l);var T,E,A,S=function(t){if(t===d&&O)return O;if(!m&&t in N)return N[t];switch(t){case g:return function(){return new s(this,t)};case x:return function(){return new s(this,t)};case b:return function(){return new s(this,t)}}return function(){return new s(this)}},C=e+\" Iterator\",k=!1,N=t.prototype,I=N[y]||N[\"@@iterator\"]||d&&N[d],O=!m&&I||S(d),D=\"Array\"==e&&N.entries||I;if(D&&(T=n(D.call(new t)),f!==Object.prototype&&T.next&&(p||n(T)===f||(a?a(T,f):\"function\"!=typeof T[y]&&c(T,y,v)),o(T,C,!0,!0),p&&(u[C]=v))),d==x&&I&&I.name!==x&&(k=!0,O=function(){return I.call(this)}),p&&!P||N[y]===O||c(N,y,O),u[e]=O,d)if(E={values:S(x),keys:w?O:S(g),entries:S(b)},P)for(A in E)(m||k||!(A in N))&&h(N,A,E[A]);else i({target:e,proto:!0,forced:m||k},E);return E}},\"7f9a\":function(t,e,s){var i=s(\"da84\"),r=s(\"8925\"),n=i.WeakMap;t.exports=\"function\"===typeof n&&/native code/.test(r(n))},\"825a\":function(t,e,s){var i=s(\"861d\");t.exports=function(t){if(!i(t))throw TypeError(String(t)+\" is not an object\");return t}},\"83ab\":function(t,e,s){var i=s(\"d039\");t.exports=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]}))},8418:function(t,e,s){\"use strict\";var i=s(\"c04e\"),r=s(\"9bf2\"),n=s(\"5c6c\");t.exports=function(t,e,s){var a=i(e);a in t?r.f(t,a,n(0,s)):t[a]=s}},\"861d\":function(t,e){t.exports=function(t){return\"object\"===typeof t?null!==t:\"function\"===typeof t}},8925:function(t,e,s){var i=s(\"c6cd\"),r=Function.toString;\"function\"!=typeof i.inspectSource&&(i.inspectSource=function(t){return r.call(t)}),t.exports=i.inspectSource},\"8a79\":function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"06cf\").f,n=s(\"50c4\"),a=s(\"5a34\"),o=s(\"1d80\"),c=s(\"ab13\"),h=s(\"c430\"),l=\"\".endsWith,p=Math.min,u=c(\"endsWith\"),d=!h&&!u&&!!function(){var t=r(String.prototype,\"endsWith\");return t&&!t.writable}();i({target:\"String\",proto:!0,forced:!d&&!u},{endsWith:function(t){var e=String(o(this));a(t);var s=arguments.length>1?arguments[1]:void 0,i=n(e.length),r=void 0===s?i:p(n(s),i),c=String(t);return l?l.call(e,c,r):e.slice(r-c.length,r)===c}})},\"8aa5\":function(t,e,s){\"use strict\";var i=s(\"6547\").charAt;t.exports=function(t,e,s){return e+(s?i(t,e).length:1)}},\"90e3\":function(t,e){var s=0,i=Math.random();t.exports=function(t){return\"Symbol(\"+String(void 0===t?\"\":t)+\")_\"+(++s+i).toString(36)}},9112:function(t,e,s){var i=s(\"83ab\"),r=s(\"9bf2\"),n=s(\"5c6c\");t.exports=i?function(t,e,s){return r.f(t,e,n(1,s))}:function(t,e,s){return t[e]=s,t}},9263:function(t,e,s){\"use strict\";var i=s(\"ad6d\"),r=s(\"9f7f\"),n=RegExp.prototype.exec,a=String.prototype.replace,o=n,c=function(){var t=/a/,e=/b*/g;return n.call(t,\"a\"),n.call(e,\"a\"),0!==t.lastIndex||0!==e.lastIndex}(),h=r.UNSUPPORTED_Y||r.BROKEN_CARET,l=void 0!==/()??/.exec(\"\")[1],p=c||l||h;p&&(o=function(t){var e,s,r,o,p=this,u=h&&p.sticky,d=i.call(p),f=p.source,m=0,y=t;return u&&(d=d.replace(\"y\",\"\"),-1===d.indexOf(\"g\")&&(d+=\"g\"),y=String(t).slice(p.lastIndex),p.lastIndex>0&&(!p.multiline||p.multiline&&\"\\n\"!==t[p.lastIndex-1])&&(f=\"(?: \"+f+\")\",y=\" \"+y,m++),s=new RegExp(\"^(?:\"+f+\")\",d)),l&&(s=new RegExp(\"^\"+f+\"$(?!\\\\s)\",d)),c&&(e=p.lastIndex),r=n.call(u?s:p,y),u?r?(r.input=r.input.slice(m),r[0]=r[0].slice(m),r.index=p.lastIndex,p.lastIndex+=r[0].length):p.lastIndex=0:c&&r&&(p.lastIndex=p.global?r.index+r[0].length:e),l&&r&&r.length>1&&a.call(r[0],s,(function(){for(o=1;o<arguments.length-2;o++)void 0===arguments[o]&&(r[o]=void 0)})),r}),t.exports=o},\"94ca\":function(t,e,s){var i=s(\"d039\"),r=/#|\\.prototype\\./,n=function(t,e){var s=o[a(t)];return s==h||s!=c&&(\"function\"==typeof e?i(e):!!e)},a=n.normalize=function(t){return String(t).replace(r,\".\").toLowerCase()},o=n.data={},c=n.NATIVE=\"N\",h=n.POLYFILL=\"P\";t.exports=n},\"99af\":function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"d039\"),n=s(\"e8b5\"),a=s(\"861d\"),o=s(\"7b0b\"),c=s(\"50c4\"),h=s(\"8418\"),l=s(\"65f0\"),p=s(\"1dde\"),u=s(\"b622\"),d=s(\"2d00\"),f=u(\"isConcatSpreadable\"),m=9007199254740991,y=\"Maximum allowed index exceeded\",g=d>=51||!r((function(){var t=[];return t[f]=!1,t.concat()[0]!==t})),x=p(\"concat\"),b=function(t){if(!a(t))return!1;var e=t[f];return void 0!==e?!!e:n(t)},v=!g||!x;i({target:\"Array\",proto:!0,forced:v},{concat:function(t){var e,s,i,r,n,a=o(this),p=l(a,0),u=0;for(e=-1,i=arguments.length;e<i;e++)if(n=-1===e?a:arguments[e],b(n)){if(r=c(n.length),u+r>m)throw TypeError(y);for(s=0;s<r;s++,u++)s in n&&h(p,u,n[s])}else{if(u>=m)throw TypeError(y);h(p,u++,n)}return p.length=u,p}})},\"9bdd\":function(t,e,s){var i=s(\"825a\");t.exports=function(t,e,s,r){try{return r?e(i(s)[0],s[1]):e(s)}catch(a){var n=t[\"return\"];throw void 0!==n&&i(n.call(t)),a}}},\"9bf2\":function(t,e,s){var i=s(\"83ab\"),r=s(\"0cfb\"),n=s(\"825a\"),a=s(\"c04e\"),o=Object.defineProperty;e.f=i?o:function(t,e,s){if(n(t),e=a(e,!0),n(s),r)try{return o(t,e,s)}catch(i){}if(\"get\"in s||\"set\"in s)throw TypeError(\"Accessors not supported\");return\"value\"in s&&(t[e]=s.value),t}},\"9ed3\":function(t,e,s){\"use strict\";var i=s(\"ae93\").IteratorPrototype,r=s(\"7c73\"),n=s(\"5c6c\"),a=s(\"d44e\"),o=s(\"3f8c\"),c=function(){return this};t.exports=function(t,e,s){var h=e+\" Iterator\";return t.prototype=r(i,{next:n(1,s)}),a(t,h,!1,!0),o[h]=c,t}},\"9f7f\":function(t,e,s){\"use strict\";var i=s(\"d039\");function r(t,e){return RegExp(t,e)}e.UNSUPPORTED_Y=i((function(){var t=r(\"a\",\"y\");return t.lastIndex=2,null!=t.exec(\"abcd\")})),e.BROKEN_CARET=i((function(){var t=r(\"^r\",\"gy\");return t.lastIndex=2,null!=t.exec(\"str\")}))},a15b:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"44ad\"),n=s(\"fc6a\"),a=s(\"a640\"),o=[].join,c=r!=Object,h=a(\"join\",\",\");i({target:\"Array\",proto:!0,forced:c||!h},{join:function(t){return o.call(n(this),void 0===t?\",\":t)}})},a434:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"23cb\"),n=s(\"a691\"),a=s(\"50c4\"),o=s(\"7b0b\"),c=s(\"65f0\"),h=s(\"8418\"),l=s(\"1dde\"),p=s(\"ae40\"),u=l(\"splice\"),d=p(\"splice\",{ACCESSORS:!0,0:0,1:2}),f=Math.max,m=Math.min,y=9007199254740991,g=\"Maximum allowed length exceeded\";i({target:\"Array\",proto:!0,forced:!u||!d},{splice:function(t,e){var s,i,l,p,u,d,x=o(this),b=a(x.length),v=r(t,b),w=arguments.length;if(0===w?s=i=0:1===w?(s=0,i=b-v):(s=w-2,i=m(f(n(e),0),b-v)),b+s-i>y)throw TypeError(g);for(l=c(x,i),p=0;p<i;p++)u=v+p,u in x&&h(l,p,x[u]);if(l.length=i,s<i){for(p=v;p<b-i;p++)u=p+i,d=p+s,u in x?x[d]=x[u]:delete x[d];for(p=b;p>b-i+s;p--)delete x[p-1]}else if(s>i)for(p=b-i;p>v;p--)u=p+i-1,d=p+s-1,u in x?x[d]=x[u]:delete x[d];for(p=0;p<s;p++)x[p+v]=arguments[p+2];return x.length=b-i+s,l}})},a4d3:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"da84\"),n=s(\"d066\"),a=s(\"c430\"),o=s(\"83ab\"),c=s(\"4930\"),h=s(\"fdbf\"),l=s(\"d039\"),p=s(\"5135\"),u=s(\"e8b5\"),d=s(\"861d\"),f=s(\"825a\"),m=s(\"7b0b\"),y=s(\"fc6a\"),g=s(\"c04e\"),x=s(\"5c6c\"),b=s(\"7c73\"),v=s(\"df75\"),w=s(\"241c\"),P=s(\"057f\"),T=s(\"7418\"),E=s(\"06cf\"),A=s(\"9bf2\"),S=s(\"d1e7\"),C=s(\"9112\"),k=s(\"6eeb\"),N=s(\"5692\"),I=s(\"f772\"),O=s(\"d012\"),D=s(\"90e3\"),M=s(\"b622\"),L=s(\"e538\"),_=s(\"746f\"),R=s(\"d44e\"),j=s(\"69f3\"),F=s(\"b727\").forEach,B=I(\"hidden\"),U=\"Symbol\",q=\"prototype\",V=M(\"toPrimitive\"),H=j.set,z=j.getterFor(U),W=Object[q],K=r.Symbol,$=n(\"JSON\",\"stringify\"),X=E.f,G=A.f,Y=P.f,J=S.f,Q=N(\"symbols\"),Z=N(\"op-symbols\"),tt=N(\"string-to-symbol-registry\"),et=N(\"symbol-to-string-registry\"),st=N(\"wks\"),it=r.QObject,rt=!it||!it[q]||!it[q].findChild,nt=o&&l((function(){return 7!=b(G({},\"a\",{get:function(){return G(this,\"a\",{value:7}).a}})).a}))?function(t,e,s){var i=X(W,e);i&&delete W[e],G(t,e,s),i&&t!==W&&G(W,e,i)}:G,at=function(t,e){var s=Q[t]=b(K[q]);return H(s,{type:U,tag:t,description:e}),o||(s.description=e),s},ot=h?function(t){return\"symbol\"==typeof t}:function(t){return Object(t)instanceof K},ct=function(t,e,s){t===W&&ct(Z,e,s),f(t);var i=g(e,!0);return f(s),p(Q,i)?(s.enumerable?(p(t,B)&&t[B][i]&&(t[B][i]=!1),s=b(s,{enumerable:x(0,!1)})):(p(t,B)||G(t,B,x(1,{})),t[B][i]=!0),nt(t,i,s)):G(t,i,s)},ht=function(t,e){f(t);var s=y(e),i=v(s).concat(ft(s));return F(i,(function(e){o&&!pt.call(s,e)||ct(t,e,s[e])})),t},lt=function(t,e){return void 0===e?b(t):ht(b(t),e)},pt=function(t){var e=g(t,!0),s=J.call(this,e);return!(this===W&&p(Q,e)&&!p(Z,e))&&(!(s||!p(this,e)||!p(Q,e)||p(this,B)&&this[B][e])||s)},ut=function(t,e){var s=y(t),i=g(e,!0);if(s!==W||!p(Q,i)||p(Z,i)){var r=X(s,i);return!r||!p(Q,i)||p(s,B)&&s[B][i]||(r.enumerable=!0),r}},dt=function(t){var e=Y(y(t)),s=[];return F(e,(function(t){p(Q,t)||p(O,t)||s.push(t)})),s},ft=function(t){var e=t===W,s=Y(e?Z:y(t)),i=[];return F(s,(function(t){!p(Q,t)||e&&!p(W,t)||i.push(Q[t])})),i};if(c||(K=function(){if(this instanceof K)throw TypeError(\"Symbol is not a constructor\");var t=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,e=D(t),s=function(t){this===W&&s.call(Z,t),p(this,B)&&p(this[B],e)&&(this[B][e]=!1),nt(this,e,x(1,t))};return o&&rt&&nt(W,e,{configurable:!0,set:s}),at(e,t)},k(K[q],\"toString\",(function(){return z(this).tag})),k(K,\"withoutSetter\",(function(t){return at(D(t),t)})),S.f=pt,A.f=ct,E.f=ut,w.f=P.f=dt,T.f=ft,L.f=function(t){return at(M(t),t)},o&&(G(K[q],\"description\",{configurable:!0,get:function(){return z(this).description}}),a||k(W,\"propertyIsEnumerable\",pt,{unsafe:!0}))),i({global:!0,wrap:!0,forced:!c,sham:!c},{Symbol:K}),F(v(st),(function(t){_(t)})),i({target:U,stat:!0,forced:!c},{for:function(t){var e=String(t);if(p(tt,e))return tt[e];var s=K(e);return tt[e]=s,et[s]=e,s},keyFor:function(t){if(!ot(t))throw TypeError(t+\" is not a symbol\");if(p(et,t))return et[t]},useSetter:function(){rt=!0},useSimple:function(){rt=!1}}),i({target:\"Object\",stat:!0,forced:!c,sham:!o},{create:lt,defineProperty:ct,defineProperties:ht,getOwnPropertyDescriptor:ut}),i({target:\"Object\",stat:!0,forced:!c},{getOwnPropertyNames:dt,getOwnPropertySymbols:ft}),i({target:\"Object\",stat:!0,forced:l((function(){T.f(1)}))},{getOwnPropertySymbols:function(t){return T.f(m(t))}}),$){var mt=!c||l((function(){var t=K();return\"[null]\"!=$([t])||\"{}\"!=$({a:t})||\"{}\"!=$(Object(t))}));i({target:\"JSON\",stat:!0,forced:mt},{stringify:function(t,e,s){var i,r=[t],n=1;while(arguments.length>n)r.push(arguments[n++]);if(i=e,(d(e)||void 0!==t)&&!ot(t))return u(e)||(e=function(t,e){if(\"function\"==typeof i&&(e=i.call(this,t,e)),!ot(e))return e}),r[1]=e,$.apply(null,r)}})}K[q][V]||C(K[q],V,K[q].valueOf),R(K,U),O[B]=!0},a640:function(t,e,s){\"use strict\";var i=s(\"d039\");t.exports=function(t,e){var s=[][t];return!!s&&i((function(){s.call(null,e||function(){throw 1},1)}))}},a691:function(t,e){var s=Math.ceil,i=Math.floor;t.exports=function(t){return isNaN(t=+t)?0:(t>0?i:s)(t)}},a79d:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"c430\"),n=s(\"fea9\"),a=s(\"d039\"),o=s(\"d066\"),c=s(\"4840\"),h=s(\"cdf9\"),l=s(\"6eeb\"),p=!!n&&a((function(){n.prototype[\"finally\"].call({then:function(){}},(function(){}))}));i({target:\"Promise\",proto:!0,real:!0,forced:p},{finally:function(t){var e=c(this,o(\"Promise\")),s=\"function\"==typeof t;return this.then(s?function(s){return h(e,t()).then((function(){return s}))}:t,s?function(s){return h(e,t()).then((function(){throw s}))}:t)}}),r||\"function\"!=typeof n||n.prototype[\"finally\"]||l(n.prototype,\"finally\",o(\"Promise\").prototype[\"finally\"])},aa47:function(t,e,s){\"use strict\";\n/**!\n * Sortable 1.10.2\n * @author\tRubaXa   <trash@rubaxa.org>\n * @author\towenm    <owen23355@gmail.com>\n * @license MIT\n */\nfunction i(t){return i=\"function\"===typeof Symbol&&\"symbol\"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},i(t)}function r(t,e,s){return e in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}function n(){return n=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var s=arguments[e];for(var i in s)Object.prototype.hasOwnProperty.call(s,i)&&(t[i]=s[i])}return t},n.apply(this,arguments)}function a(t){for(var e=1;e<arguments.length;e++){var s=null!=arguments[e]?arguments[e]:{},i=Object.keys(s);\"function\"===typeof Object.getOwnPropertySymbols&&(i=i.concat(Object.getOwnPropertySymbols(s).filter((function(t){return Object.getOwnPropertyDescriptor(s,t).enumerable})))),i.forEach((function(e){r(t,e,s[e])}))}return t}function o(t,e){if(null==t)return{};var s,i,r={},n=Object.keys(t);for(i=0;i<n.length;i++)s=n[i],e.indexOf(s)>=0||(r[s]=t[s]);return r}function c(t,e){if(null==t)return{};var s,i,r=o(t,e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);for(i=0;i<n.length;i++)s=n[i],e.indexOf(s)>=0||Object.prototype.propertyIsEnumerable.call(t,s)&&(r[s]=t[s])}return r}function h(t){return l(t)||p(t)||u()}function l(t){if(Array.isArray(t)){for(var e=0,s=new Array(t.length);e<t.length;e++)s[e]=t[e];return s}}function p(t){if(Symbol.iterator in Object(t)||\"[object Arguments]\"===Object.prototype.toString.call(t))return Array.from(t)}function u(){throw new TypeError(\"Invalid attempt to spread non-iterable instance\")}s.r(e),s.d(e,\"MultiDrag\",(function(){return Fe})),s.d(e,\"Sortable\",(function(){return Qt})),s.d(e,\"Swap\",(function(){return Se}));var d=\"1.10.2\";function f(t){if(\"undefined\"!==typeof window&&window.navigator)return!!navigator.userAgent.match(t)}var m=f(/(?:Trident.*rv[ :]?11\\.|msie|iemobile|Windows Phone)/i),y=f(/Edge/i),g=f(/firefox/i),x=f(/safari/i)&&!f(/chrome/i)&&!f(/android/i),b=f(/iP(ad|od|hone)/i),v=f(/chrome/i)&&f(/android/i),w={capture:!1,passive:!1};function P(t,e,s){t.addEventListener(e,s,!m&&w)}function T(t,e,s){t.removeEventListener(e,s,!m&&w)}function E(t,e){if(e){if(\">\"===e[0]&&(e=e.substring(1)),t)try{if(t.matches)return t.matches(e);if(t.msMatchesSelector)return t.msMatchesSelector(e);if(t.webkitMatchesSelector)return t.webkitMatchesSelector(e)}catch(s){return!1}return!1}}function A(t){return t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode}function S(t,e,s,i){if(t){s=s||document;do{if(null!=e&&(\">\"===e[0]?t.parentNode===s&&E(t,e):E(t,e))||i&&t===s)return t;if(t===s)break}while(t=A(t))}return null}var C,k=/\\s+/g;function N(t,e,s){if(t&&e)if(t.classList)t.classList[s?\"add\":\"remove\"](e);else{var i=(\" \"+t.className+\" \").replace(k,\" \").replace(\" \"+e+\" \",\" \");t.className=(i+(s?\" \"+e:\"\")).replace(k,\" \")}}function I(t,e,s){var i=t&&t.style;if(i){if(void 0===s)return document.defaultView&&document.defaultView.getComputedStyle?s=document.defaultView.getComputedStyle(t,\"\"):t.currentStyle&&(s=t.currentStyle),void 0===e?s:s[e];e in i||-1!==e.indexOf(\"webkit\")||(e=\"-webkit-\"+e),i[e]=s+(\"string\"===typeof s?\"\":\"px\")}}function O(t,e){var s=\"\";if(\"string\"===typeof t)s=t;else do{var i=I(t,\"transform\");i&&\"none\"!==i&&(s=i+\" \"+s)}while(!e&&(t=t.parentNode));var r=window.DOMMatrix||window.WebKitCSSMatrix||window.CSSMatrix||window.MSCSSMatrix;return r&&new r(s)}function D(t,e,s){if(t){var i=t.getElementsByTagName(e),r=0,n=i.length;if(s)for(;r<n;r++)s(i[r],r);return i}return[]}function M(){var t=document.scrollingElement;return t||document.documentElement}function L(t,e,s,i,r){if(t.getBoundingClientRect||t===window){var n,a,o,c,h,l,p;if(t!==window&&t!==M()?(n=t.getBoundingClientRect(),a=n.top,o=n.left,c=n.bottom,h=n.right,l=n.height,p=n.width):(a=0,o=0,c=window.innerHeight,h=window.innerWidth,l=window.innerHeight,p=window.innerWidth),(e||s)&&t!==window&&(r=r||t.parentNode,!m))do{if(r&&r.getBoundingClientRect&&(\"none\"!==I(r,\"transform\")||s&&\"static\"!==I(r,\"position\"))){var u=r.getBoundingClientRect();a-=u.top+parseInt(I(r,\"border-top-width\")),o-=u.left+parseInt(I(r,\"border-left-width\")),c=a+n.height,h=o+n.width;break}}while(r=r.parentNode);if(i&&t!==window){var d=O(r||t),f=d&&d.a,y=d&&d.d;d&&(a/=y,o/=f,p/=f,l/=y,c=a+l,h=o+p)}return{top:a,left:o,bottom:c,right:h,width:p,height:l}}}function _(t,e,s){var i=q(t,!0),r=L(t)[e];while(i){var n=L(i)[s],a=void 0;if(a=\"top\"===s||\"left\"===s?r>=n:r<=n,!a)return i;if(i===M())break;i=q(i,!1)}return!1}function R(t,e,s){var i=0,r=0,n=t.children;while(r<n.length){if(\"none\"!==n[r].style.display&&n[r]!==Qt.ghost&&n[r]!==Qt.dragged&&S(n[r],s.draggable,t,!1)){if(i===e)return n[r];i++}r++}return null}function j(t,e){var s=t.lastElementChild;while(s&&(s===Qt.ghost||\"none\"===I(s,\"display\")||e&&!E(s,e)))s=s.previousElementSibling;return s||null}function F(t,e){var s=0;if(!t||!t.parentNode)return-1;while(t=t.previousElementSibling)\"TEMPLATE\"===t.nodeName.toUpperCase()||t===Qt.clone||e&&!E(t,e)||s++;return s}function B(t){var e=0,s=0,i=M();if(t)do{var r=O(t),n=r.a,a=r.d;e+=t.scrollLeft*n,s+=t.scrollTop*a}while(t!==i&&(t=t.parentNode));return[e,s]}function U(t,e){for(var s in t)if(t.hasOwnProperty(s))for(var i in e)if(e.hasOwnProperty(i)&&e[i]===t[s][i])return Number(s);return-1}function q(t,e){if(!t||!t.getBoundingClientRect)return M();var s=t,i=!1;do{if(s.clientWidth<s.scrollWidth||s.clientHeight<s.scrollHeight){var r=I(s);if(s.clientWidth<s.scrollWidth&&(\"auto\"==r.overflowX||\"scroll\"==r.overflowX)||s.clientHeight<s.scrollHeight&&(\"auto\"==r.overflowY||\"scroll\"==r.overflowY)){if(!s.getBoundingClientRect||s===document.body)return M();if(i||e)return s;i=!0}}}while(s=s.parentNode);return M()}function V(t,e){if(t&&e)for(var s in e)e.hasOwnProperty(s)&&(t[s]=e[s]);return t}function H(t,e){return Math.round(t.top)===Math.round(e.top)&&Math.round(t.left)===Math.round(e.left)&&Math.round(t.height)===Math.round(e.height)&&Math.round(t.width)===Math.round(e.width)}function z(t,e){return function(){if(!C){var s=arguments,i=this;1===s.length?t.call(i,s[0]):t.apply(i,s),C=setTimeout((function(){C=void 0}),e)}}}function W(){clearTimeout(C),C=void 0}function K(t,e,s){t.scrollLeft+=e,t.scrollTop+=s}function $(t){var e=window.Polymer,s=window.jQuery||window.Zepto;return e&&e.dom?e.dom(t).cloneNode(!0):s?s(t).clone(!0)[0]:t.cloneNode(!0)}function X(t,e){I(t,\"position\",\"absolute\"),I(t,\"top\",e.top),I(t,\"left\",e.left),I(t,\"width\",e.width),I(t,\"height\",e.height)}function G(t){I(t,\"position\",\"\"),I(t,\"top\",\"\"),I(t,\"left\",\"\"),I(t,\"width\",\"\"),I(t,\"height\",\"\")}var Y=\"Sortable\"+(new Date).getTime();function J(){var t,e=[];return{captureAnimationState:function(){if(e=[],this.options.animation){var t=[].slice.call(this.el.children);t.forEach((function(t){if(\"none\"!==I(t,\"display\")&&t!==Qt.ghost){e.push({target:t,rect:L(t)});var s=a({},e[e.length-1].rect);if(t.thisAnimationDuration){var i=O(t,!0);i&&(s.top-=i.f,s.left-=i.e)}t.fromRect=s}}))}},addAnimationState:function(t){e.push(t)},removeAnimationState:function(t){e.splice(U(e,{target:t}),1)},animateAll:function(s){var i=this;if(!this.options.animation)return clearTimeout(t),void(\"function\"===typeof s&&s());var r=!1,n=0;e.forEach((function(t){var e=0,s=t.target,a=s.fromRect,o=L(s),c=s.prevFromRect,h=s.prevToRect,l=t.rect,p=O(s,!0);p&&(o.top-=p.f,o.left-=p.e),s.toRect=o,s.thisAnimationDuration&&H(c,o)&&!H(a,o)&&(l.top-o.top)/(l.left-o.left)===(a.top-o.top)/(a.left-o.left)&&(e=Z(l,c,h,i.options)),H(o,a)||(s.prevFromRect=a,s.prevToRect=o,e||(e=i.options.animation),i.animate(s,l,o,e)),e&&(r=!0,n=Math.max(n,e),clearTimeout(s.animationResetTimer),s.animationResetTimer=setTimeout((function(){s.animationTime=0,s.prevFromRect=null,s.fromRect=null,s.prevToRect=null,s.thisAnimationDuration=null}),e),s.thisAnimationDuration=e)})),clearTimeout(t),r?t=setTimeout((function(){\"function\"===typeof s&&s()}),n):\"function\"===typeof s&&s(),e=[]},animate:function(t,e,s,i){if(i){I(t,\"transition\",\"\"),I(t,\"transform\",\"\");var r=O(this.el),n=r&&r.a,a=r&&r.d,o=(e.left-s.left)/(n||1),c=(e.top-s.top)/(a||1);t.animatingX=!!o,t.animatingY=!!c,I(t,\"transform\",\"translate3d(\"+o+\"px,\"+c+\"px,0)\"),Q(t),I(t,\"transition\",\"transform \"+i+\"ms\"+(this.options.easing?\" \"+this.options.easing:\"\")),I(t,\"transform\",\"translate3d(0,0,0)\"),\"number\"===typeof t.animated&&clearTimeout(t.animated),t.animated=setTimeout((function(){I(t,\"transition\",\"\"),I(t,\"transform\",\"\"),t.animated=!1,t.animatingX=!1,t.animatingY=!1}),i)}}}}function Q(t){return t.offsetWidth}function Z(t,e,s,i){return Math.sqrt(Math.pow(e.top-t.top,2)+Math.pow(e.left-t.left,2))/Math.sqrt(Math.pow(e.top-s.top,2)+Math.pow(e.left-s.left,2))*i.animation}var tt=[],et={initializeByDefault:!0},st={mount:function(t){for(var e in et)et.hasOwnProperty(e)&&!(e in t)&&(t[e]=et[e]);tt.push(t)},pluginEvent:function(t,e,s){var i=this;this.eventCanceled=!1,s.cancel=function(){i.eventCanceled=!0};var r=t+\"Global\";tt.forEach((function(i){e[i.pluginName]&&(e[i.pluginName][r]&&e[i.pluginName][r](a({sortable:e},s)),e.options[i.pluginName]&&e[i.pluginName][t]&&e[i.pluginName][t](a({sortable:e},s)))}))},initializePlugins:function(t,e,s,i){for(var r in tt.forEach((function(i){var r=i.pluginName;if(t.options[r]||i.initializeByDefault){var a=new i(t,e,t.options);a.sortable=t,a.options=t.options,t[r]=a,n(s,a.defaults)}})),t.options)if(t.options.hasOwnProperty(r)){var a=this.modifyOption(t,r,t.options[r]);\"undefined\"!==typeof a&&(t.options[r]=a)}},getEventProperties:function(t,e){var s={};return tt.forEach((function(i){\"function\"===typeof i.eventProperties&&n(s,i.eventProperties.call(e[i.pluginName],t))})),s},modifyOption:function(t,e,s){var i;return tt.forEach((function(r){t[r.pluginName]&&r.optionListeners&&\"function\"===typeof r.optionListeners[e]&&(i=r.optionListeners[e].call(t[r.pluginName],s))})),i}};function it(t){var e=t.sortable,s=t.rootEl,i=t.name,r=t.targetEl,n=t.cloneEl,o=t.toEl,c=t.fromEl,h=t.oldIndex,l=t.newIndex,p=t.oldDraggableIndex,u=t.newDraggableIndex,d=t.originalEvent,f=t.putSortable,g=t.extraEventProperties;if(e=e||s&&s[Y],e){var x,b=e.options,v=\"on\"+i.charAt(0).toUpperCase()+i.substr(1);!window.CustomEvent||m||y?(x=document.createEvent(\"Event\"),x.initEvent(i,!0,!0)):x=new CustomEvent(i,{bubbles:!0,cancelable:!0}),x.to=o||s,x.from=c||s,x.item=r||s,x.clone=n,x.oldIndex=h,x.newIndex=l,x.oldDraggableIndex=p,x.newDraggableIndex=u,x.originalEvent=d,x.pullMode=f?f.lastPutMode:void 0;var w=a({},g,st.getEventProperties(i,e));for(var P in w)x[P]=w[P];s&&s.dispatchEvent(x),b[v]&&b[v].call(e,x)}}var rt=function(t,e){var s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},i=s.evt,r=c(s,[\"evt\"]);st.pluginEvent.bind(Qt)(t,e,a({dragEl:at,parentEl:ot,ghostEl:ct,rootEl:ht,nextEl:lt,lastDownEl:pt,cloneEl:ut,cloneHidden:dt,dragStarted:St,putSortable:bt,activeSortable:Qt.active,originalEvent:i,oldIndex:ft,oldDraggableIndex:yt,newIndex:mt,newDraggableIndex:gt,hideGhostForTarget:Xt,unhideGhostForTarget:Gt,cloneNowHidden:function(){dt=!0},cloneNowShown:function(){dt=!1},dispatchSortableEvent:function(t){nt({sortable:e,name:t,originalEvent:i})}},r))};function nt(t){it(a({putSortable:bt,cloneEl:ut,targetEl:at,rootEl:ht,oldIndex:ft,oldDraggableIndex:yt,newIndex:mt,newDraggableIndex:gt},t))}var at,ot,ct,ht,lt,pt,ut,dt,ft,mt,yt,gt,xt,bt,vt,wt,Pt,Tt,Et,At,St,Ct,kt,Nt,It,Ot=!1,Dt=!1,Mt=[],Lt=!1,_t=!1,Rt=[],jt=!1,Ft=[],Bt=\"undefined\"!==typeof document,Ut=b,qt=y||m?\"cssFloat\":\"float\",Vt=Bt&&!v&&!b&&\"draggable\"in document.createElement(\"div\"),Ht=function(){if(Bt){if(m)return!1;var t=document.createElement(\"x\");return t.style.cssText=\"pointer-events:auto\",\"auto\"===t.style.pointerEvents}}(),zt=function(t,e){var s=I(t),i=parseInt(s.width)-parseInt(s.paddingLeft)-parseInt(s.paddingRight)-parseInt(s.borderLeftWidth)-parseInt(s.borderRightWidth),r=R(t,0,e),n=R(t,1,e),a=r&&I(r),o=n&&I(n),c=a&&parseInt(a.marginLeft)+parseInt(a.marginRight)+L(r).width,h=o&&parseInt(o.marginLeft)+parseInt(o.marginRight)+L(n).width;if(\"flex\"===s.display)return\"column\"===s.flexDirection||\"column-reverse\"===s.flexDirection?\"vertical\":\"horizontal\";if(\"grid\"===s.display)return s.gridTemplateColumns.split(\" \").length<=1?\"vertical\":\"horizontal\";if(r&&a[\"float\"]&&\"none\"!==a[\"float\"]){var l=\"left\"===a[\"float\"]?\"left\":\"right\";return!n||\"both\"!==o.clear&&o.clear!==l?\"horizontal\":\"vertical\"}return r&&(\"block\"===a.display||\"flex\"===a.display||\"table\"===a.display||\"grid\"===a.display||c>=i&&\"none\"===s[qt]||n&&\"none\"===s[qt]&&c+h>i)?\"vertical\":\"horizontal\"},Wt=function(t,e,s){var i=s?t.left:t.top,r=s?t.right:t.bottom,n=s?t.width:t.height,a=s?e.left:e.top,o=s?e.right:e.bottom,c=s?e.width:e.height;return i===a||r===o||i+n/2===a+c/2},Kt=function(t,e){var s;return Mt.some((function(i){if(!j(i)){var r=L(i),n=i[Y].options.emptyInsertThreshold,a=t>=r.left-n&&t<=r.right+n,o=e>=r.top-n&&e<=r.bottom+n;return n&&a&&o?s=i:void 0}})),s},$t=function(t){function e(t,s){return function(i,r,n,a){var o=i.options.group.name&&r.options.group.name&&i.options.group.name===r.options.group.name;if(null==t&&(s||o))return!0;if(null==t||!1===t)return!1;if(s&&\"clone\"===t)return t;if(\"function\"===typeof t)return e(t(i,r,n,a),s)(i,r,n,a);var c=(s?i:r).options.group.name;return!0===t||\"string\"===typeof t&&t===c||t.join&&t.indexOf(c)>-1}}var s={},r=t.group;r&&\"object\"==i(r)||(r={name:r}),s.name=r.name,s.checkPull=e(r.pull,!0),s.checkPut=e(r.put),s.revertClone=r.revertClone,t.group=s},Xt=function(){!Ht&&ct&&I(ct,\"display\",\"none\")},Gt=function(){!Ht&&ct&&I(ct,\"display\",\"\")};Bt&&document.addEventListener(\"click\",(function(t){if(Dt)return t.preventDefault(),t.stopPropagation&&t.stopPropagation(),t.stopImmediatePropagation&&t.stopImmediatePropagation(),Dt=!1,!1}),!0);var Yt=function(t){if(at){t=t.touches?t.touches[0]:t;var e=Kt(t.clientX,t.clientY);if(e){var s={};for(var i in t)t.hasOwnProperty(i)&&(s[i]=t[i]);s.target=s.rootEl=e,s.preventDefault=void 0,s.stopPropagation=void 0,e[Y]._onDragOver(s)}}},Jt=function(t){at&&at.parentNode[Y]._isOutsideThisEl(t.target)};function Qt(t,e){if(!t||!t.nodeType||1!==t.nodeType)throw\"Sortable: `el` must be an HTMLElement, not \".concat({}.toString.call(t));this.el=t,this.options=e=n({},e),t[Y]=this;var s={group:null,sort:!0,disabled:!1,store:null,handle:null,draggable:/^[uo]l$/i.test(t.nodeName)?\">li\":\">*\",swapThreshold:1,invertSwap:!1,invertedSwapThreshold:null,removeCloneOnHide:!0,direction:function(){return zt(t,this.options)},ghostClass:\"sortable-ghost\",chosenClass:\"sortable-chosen\",dragClass:\"sortable-drag\",ignore:\"a, img\",filter:null,preventOnFilter:!0,animation:0,easing:null,setData:function(t,e){t.setData(\"Text\",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:\"data-id\",delay:0,delayOnTouchOnly:!1,touchStartThreshold:(Number.parseInt?Number:window).parseInt(window.devicePixelRatio,10)||1,forceFallback:!1,fallbackClass:\"sortable-fallback\",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==Qt.supportPointer&&\"PointerEvent\"in window,emptyInsertThreshold:5};for(var i in st.initializePlugins(this,t,s),s)!(i in e)&&(e[i]=s[i]);for(var r in $t(e),this)\"_\"===r.charAt(0)&&\"function\"===typeof this[r]&&(this[r]=this[r].bind(this));this.nativeDraggable=!e.forceFallback&&Vt,this.nativeDraggable&&(this.options.touchStartThreshold=1),e.supportPointer?P(t,\"pointerdown\",this._onTapStart):(P(t,\"mousedown\",this._onTapStart),P(t,\"touchstart\",this._onTapStart)),this.nativeDraggable&&(P(t,\"dragover\",this),P(t,\"dragenter\",this)),Mt.push(this.el),e.store&&e.store.get&&this.sort(e.store.get(this)||[]),n(this,J())}function Zt(t){t.dataTransfer&&(t.dataTransfer.dropEffect=\"move\"),t.cancelable&&t.preventDefault()}function te(t,e,s,i,r,n,a,o){var c,h,l=t[Y],p=l.options.onMove;return!window.CustomEvent||m||y?(c=document.createEvent(\"Event\"),c.initEvent(\"move\",!0,!0)):c=new CustomEvent(\"move\",{bubbles:!0,cancelable:!0}),c.to=e,c.from=t,c.dragged=s,c.draggedRect=i,c.related=r||e,c.relatedRect=n||L(e),c.willInsertAfter=o,c.originalEvent=a,t.dispatchEvent(c),p&&(h=p.call(l,c,a)),h}function ee(t){t.draggable=!1}function se(){jt=!1}function ie(t,e,s){var i=L(j(s.el,s.options.draggable)),r=10;return e?t.clientX>i.right+r||t.clientX<=i.right&&t.clientY>i.bottom&&t.clientX>=i.left:t.clientX>i.right&&t.clientY>i.top||t.clientX<=i.right&&t.clientY>i.bottom+r}function re(t,e,s,i,r,n,a,o){var c=i?t.clientY:t.clientX,h=i?s.height:s.width,l=i?s.top:s.left,p=i?s.bottom:s.right,u=!1;if(!a)if(o&&Nt<h*r){if(!Lt&&(1===kt?c>l+h*n/2:c<p-h*n/2)&&(Lt=!0),Lt)u=!0;else if(1===kt?c<l+Nt:c>p-Nt)return-kt}else if(c>l+h*(1-r)/2&&c<p-h*(1-r)/2)return ne(e);return u=u||a,u&&(c<l+h*n/2||c>p-h*n/2)?c>l+h/2?1:-1:0}function ne(t){return F(at)<F(t)?1:-1}function ae(t){var e=t.tagName+t.className+t.src+t.href+t.textContent,s=e.length,i=0;while(s--)i+=e.charCodeAt(s);return i.toString(36)}function oe(t){Ft.length=0;var e=t.getElementsByTagName(\"input\"),s=e.length;while(s--){var i=e[s];i.checked&&Ft.push(i)}}function ce(t){return setTimeout(t,0)}function he(t){return clearTimeout(t)}Qt.prototype={constructor:Qt,_isOutsideThisEl:function(t){this.el.contains(t)||t===this.el||(Ct=null)},_getDirection:function(t,e){return\"function\"===typeof this.options.direction?this.options.direction.call(this,t,e,at):this.options.direction},_onTapStart:function(t){if(t.cancelable){var e=this,s=this.el,i=this.options,r=i.preventOnFilter,n=t.type,a=t.touches&&t.touches[0]||t.pointerType&&\"touch\"===t.pointerType&&t,o=(a||t).target,c=t.target.shadowRoot&&(t.path&&t.path[0]||t.composedPath&&t.composedPath()[0])||o,h=i.filter;if(oe(s),!at&&!(/mousedown|pointerdown/.test(n)&&0!==t.button||i.disabled)&&!c.isContentEditable&&(o=S(o,i.draggable,s,!1),(!o||!o.animated)&&pt!==o)){if(ft=F(o),yt=F(o,i.draggable),\"function\"===typeof h){if(h.call(this,t,o,this))return nt({sortable:e,rootEl:c,name:\"filter\",targetEl:o,toEl:s,fromEl:s}),rt(\"filter\",e,{evt:t}),void(r&&t.cancelable&&t.preventDefault())}else if(h&&(h=h.split(\",\").some((function(i){if(i=S(c,i.trim(),s,!1),i)return nt({sortable:e,rootEl:i,name:\"filter\",targetEl:o,fromEl:s,toEl:s}),rt(\"filter\",e,{evt:t}),!0})),h))return void(r&&t.cancelable&&t.preventDefault());i.handle&&!S(c,i.handle,s,!1)||this._prepareDragStart(t,a,o)}}},_prepareDragStart:function(t,e,s){var i,r=this,n=r.el,a=r.options,o=n.ownerDocument;if(s&&!at&&s.parentNode===n){var c=L(s);if(ht=n,at=s,ot=at.parentNode,lt=at.nextSibling,pt=s,xt=a.group,Qt.dragged=at,vt={target:at,clientX:(e||t).clientX,clientY:(e||t).clientY},Et=vt.clientX-c.left,At=vt.clientY-c.top,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,at.style[\"will-change\"]=\"all\",i=function(){rt(\"delayEnded\",r,{evt:t}),Qt.eventCanceled?r._onDrop():(r._disableDelayedDragEvents(),!g&&r.nativeDraggable&&(at.draggable=!0),r._triggerDragStart(t,e),nt({sortable:r,name:\"choose\",originalEvent:t}),N(at,a.chosenClass,!0))},a.ignore.split(\",\").forEach((function(t){D(at,t.trim(),ee)})),P(o,\"dragover\",Yt),P(o,\"mousemove\",Yt),P(o,\"touchmove\",Yt),P(o,\"mouseup\",r._onDrop),P(o,\"touchend\",r._onDrop),P(o,\"touchcancel\",r._onDrop),g&&this.nativeDraggable&&(this.options.touchStartThreshold=4,at.draggable=!0),rt(\"delayStart\",this,{evt:t}),!a.delay||a.delayOnTouchOnly&&!e||this.nativeDraggable&&(y||m))i();else{if(Qt.eventCanceled)return void this._onDrop();P(o,\"mouseup\",r._disableDelayedDrag),P(o,\"touchend\",r._disableDelayedDrag),P(o,\"touchcancel\",r._disableDelayedDrag),P(o,\"mousemove\",r._delayedDragTouchMoveHandler),P(o,\"touchmove\",r._delayedDragTouchMoveHandler),a.supportPointer&&P(o,\"pointermove\",r._delayedDragTouchMoveHandler),r._dragStartTimer=setTimeout(i,a.delay)}}},_delayedDragTouchMoveHandler:function(t){var e=t.touches?t.touches[0]:t;Math.max(Math.abs(e.clientX-this._lastX),Math.abs(e.clientY-this._lastY))>=Math.floor(this.options.touchStartThreshold/(this.nativeDraggable&&window.devicePixelRatio||1))&&this._disableDelayedDrag()},_disableDelayedDrag:function(){at&&ee(at),clearTimeout(this._dragStartTimer),this._disableDelayedDragEvents()},_disableDelayedDragEvents:function(){var t=this.el.ownerDocument;T(t,\"mouseup\",this._disableDelayedDrag),T(t,\"touchend\",this._disableDelayedDrag),T(t,\"touchcancel\",this._disableDelayedDrag),T(t,\"mousemove\",this._delayedDragTouchMoveHandler),T(t,\"touchmove\",this._delayedDragTouchMoveHandler),T(t,\"pointermove\",this._delayedDragTouchMoveHandler)},_triggerDragStart:function(t,e){e=e||\"touch\"==t.pointerType&&t,!this.nativeDraggable||e?this.options.supportPointer?P(document,\"pointermove\",this._onTouchMove):P(document,e?\"touchmove\":\"mousemove\",this._onTouchMove):(P(at,\"dragend\",this),P(ht,\"dragstart\",this._onDragStart));try{document.selection?ce((function(){document.selection.empty()})):window.getSelection().removeAllRanges()}catch(s){}},_dragStarted:function(t,e){if(Ot=!1,ht&&at){rt(\"dragStarted\",this,{evt:e}),this.nativeDraggable&&P(document,\"dragover\",Jt);var s=this.options;!t&&N(at,s.dragClass,!1),N(at,s.ghostClass,!0),Qt.active=this,t&&this._appendGhost(),nt({sortable:this,name:\"start\",originalEvent:e})}else this._nulling()},_emulateDragOver:function(){if(wt){this._lastX=wt.clientX,this._lastY=wt.clientY,Xt();var t=document.elementFromPoint(wt.clientX,wt.clientY),e=t;while(t&&t.shadowRoot){if(t=t.shadowRoot.elementFromPoint(wt.clientX,wt.clientY),t===e)break;e=t}if(at.parentNode[Y]._isOutsideThisEl(t),e)do{if(e[Y]){var s=void 0;if(s=e[Y]._onDragOver({clientX:wt.clientX,clientY:wt.clientY,target:t,rootEl:e}),s&&!this.options.dragoverBubble)break}t=e}while(e=e.parentNode);Gt()}},_onTouchMove:function(t){if(vt){var e=this.options,s=e.fallbackTolerance,i=e.fallbackOffset,r=t.touches?t.touches[0]:t,n=ct&&O(ct,!0),a=ct&&n&&n.a,o=ct&&n&&n.d,c=Ut&&It&&B(It),h=(r.clientX-vt.clientX+i.x)/(a||1)+(c?c[0]-Rt[0]:0)/(a||1),l=(r.clientY-vt.clientY+i.y)/(o||1)+(c?c[1]-Rt[1]:0)/(o||1);if(!Qt.active&&!Ot){if(s&&Math.max(Math.abs(r.clientX-this._lastX),Math.abs(r.clientY-this._lastY))<s)return;this._onDragStart(t,!0)}if(ct){n?(n.e+=h-(Pt||0),n.f+=l-(Tt||0)):n={a:1,b:0,c:0,d:1,e:h,f:l};var p=\"matrix(\".concat(n.a,\",\").concat(n.b,\",\").concat(n.c,\",\").concat(n.d,\",\").concat(n.e,\",\").concat(n.f,\")\");I(ct,\"webkitTransform\",p),I(ct,\"mozTransform\",p),I(ct,\"msTransform\",p),I(ct,\"transform\",p),Pt=h,Tt=l,wt=r}t.cancelable&&t.preventDefault()}},_appendGhost:function(){if(!ct){var t=this.options.fallbackOnBody?document.body:ht,e=L(at,!0,Ut,!0,t),s=this.options;if(Ut){It=t;while(\"static\"===I(It,\"position\")&&\"none\"===I(It,\"transform\")&&It!==document)It=It.parentNode;It!==document.body&&It!==document.documentElement?(It===document&&(It=M()),e.top+=It.scrollTop,e.left+=It.scrollLeft):It=M(),Rt=B(It)}ct=at.cloneNode(!0),N(ct,s.ghostClass,!1),N(ct,s.fallbackClass,!0),N(ct,s.dragClass,!0),I(ct,\"transition\",\"\"),I(ct,\"transform\",\"\"),I(ct,\"box-sizing\",\"border-box\"),I(ct,\"margin\",0),I(ct,\"top\",e.top),I(ct,\"left\",e.left),I(ct,\"width\",e.width),I(ct,\"height\",e.height),I(ct,\"opacity\",\"0.8\"),I(ct,\"position\",Ut?\"absolute\":\"fixed\"),I(ct,\"zIndex\",\"100000\"),I(ct,\"pointerEvents\",\"none\"),Qt.ghost=ct,t.appendChild(ct),I(ct,\"transform-origin\",Et/parseInt(ct.style.width)*100+\"% \"+At/parseInt(ct.style.height)*100+\"%\")}},_onDragStart:function(t,e){var s=this,i=t.dataTransfer,r=s.options;rt(\"dragStart\",this,{evt:t}),Qt.eventCanceled?this._onDrop():(rt(\"setupClone\",this),Qt.eventCanceled||(ut=$(at),ut.draggable=!1,ut.style[\"will-change\"]=\"\",this._hideClone(),N(ut,this.options.chosenClass,!1),Qt.clone=ut),s.cloneId=ce((function(){rt(\"clone\",s),Qt.eventCanceled||(s.options.removeCloneOnHide||ht.insertBefore(ut,at),s._hideClone(),nt({sortable:s,name:\"clone\"}))})),!e&&N(at,r.dragClass,!0),e?(Dt=!0,s._loopId=setInterval(s._emulateDragOver,50)):(T(document,\"mouseup\",s._onDrop),T(document,\"touchend\",s._onDrop),T(document,\"touchcancel\",s._onDrop),i&&(i.effectAllowed=\"move\",r.setData&&r.setData.call(s,i,at)),P(document,\"drop\",s),I(at,\"transform\",\"translateZ(0)\")),Ot=!0,s._dragStartId=ce(s._dragStarted.bind(s,e,t)),P(document,\"selectstart\",s),St=!0,x&&I(document.body,\"user-select\",\"none\"))},_onDragOver:function(t){var e,s,i,r,n=this.el,o=t.target,c=this.options,h=c.group,l=Qt.active,p=xt===h,u=c.sort,d=bt||l,f=this,m=!1;if(!jt){if(void 0!==t.preventDefault&&t.cancelable&&t.preventDefault(),o=S(o,c.draggable,n,!0),D(\"dragOver\"),Qt.eventCanceled)return m;if(at.contains(t.target)||o.animated&&o.animatingX&&o.animatingY||f._ignoreWhileAnimating===o)return R(!1);if(Dt=!1,l&&!c.disabled&&(p?u||(i=!ht.contains(at)):bt===this||(this.lastPutMode=xt.checkPull(this,l,at,t))&&h.checkPut(this,l,at,t))){if(r=\"vertical\"===this._getDirection(t,o),e=L(at),D(\"dragOverValid\"),Qt.eventCanceled)return m;if(i)return ot=ht,M(),this._hideClone(),D(\"revert\"),Qt.eventCanceled||(lt?ht.insertBefore(at,lt):ht.appendChild(at)),R(!0);var y=j(n,c.draggable);if(!y||ie(t,r,this)&&!y.animated){if(y===at)return R(!1);if(y&&n===t.target&&(o=y),o&&(s=L(o)),!1!==te(ht,n,at,e,o,s,t,!!o))return M(),n.appendChild(at),ot=n,B(),R(!0)}else if(o.parentNode===n){s=L(o);var g,x,b=0,v=at.parentNode!==n,w=!Wt(at.animated&&at.toRect||e,o.animated&&o.toRect||s,r),P=r?\"top\":\"left\",T=_(o,\"top\",\"top\")||_(at,\"top\",\"top\"),E=T?T.scrollTop:void 0;if(Ct!==o&&(g=s[P],Lt=!1,_t=!w&&c.invertSwap||v),b=re(t,o,s,r,w?1:c.swapThreshold,null==c.invertedSwapThreshold?c.swapThreshold:c.invertedSwapThreshold,_t,Ct===o),0!==b){var A=F(at);do{A-=b,x=ot.children[A]}while(x&&(\"none\"===I(x,\"display\")||x===ct))}if(0===b||x===o)return R(!1);Ct=o,kt=b;var C=o.nextElementSibling,k=!1;k=1===b;var O=te(ht,n,at,e,o,s,t,k);if(!1!==O)return 1!==O&&-1!==O||(k=1===O),jt=!0,setTimeout(se,30),M(),k&&!C?n.appendChild(at):o.parentNode.insertBefore(at,k?C:o),T&&K(T,0,E-T.scrollTop),ot=at.parentNode,void 0===g||_t||(Nt=Math.abs(g-L(o)[P])),B(),R(!0)}if(n.contains(at))return R(!1)}return!1}function D(c,h){rt(c,f,a({evt:t,isOwner:p,axis:r?\"vertical\":\"horizontal\",revert:i,dragRect:e,targetRect:s,canSort:u,fromSortable:d,target:o,completed:R,onMove:function(s,i){return te(ht,n,at,e,s,L(s),t,i)},changed:B},h))}function M(){D(\"dragOverAnimationCapture\"),f.captureAnimationState(),f!==d&&d.captureAnimationState()}function R(e){return D(\"dragOverCompleted\",{insertion:e}),e&&(p?l._hideClone():l._showClone(f),f!==d&&(N(at,bt?bt.options.ghostClass:l.options.ghostClass,!1),N(at,c.ghostClass,!0)),bt!==f&&f!==Qt.active?bt=f:f===Qt.active&&bt&&(bt=null),d===f&&(f._ignoreWhileAnimating=o),f.animateAll((function(){D(\"dragOverAnimationComplete\"),f._ignoreWhileAnimating=null})),f!==d&&(d.animateAll(),d._ignoreWhileAnimating=null)),(o===at&&!at.animated||o===n&&!o.animated)&&(Ct=null),c.dragoverBubble||t.rootEl||o===document||(at.parentNode[Y]._isOutsideThisEl(t.target),!e&&Yt(t)),!c.dragoverBubble&&t.stopPropagation&&t.stopPropagation(),m=!0}function B(){mt=F(at),gt=F(at,c.draggable),nt({sortable:f,name:\"change\",toEl:n,newIndex:mt,newDraggableIndex:gt,originalEvent:t})}},_ignoreWhileAnimating:null,_offMoveEvents:function(){T(document,\"mousemove\",this._onTouchMove),T(document,\"touchmove\",this._onTouchMove),T(document,\"pointermove\",this._onTouchMove),T(document,\"dragover\",Yt),T(document,\"mousemove\",Yt),T(document,\"touchmove\",Yt)},_offUpEvents:function(){var t=this.el.ownerDocument;T(t,\"mouseup\",this._onDrop),T(t,\"touchend\",this._onDrop),T(t,\"pointerup\",this._onDrop),T(t,\"touchcancel\",this._onDrop),T(document,\"selectstart\",this)},_onDrop:function(t){var e=this.el,s=this.options;mt=F(at),gt=F(at,s.draggable),rt(\"drop\",this,{evt:t}),ot=at&&at.parentNode,mt=F(at),gt=F(at,s.draggable),Qt.eventCanceled||(Ot=!1,_t=!1,Lt=!1,clearInterval(this._loopId),clearTimeout(this._dragStartTimer),he(this.cloneId),he(this._dragStartId),this.nativeDraggable&&(T(document,\"drop\",this),T(e,\"dragstart\",this._onDragStart)),this._offMoveEvents(),this._offUpEvents(),x&&I(document.body,\"user-select\",\"\"),I(at,\"transform\",\"\"),t&&(St&&(t.cancelable&&t.preventDefault(),!s.dropBubble&&t.stopPropagation()),ct&&ct.parentNode&&ct.parentNode.removeChild(ct),(ht===ot||bt&&\"clone\"!==bt.lastPutMode)&&ut&&ut.parentNode&&ut.parentNode.removeChild(ut),at&&(this.nativeDraggable&&T(at,\"dragend\",this),ee(at),at.style[\"will-change\"]=\"\",St&&!Ot&&N(at,bt?bt.options.ghostClass:this.options.ghostClass,!1),N(at,this.options.chosenClass,!1),nt({sortable:this,name:\"unchoose\",toEl:ot,newIndex:null,newDraggableIndex:null,originalEvent:t}),ht!==ot?(mt>=0&&(nt({rootEl:ot,name:\"add\",toEl:ot,fromEl:ht,originalEvent:t}),nt({sortable:this,name:\"remove\",toEl:ot,originalEvent:t}),nt({rootEl:ot,name:\"sort\",toEl:ot,fromEl:ht,originalEvent:t}),nt({sortable:this,name:\"sort\",toEl:ot,originalEvent:t})),bt&&bt.save()):mt!==ft&&mt>=0&&(nt({sortable:this,name:\"update\",toEl:ot,originalEvent:t}),nt({sortable:this,name:\"sort\",toEl:ot,originalEvent:t})),Qt.active&&(null!=mt&&-1!==mt||(mt=ft,gt=yt),nt({sortable:this,name:\"end\",toEl:ot,originalEvent:t}),this.save())))),this._nulling()},_nulling:function(){rt(\"nulling\",this),ht=at=ot=ct=lt=ut=pt=dt=vt=wt=St=mt=gt=ft=yt=Ct=kt=bt=xt=Qt.dragged=Qt.ghost=Qt.clone=Qt.active=null,Ft.forEach((function(t){t.checked=!0})),Ft.length=Pt=Tt=0},handleEvent:function(t){switch(t.type){case\"drop\":case\"dragend\":this._onDrop(t);break;case\"dragenter\":case\"dragover\":at&&(this._onDragOver(t),Zt(t));break;case\"selectstart\":t.preventDefault();break}},toArray:function(){for(var t,e=[],s=this.el.children,i=0,r=s.length,n=this.options;i<r;i++)t=s[i],S(t,n.draggable,this.el,!1)&&e.push(t.getAttribute(n.dataIdAttr)||ae(t));return e},sort:function(t){var e={},s=this.el;this.toArray().forEach((function(t,i){var r=s.children[i];S(r,this.options.draggable,s,!1)&&(e[t]=r)}),this),t.forEach((function(t){e[t]&&(s.removeChild(e[t]),s.appendChild(e[t]))}))},save:function(){var t=this.options.store;t&&t.set&&t.set(this)},closest:function(t,e){return S(t,e||this.options.draggable,this.el,!1)},option:function(t,e){var s=this.options;if(void 0===e)return s[t];var i=st.modifyOption(this,t,e);s[t]=\"undefined\"!==typeof i?i:e,\"group\"===t&&$t(s)},destroy:function(){rt(\"destroy\",this);var t=this.el;t[Y]=null,T(t,\"mousedown\",this._onTapStart),T(t,\"touchstart\",this._onTapStart),T(t,\"pointerdown\",this._onTapStart),this.nativeDraggable&&(T(t,\"dragover\",this),T(t,\"dragenter\",this)),Array.prototype.forEach.call(t.querySelectorAll(\"[draggable]\"),(function(t){t.removeAttribute(\"draggable\")})),this._onDrop(),this._disableDelayedDragEvents(),Mt.splice(Mt.indexOf(this.el),1),this.el=t=null},_hideClone:function(){if(!dt){if(rt(\"hideClone\",this),Qt.eventCanceled)return;I(ut,\"display\",\"none\"),this.options.removeCloneOnHide&&ut.parentNode&&ut.parentNode.removeChild(ut),dt=!0}},_showClone:function(t){if(\"clone\"===t.lastPutMode){if(dt){if(rt(\"showClone\",this),Qt.eventCanceled)return;ht.contains(at)&&!this.options.group.revertClone?ht.insertBefore(ut,at):lt?ht.insertBefore(ut,lt):ht.appendChild(ut),this.options.group.revertClone&&this.animate(at,ut),I(ut,\"display\",\"\"),dt=!1}}else this._hideClone()}},Bt&&P(document,\"touchmove\",(function(t){(Qt.active||Ot)&&t.cancelable&&t.preventDefault()})),Qt.utils={on:P,off:T,css:I,find:D,is:function(t,e){return!!S(t,e,t,!1)},extend:V,throttle:z,closest:S,toggleClass:N,clone:$,index:F,nextTick:ce,cancelNextTick:he,detectDirection:zt,getChild:R},Qt.get=function(t){return t[Y]},Qt.mount=function(){for(var t=arguments.length,e=new Array(t),s=0;s<t;s++)e[s]=arguments[s];e[0].constructor===Array&&(e=e[0]),e.forEach((function(t){if(!t.prototype||!t.prototype.constructor)throw\"Sortable: Mounted plugin must be a constructor function, not \".concat({}.toString.call(t));t.utils&&(Qt.utils=a({},Qt.utils,t.utils)),st.mount(t)}))},Qt.create=function(t,e){return new Qt(t,e)},Qt.version=d;var le,pe,ue,de,fe,me,ye=[],ge=!1;function xe(){function t(){for(var t in this.defaults={scroll:!0,scrollSensitivity:30,scrollSpeed:10,bubbleScroll:!0},this)\"_\"===t.charAt(0)&&\"function\"===typeof this[t]&&(this[t]=this[t].bind(this))}return t.prototype={dragStarted:function(t){var e=t.originalEvent;this.sortable.nativeDraggable?P(document,\"dragover\",this._handleAutoScroll):this.options.supportPointer?P(document,\"pointermove\",this._handleFallbackAutoScroll):e.touches?P(document,\"touchmove\",this._handleFallbackAutoScroll):P(document,\"mousemove\",this._handleFallbackAutoScroll)},dragOverCompleted:function(t){var e=t.originalEvent;this.options.dragOverBubble||e.rootEl||this._handleAutoScroll(e)},drop:function(){this.sortable.nativeDraggable?T(document,\"dragover\",this._handleAutoScroll):(T(document,\"pointermove\",this._handleFallbackAutoScroll),T(document,\"touchmove\",this._handleFallbackAutoScroll),T(document,\"mousemove\",this._handleFallbackAutoScroll)),ve(),be(),W()},nulling:function(){fe=pe=le=ge=me=ue=de=null,ye.length=0},_handleFallbackAutoScroll:function(t){this._handleAutoScroll(t,!0)},_handleAutoScroll:function(t,e){var s=this,i=(t.touches?t.touches[0]:t).clientX,r=(t.touches?t.touches[0]:t).clientY,n=document.elementFromPoint(i,r);if(fe=t,e||y||m||x){Pe(t,this.options,n,e);var a=q(n,!0);!ge||me&&i===ue&&r===de||(me&&ve(),me=setInterval((function(){var n=q(document.elementFromPoint(i,r),!0);n!==a&&(a=n,be()),Pe(t,s.options,n,e)}),10),ue=i,de=r)}else{if(!this.options.bubbleScroll||q(n,!0)===M())return void be();Pe(t,this.options,q(n,!1),!1)}}},n(t,{pluginName:\"scroll\",initializeByDefault:!0})}function be(){ye.forEach((function(t){clearInterval(t.pid)})),ye=[]}function ve(){clearInterval(me)}var we,Pe=z((function(t,e,s,i){if(e.scroll){var r,n=(t.touches?t.touches[0]:t).clientX,a=(t.touches?t.touches[0]:t).clientY,o=e.scrollSensitivity,c=e.scrollSpeed,h=M(),l=!1;pe!==s&&(pe=s,be(),le=e.scroll,r=e.scrollFn,!0===le&&(le=q(s,!0)));var p=0,u=le;do{var d=u,f=L(d),m=f.top,y=f.bottom,g=f.left,x=f.right,b=f.width,v=f.height,w=void 0,P=void 0,T=d.scrollWidth,E=d.scrollHeight,A=I(d),S=d.scrollLeft,C=d.scrollTop;d===h?(w=b<T&&(\"auto\"===A.overflowX||\"scroll\"===A.overflowX||\"visible\"===A.overflowX),P=v<E&&(\"auto\"===A.overflowY||\"scroll\"===A.overflowY||\"visible\"===A.overflowY)):(w=b<T&&(\"auto\"===A.overflowX||\"scroll\"===A.overflowX),P=v<E&&(\"auto\"===A.overflowY||\"scroll\"===A.overflowY));var k=w&&(Math.abs(x-n)<=o&&S+b<T)-(Math.abs(g-n)<=o&&!!S),N=P&&(Math.abs(y-a)<=o&&C+v<E)-(Math.abs(m-a)<=o&&!!C);if(!ye[p])for(var O=0;O<=p;O++)ye[O]||(ye[O]={});ye[p].vx==k&&ye[p].vy==N&&ye[p].el===d||(ye[p].el=d,ye[p].vx=k,ye[p].vy=N,clearInterval(ye[p].pid),0==k&&0==N||(l=!0,ye[p].pid=setInterval(function(){i&&0===this.layer&&Qt.active._onTouchMove(fe);var e=ye[this.layer].vy?ye[this.layer].vy*c:0,s=ye[this.layer].vx?ye[this.layer].vx*c:0;\"function\"===typeof r&&\"continue\"!==r.call(Qt.dragged.parentNode[Y],s,e,t,fe,ye[this.layer].el)||K(ye[this.layer].el,s,e)}.bind({layer:p}),24))),p++}while(e.bubbleScroll&&u!==h&&(u=q(u,!1)));ge=l}}),30),Te=function(t){var e=t.originalEvent,s=t.putSortable,i=t.dragEl,r=t.activeSortable,n=t.dispatchSortableEvent,a=t.hideGhostForTarget,o=t.unhideGhostForTarget;if(e){var c=s||r;a();var h=e.changedTouches&&e.changedTouches.length?e.changedTouches[0]:e,l=document.elementFromPoint(h.clientX,h.clientY);o(),c&&!c.el.contains(l)&&(n(\"spill\"),this.onSpill({dragEl:i,putSortable:s}))}};function Ee(){}function Ae(){}function Se(){function t(){this.defaults={swapClass:\"sortable-swap-highlight\"}}return t.prototype={dragStart:function(t){var e=t.dragEl;we=e},dragOverValid:function(t){var e=t.completed,s=t.target,i=t.onMove,r=t.activeSortable,n=t.changed,a=t.cancel;if(r.options.swap){var o=this.sortable.el,c=this.options;if(s&&s!==o){var h=we;!1!==i(s)?(N(s,c.swapClass,!0),we=s):we=null,h&&h!==we&&N(h,c.swapClass,!1)}n(),e(!0),a()}},drop:function(t){var e=t.activeSortable,s=t.putSortable,i=t.dragEl,r=s||this.sortable,n=this.options;we&&N(we,n.swapClass,!1),we&&(n.swap||s&&s.options.swap)&&i!==we&&(r.captureAnimationState(),r!==e&&e.captureAnimationState(),Ce(i,we),r.animateAll(),r!==e&&e.animateAll())},nulling:function(){we=null}},n(t,{pluginName:\"swap\",eventProperties:function(){return{swapItem:we}}})}function Ce(t,e){var s,i,r=t.parentNode,n=e.parentNode;r&&n&&!r.isEqualNode(e)&&!n.isEqualNode(t)&&(s=F(t),i=F(e),r.isEqualNode(n)&&s<i&&i++,r.insertBefore(e,r.children[s]),n.insertBefore(t,n.children[i]))}Ee.prototype={startIndex:null,dragStart:function(t){var e=t.oldDraggableIndex;this.startIndex=e},onSpill:function(t){var e=t.dragEl,s=t.putSortable;this.sortable.captureAnimationState(),s&&s.captureAnimationState();var i=R(this.sortable.el,this.startIndex,this.options);i?this.sortable.el.insertBefore(e,i):this.sortable.el.appendChild(e),this.sortable.animateAll(),s&&s.animateAll()},drop:Te},n(Ee,{pluginName:\"revertOnSpill\"}),Ae.prototype={onSpill:function(t){var e=t.dragEl,s=t.putSortable,i=s||this.sortable;i.captureAnimationState(),e.parentNode&&e.parentNode.removeChild(e),i.animateAll()},drop:Te},n(Ae,{pluginName:\"removeOnSpill\"});var ke,Ne,Ie,Oe,De,Me=[],Le=[],_e=!1,Re=!1,je=!1;function Fe(){function t(t){for(var e in this)\"_\"===e.charAt(0)&&\"function\"===typeof this[e]&&(this[e]=this[e].bind(this));t.options.supportPointer?P(document,\"pointerup\",this._deselectMultiDrag):(P(document,\"mouseup\",this._deselectMultiDrag),P(document,\"touchend\",this._deselectMultiDrag)),P(document,\"keydown\",this._checkKeyDown),P(document,\"keyup\",this._checkKeyUp),this.defaults={selectedClass:\"sortable-selected\",multiDragKey:null,setData:function(e,s){var i=\"\";Me.length&&Ne===t?Me.forEach((function(t,e){i+=(e?\", \":\"\")+t.textContent})):i=s.textContent,e.setData(\"Text\",i)}}}return t.prototype={multiDragKeyDown:!1,isMultiDrag:!1,delayStartGlobal:function(t){var e=t.dragEl;Ie=e},delayEnded:function(){this.isMultiDrag=~Me.indexOf(Ie)},setupClone:function(t){var e=t.sortable,s=t.cancel;if(this.isMultiDrag){for(var i=0;i<Me.length;i++)Le.push($(Me[i])),Le[i].sortableIndex=Me[i].sortableIndex,Le[i].draggable=!1,Le[i].style[\"will-change\"]=\"\",N(Le[i],this.options.selectedClass,!1),Me[i]===Ie&&N(Le[i],this.options.chosenClass,!1);e._hideClone(),s()}},clone:function(t){var e=t.sortable,s=t.rootEl,i=t.dispatchSortableEvent,r=t.cancel;this.isMultiDrag&&(this.options.removeCloneOnHide||Me.length&&Ne===e&&(Ue(!0,s),i(\"clone\"),r()))},showClone:function(t){var e=t.cloneNowShown,s=t.rootEl,i=t.cancel;this.isMultiDrag&&(Ue(!1,s),Le.forEach((function(t){I(t,\"display\",\"\")})),e(),De=!1,i())},hideClone:function(t){var e=this,s=(t.sortable,t.cloneNowHidden),i=t.cancel;this.isMultiDrag&&(Le.forEach((function(t){I(t,\"display\",\"none\"),e.options.removeCloneOnHide&&t.parentNode&&t.parentNode.removeChild(t)})),s(),De=!0,i())},dragStartGlobal:function(t){t.sortable;!this.isMultiDrag&&Ne&&Ne.multiDrag._deselectMultiDrag(),Me.forEach((function(t){t.sortableIndex=F(t)})),Me=Me.sort((function(t,e){return t.sortableIndex-e.sortableIndex})),je=!0},dragStarted:function(t){var e=this,s=t.sortable;if(this.isMultiDrag){if(this.options.sort&&(s.captureAnimationState(),this.options.animation)){Me.forEach((function(t){t!==Ie&&I(t,\"position\",\"absolute\")}));var i=L(Ie,!1,!0,!0);Me.forEach((function(t){t!==Ie&&X(t,i)})),Re=!0,_e=!0}s.animateAll((function(){Re=!1,_e=!1,e.options.animation&&Me.forEach((function(t){G(t)})),e.options.sort&&qe()}))}},dragOver:function(t){var e=t.target,s=t.completed,i=t.cancel;Re&&~Me.indexOf(e)&&(s(!1),i())},revert:function(t){var e=t.fromSortable,s=t.rootEl,i=t.sortable,r=t.dragRect;Me.length>1&&(Me.forEach((function(t){i.addAnimationState({target:t,rect:Re?L(t):r}),G(t),t.fromRect=r,e.removeAnimationState(t)})),Re=!1,Be(!this.options.removeCloneOnHide,s))},dragOverCompleted:function(t){var e=t.sortable,s=t.isOwner,i=t.insertion,r=t.activeSortable,n=t.parentEl,a=t.putSortable,o=this.options;if(i){if(s&&r._hideClone(),_e=!1,o.animation&&Me.length>1&&(Re||!s&&!r.options.sort&&!a)){var c=L(Ie,!1,!0,!0);Me.forEach((function(t){t!==Ie&&(X(t,c),n.appendChild(t))})),Re=!0}if(!s)if(Re||qe(),Me.length>1){var h=De;r._showClone(e),r.options.animation&&!De&&h&&Le.forEach((function(t){r.addAnimationState({target:t,rect:Oe}),t.fromRect=Oe,t.thisAnimationDuration=null}))}else r._showClone(e)}},dragOverAnimationCapture:function(t){var e=t.dragRect,s=t.isOwner,i=t.activeSortable;if(Me.forEach((function(t){t.thisAnimationDuration=null})),i.options.animation&&!s&&i.multiDrag.isMultiDrag){Oe=n({},e);var r=O(Ie,!0);Oe.top-=r.f,Oe.left-=r.e}},dragOverAnimationComplete:function(){Re&&(Re=!1,qe())},drop:function(t){var e=t.originalEvent,s=t.rootEl,i=t.parentEl,r=t.sortable,n=t.dispatchSortableEvent,a=t.oldIndex,o=t.putSortable,c=o||this.sortable;if(e){var h=this.options,l=i.children;if(!je)if(h.multiDragKey&&!this.multiDragKeyDown&&this._deselectMultiDrag(),N(Ie,h.selectedClass,!~Me.indexOf(Ie)),~Me.indexOf(Ie))Me.splice(Me.indexOf(Ie),1),ke=null,it({sortable:r,rootEl:s,name:\"deselect\",targetEl:Ie,originalEvt:e});else{if(Me.push(Ie),it({sortable:r,rootEl:s,name:\"select\",targetEl:Ie,originalEvt:e}),e.shiftKey&&ke&&r.el.contains(ke)){var p,u,d=F(ke),f=F(Ie);if(~d&&~f&&d!==f)for(f>d?(u=d,p=f):(u=f,p=d+1);u<p;u++)~Me.indexOf(l[u])||(N(l[u],h.selectedClass,!0),Me.push(l[u]),it({sortable:r,rootEl:s,name:\"select\",targetEl:l[u],originalEvt:e}))}else ke=Ie;Ne=c}if(je&&this.isMultiDrag){if((i[Y].options.sort||i!==s)&&Me.length>1){var m=L(Ie),y=F(Ie,\":not(.\"+this.options.selectedClass+\")\");if(!_e&&h.animation&&(Ie.thisAnimationDuration=null),c.captureAnimationState(),!_e&&(h.animation&&(Ie.fromRect=m,Me.forEach((function(t){if(t.thisAnimationDuration=null,t!==Ie){var e=Re?L(t):m;t.fromRect=e,c.addAnimationState({target:t,rect:e})}}))),qe(),Me.forEach((function(t){l[y]?i.insertBefore(t,l[y]):i.appendChild(t),y++})),a===F(Ie))){var g=!1;Me.forEach((function(t){t.sortableIndex===F(t)||(g=!0)})),g&&n(\"update\")}Me.forEach((function(t){G(t)})),c.animateAll()}Ne=c}(s===i||o&&\"clone\"!==o.lastPutMode)&&Le.forEach((function(t){t.parentNode&&t.parentNode.removeChild(t)}))}},nullingGlobal:function(){this.isMultiDrag=je=!1,Le.length=0},destroyGlobal:function(){this._deselectMultiDrag(),T(document,\"pointerup\",this._deselectMultiDrag),T(document,\"mouseup\",this._deselectMultiDrag),T(document,\"touchend\",this._deselectMultiDrag),T(document,\"keydown\",this._checkKeyDown),T(document,\"keyup\",this._checkKeyUp)},_deselectMultiDrag:function(t){if((\"undefined\"===typeof je||!je)&&Ne===this.sortable&&(!t||!S(t.target,this.options.draggable,this.sortable.el,!1))&&(!t||0===t.button))while(Me.length){var e=Me[0];N(e,this.options.selectedClass,!1),Me.shift(),it({sortable:this.sortable,rootEl:this.sortable.el,name:\"deselect\",targetEl:e,originalEvt:t})}},_checkKeyDown:function(t){t.key===this.options.multiDragKey&&(this.multiDragKeyDown=!0)},_checkKeyUp:function(t){t.key===this.options.multiDragKey&&(this.multiDragKeyDown=!1)}},n(t,{pluginName:\"multiDrag\",utils:{select:function(t){var e=t.parentNode[Y];e&&e.options.multiDrag&&!~Me.indexOf(t)&&(Ne&&Ne!==e&&(Ne.multiDrag._deselectMultiDrag(),Ne=e),N(t,e.options.selectedClass,!0),Me.push(t))},deselect:function(t){var e=t.parentNode[Y],s=Me.indexOf(t);e&&e.options.multiDrag&&~s&&(N(t,e.options.selectedClass,!1),Me.splice(s,1))}},eventProperties:function(){var t=this,e=[],s=[];return Me.forEach((function(i){var r;e.push({multiDragElement:i,index:i.sortableIndex}),r=Re&&i!==Ie?-1:Re?F(i,\":not(.\"+t.options.selectedClass+\")\"):F(i),s.push({multiDragElement:i,index:r})})),{items:h(Me),clones:[].concat(Le),oldIndicies:e,newIndicies:s}},optionListeners:{multiDragKey:function(t){return t=t.toLowerCase(),\"ctrl\"===t?t=\"Control\":t.length>1&&(t=t.charAt(0).toUpperCase()+t.substr(1)),t}}})}function Be(t,e){Me.forEach((function(s,i){var r=e.children[s.sortableIndex+(t?Number(i):0)];r?e.insertBefore(s,r):e.appendChild(s)}))}function Ue(t,e){Le.forEach((function(s,i){var r=e.children[s.sortableIndex+(t?Number(i):0)];r?e.insertBefore(s,r):e.appendChild(s)}))}function qe(){Me.forEach((function(t){t!==Ie&&t.parentNode&&t.parentNode.removeChild(t)}))}Qt.mount(new xe),Qt.mount(Ae,Ee),e[\"default\"]=Qt},ab13:function(t,e,s){var i=s(\"b622\"),r=i(\"match\");t.exports=function(t){var e=/./;try{\"/./\"[t](e)}catch(s){try{return e[r]=!1,\"/./\"[t](e)}catch(i){}}return!1}},ac1f:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"9263\");i({target:\"RegExp\",proto:!0,forced:/./.exec!==r},{exec:r})},ad6d:function(t,e,s){\"use strict\";var i=s(\"825a\");t.exports=function(){var t=i(this),e=\"\";return t.global&&(e+=\"g\"),t.ignoreCase&&(e+=\"i\"),t.multiline&&(e+=\"m\"),t.dotAll&&(e+=\"s\"),t.unicode&&(e+=\"u\"),t.sticky&&(e+=\"y\"),e}},ade3:function(t,e,s){\"use strict\";function i(t,e,s){return e in t?Object.defineProperty(t,e,{value:s,enumerable:!0,configurable:!0,writable:!0}):t[e]=s,t}s.d(e,\"a\",(function(){return i}))},ae40:function(t,e,s){var i=s(\"83ab\"),r=s(\"d039\"),n=s(\"5135\"),a=Object.defineProperty,o={},c=function(t){throw t};t.exports=function(t,e){if(n(o,t))return o[t];e||(e={});var s=[][t],h=!!n(e,\"ACCESSORS\")&&e.ACCESSORS,l=n(e,0)?e[0]:c,p=n(e,1)?e[1]:void 0;return o[t]=!!s&&!r((function(){if(h&&!i)return!0;var t={length:-1};h?a(t,1,{enumerable:!0,get:c}):t[1]=1,s.call(t,l,p)}))}},ae93:function(t,e,s){\"use strict\";var i,r,n,a=s(\"e163\"),o=s(\"9112\"),c=s(\"5135\"),h=s(\"b622\"),l=s(\"c430\"),p=h(\"iterator\"),u=!1,d=function(){return this};[].keys&&(n=[].keys(),\"next\"in n?(r=a(a(n)),r!==Object.prototype&&(i=r)):u=!0),void 0==i&&(i={}),l||c(i,p)||o(i,p,d),t.exports={IteratorPrototype:i,BUGGY_SAFARI_ITERATORS:u}},b041:function(t,e,s){\"use strict\";var i=s(\"00ee\"),r=s(\"f5df\");t.exports=i?{}.toString:function(){return\"[object \"+r(this)+\"]\"}},b0c0:function(t,e,s){var i=s(\"83ab\"),r=s(\"9bf2\").f,n=Function.prototype,a=n.toString,o=/^\\s*function ([^ (]*)/,c=\"name\";i&&!(c in n)&&r(n,c,{configurable:!0,get:function(){try{return a.call(this).match(o)[1]}catch(t){return\"\"}}})},b311:function(t,e,s){\n/*!\n * clipboard.js v2.0.6\n * https://clipboardjs.com/\n * \n * Licensed MIT © Zeno Rocha\n */\n(function(e,s){t.exports=s()})(0,(function(){return function(t){var e={};function s(i){if(e[i])return e[i].exports;var r=e[i]={i:i,l:!1,exports:{}};return t[i].call(r.exports,r,r.exports,s),r.l=!0,r.exports}return s.m=t,s.c=e,s.d=function(t,e,i){s.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:i})},s.r=function(t){\"undefined\"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(t,\"__esModule\",{value:!0})},s.t=function(t,e){if(1&e&&(t=s(t)),8&e)return t;if(4&e&&\"object\"===typeof t&&t&&t.__esModule)return t;var i=Object.create(null);if(s.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:t}),2&e&&\"string\"!=typeof t)for(var r in t)s.d(i,r,function(e){return t[e]}.bind(null,r));return i},s.n=function(t){var e=t&&t.__esModule?function(){return t[\"default\"]}:function(){return t};return s.d(e,\"a\",e),e},s.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},s.p=\"\",s(s.s=6)}([function(t,e){function s(t){var e;if(\"SELECT\"===t.nodeName)t.focus(),e=t.value;else if(\"INPUT\"===t.nodeName||\"TEXTAREA\"===t.nodeName){var s=t.hasAttribute(\"readonly\");s||t.setAttribute(\"readonly\",\"\"),t.select(),t.setSelectionRange(0,t.value.length),s||t.removeAttribute(\"readonly\"),e=t.value}else{t.hasAttribute(\"contenteditable\")&&t.focus();var i=window.getSelection(),r=document.createRange();r.selectNodeContents(t),i.removeAllRanges(),i.addRange(r),e=i.toString()}return e}t.exports=s},function(t,e){function s(){}s.prototype={on:function(t,e,s){var i=this.e||(this.e={});return(i[t]||(i[t]=[])).push({fn:e,ctx:s}),this},once:function(t,e,s){var i=this;function r(){i.off(t,r),e.apply(s,arguments)}return r._=e,this.on(t,r,s)},emit:function(t){var e=[].slice.call(arguments,1),s=((this.e||(this.e={}))[t]||[]).slice(),i=0,r=s.length;for(i;i<r;i++)s[i].fn.apply(s[i].ctx,e);return this},off:function(t,e){var s=this.e||(this.e={}),i=s[t],r=[];if(i&&e)for(var n=0,a=i.length;n<a;n++)i[n].fn!==e&&i[n].fn._!==e&&r.push(i[n]);return r.length?s[t]=r:delete s[t],this}},t.exports=s,t.exports.TinyEmitter=s},function(t,e,s){var i=s(3),r=s(4);function n(t,e,s){if(!t&&!e&&!s)throw new Error(\"Missing required arguments\");if(!i.string(e))throw new TypeError(\"Second argument must be a String\");if(!i.fn(s))throw new TypeError(\"Third argument must be a Function\");if(i.node(t))return a(t,e,s);if(i.nodeList(t))return o(t,e,s);if(i.string(t))return c(t,e,s);throw new TypeError(\"First argument must be a String, HTMLElement, HTMLCollection, or NodeList\")}function a(t,e,s){return t.addEventListener(e,s),{destroy:function(){t.removeEventListener(e,s)}}}function o(t,e,s){return Array.prototype.forEach.call(t,(function(t){t.addEventListener(e,s)})),{destroy:function(){Array.prototype.forEach.call(t,(function(t){t.removeEventListener(e,s)}))}}}function c(t,e,s){return r(document.body,t,e,s)}t.exports=n},function(t,e){e.node=function(t){return void 0!==t&&t instanceof HTMLElement&&1===t.nodeType},e.nodeList=function(t){var s=Object.prototype.toString.call(t);return void 0!==t&&(\"[object NodeList]\"===s||\"[object HTMLCollection]\"===s)&&\"length\"in t&&(0===t.length||e.node(t[0]))},e.string=function(t){return\"string\"===typeof t||t instanceof String},e.fn=function(t){var e=Object.prototype.toString.call(t);return\"[object Function]\"===e}},function(t,e,s){var i=s(5);function r(t,e,s,i,r){var n=a.apply(this,arguments);return t.addEventListener(s,n,r),{destroy:function(){t.removeEventListener(s,n,r)}}}function n(t,e,s,i,n){return\"function\"===typeof t.addEventListener?r.apply(null,arguments):\"function\"===typeof s?r.bind(null,document).apply(null,arguments):(\"string\"===typeof t&&(t=document.querySelectorAll(t)),Array.prototype.map.call(t,(function(t){return r(t,e,s,i,n)})))}function a(t,e,s,r){return function(s){s.delegateTarget=i(s.target,e),s.delegateTarget&&r.call(t,s)}}t.exports=n},function(t,e){var s=9;if(\"undefined\"!==typeof Element&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function r(t,e){while(t&&t.nodeType!==s){if(\"function\"===typeof t.matches&&t.matches(e))return t;t=t.parentNode}}t.exports=r},function(t,e,s){\"use strict\";s.r(e);var i=s(0),r=s.n(i),n=\"function\"===typeof Symbol&&\"symbol\"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},a=function(){function t(t,e){for(var s=0;s<e.length;s++){var i=e[s];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,s,i){return s&&t(e.prototype,s),i&&t(e,i),e}}();function o(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}var c=function(){function t(e){o(this,t),this.resolveOptions(e),this.initSelection()}return a(t,[{key:\"resolveOptions\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action=t.action,this.container=t.container,this.emitter=t.emitter,this.target=t.target,this.text=t.text,this.trigger=t.trigger,this.selectedText=\"\"}},{key:\"initSelection\",value:function(){this.text?this.selectFake():this.target&&this.selectTarget()}},{key:\"selectFake\",value:function(){var t=this,e=\"rtl\"==document.documentElement.getAttribute(\"dir\");this.removeFake(),this.fakeHandlerCallback=function(){return t.removeFake()},this.fakeHandler=this.container.addEventListener(\"click\",this.fakeHandlerCallback)||!0,this.fakeElem=document.createElement(\"textarea\"),this.fakeElem.style.fontSize=\"12pt\",this.fakeElem.style.border=\"0\",this.fakeElem.style.padding=\"0\",this.fakeElem.style.margin=\"0\",this.fakeElem.style.position=\"absolute\",this.fakeElem.style[e?\"right\":\"left\"]=\"-9999px\";var s=window.pageYOffset||document.documentElement.scrollTop;this.fakeElem.style.top=s+\"px\",this.fakeElem.setAttribute(\"readonly\",\"\"),this.fakeElem.value=this.text,this.container.appendChild(this.fakeElem),this.selectedText=r()(this.fakeElem),this.copyText()}},{key:\"removeFake\",value:function(){this.fakeHandler&&(this.container.removeEventListener(\"click\",this.fakeHandlerCallback),this.fakeHandler=null,this.fakeHandlerCallback=null),this.fakeElem&&(this.container.removeChild(this.fakeElem),this.fakeElem=null)}},{key:\"selectTarget\",value:function(){this.selectedText=r()(this.target),this.copyText()}},{key:\"copyText\",value:function(){var t=void 0;try{t=document.execCommand(this.action)}catch(e){t=!1}this.handleResult(t)}},{key:\"handleResult\",value:function(t){this.emitter.emit(t?\"success\":\"error\",{action:this.action,text:this.selectedText,trigger:this.trigger,clearSelection:this.clearSelection.bind(this)})}},{key:\"clearSelection\",value:function(){this.trigger&&this.trigger.focus(),document.activeElement.blur(),window.getSelection().removeAllRanges()}},{key:\"destroy\",value:function(){this.removeFake()}},{key:\"action\",set:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:\"copy\";if(this._action=t,\"copy\"!==this._action&&\"cut\"!==this._action)throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"')},get:function(){return this._action}},{key:\"target\",set:function(t){if(void 0!==t){if(!t||\"object\"!==(\"undefined\"===typeof t?\"undefined\":n(t))||1!==t.nodeType)throw new Error('Invalid \"target\" value, use a valid Element');if(\"copy\"===this.action&&t.hasAttribute(\"disabled\"))throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');if(\"cut\"===this.action&&(t.hasAttribute(\"readonly\")||t.hasAttribute(\"disabled\")))throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');this._target=t}},get:function(){return this._target}}]),t}(),h=c,l=s(1),p=s.n(l),u=s(2),d=s.n(u),f=\"function\"===typeof Symbol&&\"symbol\"===typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&\"function\"===typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?\"symbol\":typeof t},m=function(){function t(t,e){for(var s=0;s<e.length;s++){var i=e[s];i.enumerable=i.enumerable||!1,i.configurable=!0,\"value\"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}return function(e,s,i){return s&&t(e.prototype,s),i&&t(e,i),e}}();function y(t,e){if(!(t instanceof e))throw new TypeError(\"Cannot call a class as a function\")}function g(t,e){if(!t)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return!e||\"object\"!==typeof e&&\"function\"!==typeof e?t:e}function x(t,e){if(\"function\"!==typeof e&&null!==e)throw new TypeError(\"Super expression must either be null or a function, not \"+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}var b=function(t){function e(t,s){y(this,e);var i=g(this,(e.__proto__||Object.getPrototypeOf(e)).call(this));return i.resolveOptions(s),i.listenClick(t),i}return x(e,t),m(e,[{key:\"resolveOptions\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this.action=\"function\"===typeof t.action?t.action:this.defaultAction,this.target=\"function\"===typeof t.target?t.target:this.defaultTarget,this.text=\"function\"===typeof t.text?t.text:this.defaultText,this.container=\"object\"===f(t.container)?t.container:document.body}},{key:\"listenClick\",value:function(t){var e=this;this.listener=d()(t,\"click\",(function(t){return e.onClick(t)}))}},{key:\"onClick\",value:function(t){var e=t.delegateTarget||t.currentTarget;this.clipboardAction&&(this.clipboardAction=null),this.clipboardAction=new h({action:this.action(e),target:this.target(e),text:this.text(e),container:this.container,trigger:e,emitter:this})}},{key:\"defaultAction\",value:function(t){return v(\"action\",t)}},{key:\"defaultTarget\",value:function(t){var e=v(\"target\",t);if(e)return document.querySelector(e)}},{key:\"defaultText\",value:function(t){return v(\"text\",t)}},{key:\"destroy\",value:function(){this.listener.destroy(),this.clipboardAction&&(this.clipboardAction.destroy(),this.clipboardAction=null)}}],[{key:\"isSupported\",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[\"copy\",\"cut\"],e=\"string\"===typeof t?[t]:t,s=!!document.queryCommandSupported;return e.forEach((function(t){s=s&&!!document.queryCommandSupported(t)})),s}}]),e}(p.a);function v(t,e){var s=\"data-clipboard-\"+t;if(e.hasAttribute(s))return e.getAttribute(s)}e[\"default\"]=b}])[\"default\"]}))},b575:function(t,e,s){var i,r,n,a,o,c,h,l,p=s(\"da84\"),u=s(\"06cf\").f,d=s(\"c6b6\"),f=s(\"2cf4\").set,m=s(\"1cdc\"),y=p.MutationObserver||p.WebKitMutationObserver,g=p.process,x=p.Promise,b=\"process\"==d(g),v=u(p,\"queueMicrotask\"),w=v&&v.value;w||(i=function(){var t,e;b&&(t=g.domain)&&t.exit();while(r){e=r.fn,r=r.next;try{e()}catch(s){throw r?a():n=void 0,s}}n=void 0,t&&t.enter()},b?a=function(){g.nextTick(i)}:y&&!m?(o=!0,c=document.createTextNode(\"\"),new y(i).observe(c,{characterData:!0}),a=function(){c.data=o=!o}):x&&x.resolve?(h=x.resolve(void 0),l=h.then,a=function(){l.call(h,i)}):a=function(){f.call(p,i)}),t.exports=w||function(t){var e={fn:t,next:void 0};n&&(n.next=e),r||(r=e,a()),n=e}},b622:function(t,e,s){var i=s(\"da84\"),r=s(\"5692\"),n=s(\"5135\"),a=s(\"90e3\"),o=s(\"4930\"),c=s(\"fdbf\"),h=r(\"wks\"),l=i.Symbol,p=c?l:l&&l.withoutSetter||a;t.exports=function(t){return n(h,t)||(o&&n(l,t)?h[t]=l[t]:h[t]=p(\"Symbol.\"+t)),h[t]}},b64b:function(t,e,s){var i=s(\"23e7\"),r=s(\"7b0b\"),n=s(\"df75\"),a=s(\"d039\"),o=a((function(){n(1)}));i({target:\"Object\",stat:!0,forced:o},{keys:function(t){return n(r(t))}})},b727:function(t,e,s){var i=s(\"0366\"),r=s(\"44ad\"),n=s(\"7b0b\"),a=s(\"50c4\"),o=s(\"65f0\"),c=[].push,h=function(t){var e=1==t,s=2==t,h=3==t,l=4==t,p=6==t,u=5==t||p;return function(d,f,m,y){for(var g,x,b=n(d),v=r(b),w=i(f,m,3),P=a(v.length),T=0,E=y||o,A=e?E(d,P):s?E(d,0):void 0;P>T;T++)if((u||T in v)&&(g=v[T],x=w(g,T,b),t))if(e)A[T]=x;else if(x)switch(t){case 3:return!0;case 5:return g;case 6:return T;case 2:c.call(A,g)}else if(l)return!1;return p?-1:h||l?l:A}};t.exports={forEach:h(0),map:h(1),filter:h(2),some:h(3),every:h(4),find:h(5),findIndex:h(6)}},c04e:function(t,e,s){var i=s(\"861d\");t.exports=function(t,e){if(!i(t))return t;var s,r;if(e&&\"function\"==typeof(s=t.toString)&&!i(r=s.call(t)))return r;if(\"function\"==typeof(s=t.valueOf)&&!i(r=s.call(t)))return r;if(!e&&\"function\"==typeof(s=t.toString)&&!i(r=s.call(t)))return r;throw TypeError(\"Can't convert object to primitive value\")}},c430:function(t,e){t.exports=!1},c6b6:function(t,e){var s={}.toString;t.exports=function(t){return s.call(t).slice(8,-1)}},c6cd:function(t,e,s){var i=s(\"da84\"),r=s(\"ce4e\"),n=\"__core-js_shared__\",a=i[n]||r(n,{});t.exports=a},c740:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"b727\").findIndex,n=s(\"44d2\"),a=s(\"ae40\"),o=\"findIndex\",c=!0,h=a(o);o in[]&&Array(1)[o]((function(){c=!1})),i({target:\"Array\",proto:!0,forced:c||!h},{findIndex:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),n(o)},c8ba:function(t,e){var s;s=function(){return this}();try{s=s||new Function(\"return this\")()}catch(i){\"object\"===typeof window&&(s=window)}t.exports=s},c975:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"4d64\").indexOf,n=s(\"a640\"),a=s(\"ae40\"),o=[].indexOf,c=!!o&&1/[1].indexOf(1,-0)<0,h=n(\"indexOf\"),l=a(\"indexOf\",{ACCESSORS:!0,1:0});i({target:\"Array\",proto:!0,forced:c||!h||!l},{indexOf:function(t){return c?o.apply(this,arguments)||0:r(this,t,arguments.length>1?arguments[1]:void 0)}})},ca84:function(t,e,s){var i=s(\"5135\"),r=s(\"fc6a\"),n=s(\"4d64\").indexOf,a=s(\"d012\");t.exports=function(t,e){var s,o=r(t),c=0,h=[];for(s in o)!i(a,s)&&i(o,s)&&h.push(s);while(e.length>c)i(o,s=e[c++])&&(~n(h,s)||h.push(s));return h}},caad:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"4d64\").includes,n=s(\"44d2\"),a=s(\"ae40\"),o=a(\"indexOf\",{ACCESSORS:!0,1:0});i({target:\"Array\",proto:!0,forced:!o},{includes:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}}),n(\"includes\")},cc06:function(t,e,s){\"use strict\";function i(t,e,s,i){var r,n=!1,a=0;function o(){r&&clearTimeout(r)}function c(){o(),n=!0}function h(){for(var c=arguments.length,h=new Array(c),l=0;l<c;l++)h[l]=arguments[l];var p=this,u=Date.now()-a;function d(){a=Date.now(),s.apply(p,h)}function f(){r=void 0}n||(i&&!r&&d(),o(),void 0===i&&u>t?d():!0!==e&&(r=setTimeout(i?f:d,void 0===i?t-u:t)))}return\"boolean\"!==typeof e&&(i=s,s=e,e=void 0),h.cancel=c,h}function r(t,e,s){return void 0===s?i(t,e,!1):i(t,s,!1!==e)}s.d(e,\"a\",(function(){return r}))},cc12:function(t,e,s){var i=s(\"da84\"),r=s(\"861d\"),n=i.document,a=r(n)&&r(n.createElement);t.exports=function(t){return a?n.createElement(t):{}}},cca6:function(t,e,s){var i=s(\"23e7\"),r=s(\"60da\");i({target:\"Object\",stat:!0,forced:Object.assign!==r},{assign:r})},cdf9:function(t,e,s){var i=s(\"825a\"),r=s(\"861d\"),n=s(\"f069\");t.exports=function(t,e){if(i(t),r(e)&&e.constructor===t)return e;var s=n.f(t),a=s.resolve;return a(e),s.promise}},ce4e:function(t,e,s){var i=s(\"da84\"),r=s(\"9112\");t.exports=function(t,e){try{r(i,t,e)}catch(s){i[t]=e}return e}},d012:function(t,e){t.exports={}},d039:function(t,e){t.exports=function(t){try{return!!t()}catch(e){return!0}}},d066:function(t,e,s){var i=s(\"428f\"),r=s(\"da84\"),n=function(t){return\"function\"==typeof t?t:void 0};t.exports=function(t,e){return arguments.length<2?n(i[t])||n(r[t]):i[t]&&i[t][e]||r[t]&&r[t][e]}},d1e7:function(t,e,s){\"use strict\";var i={}.propertyIsEnumerable,r=Object.getOwnPropertyDescriptor,n=r&&!i.call({1:2},1);e.f=n?function(t){var e=r(this,t);return!!e&&e.enumerable}:i},d28b:function(t,e,s){var i=s(\"746f\");i(\"iterator\")},d2bb:function(t,e,s){var i=s(\"825a\"),r=s(\"3bbe\");t.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var t,e=!1,s={};try{t=Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set,t.call(s,[]),e=s instanceof Array}catch(n){}return function(s,n){return i(s),r(n),e?t.call(s,n):s.__proto__=n,s}}():void 0)},d3b7:function(t,e,s){var i=s(\"00ee\"),r=s(\"6eeb\"),n=s(\"b041\");i||r(Object.prototype,\"toString\",n,{unsafe:!0})},d44e:function(t,e,s){var i=s(\"9bf2\").f,r=s(\"5135\"),n=s(\"b622\"),a=n(\"toStringTag\");t.exports=function(t,e,s){t&&!r(t=s?t:t.prototype,a)&&i(t,a,{configurable:!0,value:e})}},d60a:function(t,e){t.exports=function(t){return t&&\"object\"===typeof t&&\"function\"===typeof t.copy&&\"function\"===typeof t.fill&&\"function\"===typeof t.readUInt8}},d784:function(t,e,s){\"use strict\";s(\"ac1f\");var i=s(\"6eeb\"),r=s(\"d039\"),n=s(\"b622\"),a=s(\"9263\"),o=s(\"9112\"),c=n(\"species\"),h=!r((function(){var t=/./;return t.exec=function(){var t=[];return t.groups={a:\"7\"},t},\"7\"!==\"\".replace(t,\"$<a>\")})),l=function(){return\"$0\"===\"a\".replace(/./,\"$0\")}(),p=n(\"replace\"),u=function(){return!!/./[p]&&\"\"===/./[p](\"a\",\"$0\")}(),d=!r((function(){var t=/(?:)/,e=t.exec;t.exec=function(){return e.apply(this,arguments)};var s=\"ab\".split(t);return 2!==s.length||\"a\"!==s[0]||\"b\"!==s[1]}));t.exports=function(t,e,s,p){var f=n(t),m=!r((function(){var e={};return e[f]=function(){return 7},7!=\"\"[t](e)})),y=m&&!r((function(){var e=!1,s=/a/;return\"split\"===t&&(s={},s.constructor={},s.constructor[c]=function(){return s},s.flags=\"\",s[f]=/./[f]),s.exec=function(){return e=!0,null},s[f](\"\"),!e}));if(!m||!y||\"replace\"===t&&(!h||!l||u)||\"split\"===t&&!d){var g=/./[f],x=s(f,\"\"[t],(function(t,e,s,i,r){return e.exec===a?m&&!r?{done:!0,value:g.call(e,s,i)}:{done:!0,value:t.call(s,e,i)}:{done:!1}}),{REPLACE_KEEPS_$0:l,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:u}),b=x[0],v=x[1];i(String.prototype,t,b),i(RegExp.prototype,f,2==e?function(t,e){return v.call(t,this,e)}:function(t){return v.call(t,this)})}p&&o(RegExp.prototype[f],\"sham\",!0)}},d81d:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"b727\").map,n=s(\"1dde\"),a=s(\"ae40\"),o=n(\"map\"),c=a(\"map\");i({target:\"Array\",proto:!0,forced:!o||!c},{map:function(t){return r(this,t,arguments.length>1?arguments[1]:void 0)}})},da84:function(t,e,s){(function(e){var s=function(t){return t&&t.Math==Math&&t};t.exports=s(\"object\"==typeof globalThis&&globalThis)||s(\"object\"==typeof window&&window)||s(\"object\"==typeof self&&self)||s(\"object\"==typeof e&&e)||Function(\"return this\")()}).call(this,s(\"c8ba\"))},dbb4:function(t,e,s){var i=s(\"23e7\"),r=s(\"83ab\"),n=s(\"56ef\"),a=s(\"fc6a\"),o=s(\"06cf\"),c=s(\"8418\");i({target:\"Object\",stat:!0,sham:!r},{getOwnPropertyDescriptors:function(t){var e,s,i=a(t),r=o.f,h=n(i),l={},p=0;while(h.length>p)s=r(i,e=h[p++]),void 0!==s&&c(l,e,s);return l}})},ddb0:function(t,e,s){var i=s(\"da84\"),r=s(\"fdbc\"),n=s(\"e260\"),a=s(\"9112\"),o=s(\"b622\"),c=o(\"iterator\"),h=o(\"toStringTag\"),l=n.values;for(var p in r){var u=i[p],d=u&&u.prototype;if(d){if(d[c]!==l)try{a(d,c,l)}catch(m){d[c]=l}if(d[h]||a(d,h,p),r[p])for(var f in n)if(d[f]!==n[f])try{a(d,f,n[f])}catch(m){d[f]=n[f]}}}},df75:function(t,e,s){var i=s(\"ca84\"),r=s(\"7839\");t.exports=Object.keys||function(t){return i(t,r)}},df7c:function(t,e,s){(function(t){function s(t,e){for(var s=0,i=t.length-1;i>=0;i--){var r=t[i];\".\"===r?t.splice(i,1):\"..\"===r?(t.splice(i,1),s++):s&&(t.splice(i,1),s--)}if(e)for(;s--;s)t.unshift(\"..\");return t}function i(t){\"string\"!==typeof t&&(t+=\"\");var e,s=0,i=-1,r=!0;for(e=t.length-1;e>=0;--e)if(47===t.charCodeAt(e)){if(!r){s=e+1;break}}else-1===i&&(r=!1,i=e+1);return-1===i?\"\":t.slice(s,i)}function r(t,e){if(t.filter)return t.filter(e);for(var s=[],i=0;i<t.length;i++)e(t[i],i,t)&&s.push(t[i]);return s}e.resolve=function(){for(var e=\"\",i=!1,n=arguments.length-1;n>=-1&&!i;n--){var a=n>=0?arguments[n]:t.cwd();if(\"string\"!==typeof a)throw new TypeError(\"Arguments to path.resolve must be strings\");a&&(e=a+\"/\"+e,i=\"/\"===a.charAt(0))}return e=s(r(e.split(\"/\"),(function(t){return!!t})),!i).join(\"/\"),(i?\"/\":\"\")+e||\".\"},e.normalize=function(t){var i=e.isAbsolute(t),a=\"/\"===n(t,-1);return t=s(r(t.split(\"/\"),(function(t){return!!t})),!i).join(\"/\"),t||i||(t=\".\"),t&&a&&(t+=\"/\"),(i?\"/\":\"\")+t},e.isAbsolute=function(t){return\"/\"===t.charAt(0)},e.join=function(){var t=Array.prototype.slice.call(arguments,0);return e.normalize(r(t,(function(t,e){if(\"string\"!==typeof t)throw new TypeError(\"Arguments to path.join must be strings\");return t})).join(\"/\"))},e.relative=function(t,s){function i(t){for(var e=0;e<t.length;e++)if(\"\"!==t[e])break;for(var s=t.length-1;s>=0;s--)if(\"\"!==t[s])break;return e>s?[]:t.slice(e,s-e+1)}t=e.resolve(t).substr(1),s=e.resolve(s).substr(1);for(var r=i(t.split(\"/\")),n=i(s.split(\"/\")),a=Math.min(r.length,n.length),o=a,c=0;c<a;c++)if(r[c]!==n[c]){o=c;break}var h=[];for(c=o;c<r.length;c++)h.push(\"..\");return h=h.concat(n.slice(o)),h.join(\"/\")},e.sep=\"/\",e.delimiter=\":\",e.dirname=function(t){if(\"string\"!==typeof t&&(t+=\"\"),0===t.length)return\".\";for(var e=t.charCodeAt(0),s=47===e,i=-1,r=!0,n=t.length-1;n>=1;--n)if(e=t.charCodeAt(n),47===e){if(!r){i=n;break}}else r=!1;return-1===i?s?\"/\":\".\":s&&1===i?\"/\":t.slice(0,i)},e.basename=function(t,e){var s=i(t);return e&&s.substr(-1*e.length)===e&&(s=s.substr(0,s.length-e.length)),s},e.extname=function(t){\"string\"!==typeof t&&(t+=\"\");for(var e=-1,s=0,i=-1,r=!0,n=0,a=t.length-1;a>=0;--a){var o=t.charCodeAt(a);if(47!==o)-1===i&&(r=!1,i=a+1),46===o?-1===e?e=a:1!==n&&(n=1):-1!==e&&(n=-1);else if(!r){s=a+1;break}}return-1===e||-1===i||0===n||1===n&&e===i-1&&e===s+1?\"\":t.slice(e,i)};var n=\"b\"===\"ab\".substr(-1)?function(t,e,s){return t.substr(e,s)}:function(t,e,s){return e<0&&(e=t.length+e),t.substr(e,s)}}).call(this,s(\"4362\"))},e017:function(t,e,s){(function(e){(function(e,s){t.exports=s()})(0,(function(){\"use strict\";var t=function(t){var e=t.id,s=t.viewBox,i=t.content;this.id=e,this.viewBox=s,this.content=i};t.prototype.stringify=function(){return this.content},t.prototype.toString=function(){return this.stringify()},t.prototype.destroy=function(){var t=this;[\"id\",\"viewBox\",\"content\"].forEach((function(e){return delete t[e]}))};var s=function(t){var e=!!document.importNode,s=(new DOMParser).parseFromString(t,\"image/svg+xml\").documentElement;return e?document.importNode(s,!0):s};\"undefined\"!==typeof window?window:\"undefined\"!==typeof e||\"undefined\"!==typeof self&&self;function i(t,e){return e={exports:{}},t(e,e.exports),e.exports}var r=i((function(t,e){(function(e,s){t.exports=s()})(0,(function(){function t(t){var e=t&&\"object\"===typeof t;return e&&\"[object RegExp]\"!==Object.prototype.toString.call(t)&&\"[object Date]\"!==Object.prototype.toString.call(t)}function e(t){return Array.isArray(t)?[]:{}}function s(s,i){var r=i&&!0===i.clone;return r&&t(s)?n(e(s),s,i):s}function i(e,i,r){var a=e.slice();return i.forEach((function(i,o){\"undefined\"===typeof a[o]?a[o]=s(i,r):t(i)?a[o]=n(e[o],i,r):-1===e.indexOf(i)&&a.push(s(i,r))})),a}function r(e,i,r){var a={};return t(e)&&Object.keys(e).forEach((function(t){a[t]=s(e[t],r)})),Object.keys(i).forEach((function(o){t(i[o])&&e[o]?a[o]=n(e[o],i[o],r):a[o]=s(i[o],r)})),a}function n(t,e,n){var a=Array.isArray(e),o=n||{arrayMerge:i},c=o.arrayMerge||i;return a?Array.isArray(t)?c(t,e,n):s(e,n):r(t,e,n)}return n.all=function(t,e){if(!Array.isArray(t)||t.length<2)throw new Error(\"first argument should be an array with at least two elements\");return t.reduce((function(t,s){return n(t,s,e)}))},n}))})),n=i((function(t,e){var s={svg:{name:\"xmlns\",uri:\"http://www.w3.org/2000/svg\"},xlink:{name:\"xmlns:xlink\",uri:\"http://www.w3.org/1999/xlink\"}};e.default=s,t.exports=e.default})),a=function(t){return Object.keys(t).map((function(e){var s=t[e].toString().replace(/\"/g,\"&quot;\");return e+'=\"'+s+'\"'})).join(\" \")},o=n.svg,c=n.xlink,h={};h[o.name]=o.uri,h[c.name]=c.uri;var l=function(t,e){void 0===t&&(t=\"\");var s=r(h,e||{}),i=a(s);return\"<svg \"+i+\">\"+t+\"</svg>\"},p=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var i={isMounted:{}};return i.isMounted.get=function(){return!!this.node},e.createFromExistingNode=function(t){return new e({id:t.getAttribute(\"id\"),viewBox:t.getAttribute(\"viewBox\"),content:t.outerHTML})},e.prototype.destroy=function(){this.isMounted&&this.unmount(),t.prototype.destroy.call(this)},e.prototype.mount=function(t){if(this.isMounted)return this.node;var e=\"string\"===typeof t?document.querySelector(t):t,s=this.render();return this.node=s,e.appendChild(s),s},e.prototype.render=function(){var t=this.stringify();return s(l(t)).childNodes[0]},e.prototype.unmount=function(){this.node.parentNode.removeChild(this.node)},Object.defineProperties(e.prototype,i),e}(t);return p}))}).call(this,s(\"c8ba\"))},e01a:function(t,e,s){\"use strict\";var i=s(\"23e7\"),r=s(\"83ab\"),n=s(\"da84\"),a=s(\"5135\"),o=s(\"861d\"),c=s(\"9bf2\").f,h=s(\"e893\"),l=n.Symbol;if(r&&\"function\"==typeof l&&(!(\"description\"in l.prototype)||void 0!==l().description)){var p={},u=function(){var t=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),e=this instanceof u?new l(t):void 0===t?l():l(t);return\"\"===t&&(p[e]=!0),e};h(u,l);var d=u.prototype=l.prototype;d.constructor=u;var f=d.toString,m=\"Symbol(test)\"==String(l(\"test\")),y=/^Symbol\\((.*)\\)[^)]+$/;c(d,\"description\",{configurable:!0,get:function(){var t=o(this)?this.valueOf():this,e=f.call(t);if(a(p,t))return\"\";var s=m?e.slice(7,-1):e.replace(y,\"$1\");return\"\"===s?void 0:s}}),i({global:!0,forced:!0},{Symbol:u})}},e163:function(t,e,s){var i=s(\"5135\"),r=s(\"7b0b\"),n=s(\"f772\"),a=s(\"e177\"),o=n(\"IE_PROTO\"),c=Object.prototype;t.exports=a?Object.getPrototypeOf:function(t){return t=r(t),i(t,o)?t[o]:\"function\"==typeof t.constructor&&t instanceof t.constructor?t.constructor.prototype:t instanceof Object?c:null}},e177:function(t,e,s){var i=s(\"d039\");t.exports=!i((function(){function t(){}return t.prototype.constructor=null,Object.getPrototypeOf(new t)!==t.prototype}))},e260:function(t,e,s){\"use strict\";var i=s(\"fc6a\"),r=s(\"44d2\"),n=s(\"3f8c\"),a=s(\"69f3\"),o=s(\"7dd0\"),c=\"Array Iterator\",h=a.set,l=a.getterFor(c);t.exports=o(Array,\"Array\",(function(t,e){h(this,{type:c,target:i(t),index:0,kind:e})}),(function(){var t=l(this),e=t.target,s=t.kind,i=t.index++;return!e||i>=e.length?(t.target=void 0,{value:void 0,done:!0}):\"keys\"==s?{value:i,done:!1}:\"values\"==s?{value:e[i],done:!1}:{value:[i,e[i]],done:!1}}),\"values\"),n.Arguments=n.Array,r(\"keys\"),r(\"values\"),r(\"entries\")},e2cc:function(t,e,s){var i=s(\"6eeb\");t.exports=function(t,e,s){for(var r in e)i(t,r,e[r],s);return t}},e439:function(t,e,s){var i=s(\"23e7\"),r=s(\"d039\"),n=s(\"fc6a\"),a=s(\"06cf\").f,o=s(\"83ab\"),c=r((function(){a(1)})),h=!o||c;i({target:\"Object\",stat:!0,forced:h,sham:!o},{getOwnPropertyDescriptor:function(t,e){return a(n(t),e)}})},e538:function(t,e,s){var i=s(\"b622\");e.f=i},e667:function(t,e){t.exports=function(t){try{return{error:!1,value:t()}}catch(e){return{error:!0,value:e}}}},e6cf:function(t,e,s){\"use strict\";var i,r,n,a,o=s(\"23e7\"),c=s(\"c430\"),h=s(\"da84\"),l=s(\"d066\"),p=s(\"fea9\"),u=s(\"6eeb\"),d=s(\"e2cc\"),f=s(\"d44e\"),m=s(\"2626\"),y=s(\"861d\"),g=s(\"1c0b\"),x=s(\"19aa\"),b=s(\"c6b6\"),v=s(\"8925\"),w=s(\"2266\"),P=s(\"1c7e\"),T=s(\"4840\"),E=s(\"2cf4\").set,A=s(\"b575\"),S=s(\"cdf9\"),C=s(\"44de\"),k=s(\"f069\"),N=s(\"e667\"),I=s(\"69f3\"),O=s(\"94ca\"),D=s(\"b622\"),M=s(\"2d00\"),L=D(\"species\"),_=\"Promise\",R=I.get,j=I.set,F=I.getterFor(_),B=p,U=h.TypeError,q=h.document,V=h.process,H=l(\"fetch\"),z=k.f,W=z,K=\"process\"==b(V),$=!!(q&&q.createEvent&&h.dispatchEvent),X=\"unhandledrejection\",G=\"rejectionhandled\",Y=0,J=1,Q=2,Z=1,tt=2,et=O(_,(function(){var t=v(B)!==String(B);if(!t){if(66===M)return!0;if(!K&&\"function\"!=typeof PromiseRejectionEvent)return!0}if(c&&!B.prototype[\"finally\"])return!0;if(M>=51&&/native code/.test(B))return!1;var e=B.resolve(1),s=function(t){t((function(){}),(function(){}))},i=e.constructor={};return i[L]=s,!(e.then((function(){}))instanceof s)})),st=et||!P((function(t){B.all(t)[\"catch\"]((function(){}))})),it=function(t){var e;return!(!y(t)||\"function\"!=typeof(e=t.then))&&e},rt=function(t,e,s){if(!e.notified){e.notified=!0;var i=e.reactions;A((function(){var r=e.value,n=e.state==J,a=0;while(i.length>a){var o,c,h,l=i[a++],p=n?l.ok:l.fail,u=l.resolve,d=l.reject,f=l.domain;try{p?(n||(e.rejection===tt&&ct(t,e),e.rejection=Z),!0===p?o=r:(f&&f.enter(),o=p(r),f&&(f.exit(),h=!0)),o===l.promise?d(U(\"Promise-chain cycle\")):(c=it(o))?c.call(o,u,d):u(o)):d(r)}catch(m){f&&!h&&f.exit(),d(m)}}e.reactions=[],e.notified=!1,s&&!e.rejection&&at(t,e)}))}},nt=function(t,e,s){var i,r;$?(i=q.createEvent(\"Event\"),i.promise=e,i.reason=s,i.initEvent(t,!1,!0),h.dispatchEvent(i)):i={promise:e,reason:s},(r=h[\"on\"+t])?r(i):t===X&&C(\"Unhandled promise rejection\",s)},at=function(t,e){E.call(h,(function(){var s,i=e.value,r=ot(e);if(r&&(s=N((function(){K?V.emit(\"unhandledRejection\",i,t):nt(X,t,i)})),e.rejection=K||ot(e)?tt:Z,s.error))throw s.value}))},ot=function(t){return t.rejection!==Z&&!t.parent},ct=function(t,e){E.call(h,(function(){K?V.emit(\"rejectionHandled\",t):nt(G,t,e.value)}))},ht=function(t,e,s,i){return function(r){t(e,s,r,i)}},lt=function(t,e,s,i){e.done||(e.done=!0,i&&(e=i),e.value=s,e.state=Q,rt(t,e,!0))},pt=function(t,e,s,i){if(!e.done){e.done=!0,i&&(e=i);try{if(t===s)throw U(\"Promise can't be resolved itself\");var r=it(s);r?A((function(){var i={done:!1};try{r.call(s,ht(pt,t,i,e),ht(lt,t,i,e))}catch(n){lt(t,i,n,e)}})):(e.value=s,e.state=J,rt(t,e,!1))}catch(n){lt(t,{done:!1},n,e)}}};et&&(B=function(t){x(this,B,_),g(t),i.call(this);var e=R(this);try{t(ht(pt,this,e),ht(lt,this,e))}catch(s){lt(this,e,s)}},i=function(t){j(this,{type:_,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:Y,value:void 0})},i.prototype=d(B.prototype,{then:function(t,e){var s=F(this),i=z(T(this,B));return i.ok=\"function\"!=typeof t||t,i.fail=\"function\"==typeof e&&e,i.domain=K?V.domain:void 0,s.parent=!0,s.reactions.push(i),s.state!=Y&&rt(this,s,!1),i.promise},catch:function(t){return this.then(void 0,t)}}),r=function(){var t=new i,e=R(t);this.promise=t,this.resolve=ht(pt,t,e),this.reject=ht(lt,t,e)},k.f=z=function(t){return t===B||t===n?new r(t):W(t)},c||\"function\"!=typeof p||(a=p.prototype.then,u(p.prototype,\"then\",(function(t,e){var s=this;return new B((function(t,e){a.call(s,t,e)})).then(t,e)}),{unsafe:!0}),\"function\"==typeof H&&o({global:!0,enumerable:!0,forced:!0},{fetch:function(t){return S(B,H.apply(h,arguments))}}))),o({global:!0,wrap:!0,forced:et},{Promise:B}),f(B,_,!1,!0),m(_),n=l(_),o({target:_,stat:!0,forced:et},{reject:function(t){var e=z(this);return e.reject.call(void 0,t),e.promise}}),o({target:_,stat:!0,forced:c||et},{resolve:function(t){return S(c&&this===n?B:this,t)}}),o({target:_,stat:!0,forced:st},{all:function(t){var e=this,s=z(e),i=s.resolve,r=s.reject,n=N((function(){var s=g(e.resolve),n=[],a=0,o=1;w(t,(function(t){var c=a++,h=!1;n.push(void 0),o++,s.call(e,t).then((function(t){h||(h=!0,n[c]=t,--o||i(n))}),r)})),--o||i(n)}));return n.error&&r(n.value),s.promise},race:function(t){var e=this,s=z(e),i=s.reject,r=N((function(){var r=g(e.resolve);w(t,(function(t){r.call(e,t).then(s.resolve,i)}))}));return r.error&&i(r.value),s.promise}})},e893:function(t,e,s){var i=s(\"5135\"),r=s(\"56ef\"),n=s(\"06cf\"),a=s(\"9bf2\");t.exports=function(t,e){for(var s=r(e),o=a.f,c=n.f,h=0;h<s.length;h++){var l=s[h];i(t,l)||o(t,l,c(e,l))}}},e8b5:function(t,e,s){var i=s(\"c6b6\");t.exports=Array.isArray||function(t){return\"Array\"==i(t)}},e95a:function(t,e,s){var i=s(\"b622\"),r=s(\"3f8c\"),n=i(\"iterator\"),a=Array.prototype;t.exports=function(t){return void 0!==t&&(r.Array===t||a[n]===t)}},f069:function(t,e,s){\"use strict\";var i=s(\"1c0b\"),r=function(t){var e,s;this.promise=new t((function(t,i){if(void 0!==e||void 0!==s)throw TypeError(\"Bad Promise constructor\");e=t,s=i})),this.resolve=i(e),this.reject=i(s)};t.exports.f=function(t){return new r(t)}},f5df:function(t,e,s){var i=s(\"00ee\"),r=s(\"c6b6\"),n=s(\"b622\"),a=n(\"toStringTag\"),o=\"Arguments\"==r(function(){return arguments}()),c=function(t,e){try{return t[e]}catch(s){}};t.exports=i?r:function(t){var e,s,i;return void 0===t?\"Undefined\":null===t?\"Null\":\"string\"==typeof(s=c(e=Object(t),a))?s:o?r(e):\"Object\"==(i=r(e))&&\"function\"==typeof e.callee?\"Arguments\":i}},f772:function(t,e,s){var i=s(\"5692\"),r=s(\"90e3\"),n=i(\"keys\");t.exports=function(t){return n[t]||(n[t]=r(t))}},fc6a:function(t,e,s){var i=s(\"44ad\"),r=s(\"1d80\");t.exports=function(t){return i(r(t))}},fdbc:function(t,e){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},fdbf:function(t,e,s){var i=s(\"4930\");t.exports=i&&!Symbol.sham&&\"symbol\"==typeof Symbol.iterator},fea9:function(t,e,s){var i=s(\"da84\");t.exports=i.Promise}}]);"
  },
  {
    "path": "static/form-generator/js/index.8e6d9f8f.js",
    "content": "(function(e){function t(t){for(var o,n,c=t[0],r=t[1],s=t[2],u=0,d=[];u<c.length;u++)n=c[u],Object.prototype.hasOwnProperty.call(i,n)&&i[n]&&d.push(i[n][0]),i[n]=0;for(o in r)Object.prototype.hasOwnProperty.call(r,o)&&(e[o]=r[o]);_&&_(t);while(d.length)d.shift()();return l.push.apply(l,s||[]),a()}function a(){for(var e,t=0;t<l.length;t++){for(var a=l[t],o=!0,n=1;n<a.length;n++){var c=a[n];0!==i[c]&&(o=!1)}o&&(l.splice(t--,1),e=r(r.s=a[0]))}return e}var o={},n={index:0},i={index:0},l=[];function c(e){return r.p+\"js/\"+({\"parser-example\":\"parser-example\",\"tinymce-example\":\"tinymce-example\"}[e]||e)+\".\"+{\"parser-example\":\"ce55fa09\",\"tinymce-example\":\"641995ab\"}[e]+\".js\"}function r(t){if(o[t])return o[t].exports;var a=o[t]={i:t,l:!1,exports:{}};return e[t].call(a.exports,a,a.exports,r),a.l=!0,a.exports}r.e=function(e){var t=[],a={\"parser-example\":1};n[e]?t.push(n[e]):0!==n[e]&&a[e]&&t.push(n[e]=new Promise((function(t,a){for(var o=\"css/\"+({\"parser-example\":\"parser-example\",\"tinymce-example\":\"tinymce-example\"}[e]||e)+\".\"+{\"parser-example\":\"69e16e51\",\"tinymce-example\":\"31d6cfe0\"}[e]+\".css\",i=r.p+o,l=document.getElementsByTagName(\"link\"),c=0;c<l.length;c++){var s=l[c],u=s.getAttribute(\"data-href\")||s.getAttribute(\"href\");if(\"stylesheet\"===s.rel&&(u===o||u===i))return t()}var d=document.getElementsByTagName(\"style\");for(c=0;c<d.length;c++){s=d[c],u=s.getAttribute(\"data-href\");if(u===o||u===i)return t()}var _=document.createElement(\"link\");_.rel=\"stylesheet\",_.type=\"text/css\",_.onload=t,_.onerror=function(t){var o=t&&t.target&&t.target.src||i,l=new Error(\"Loading CSS chunk \"+e+\" failed.\\n(\"+o+\")\");l.code=\"CSS_CHUNK_LOAD_FAILED\",l.request=o,delete n[e],_.parentNode.removeChild(_),a(l)},_.href=i;var p=document.getElementsByTagName(\"head\")[0];p.appendChild(_)})).then((function(){n[e]=0})));var o=i[e];if(0!==o)if(o)t.push(o[2]);else{var l=new Promise((function(t,a){o=i[e]=[t,a]}));t.push(o[2]=l);var s,u=document.createElement(\"script\");u.charset=\"utf-8\",u.timeout=120,r.nc&&u.setAttribute(\"nonce\",r.nc),u.src=c(e);var d=new Error;s=function(t){u.onerror=u.onload=null,clearTimeout(_);var a=i[e];if(0!==a){if(a){var o=t&&(\"load\"===t.type?\"missing\":t.type),n=t&&t.target&&t.target.src;d.message=\"Loading chunk \"+e+\" failed.\\n(\"+o+\": \"+n+\")\",d.name=\"ChunkLoadError\",d.type=o,d.request=n,a[1](d)}i[e]=void 0}};var _=setTimeout((function(){s({type:\"timeout\",target:u})}),12e4);u.onerror=u.onload=s,document.head.appendChild(u)}return Promise.all(t)},r.m=e,r.c=o,r.d=function(e,t,a){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:a})},r.r=function(e){\"undefined\"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&\"object\"===typeof e&&e&&e.__esModule)return e;var a=Object.create(null);if(r.r(a),Object.defineProperty(a,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var o in e)r.d(a,o,function(t){return e[t]}.bind(null,o));return a},r.n=function(e){var t=e&&e.__esModule?function(){return e[\"default\"]}:function(){return e};return r.d(t,\"a\",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p=\"/form-generator/\",r.oe=function(e){throw console.error(e),e};var s=window[\"webpackJsonp\"]=window[\"webpackJsonp\"]||[],u=s.push.bind(s);s.push=t,s=s.slice();for(var d=0;d<s.length;d++)t(s[d]);var _=u;l.push([0,\"chunk-vendors\"]),a()})({0:function(e,t,a){e.exports=a(\"8a8a\")},\"03ab\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-color\",use:\"icon-color-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-color\"><defs><style type=\"text/css\"></style></defs><path d=\"M747.59340925 691.12859384c11.51396329 0.25305413 22.43746719-0.21087818 40.74171707-1.51832482 29.35428085-2.10878421 35.84933734-2.36183835 46.47761114-0.8856895 24.71495444 3.37405491 41.12129828 21.76265671 32.47528161 47.95376084-85.57447632 258.19957947-442.00123984 249.76444099-628.67084683 50.73735554-153.47733892-159.33976008-153.09775772-414.41833795 0.92786545-573.42069196 159.71934128-162.67163983 424.03439521-166.59397897 565.78689185 0.63263534 80.38686649 94.81095318 108.34934958 169.16669549 89.11723508 230.57450162-15.01454608 47.99593598-50.61082928 77.68762207-119.77896259 114.63352789-4.89237973 2.65706845-29.35428085 15.52065436-35.84933652 19.02123633-46.94154346 25.30541465-63.51659033 41.20565021-62.20914449 58.45550757 2.95229856 39.13904114 24.16667102 52.7196135 70.98168823 53.81618115z m44.41100207 50.10472101c-19.82257471 1.43397372-32.05352527 1.940082-45.63409763 1.6448519-70.34905207-1.60267593-115.98314969-30.91478165-121.38163769-101.64341492-3.45840683-46.05585397 24.7571304-73.13264758 89.24376132-107.96976837 6.7902866-3.66928501 31.37871396-16.57504688 36.06021551-19.06341229 57.69634516-30.83042972 85.15271997-53.73183005 94.76877722-84.47790866 12.77923398-40.78389304-9.10994898-98.94417051-79.24812286-181.6507002-121.17075953-142.97559219-350.14258521-139.60153647-489.2380134 2.06660824-134.49827774 138.84237405-134.79350784 362.12048163-0.42175717 501.637667 158.53842169 168.99799328 451.9968783 181.18676788 534.57688175-11.80919339-4.68150156 0.2952301-10.71262573 0.67481131-18.72600705 1.26527069z\" p-id=\"2509\" /><path d=\"M346.03865637 637.18588562a78.82636652 78.82636652 0 0 0 78.32025825-79.29029883c0-43.69401562-35.005823-79.29029883-78.32025825-79.29029882a78.82636652 78.82636652 0 0 0-78.36243338 79.29029882c0 43.69401562 35.005823 79.29029883 78.36243338 79.29029883z m0-51.7495729a27.07679361 27.07679361 0 0 1-26.5706845-27.54072593c0-15.30977536 11.97789643-27.54072593 26.5706845-27.54072592 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072592a27.07679361 27.07679361 0 0 1-26.57068533 27.54072593zM475.7289063 807.11174353a78.82636652 78.82636652 0 0 0 78.3624334-79.29029882c0-43.69401562-34.96364785-79.29029883-78.32025825-79.29029883a78.82636652 78.82636652 0 0 0-78.32025742 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029882z m0-51.74957208a27.07679361 27.07679361 0 0 1-26.57068532-27.54072674c0-15.30977536 12.06224753-27.54072593 26.57068532-27.54072593 14.59278892 0 26.57068533 12.23095057 26.57068453 27.54072593a27.07679361 27.07679361 0 0 1-26.57068453 27.54072674zM601.24376214 377.21492718a78.82636652 78.82636652 0 0 0 78.32025742-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025742-79.29029882a78.82636652 78.82636652 0 0 0-78.32025823 79.29029883c0 43.69401562 34.96364785 79.29029883 78.32025824 79.29029883z m1e-8-51.74957208a27.07679361 27.07679361 0 0 1-26.57068534-27.54072675c0-15.30977536 11.97789643-27.54072593 26.57068534-27.54072591 14.55061295 0 26.57068533 12.23095057 26.57068451 27.54072592a27.07679361 27.07679361 0 0 1-26.57068451 27.54072674zM378.80916809 433.85687983a78.82636652 78.82636652 0 0 0 78.32025824-79.29029883c0-43.69401562-34.96364785-79.29029883-78.32025824-79.29029802a78.82636652 78.82636652 0 0 0-78.32025742 79.29029802c0 43.69401562 34.96364785 79.29029883 78.32025742 79.29029883z m0-51.74957209a27.07679361 27.07679361 0 0 1-26.57068451-27.54072674c0-15.30977536 11.97789643-27.54072593 26.57068451-27.54072593 14.55061295 0 26.57068533 12.23095057 26.57068533 27.54072593a27.07679361 27.07679361 0 0 1-26.57068533 27.54072674z\" p-id=\"2510\" /></symbol>'});l.a.add(c);t[\"default\"]=c},\"064a\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-select\",use:\"icon-select-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-select\"><defs><style type=\"text/css\"></style></defs><path d=\"M62 511.97954521C62 263.86590869 263.90681826 62 511.97954521 62s449.97954521 201.825 449.97954521 449.97954521c0 248.19545479-201.90681826 449.97954521-449.97954521 449.97954521C263.90681826 962 62 760.175 62 511.97954521M901.98636348 511.97954521c0-215.24318174-175.00909131-390.41590869-390.00681827-390.41590869-215.03863652 0-389.96590869 175.17272695-389.96590868 390.41590869 0 215.28409131 175.00909131 390.45681826 389.96590868 390.45681826C727.01818174 902.47727305 901.98636348 727.30454521 901.98636348 511.97954521M264.17272695 430.28409131c0-5.76818174 2.12727305-11.51590869 6.64772696-15.87272696 8.71363652-8.75454521 22.88863652-8.75454521 31.725 0l209.4340913 208.22727305L721.45454521 414.53409131c8.75454521-8.71363652 22.97045479-8.71363652 31.90909132 0 8.71363652 8.75454521 8.71363652 22.88863652 0 31.60227304L511.97954521 685.74090869 270.71818174 446.01363653C266.27954521 441.77954521 264.17272695 436.05227305 264.17272695 430.28409131\" p-id=\"805\" /></symbol>'});l.a.add(c);t[\"default\"]=c},\"0f05\":function(e,t,a){},\"0f88\":function(e,t,a){\"use strict\";a.r(t),t[\"default\"]={\"list-type\":function(e,t,a){var o=[],n=t.__config__;return\"picture-card\"===t[\"list-type\"]?o.push(e(\"i\",{class:\"el-icon-plus\"})):o.push(e(\"el-button\",{attrs:{size:\"small\",type:\"primary\",icon:\"el-icon-upload\"}},[n.buttonText])),n.showTip&&o.push(e(\"div\",{slot:\"tip\",class:\"el-upload__tip\"},[\"只能上传不超过 \",n.fileSize,n.sizeUnit,\" 的\",t.accept,\"文件\"])),o}}},\"128d\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-textarea\",use:\"icon-textarea-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-textarea\"><defs><style type=\"text/css\"></style></defs><path d=\"M896 160H128c-35.2 0-64 28.8-64 64v576c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V224c0-35.2-28.8-64-64-64z m0 608c0 16-12.8 32-32 32H160c-19.2 0-32-12.8-32-32V256c0-16 12.8-32 32-32h704c19.2 0 32 12.8 32 32v512z\" p-id=\"2985\" /><path d=\"M224 288c-19.2 0-32 12.8-32 32v256c0 16 12.8 32 32 32s32-12.8 32-32V320c0-16-12.8-32-32-32z m608 480c19.2 0 32-12.8 32-32V608L704 768h128z\" p-id=\"2986\" /></symbol>'});l.a.add(c);t[\"default\"]=c},\"167d\":function(e,t,a){\"use strict\";a.r(t),t[\"default\"]={prepend:function(e,t,a){return e(\"template\",{slot:\"prepend\"},[t.__slot__[a]])},append:function(e,t,a){return e(\"template\",{slot:\"append\"},[t.__slot__[a]])}}},\"1fce\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-number\",use:\"icon-number-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-number\"><defs><style type=\"text/css\"></style></defs><path d=\"M279.272727 791.272727h512a46.545455 46.545455 0 0 1 0 93.090909H279.272727a46.545455 46.545455 0 0 1 0-93.090909z m33.838546-617.984V651.636364H193.722182V395.170909c0-37.003636-0.884364-59.298909-2.653091-66.746182a24.948364 24.948364 0 0 0-14.615273-16.989091c-8.005818-3.863273-25.786182-5.771636-53.341091-5.771636h-11.822545v-55.854545c57.716364-12.381091 101.562182-37.888 131.490909-76.520728h70.283636z m303.709091 396.8V651.636364H354.164364v-68.235637c77.777455-127.255273 124.043636-206.010182 138.705454-236.218182 14.661818-30.254545 22.016-53.853091 22.016-70.74909 0-13.032727-2.234182-22.714182-6.656-29.137455-4.421818-6.376727-11.170909-9.588364-20.247273-9.588364a22.248727 22.248727 0 0 0-20.200727 10.612364c-4.468364 7.121455-6.656 21.178182-6.656 42.263273v45.521454H354.164364v-17.454545c0-26.763636 1.396364-47.941818 4.142545-63.348364 2.746182-15.499636 9.541818-30.72 20.386909-45.661091 10.798545-14.987636 24.901818-26.298182 42.216727-33.978182 17.361455-7.68 38.167273-11.543273 62.37091-11.543272 47.476364 0 83.316364 11.776 107.706181 35.328 24.296727 23.552 36.445091 53.341091 36.445091 89.367272 0 27.368727-6.842182 56.32-20.48 86.853819-13.730909 30.533818-54.039273 95.325091-121.018182 194.420363h130.885819z m270.615272-189.393454c18.152727 6.097455 31.650909 16.104727 40.494546 29.975272 8.843636 13.917091 13.312 46.452364 13.312 97.652364 0 38.027636-4.328727 67.490909-13.032727 88.529455-8.657455 20.945455-23.598545 36.910545-44.869819 47.848727-21.271273 10.938182-48.593455 16.384-81.873454 16.384-37.794909 0-67.490909-6.330182-89.088-19.083636-21.550545-12.660364-35.746909-28.253091-42.542546-46.638546-6.795636-18.432-10.193455-50.362182-10.193454-95.883636v-37.841455h119.389091v77.730909c0 20.666182 1.210182 33.838545 3.723636 39.424 2.420364 5.585455 7.912727 8.424727 16.337455 8.424728 9.309091 0 15.36-3.537455 18.338909-10.612364 2.932364-7.121455 4.421818-25.6 4.421818-55.575273v-33.047273c0-18.338909-2.048-31.744-6.190546-40.215272a30.72 30.72 0 0 0-18.338909-16.709818c-8.052364-2.653091-23.738182-4.189091-46.964363-4.561455V357.050182c28.392727 0 45.893818-1.070545 52.596363-3.258182a22.946909 22.946909 0 0 0 14.475637-14.149818c2.932364-7.307636 4.421818-18.711273 4.421818-34.257455v-26.624c0-16.756364-1.722182-27.741091-5.12-33.047272-3.490909-5.352727-8.843636-8.005818-16.151273-8.005819-8.285091 0-13.963636 2.792727-16.989091 8.378182-3.025455 5.632-4.561455 17.640727-4.561454 35.933091v39.284364h-119.389091v-40.773818c0-45.661091 10.472727-76.567273 31.325091-92.625455 20.898909-16.058182 54.085818-24.064 99.607272-24.064 56.878545 0 95.511273 11.170909 115.805091 33.373091 20.293818 22.248727 30.394182 53.201455 30.394182 92.765091 0 26.810182-3.630545 46.173091-10.891636 58.088727-7.307636 11.915636-20.107636 22.807273-38.446546 32.628364z\" p-id=\"2868\" /></symbol>'});l.a.add(c);t[\"default\"]=c},\"235f\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-date\",use:\"icon-date-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-date\"><defs><style type=\"text/css\"></style></defs><path d=\"M479.85714249 608.42857168h64.28571502c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285751s-12.85714249-32.14285751-32.14285664-32.14285664h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285662s12.85714249 32.14285751 32.14285664 32.14285753z m-2e-8 122.14285665h64.28571504c19.28571417 0 32.14285751-12.85714249 32.14285664-32.14285665s-12.85714249-32.14285751-32.14285664-32.14285751h-64.28571504c-19.28571417 0-32.14285751 12.85714249-32.14285664 32.14285751s12.85714249 32.14285751 32.14285664 32.14285664z m353.57142921-559.28571416h-128.57142921v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285664-32.14285753s-32.14285751 12.85714249-32.14285751 32.14285753v32.14285664h-257.14285665v-32.14285664c0-19.28571417-12.85714249-32.14285751-32.14285752-32.14285753s-32.14285751 12.85714249-32.14285664 32.14285753v32.14285664h-128.57142919c-70.71428585 0-128.57142832 57.85714249-128.57142832 122.14285751v501.42857081c0 70.71428585 57.85714249 128.57142832 128.57142832 122.14285751h642.85714335c70.71428585 0 128.57142832-57.85714249 128.57142833-122.14285751v-501.42857081c0-70.71428585-57.85714249-122.14285753-128.57142833-122.14285751z m64.28571415 623.57142832c0 32.14285751-32.14285751 64.28571415-64.28571416 64.28571504h-642.85714335c-32.14285751 0-64.28571415-25.71428583-64.28571417-64.28571504v-372.85714249h771.42857168v372.85714249z m0-437.14285664h-771.42857168v-64.28571417c0-32.14285751 32.14285751-64.28571415 64.28571417-64.28571415h128.57142919v32.14285664c0 19.28571417 12.85714249 32.14285751 32.14285664 32.14285751s32.14285751-12.85714249 32.14285753-32.14285751v-32.14285664h257.14285665v32.14285664c0 19.28571417 12.85714249 32.14285751 32.1428575 32.14285751s32.14285751-12.85714249 32.14285664-32.14285751v-32.14285664h128.57142921c32.14285751 0 64.28571415 25.71428583 64.28571415 64.28571415v64.28571417z m-610.71428583 372.85714247h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285664s-12.85714249-32.14285751-32.14285753-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285751s12.85714249 32.14285751 32.14285751 32.14285665z m385.71428583-122.14285664h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285751s-12.85714249-32.14285751-32.14285751-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285664s12.85714249 32.14285751 32.14285753 32.14285751z m-385.71428583 0h64.28571415c19.28571417 0 32.14285751-12.85714249 32.14285753-32.14285751s-12.85714249-32.14285751-32.14285753-32.14285664h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285751 32.14285664s12.85714249 32.14285751 32.14285751 32.14285751z m385.71428583 122.14285665h64.28571417c19.28571417 0 32.14285751-12.85714249 32.14285751-32.14285665s-12.85714249-32.14285751-32.14285751-32.14285751h-64.28571415c-19.28571417 0-32.14285751 12.85714249-32.14285753 32.14285751s12.85714249 32.14285751 32.14285753 32.14285665z\" p-id=\"1069\" /></symbol>'});l.a.add(c);t[\"default\"]=c},2384:function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-switch\",use:\"icon-switch-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-switch\"><defs><style type=\"text/css\"></style></defs><path d=\"M692 792H332c-150 0-270-120-270-270s120-270 270-270h360c150 0 270 120 270 270 0 147-120 270-270 270zM332 312c-117 0-210 93-210 210s93 210 210 210h360c117 0 210-93 210-210s-93-210-210-210H332z\" p-id=\"1111\" /><path d=\"M341 522m-150 0a150 150 0 1 0 300 0 150 150 0 1 0-300 0Z\" p-id=\"1112\" /></symbol>'});l.a.add(c);t[\"default\"]=c},\"2a3d\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-password\",use:\"icon-password-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-password\"><defs><style type=\"text/css\"></style></defs><path d=\"M868.593046 403.832442c-30.081109-28.844955-70.037123-44.753273-112.624057-44.753273L265.949606 359.079168c-42.554188 0-82.510202 15.908318-112.469538 44.690852-30.236652 28.782533-46.857191 67.222007-46.857191 108.198258l0 294.079782c0 40.977273 16.619516 79.414701 46.702672 108.136859 29.959336 28.844955 70.069869 44.814672 112.624057 44.814672l490.019383 0c42.585911 0 82.696444-15.969717 112.624057-44.814672 30.082132-28.844955 46.579875-67.222007 46.579875-108.136859L915.172921 511.968278C915.171897 471.053426 898.675178 432.677397 868.593046 403.832442zM841.821309 806.049083c0 22.098297-8.882298 42.772152-25.099654 58.306964-16.154935 15.661701-37.81935 24.203238-60.752666 24.203238L265.949606 888.559285c-22.934339 0-44.567032-8.54256-60.877509-24.264637-16.186657-15.474436-25.067932-36.148291-25.067932-58.246589L180.004165 511.968278c0-22.035876 8.881274-42.772152 25.192775-58.307987 16.186657-15.536858 37.81935-24.139793 60.753689-24.139793l490.019383 0c22.933315 0 44.597731 8.602935 60.752666 24.139793 16.21838 15.535835 25.099654 36.272112 25.099654 58.307987L841.822332 806.049083zM510.974136 135.440715c114.914216 0 208.318536 89.75214 208.318536 200.055338l73.350588 0c0-149.113109-126.366036-270.496667-281.669124-270.496667-155.333788 0-281.699824 121.383558-281.699824 270.496667l73.350588 0C302.623877 225.193879 396.059919 135.440715 510.974136 135.440715zM474.299865 747.244792l73.350588 0L547.650453 629.576859l-73.350588 0L474.299865 747.244792z\" p-id=\"2751\" /></symbol>'});l.a.add(c);t[\"default\"]=c},\"2cfa\":function(e,t,a){\"use strict\";a.r(t);a(\"4160\"),a(\"159b\");t[\"default\"]={options:function(e,t,a){var o=[];return t.__slot__.options.forEach((function(a){\"button\"===t.__config__.optionType?o.push(e(\"el-radio-button\",{attrs:{label:a.value}},[a.label])):o.push(e(\"el-radio\",{attrs:{label:a.value,border:t.border}},[a.label]))})),o}}},\"2db0\":function(e,t,a){},\"2dba\":function(e,t,a){\"use strict\";var o=a(\"6f47\"),n=a.n(o);n.a},\"31c6\":function(e,t,a){\"use strict\";var o,n=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a(\"textarea\",{staticStyle:{visibility:\"hidden\"},attrs:{id:e.tinymceId}})},i=[],l=(a(\"99af\"),a(\"d3b7\"),a(\"25f0\"),a(\"c88b\")),c=a(\"5f72\"),r=a.n(c);function s(e){if(o)e(o);else{var t=r.a.Loading.service({fullscreen:!0,lock:!0,text:\"富文本资源加载中...\",spinner:\"el-icon-loading\",background:\"rgba(255, 255, 255, 0.5)\"});Object(l[\"a\"])(\"https://lib.baomitu.com/tinymce/5.3.2/tinymce.min.js\",(function(){t.close(),o=tinymce,e(o)}))}}var u=[\"advlist anchor autolink autosave code codesample directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textpattern visualblocks visualchars wordcount\"],d=[\"code searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote removeformat subscript superscript codesample hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen\"],_=a(\"cc06\"),p=1,m={props:{id:{type:String,default:function(){return 1e4===p&&(p=1),\"tinymce\".concat(+new Date).concat(p++)}},value:{default:\"\"}},data:function(){return{tinymceId:this.id}},mounted:function(){var e=this;s((function(t){a(\"afc4\");var o={selector:\"#\".concat(e.tinymceId),language:\"zh_CN\",menubar:\"file edit insert view format table\",plugins:u,toolbar:d,height:300,branding:!1,object_resizing:!1,end_container_on_empty_block:!0,powerpaste_word_import:\"clean\",code_dialog_height:450,code_dialog_width:1e3,advlist_bullet_styles:\"square\",advlist_number_styles:\"default\",default_link_target:\"_blank\",link_title:!1,nonbreaking_force_tab:!0};o=Object.assign(o,e.$attrs),o.init_instance_callback=function(t){e.value&&t.setContent(e.value),e.vModel(t)},t.init(o)}))},destroyed:function(){this.destroyTinymce()},methods:{vModel:function(e){var t=this,a=Object(_[\"a\"])(250,e.setContent);this.$watch(\"value\",(function(t,o){e&&t!==o&&t!==e.getContent()&&(\"string\"!==typeof t&&(t=t.toString()),a.call(e,t))})),e.on(\"change keyup undo redo\",(function(){t.$emit(\"input\",e.getContent())}))},destroyTinymce:function(){if(window.tinymce){var e=window.tinymce.get(this.tinymceId);e&&e.destroy()}}}},f=m,v=a(\"2877\"),h=Object(v[\"a\"])(f,n,i,!1,null,null,null);t[\"a\"]=h.exports},\"3add\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-time\",use:\"icon-time-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-time\"><defs><style type=\"text/css\"></style></defs><path d=\"M520 559h204c17.673 0 32 14.327 32 32 0 17.673-14.327 32-32 32H488c-17.673 0-32-14.327-32-32 0-0.167 0.001-0.334 0.004-0.5a32.65 32.65 0 0 1-0.004-0.5V277c0-17.673 14.327-32 32-32 17.673 0 32 14.327 32 32v282z m-8 401C264.576 960 64 759.424 64 512S264.576 64 512 64s448 200.576 448 448-200.576 448-448 448z m0-64c212.077 0 384-171.923 384-384S724.077 128 512 128 128 299.923 128 512s171.923 384 384 384z\" p-id=\"1009\" /></symbol>'});l.a.add(c);t[\"default\"]=c},4758:function(e,t,a){\"use strict\";a(\"4160\"),a(\"b64b\"),a(\"d3b7\"),a(\"ac1f\"),a(\"5319\"),a(\"159b\"),a(\"ddb0\");var o=a(\"5530\"),n=a(\"ed08\"),i={},l=a(\"9977\"),c=l.keys()||[];function r(e,t){var a=this;e.props.value=t,e.on.input=function(e){a.$emit(\"input\",e)}}function s(e,t,a){var o=i[t.__config__.tag];o&&Object.keys(o).forEach((function(n){var i=o[n];t.__slot__&&t.__slot__[n]&&a.push(i(e,t,n))}))}function u(e){var t=this;[\"on\",\"nativeOn\"].forEach((function(a){var o=Object.keys(e[a]||{});o.forEach((function(o){var n=e[a][o];\"string\"===typeof n&&(e[a][o]=function(e){return t.$emit(n,e)})}))}))}function d(e,t){var a=this;Object.keys(e).forEach((function(n){var i=e[n];\"__vModel__\"===n?r.call(a,t,e.__config__.defaultValue):t[n]?t[n]=Object(o[\"a\"])(Object(o[\"a\"])({},t[n]),i):t.attrs[n]=i})),_(t)}function _(e){delete e.attrs.__config__,delete e.attrs.__slot__,delete e.attrs.__methods__}function p(){return{attrs:{},props:{},nativeOn:{},on:{},style:{}}}c.forEach((function(e){var t=e.replace(/^\\.\\/(.*)\\.\\w+$/,\"$1\"),a=l(e).default;i[t]=a})),t[\"a\"]={props:{conf:{type:Object,required:!0}},render:function(e){var t=p(),a=Object(n[\"b\"])(this.conf),o=[];return s.call(this,e,a,o),u.call(this,a),d.call(this,a,t),e(this.conf.__config__.tag,t,o)}}},\"475a\":function(e,t,a){},\"4ed4\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-button\",use:\"icon-button-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-button\"><defs><style type=\"text/css\"></style></defs><path d=\"M230.4 307.712c13.824 0 25.088-11.264 25.088-25.088 0-100.352 81.92-182.272 182.272-182.272s182.272 81.408 182.272 182.272c0 13.824 11.264 25.088 25.088 25.088s25.088-11.264 24.576-25.088c0-127.488-103.936-231.936-231.936-231.936S205.824 154.624 205.824 282.624c-0.512 14.336 10.752 25.088 24.576 25.088z m564.736 234.496c-11.264 0-21.504 2.048-31.232 6.144 0-44.544-40.448-81.92-88.064-81.92-14.848 0-28.16 3.584-39.936 10.24-13.824-28.16-44.544-48.128-78.848-48.128-12.288 0-24.576 2.56-35.328 7.68V284.16c0-45.568-37.888-81.92-84.48-81.92s-84.48 36.864-84.48 81.92v348.672l-69.12-112.64c-18.432-28.16-58.368-36.864-91.136-19.968-26.624 14.336-46.592 47.104-30.208 88.064 3.072 8.192 76.8 205.312 171.52 311.296 0 0 28.16 24.576 43.008 58.88 4.096 9.728 13.312 15.36 22.528 15.36 3.072 0 6.656-0.512 9.728-2.048 12.288-5.12 18.432-19.968 12.8-32.256-19.456-44.544-53.76-74.752-53.76-74.752C281.6 768 209.408 573.44 208.384 570.88c-5.12-12.8-2.56-20.992 7.168-26.112 9.216-4.608 21.504-4.608 26.112 2.56l113.152 184.32c4.096 8.704 12.8 14.336 22.528 14.336 13.824 0 25.088-10.752 25.088-25.088V284.16c0-17.92 15.36-32.256 34.816-32.256s34.816 14.336 34.816 32.256v284.16c0 13.824 10.24 25.088 24.576 25.088 13.824 0 25.088-11.264 25.088-25.088v-57.344c0-17.92 15.36-32.768 34.816-32.768 19.968 0 37.376 15.36 37.376 32.768v95.232c0 7.168 3.072 13.312 7.68 17.92 4.608 4.608 10.752 7.168 17.92 7.168 13.824 0 24.576-11.264 24.576-25.088V547.84c0-18.432 13.824-32.256 32.256-32.256 20.48 0 38.912 15.36 38.912 32.256v95.232c0 13.824 11.264 25.088 25.088 25.088s24.576-11.264 25.088-25.088v-18.944c0-18.944 12.8-32.256 30.72-32.256 18.432 0 22.528 18.944 22.528 31.744 0 1.024-11.776 99.84-50.688 173.056-30.72 58.368-45.056 112.128-51.2 146.944-2.56 13.312 6.656 26.112 19.968 28.672 1.536 0 3.072 0.512 4.608 0.512 11.776 0 22.016-8.192 24.064-20.48 5.632-31.232 18.432-79.36 46.08-132.608 43.52-81.92 55.808-186.88 56.32-193.536-0.512-50.688-29.696-83.968-72.704-83.968z\" /></symbol>'});l.a.add(c);t[\"default\"]=c},\"51ff\":function(e,t,a){var o={\"./button.svg\":\"4ed4\",\"./cascader.svg\":\"a393\",\"./checkbox.svg\":\"8963\",\"./color.svg\":\"03ab\",\"./component.svg\":\"56d6\",\"./date-range.svg\":\"e6df\",\"./date.svg\":\"235f\",\"./input.svg\":\"81d6\",\"./number.svg\":\"1fce\",\"./password.svg\":\"2a3d\",\"./radio.svg\":\"d8dc\",\"./rate.svg\":\"6786\",\"./rich-text.svg\":\"c630\",\"./row.svg\":\"c95d\",\"./select.svg\":\"064a\",\"./slider.svg\":\"eb1c\",\"./switch.svg\":\"2384\",\"./textarea.svg\":\"128d\",\"./time-range.svg\":\"861c\",\"./time.svg\":\"3add\",\"./upload.svg\":\"9d82\"};function n(e){var t=i(e);return a(t)}function i(e){if(!a.o(o,e)){var t=new Error(\"Cannot find module '\"+e+\"'\");throw t.code=\"MODULE_NOT_FOUND\",t}return o[e]}n.keys=function(){return Object.keys(o)},n.resolve=i,e.exports=n,n.id=\"51ff\"},\"56d6\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-component\",use:\"icon-component-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-component\"><defs><style type=\"text/css\"></style></defs><path d=\"M826.56 470.016c-32.896 0-64.384 12.288-89.984 35.52l0-104.96c0-62.208-50.496-112.832-112.64-113.088L623.936 287.04 519.552 287.104C541.824 262.72 554.56 230.72 554.56 197.12c0-73.536-59.904-133.44-133.504-133.44-73.472 0-133.376 59.904-133.376 133.44 0 32.896 12.224 64.256 35.52 89.984L175.232 287.104l0 0.576C113.728 288.704 64 338.88 64 400.576l0.32 0 0.32 116.48C60.864 544.896 70.592 577.728 100.8 588.48c12.736 4.608 37.632 7.488 60.864-25.28 12.992-18.368 34.24-29.248 56.64-29.248 38.336 0 69.504 31.104 69.504 69.312 0 38.4-31.168 69.504-69.504 69.504-22.656 0-44.032-11.264-57.344-30.4C138.688 610.112 112.576 615.36 102.464 619.136c-29.824 10.752-39.104 43.776-38.144 67.392l0 160.384L64 846.912C64 909.248 114.752 960 177.216 960l446.272 0c62.4 0 113.152-50.752 113.152-113.152l0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.536 0 133.44-59.904 133.44-133.504C960 529.92 900.096 470.016 826.56 470.016zM826.56 672.896c-22.72 0-44.032-11.264-57.344-30.4-22.272-32.384-48.448-27.136-58.56-23.36-29.824 10.752-39.04 43.776-38.08 67.392l0 160.384c0 27.136-22.016 49.152-49.152 49.152L177.216 896.064C150.08 896 128 873.984 128 846.848l0.32 0 0-145.024c24.384 22.272 56.384 35.008 89.984 35.008 73.6 0 133.504-59.904 133.504-133.504 0-73.472-59.904-133.376-133.504-133.376-32.896 0-64.32 12.288-89.984 35.52l0-104.96L128 400.512c0-27.072 22.08-49.152 49.216-49.152L177.216 351.04 334.656 350.72c3.776 0.512 7.616 0.832 11.52 0.832 24.896 0 50.752-10.816 60.032-37.056 4.544-12.736 7.424-37.568-25.344-60.736C362.624 240.768 351.68 219.52 351.68 197.12c0-38.272 31.104-69.44 69.376-69.44 38.336 0 69.504 31.168 69.504 69.44 0 22.72-11.264 44.032-30.528 57.472C427.968 276.736 433.088 302.784 436.8 313.024c10.752 29.888 43.072 39.232 67.392 38.08l119.232 0 0 0.384c27.136 0 49.152 22.08 49.152 49.152l0.256 116.48c-3.776 27.84 6.016 60.736 36.224 71.488 12.736 4.608 37.632 7.488 60.8-25.28 13.056-18.368 34.24-29.248 56.704-29.248C864.832 534.016 896 565.12 896 603.392 896 641.728 864.832 672.896 826.56 672.896z\" p-id=\"3146\" /></symbol>'});l.a.add(c);t[\"default\"]=c},\"5f72\":function(e,t){e.exports=ELEMENT},\"627e\":function(e,t,a){},6389:function(e,t){e.exports=VueRouter},\"66a2\":function(e,t,a){\"use strict\";var o=a(\"475a\"),n=a.n(o);n.a},6786:function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-rate\",use:\"icon-rate-usage\",viewBox:\"0 0 1069 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1069 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-rate\"><defs><style type=\"text/css\"></style></defs><path d=\"M633.72929961 378.02038203l9.49872568 18.68789795 20.78025469 2.79745225 206.61592412 27.33248408a11.46496817 11.46496817 0 0 1 6.6095543 19.47324902l-147.2675168 147.35350284-14.89299345 14.89299345 3.8006376 20.68280244 37.84585956 204.89044571a11.46496817 11.46496817 0 0 1-16.4808914 12.2961788L554.68980898 751.84713388l-18.68789794-9.49299345-18.48726123 9.99171915-183.23885392 99.34968163a11.46496817 11.46496817 0 0 1-16.78471347-11.8662416l32.5433127-205.79617881 3.29617793-20.78598692-15.19108243-14.49172002-151.03375839-143.48407587a11.46496817 11.46496817 0 0 1 6.09936328-19.63949062l205.79617881-32.63503185 20.78598691-3.2961788L428.87898125 380.72038203 518.59235674 192.64331182a11.46496817 11.46496817 0 0 1 20.56815264-0.26369385l94.56879023 185.63503183zM496.64840732 85.52038203l-121.75796162 254.98089229L95.76433145 384.76178369A34.3949045 34.3949045 0 0 0 77.46050938 443.66879023l204.87324901 194.66369385-44.16879023 279.1146498a34.3949045 34.3949045 0 0 0 50.36560489 35.61592325l248.4-134.67898038 251.84522285 128.27579591a34.3949045 34.3949045 0 0 0 49.43694287-36.89426777l-51.30573223-277.85350284 199.73120977-199.90891758a34.3949045 34.3949045 0 0 0-19.82866201-58.40827998l-280.11783428-37.03184736L558.32993633 84.71210205a34.3949045 34.3949045 0 0 0-61.68152901 0.80254775z\" p-id=\"1099\" /></symbol>'});l.a.add(c);t[\"default\"]=c},6828:function(e,t,a){\"use strict\";var o=a(\"627e\"),n=a.n(o);n.a},\"6f47\":function(e,t,a){},\"7f29\":function(e,t,a){\"use strict\";a.r(t);a(\"4160\"),a(\"159b\");t[\"default\"]={options:function(e,t,a){var o=[];return t.__slot__.options.forEach((function(t){o.push(e(\"el-option\",{attrs:{label:t.label,value:t.value,disabled:t.disabled}}))})),o}}},\"80e9\":function(e,t,a){\"use strict\";var o=a(\"fca0\"),n=a.n(o);n.a},\"81d6\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-input\",use:\"icon-input-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-input\"><defs><style type=\"text/css\"></style></defs><path d=\"M896 224H128c-35.2 0-64 28.8-64 64v448c0 35.2 28.8 64 64 64h768c35.2 0 64-28.8 64-64V288c0-35.2-28.8-64-64-64z m0 480c0 19.2-12.8 32-32 32H160c-19.2 0-32-12.8-32-32V320c0-19.2 12.8-32 32-32h704c19.2 0 32 12.8 32 32v384z\" p-id=\"3103\" /><path d=\"M224 352c-19.2 0-32 12.8-32 32v256c0 16 12.8 32 32 32s32-12.8 32-32V384c0-16-12.8-32-32-32z\" p-id=\"3104\" /></symbol>'});l.a.add(c);t[\"default\"]=c},\"861c\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-time-range\",use:\"icon-time-range-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-time-range\"><defs><style type=\"text/css\"></style></defs><path d=\"M498.595712 482.290351 345.420077 482.290351l0 57.307194 210.477712 0L555.897789 274.196942l-57.301054 0L498.596735 482.290351zM498.595712 482.290351\" p-id=\"1249\" /><path d=\"M577.685002 644.98478l379.879913 0 0 57.302077L577.685002 702.286858 577.685002 644.98478 577.685002 644.98478zM577.685002 644.98478\" p-id=\"1250\" /><path d=\"M577.685002 773.764795l379.879913 0 0 57.307194L577.685002 831.071989 577.685002 773.764795 577.685002 773.764795zM577.685002 773.764795\" p-id=\"1251\" /><path d=\"M577.685002 902.549927l379.879913 0 0 57.307194L577.685002 959.857121 577.685002 902.549927 577.685002 902.549927zM577.685002 902.549927\" p-id=\"1252\" /><path d=\"M102.523001 382.290823c4.450359 2.615571 9.470699 3.954055 14.530948 3.954055 2.969635 0 5.952572-0.461511 8.836249-1.394766l190.809767-61.886489c15.052834-4.882194 23.297612-21.040199 18.415418-36.08894-4.882194-15.052834-21.040199-23.297612-36.093033-18.415418L175.676092 308.458257c15.994276-26.115797 35.170011-50.537 57.370639-72.743768 73.767074-73.767074 171.845857-114.388237 276.16783-114.388237 104.32095 0 202.39564 40.622186 276.16169 114.388237s114.393353 171.845857 114.393353 276.16783c0 26.427906-2.615571 52.449559-7.709589 77.780481l58.302871 0c4.464685-25.499767 6.708795-51.470255 6.708795-77.780481 0-60.449767-11.845793-119.102608-35.204803-174.336584-22.559808-53.334719-54.850236-101.226472-95.968725-142.349055-41.122583-41.122583-89.017406-73.408917-142.348032-95.968725C628.317169 75.866898 569.659211 64.021106 509.215584 64.021106c-60.448744 0-119.106702 11.845793-174.336584 35.207873-53.334719 22.559808-101.230566 54.846142-142.349055 95.968725-23.980157 23.980157-44.934398 50.278103-62.727647 78.601172l-20.738323-105.655342c-3.043313-15.527648-18.105357-25.642007-33.631982-22.599717-15.527648 3.048429-25.64303 18.105357-22.599717 33.637098l36.102243 183.932126C90.51348 371.153158 95.460142 378.13313 102.523001 382.290823L102.523001 382.290823zM102.523001 382.290823\" p-id=\"1253\" /><path d=\"M126.020158 587.9416 67.768453 587.9416c5.759167 33.679054 15.368012 66.544579 28.789697 98.278327 22.559808 53.333696 54.850236 101.225449 95.971795 142.348032 41.122583 41.122583 89.014336 73.408917 142.349055 95.968725 54.112432 22.88829 111.517863 34.71157 170.668031 35.18229L505.547031 902.395408c-102.94972-0.941442-199.594851-41.445948-272.499277-114.349351C177.545672 732.543975 140.810003 663.275355 126.020158 587.9416L126.020158 587.9416zM126.020158 587.9416\" p-id=\"1254\" /></symbol>'});l.a.add(c);t[\"default\"]=c},8963:function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-checkbox\",use:\"icon-checkbox-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-checkbox\"><defs><style type=\"text/css\"></style></defs><path d=\"M828.40625 90.125H195.59375C137.375 90.125 90.125 137.375 90.125 195.59375v632.8125c0 58.21875 47.25 105.46875 105.46875 105.46875h632.8125c58.21875 0 105.46875-47.25 105.46875-105.46875V195.59375c0-58.21875-47.25-105.46875-105.46875-105.46875z m52.734375 738.28125c0 29.16-23.57015625 52.734375-52.734375 52.734375H195.59375c-29.109375 0-52.734375-23.574375-52.734375-52.734375V195.59375c0-29.109375 23.625-52.734375 52.734375-52.734375h632.8125c29.16 0 52.734375 23.625 52.734375 52.734375v632.8125z\" p-id=\"903\" /><path d=\"M421.52890625 709.55984375a36.28125 36.28125 0 0 1-27.55265625-12.66890625L205.17453125 476.613125a36.28546875 36.28546875 0 0 1 55.10109375-47.22890625l164.986875 192.4846875 342.16171875-298.48078125a36.2896875 36.2896875 0 0 1 47.70984375 54.68765625L445.3859375 700.6203125a36.3234375 36.3234375 0 0 1-23.85703125 8.93953125z\" p-id=\"904\" /></symbol>'});l.a.add(c);t[\"default\"]=c},\"8a8a\":function(e,t,a){\"use strict\";a.r(t);a(\"e260\"),a(\"e6cf\"),a(\"cca6\"),a(\"a79d\");var o,n,i=a(\"8bbf\"),l=a.n(i),c=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a(\"div\",[a(\"router-view\")],1)},r=[],s={mounted:function(){var e=document.querySelector(\"#pre-loader\");e.style.display=\"none\",document.body.ondrop=function(e){e.preventDefault(),e.stopPropagation()}}},u=s,d=a(\"2877\"),_=Object(d[\"a\"])(u,c,r,!1,null,null,null),p=_.exports,m=(a(\"d3b7\"),a(\"6389\")),f=a.n(m),v=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a(\"div\",{staticClass:\"container\"},[a(\"div\",{staticClass:\"left-board\"},[a(\"div\",{staticClass:\"logo-wrapper\"},[a(\"div\",{staticClass:\"logo\"},[a(\"img\",{attrs:{src:e.logo,alt:\"logo\"}}),e._v(\" 表单构建 \")])]),a(\"el-scrollbar\",{staticClass:\"left-scrollbar\"},[a(\"div\",{staticClass:\"components-list\"},e._l(e.leftComponents,(function(t,o){return a(\"div\",{key:o},[a(\"div\",{staticClass:\"components-title\"},[a(\"svg-icon\",{attrs:{\"icon-class\":\"component\"}}),e._v(\" \"+e._s(t.title)+\" \")],1),a(\"draggable\",{staticClass:\"components-draggable\",attrs:{list:t.list,group:{name:\"componentsGroup\",pull:\"clone\",put:!1},clone:e.cloneComponent,draggable:\".components-item\",sort:!1},on:{end:e.onEnd}},e._l(t.list,(function(t,o){return a(\"div\",{key:o,staticClass:\"components-item\",on:{click:function(a){return e.addComponent(t)}}},[a(\"div\",{staticClass:\"components-body\"},[a(\"svg-icon\",{attrs:{\"icon-class\":t.__config__.tagIcon}}),e._v(\" \"+e._s(t.__config__.label)+\" \")],1)])})),0)],1)})),0)])],1),a(\"div\",{staticClass:\"center-board\"},[a(\"div\",{staticClass:\"action-bar\"},[a(\"el-button\",{attrs:{icon:\"el-icon-video-play\",type:\"text\"},on:{click:e.run}},[e._v(\" 运行 \")]),a(\"el-button\",{attrs:{icon:\"el-icon-view\",type:\"text\"},on:{click:e.showJson}},[e._v(\" 查看json \")]),a(\"el-button\",{attrs:{icon:\"el-icon-download\",type:\"text\"},on:{click:e.download}},[e._v(\" 导出vue文件 \")]),a(\"el-button\",{staticClass:\"copy-btn-main\",attrs:{icon:\"el-icon-document-copy\",type:\"text\"},on:{click:e.copy}},[e._v(\" 复制代码 \")]),a(\"el-button\",{staticClass:\"delete-btn\",attrs:{icon:\"el-icon-delete\",type:\"text\"},on:{click:e.empty}},[e._v(\" 清空 \")])],1),a(\"el-scrollbar\",{staticClass:\"center-scrollbar\"},[a(\"el-row\",{staticClass:\"center-board-row\",attrs:{gutter:e.formConf.gutter}},[a(\"el-form\",{attrs:{size:e.formConf.size,\"label-position\":e.formConf.labelPosition,disabled:e.formConf.disabled,\"label-width\":e.formConf.labelWidth+\"px\"}},[a(\"draggable\",{staticClass:\"drawing-board\",attrs:{list:e.drawingList,animation:340,group:\"componentsGroup\"}},e._l(e.drawingList,(function(t,o){return a(\"draggable-item\",{key:t.renderKey,attrs:{\"drawing-list\":e.drawingList,element:t,index:o,\"active-id\":e.activeId,\"form-conf\":e.formConf},on:{activeItem:e.activeFormItem,copyItem:e.drawingItemCopy,deleteItem:e.drawingItemDelete}})})),1),a(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:!e.drawingList.length,expression:\"!drawingList.length\"}],staticClass:\"empty-info\"},[e._v(\" 从左侧拖入或点选组件进行表单设计 \")])],1)],1)],1)],1),a(\"right-panel\",{attrs:{\"active-data\":e.activeData,\"form-conf\":e.formConf,\"show-field\":!!e.drawingList.length},on:{\"tag-change\":e.tagChange}}),a(\"form-drawer\",{attrs:{visible:e.drawerVisible,\"form-data\":e.formData,size:\"100%\",\"generate-conf\":e.generateConf},on:{\"update:visible\":function(t){e.drawerVisible=t}}}),a(\"json-drawer\",{attrs:{size:\"60%\",visible:e.jsonDrawerVisible,\"json-str\":JSON.stringify(e.formData)},on:{\"update:visible\":function(t){e.jsonDrawerVisible=t},refresh:e.refreshJson}}),a(\"code-type-dialog\",{attrs:{visible:e.dialogVisible,title:\"选择生成类型\",\"show-file-name\":e.showFileName},on:{\"update:visible\":function(t){e.dialogVisible=t},confirm:e.generate}}),a(\"input\",{attrs:{id:\"copyNode\",type:\"hidden\"}})],1)},h=[],b=(a(\"c740\"),a(\"4160\"),a(\"d81d\"),a(\"a434\"),a(\"b64b\"),a(\"ac1f\"),a(\"5319\"),a(\"159b\"),a(\"53ca\")),g=a(\"5530\"),w=a(\"310e\"),y=a.n(w),D=a(\"cc06\"),x=a(\"21a6\"),k=a(\"b311\"),C=a.n(k),O=a(\"4758\"),M=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a(\"div\",[a(\"el-drawer\",e._g(e._b({on:{opened:e.onOpen,close:e.onClose}},\"el-drawer\",e.$attrs,!1),e.$listeners),[a(\"div\",{staticStyle:{height:\"100%\"}},[a(\"el-row\",{staticStyle:{height:\"100%\",overflow:\"auto\"}},[a(\"el-col\",{staticClass:\"left-editor\",attrs:{md:24,lg:12}},[a(\"div\",{staticClass:\"setting\",attrs:{title:\"资源引用\"},on:{click:e.showResource}},[a(\"el-badge\",{staticClass:\"item\",attrs:{\"is-dot\":!!e.resources.length}},[a(\"i\",{staticClass:\"el-icon-setting\"})])],1),a(\"el-tabs\",{staticClass:\"editor-tabs\",attrs:{type:\"card\"},model:{value:e.activeTab,callback:function(t){e.activeTab=t},expression:\"activeTab\"}},[a(\"el-tab-pane\",{attrs:{name:\"html\"}},[a(\"span\",{attrs:{slot:\"label\"},slot:\"label\"},[\"html\"===e.activeTab?a(\"i\",{staticClass:\"el-icon-edit\"}):a(\"i\",{staticClass:\"el-icon-document\"}),e._v(\" template \")])]),a(\"el-tab-pane\",{attrs:{name:\"js\"}},[a(\"span\",{attrs:{slot:\"label\"},slot:\"label\"},[\"js\"===e.activeTab?a(\"i\",{staticClass:\"el-icon-edit\"}):a(\"i\",{staticClass:\"el-icon-document\"}),e._v(\" script \")])]),a(\"el-tab-pane\",{attrs:{name:\"css\"}},[a(\"span\",{attrs:{slot:\"label\"},slot:\"label\"},[\"css\"===e.activeTab?a(\"i\",{staticClass:\"el-icon-edit\"}):a(\"i\",{staticClass:\"el-icon-document\"}),e._v(\" css \")])])],1),a(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"html\"===e.activeTab,expression:\"activeTab==='html'\"}],staticClass:\"tab-editor\",attrs:{id:\"editorHtml\"}}),a(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"js\"===e.activeTab,expression:\"activeTab==='js'\"}],staticClass:\"tab-editor\",attrs:{id:\"editorJs\"}}),a(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"css\"===e.activeTab,expression:\"activeTab==='css'\"}],staticClass:\"tab-editor\",attrs:{id:\"editorCss\"}})],1),a(\"el-col\",{staticClass:\"right-preview\",attrs:{md:24,lg:12}},[a(\"div\",{staticClass:\"action-bar\",style:{\"text-align\":\"left\"}},[a(\"span\",{staticClass:\"bar-btn\",on:{click:e.runCode}},[a(\"i\",{staticClass:\"el-icon-refresh\"}),e._v(\" 刷新 \")]),a(\"span\",{staticClass:\"bar-btn\",on:{click:e.exportFile}},[a(\"i\",{staticClass:\"el-icon-download\"}),e._v(\" 导出vue文件 \")]),a(\"span\",{ref:\"copyBtn\",staticClass:\"bar-btn copy-btn\"},[a(\"i\",{staticClass:\"el-icon-document-copy\"}),e._v(\" 复制代码 \")]),a(\"span\",{staticClass:\"bar-btn delete-btn\",on:{click:function(t){return e.$emit(\"update:visible\",!1)}}},[a(\"i\",{staticClass:\"el-icon-circle-close\"}),e._v(\" 关闭 \")])]),a(\"iframe\",{directives:[{name:\"show\",rawName:\"v-show\",value:e.isIframeLoaded,expression:\"isIframeLoaded\"}],ref:\"previewPage\",staticClass:\"result-wrapper\",attrs:{frameborder:\"0\",src:\"preview.html\"},on:{load:e.iframeLoad}}),a(\"div\",{directives:[{name:\"show\",rawName:\"v-show\",value:!e.isIframeLoaded,expression:\"!isIframeLoaded\"},{name:\"loading\",rawName:\"v-loading\",value:!0,expression:\"true\"}],staticClass:\"result-wrapper\"})])],1)],1)]),a(\"resource-dialog\",{attrs:{visible:e.resourceVisible,\"origin-resource\":e.resources},on:{\"update:visible\":function(t){e.resourceVisible=t},save:e.setResource}})],1)},E=[],I=(a(\"99af\"),a(\"8a79\"),a(\"1861\")),L=(a(\"a15b\"),a(\"45fc\"),a(\"b0c0\"),a(\"beaa\"));function j(e){return'<el-dialog v-bind=\"$attrs\" v-on=\"$listeners\" @open=\"onOpen\" @close=\"onClose\" title=\"Dialog Titile\">\\n    '.concat(e,'\\n    <div slot=\"footer\">\\n      <el-button @click=\"close\">取消</el-button>\\n      <el-button type=\"primary\" @click=\"handelConfirm\">确定</el-button>\\n    </div>\\n  </el-dialog>')}function T(e){return\"<template>\\n    <div>\\n      \".concat(e,\"\\n    </div>\\n  </template>\")}function z(e){return\"<script>\\n    \".concat(e,\"\\n  <\\/script>\")}function P(e){return\"<style>\\n    \".concat(e,\"\\n  </style>\")}function $(e,t,a){var o=\"\";\"right\"!==e.labelPosition&&(o='label-position=\"'.concat(e.labelPosition,'\"'));var i=e.disabled?':disabled=\"'.concat(e.disabled,'\"'):\"\",l='<el-form ref=\"'.concat(e.formRef,'\" :model=\"').concat(e.formModel,'\" :rules=\"').concat(e.formRules,'\" size=\"').concat(e.size,'\" ').concat(i,' label-width=\"').concat(e.labelWidth,'px\" ').concat(o,\">\\n      \").concat(t,\"\\n      \").concat(B(e,a),\"\\n    </el-form>\");return n&&(l='<el-row :gutter=\"'.concat(e.gutter,'\">\\n        ').concat(l,\"\\n      </el-row>\")),l}function B(e,t){var a=\"\";return e.formBtns&&\"file\"===t&&(a='<el-form-item size=\"large\">\\n          <el-button type=\"primary\" @click=\"submitForm\">提交</el-button>\\n          <el-button @click=\"resetForm\">重置</el-button>\\n        </el-form-item>',n&&(a='<el-col :span=\"24\">\\n          '.concat(a,\"\\n        </el-col>\"))),a}function R(e,t){return n||24!==e.__config__.span?'<el-col :span=\"'.concat(e.__config__.span,'\">\\n      ').concat(t,\"\\n    </el-col>\"):t}var A={colFormItem:function(e){var t=e.__config__,a=\"\",n='label=\"'.concat(t.label,'\"');t.labelWidth&&t.labelWidth!==o.labelWidth&&(a='label-width=\"'.concat(t.labelWidth,'px\"')),!1===t.showLabel&&(a='label-width=\"0\"',n=\"\");var i=!L[\"a\"][t.tag]&&t.required?\"required\":\"\",l=S[t.tag]?S[t.tag](e):null,c=\"<el-form-item \".concat(a,\" \").concat(n,' prop=\"').concat(e.__vModel__,'\" ').concat(i,\">\\n        \").concat(l,\"\\n      </el-form-item>\");return c=R(e,c),c},rowFormItem:function(e){var t=e.__config__,a=\"default\"===e.type?\"\":'type=\"'.concat(e.type,'\"'),o=\"default\"===e.type?\"\":'justify=\"'.concat(e.justify,'\"'),n=\"default\"===e.type?\"\":'align=\"'.concat(e.align,'\"'),i=e.gutter?':gutter=\"'.concat(e.gutter,'\"'):\"\",l=t.children.map((function(e){return A[e.__config__.layout](e)})),c=\"<el-row \".concat(a,\" \").concat(o,\" \").concat(n,\" \").concat(i,\">\\n      \").concat(l.join(\"\\n\"),\"\\n    </el-row>\");return c=R(e,c),c}},S={\"el-button\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=e.type?'type=\"'.concat(e.type,'\"'):\"\",i=e.icon?'icon=\"'.concat(e.icon,'\"'):\"\",l=e.round?\"round\":\"\",c=e.size?'size=\"'.concat(e.size,'\"'):\"\",r=e.plain?\"plain\":\"\",s=e.circle?\"circle\":\"\",u=N(e);return u&&(u=\"\\n\".concat(u,\"\\n\")),\"<\".concat(a,\" \").concat(n,\" \").concat(i,\" \").concat(l,\" \").concat(c,\" \").concat(r,\" \").concat(o,\" \").concat(s,\">\").concat(u,\"</\").concat(a,\">\")},\"el-input\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i=t.clearable,l=t.placeholder,c=t.width,r=e.maxlength?':maxlength=\"'.concat(e.maxlength,'\"'):\"\",s=e[\"show-word-limit\"]?\"show-word-limit\":\"\",u=e.readonly?\"readonly\":\"\",d=e[\"prefix-icon\"]?\"prefix-icon='\".concat(e[\"prefix-icon\"],\"'\"):\"\",_=e[\"suffix-icon\"]?\"suffix-icon='\".concat(e[\"suffix-icon\"],\"'\"):\"\",p=e[\"show-password\"]?\"show-password\":\"\",m=e.type?'type=\"'.concat(e.type,'\"'):\"\",f=e.autosize&&e.autosize.minRows?':autosize=\"{minRows: '.concat(e.autosize.minRows,\", maxRows: \").concat(e.autosize.maxRows,'}\"'):\"\",v=F(e);return v&&(v=\"\\n\".concat(v,\"\\n\")),\"<\".concat(a,\" \").concat(n,\" \").concat(m,\" \").concat(l,\" \").concat(r,\" \").concat(s,\" \").concat(u,\" \").concat(o,\" \").concat(i,\" \").concat(d,\" \").concat(_,\" \").concat(p,\" \").concat(f,\" \").concat(c,\">\").concat(v,\"</\").concat(a,\">\")},\"el-input-number\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i=t.placeholder,l=e[\"controls-position\"]?\"controls-position=\".concat(e[\"controls-position\"]):\"\",c=e.min?\":min='\".concat(e.min,\"'\"):\"\",r=e.max?\":max='\".concat(e.max,\"'\"):\"\",s=e.step?\":step='\".concat(e.step,\"'\"):\"\",u=e[\"step-strictly\"]?\"step-strictly\":\"\",d=e.precision?\":precision='\".concat(e.precision,\"'\"):\"\";return\"<\".concat(a,\" \").concat(n,\" \").concat(i,\" \").concat(s,\" \").concat(u,\" \").concat(d,\" \").concat(l,\" \").concat(c,\" \").concat(r,\" \").concat(o,\"></\").concat(a,\">\")},\"el-select\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i=t.clearable,l=t.placeholder,c=t.width,r=e.filterable?\"filterable\":\"\",s=e.multiple?\"multiple\":\"\",u=q(e);return u&&(u=\"\\n\".concat(u,\"\\n\")),\"<\".concat(a,\" \").concat(n,\" \").concat(l,\" \").concat(o,\" \").concat(s,\" \").concat(r,\" \").concat(i,\" \").concat(c,\">\").concat(u,\"</\").concat(a,\">\")},\"el-radio-group\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i='size=\"'.concat(e.size,'\"'),l=W(e);return l&&(l=\"\\n\".concat(l,\"\\n\")),\"<\".concat(a,\" \").concat(n,\" \").concat(i,\" \").concat(o,\">\").concat(l,\"</\").concat(a,\">\")},\"el-checkbox-group\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i='size=\"'.concat(e.size,'\"'),l=e.min?':min=\"'.concat(e.min,'\"'):\"\",c=e.max?':max=\"'.concat(e.max,'\"'):\"\",r=U(e);return r&&(r=\"\\n\".concat(r,\"\\n\")),\"<\".concat(a,\" \").concat(n,\" \").concat(l,\" \").concat(c,\" \").concat(i,\" \").concat(o,\">\").concat(r,\"</\").concat(a,\">\")},\"el-switch\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i=e[\"active-text\"]?'active-text=\"'.concat(e[\"active-text\"],'\"'):\"\",l=e[\"inactive-text\"]?'inactive-text=\"'.concat(e[\"inactive-text\"],'\"'):\"\",c=e[\"active-color\"]?'active-color=\"'.concat(e[\"active-color\"],'\"'):\"\",r=e[\"inactive-color\"]?'inactive-color=\"'.concat(e[\"inactive-color\"],'\"'):\"\",s=!0!==e[\"active-value\"]?\":active-value='\".concat(JSON.stringify(e[\"active-value\"]),\"'\"):\"\",u=!1!==e[\"inactive-value\"]?\":inactive-value='\".concat(JSON.stringify(e[\"inactive-value\"]),\"'\"):\"\";return\"<\".concat(a,\" \").concat(n,\" \").concat(i,\" \").concat(l,\" \").concat(c,\" \").concat(r,\" \").concat(s,\" \").concat(u,\" \").concat(o,\"></\").concat(a,\">\")},\"el-cascader\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i=t.clearable,l=t.placeholder,c=t.width,r=e.options?':options=\"'.concat(e.__vModel__,'Options\"'):\"\",s=e.props?':props=\"'.concat(e.__vModel__,'Props\"'):\"\",u=e[\"show-all-levels\"]?\"\":':show-all-levels=\"false\"',d=e.filterable?\"filterable\":\"\",_=\"/\"===e.separator?\"\":'separator=\"'.concat(e.separator,'\"');return\"<\".concat(a,\" \").concat(n,\" \").concat(r,\" \").concat(s,\" \").concat(c,\" \").concat(u,\" \").concat(l,\" \").concat(_,\" \").concat(d,\" \").concat(i,\" \").concat(o,\"></\").concat(a,\">\")},\"el-slider\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i=e.min?\":min='\".concat(e.min,\"'\"):\"\",l=e.max?\":max='\".concat(e.max,\"'\"):\"\",c=e.step?\":step='\".concat(e.step,\"'\"):\"\",r=e.range?\"range\":\"\",s=e[\"show-stops\"]?':show-stops=\"'.concat(e[\"show-stops\"],'\"'):\"\";return\"<\".concat(a,\" \").concat(i,\" \").concat(l,\" \").concat(c,\" \").concat(n,\" \").concat(r,\" \").concat(s,\" \").concat(o,\"></\").concat(a,\">\")},\"el-time-picker\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i=t.clearable,l=t.placeholder,c=t.width,r=e[\"start-placeholder\"]?'start-placeholder=\"'.concat(e[\"start-placeholder\"],'\"'):\"\",s=e[\"end-placeholder\"]?'end-placeholder=\"'.concat(e[\"end-placeholder\"],'\"'):\"\",u=e[\"range-separator\"]?'range-separator=\"'.concat(e[\"range-separator\"],'\"'):\"\",d=e[\"is-range\"]?\"is-range\":\"\",_=e.format?'format=\"'.concat(e.format,'\"'):\"\",p=e[\"value-format\"]?'value-format=\"'.concat(e[\"value-format\"],'\"'):\"\",m=e[\"picker-options\"]?\":picker-options='\".concat(JSON.stringify(e[\"picker-options\"]),\"'\"):\"\";return\"<\".concat(a,\" \").concat(n,\" \").concat(d,\" \").concat(_,\" \").concat(p,\" \").concat(m,\" \").concat(c,\" \").concat(l,\" \").concat(r,\" \").concat(s,\" \").concat(u,\" \").concat(i,\" \").concat(o,\"></\").concat(a,\">\")},\"el-date-picker\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i=t.clearable,l=t.placeholder,c=t.width,r=e[\"start-placeholder\"]?'start-placeholder=\"'.concat(e[\"start-placeholder\"],'\"'):\"\",s=e[\"end-placeholder\"]?'end-placeholder=\"'.concat(e[\"end-placeholder\"],'\"'):\"\",u=e[\"range-separator\"]?'range-separator=\"'.concat(e[\"range-separator\"],'\"'):\"\",d=e.format?'format=\"'.concat(e.format,'\"'):\"\",_=e[\"value-format\"]?'value-format=\"'.concat(e[\"value-format\"],'\"'):\"\",p=\"date\"===e.type?\"\":'type=\"'.concat(e.type,'\"'),m=e.readonly?\"readonly\":\"\";return\"<\".concat(a,\" \").concat(p,\" \").concat(n,\" \").concat(d,\" \").concat(_,\" \").concat(c,\" \").concat(l,\" \").concat(r,\" \").concat(s,\" \").concat(u,\" \").concat(i,\" \").concat(m,\" \").concat(o,\"></\").concat(a,\">\")},\"el-rate\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i=e.max?\":max='\".concat(e.max,\"'\"):\"\",l=e[\"allow-half\"]?\"allow-half\":\"\",c=e[\"show-text\"]?\"show-text\":\"\",r=e[\"show-score\"]?\"show-score\":\"\";return\"<\".concat(a,\" \").concat(n,\" \").concat(i,\" \").concat(l,\" \").concat(c,\" \").concat(r,\" \").concat(o,\"></\").concat(a,\">\")},\"el-color-picker\":function(e){var t=V(e),a=t.tag,o=t.disabled,n=t.vModel,i='size=\"'.concat(e.size,'\"'),l=e[\"show-alpha\"]?\"show-alpha\":\"\",c=e[\"color-format\"]?'color-format=\"'.concat(e[\"color-format\"],'\"'):\"\";return\"<\".concat(a,\" \").concat(n,\" \").concat(i,\" \").concat(l,\" \").concat(c,\" \").concat(o,\"></\").concat(a,\">\")},\"el-upload\":function(e){var t=e.__config__.tag,a=e.disabled?\":disabled='true'\":\"\",o=e.action?':action=\"'.concat(e.__vModel__,'Action\"'):\"\",n=e.multiple?\"multiple\":\"\",i=\"text\"!==e[\"list-type\"]?'list-type=\"'.concat(e[\"list-type\"],'\"'):\"\",l=e.accept?'accept=\"'.concat(e.accept,'\"'):\"\",c=\"file\"!==e.name?'name=\"'.concat(e.name,'\"'):\"\",r=!1===e[\"auto-upload\"]?':auto-upload=\"false\"':\"\",s=':before-upload=\"'.concat(e.__vModel__,'BeforeUpload\"'),u=':file-list=\"'.concat(e.__vModel__,'fileList\"'),d='ref=\"'.concat(e.__vModel__,'\"'),_=K(e);return _&&(_=\"\\n\".concat(_,\"\\n\")),\"<\".concat(t,\" \").concat(d,\" \").concat(u,\" \").concat(o,\" \").concat(r,\" \").concat(n,\" \").concat(s,\" \").concat(i,\" \").concat(l,\" \").concat(c,\" \").concat(a,\">\").concat(_,\"</\").concat(t,\">\")},tinymce:function(e){var t=V(e),a=t.tag,o=t.vModel,n=t.placeholder,i=e.height?':height=\"'.concat(e.height,'\"'):\"\",l=e.branding?':branding=\"'.concat(e.branding,'\"'):\"\";return\"<\".concat(a,\" \").concat(o,\" \").concat(n,\" \").concat(i,\" \").concat(l,\"></\").concat(a,\">\")}};function V(e){return{tag:e.__config__.tag,vModel:'v-model=\"'.concat(o.formModel,\".\").concat(e.__vModel__,'\"'),clearable:e.clearable?\"clearable\":\"\",placeholder:e.placeholder?'placeholder=\"'.concat(e.placeholder,'\"'):\"\",width:e.style&&e.style.width?\":style=\\\"{width: '100%'}\\\"\":\"\",disabled:e.disabled?\":disabled='true'\":\"\"}}function N(e){var t=[],a=e.__slot__||{};return a.default&&t.push(a.default),t.join(\"\\n\")}function F(e){var t=[],a=e.__slot__;return a&&a.prepend&&t.push('<template slot=\"prepend\">'.concat(a.prepend,\"</template>\")),a&&a.append&&t.push('<template slot=\"append\">'.concat(a.append,\"</template>\")),t.join(\"\\n\")}function q(e){var t=[],a=e.__slot__;return a&&a.options&&a.options.length&&t.push('<el-option v-for=\"(item, index) in '.concat(e.__vModel__,'Options\" :key=\"index\" :label=\"item.label\" :value=\"item.value\" :disabled=\"item.disabled\"></el-option>')),t.join(\"\\n\")}function W(e){var t=[],a=e.__slot__,o=e.__config__;if(a&&a.options&&a.options.length){var n=\"button\"===o.optionType?\"el-radio-button\":\"el-radio\",i=o.border?\"border\":\"\";t.push(\"<\".concat(n,' v-for=\"(item, index) in ').concat(e.__vModel__,'Options\" :key=\"index\" :label=\"item.value\" :disabled=\"item.disabled\" ').concat(i,\">{{item.label}}</\").concat(n,\">\"))}return t.join(\"\\n\")}function U(e){var t=[],a=e.__slot__,o=e.__config__;if(a&&a.options&&a.options.length){var n=\"button\"===o.optionType?\"el-checkbox-button\":\"el-checkbox\",i=o.border?\"border\":\"\";t.push(\"<\".concat(n,' v-for=\"(item, index) in ').concat(e.__vModel__,'Options\" :key=\"index\" :label=\"item.value\" :disabled=\"item.disabled\" ').concat(i,\">{{item.label}}</\").concat(n,\">\"))}return t.join(\"\\n\")}function K(e){var t=[],a=e.__config__;return\"picture-card\"===e[\"list-type\"]?t.push('<i class=\"el-icon-plus\"></i>'):t.push('<el-button size=\"small\" type=\"primary\" icon=\"el-icon-upload\">'.concat(a.buttonText,\"</el-button>\")),a.showTip&&t.push('<div slot=\"tip\" class=\"el-upload__tip\">只能上传不超过 '.concat(a.fileSize).concat(a.sizeUnit,\" 的\").concat(e.accept,\"文件</div>\")),t.join(\"\\n\")}function H(e,t){var a=[];o=e,n=e.fields.some((function(e){return 24!==e.__config__.span})),e.fields.forEach((function(e){a.push(A[e.__config__.layout](e))}));var i=a.join(\"\\n\"),l=$(e,i,t);return\"dialog\"===t&&(l=j(l)),o=null,l}var G=a(\"f4a7\"),J=(a(\"c975\"),{\"el-rate\":\".el-rate{display: inline-block; vertical-align: text-top;}\",\"el-upload\":\".el-upload__tip{line-height: 1.2;}\"});function Y(e,t){var a=J[t.__config__.tag];a&&-1===e.indexOf(a)&&e.push(a),t.__config__.children&&t.__config__.children.forEach((function(t){return Y(e,t)}))}function Z(e){var t=[];return e.fields.forEach((function(e){return Y(t,e)})),t.join(\"\\n\")}var Q,X,ee=a(\"ed08\"),te=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a(\"div\",[a(\"el-dialog\",e._g(e._b({attrs:{title:\"外部资源引用\",width:\"600px\",\"close-on-click-modal\":!1},on:{open:e.onOpen,close:e.onClose}},\"el-dialog\",e.$attrs,!1),e.$listeners),[e._l(e.resources,(function(t,o){return a(\"el-input\",{key:o,staticClass:\"url-item\",attrs:{placeholder:\"请输入 css 或 js 资源路径\",\"prefix-icon\":\"el-icon-link\",clearable:\"\"},model:{value:e.resources[o],callback:function(t){e.$set(e.resources,o,t)},expression:\"resources[index]\"}},[a(\"el-button\",{attrs:{slot:\"append\",icon:\"el-icon-delete\"},on:{click:function(t){return e.deleteOne(o)}},slot:\"append\"})],1)})),a(\"el-button-group\",{staticClass:\"add-item\"},[a(\"el-button\",{attrs:{plain:\"\"},on:{click:function(t){return e.addOne(\"https://lib.baomitu.com/jquery/1.8.3/jquery.min.js\")}}},[e._v(\" jQuery1.8.3 \")]),a(\"el-button\",{attrs:{plain:\"\"},on:{click:function(t){return e.addOne(\"https://unpkg.com/http-vue-loader\")}}},[e._v(\" http-vue-loader \")]),a(\"el-button\",{attrs:{icon:\"el-icon-circle-plus-outline\",plain:\"\"},on:{click:function(t){return e.addOne(\"\")}}},[e._v(\" 添加其他 \")])],1),a(\"div\",{attrs:{slot:\"footer\"},slot:\"footer\"},[a(\"el-button\",{on:{click:e.close}},[e._v(\" 取消 \")]),a(\"el-button\",{attrs:{type:\"primary\"},on:{click:e.handelConfirm}},[e._v(\" 确定 \")])],1)],2)],1)},ae=[],oe=(a(\"4de4\"),{components:{},inheritAttrs:!1,props:[\"originResource\"],data:function(){return{resources:null}},computed:{},watch:{},created:function(){},mounted:function(){},methods:{onOpen:function(){this.resources=this.originResource.length?Object(ee[\"b\"])(this.originResource):[\"\"]},onClose:function(){},close:function(){this.$emit(\"update:visible\",!1)},handelConfirm:function(){var e=this.resources.filter((function(e){return!!e}))||[];this.$emit(\"save\",e),this.close(),e.length&&(this.resources=e)},deleteOne:function(e){this.resources.splice(e,1)},addOne:function(e){this.resources.indexOf(e)>-1?this.$message(\"资源已存在\"):this.resources.push(e)}}}),ne=oe,ie=(a(\"2dba\"),Object(d[\"a\"])(ne,te,ae,!1,null,\"60dcec16\",null)),le=ie.exports,ce=a(\"c88b\"),re=a(\"5f72\"),se=a.n(re);function ue(e){if(Q)e(Q);else{var t=\"https://lib.baomitu.com/monaco-editor/0.19.3/min/vs\",a=se.a.Loading.service({fullscreen:!0,lock:!0,text:\"编辑器资源初始化中...\",spinner:\"el-icon-loading\",background:\"rgba(255, 255, 255, 0.5)\"});!window.require&&(window.require={}),!window.require.paths&&(window.require.paths={}),window.require.paths.vs=t,Object(ce[\"b\"])([\"\".concat(t,\"/loader.js\"),\"\".concat(t,\"/editor/editor.main.nls.js\"),\"\".concat(t,\"/editor/editor.main.js\")],(function(){a.close(),Q=monaco,e(Q)}))}}function de(e){if(X)e(X);else{var t=se.a.Loading.service({fullscreen:!0,lock:!0,text:\"格式化资源加载中...\",spinner:\"el-icon-loading\",background:\"rgba(255, 255, 255, 0.5)\"});Object(ce[\"a\"])(\"https://lib.baomitu.com/js-beautify/1.10.2/beautifier.min.js\",(function(){t.close(),X=beautifier,e(X)}))}}var _e,pe,me,fe,ve={html:null,js:null,css:null},he={html:\"html\",js:\"javascript\",css:\"css\"},be={components:{ResourceDialog:le},props:[\"formData\",\"generateConf\"],data:function(){return{activeTab:\"html\",htmlCode:\"\",jsCode:\"\",cssCode:\"\",codeFrame:\"\",isIframeLoaded:!1,isInitcode:!1,isRefreshCode:!1,resourceVisible:!1,scripts:[],links:[],monaco:null}},computed:{resources:function(){return this.scripts.concat(this.links)}},watch:{},created:function(){},mounted:function(){var e=this;window.addEventListener(\"keydown\",this.preventDefaultSave);var t=new C.a(\".copy-btn\",{text:function(t){var a=e.generateCode();return e.$notify({title:\"成功\",message:\"代码已复制到剪切板，可粘贴。\",type:\"success\"}),a}});t.on(\"error\",(function(t){e.$message.error(\"代码复制失败\")}))},beforeDestroy:function(){window.removeEventListener(\"keydown\",this.preventDefaultSave)},methods:{preventDefaultSave:function(e){\"s\"===e.key&&(e.metaKey||e.ctrlKey)&&e.preventDefault()},onOpen:function(){var e=this,t=this.generateConf.type;this.htmlCode=H(this.formData,t),this.jsCode=Object(G[\"a\"])(this.formData,t),this.cssCode=Z(this.formData),de((function(t){_e=t,e.htmlCode=_e.html(e.htmlCode,ee[\"a\"].html),e.jsCode=_e.js(e.jsCode,ee[\"a\"].js),e.cssCode=_e.css(e.cssCode,ee[\"a\"].html),ue((function(t){pe=t,e.setEditorValue(\"editorHtml\",\"html\",e.htmlCode),e.setEditorValue(\"editorJs\",\"js\",e.jsCode),e.setEditorValue(\"editorCss\",\"css\",e.cssCode),e.isInitcode||(e.isRefreshCode=!0,e.isIframeLoaded&&(e.isInitcode=!0)&&e.runCode())}))}))},onClose:function(){this.isInitcode=!1,this.isRefreshCode=!1},iframeLoad:function(){this.isInitcode||(this.isIframeLoaded=!0,this.isRefreshCode&&(this.isInitcode=!0)&&this.runCode())},setEditorValue:function(e,t,a){var o=this;ve[t]?ve[t].setValue(a):ve[t]=pe.editor.create(document.getElementById(e),{value:a,theme:\"vs-dark\",language:he[t],automaticLayout:!0}),ve[t].onKeyDown((function(e){49===e.keyCode&&(e.metaKey||e.ctrlKey)&&o.runCode()}))},runCode:function(){var e=ve.js.getValue();try{var t=Object(I[\"parse\"])(e,{sourceType:\"module\"}),a=t.program.body;if(a.length>1)return void this.$confirm(\"js格式不能识别，仅支持修改export default的对象内容\",\"提示\",{type:\"warning\"});if(\"ExportDefaultDeclaration\"===a[0].type){var o={type:\"refreshFrame\",data:{generateConf:this.generateConf,html:ve.html.getValue(),js:e.replace(ee[\"c\"],\"\"),css:ve.css.getValue(),scripts:this.scripts,links:this.links}};this.$refs.previewPage.contentWindow.postMessage(o,location.origin)}else this.$message.error(\"请使用export default\")}catch(n){this.$message.error(\"js错误：\".concat(n)),console.error(n)}},generateCode:function(){var e=T(ve.html.getValue()),t=z(ve.js.getValue()),a=P(ve.css.getValue());return _e.html(e+t+a,ee[\"a\"].html)},exportFile:function(){var e=this;this.$prompt(\"文件名:\",\"导出文件\",{inputValue:\"\".concat(+new Date,\".vue\"),closeOnClickModal:!1,inputPlaceholder:\"请输入文件名\"}).then((function(t){var a=t.value;a||(a=\"\".concat(+new Date,\".vue\"));var o=e.generateCode(),n=new Blob([o],{type:\"text/plain;charset=utf-8\"});Object(x[\"saveAs\"])(n,a)}))},showResource:function(){this.resourceVisible=!0},setResource:function(e){var t=[],a=[];Array.isArray(e)?(e.forEach((function(e){e.endsWith(\".css\")?a.push(e):t.push(e)})),this.scripts=t,this.links=a):(this.scripts=[],this.links=[])}}},ge=be,we=(a(\"d9b9\"),Object(d[\"a\"])(ge,M,E,!1,null,\"3157a144\",null)),ye=we.exports,De=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a(\"div\",[a(\"el-drawer\",e._g(e._b({on:{opened:e.onOpen,close:e.onClose}},\"el-drawer\",e.$attrs,!1),e.$listeners),[a(\"div\",{staticClass:\"action-bar\",style:{\"text-align\":\"left\"}},[a(\"span\",{staticClass:\"bar-btn\",on:{click:e.refresh}},[a(\"i\",{staticClass:\"el-icon-refresh\"}),e._v(\" 刷新 \")]),a(\"span\",{ref:\"copyBtn\",staticClass:\"bar-btn copy-json-btn\"},[a(\"i\",{staticClass:\"el-icon-document-copy\"}),e._v(\" 复制JSON \")]),a(\"span\",{staticClass:\"bar-btn\",on:{click:e.exportJsonFile}},[a(\"i\",{staticClass:\"el-icon-download\"}),e._v(\" 导出JSON文件 \")]),a(\"span\",{staticClass:\"bar-btn delete-btn\",on:{click:function(t){return e.$emit(\"update:visible\",!1)}}},[a(\"i\",{staticClass:\"el-icon-circle-close\"}),e._v(\" 关闭 \")])]),a(\"div\",{staticClass:\"json-editor\",attrs:{id:\"editorJson\"}})])],1)},xe=[],ke={components:{},props:{jsonStr:{type:String,required:!0}},data:function(){return{}},computed:{},watch:{},created:function(){},mounted:function(){var e=this;window.addEventListener(\"keydown\",this.preventDefaultSave);var t=new C.a(\".copy-json-btn\",{text:function(t){return e.$notify({title:\"成功\",message:\"代码已复制到剪切板，可粘贴。\",type:\"success\"}),e.beautifierJson}});t.on(\"error\",(function(t){e.$message.error(\"代码复制失败\")}))},beforeDestroy:function(){window.removeEventListener(\"keydown\",this.preventDefaultSave)},methods:{preventDefaultSave:function(e){\"s\"===e.key&&(e.metaKey||e.ctrlKey)&&e.preventDefault()},onOpen:function(){var e=this;de((function(t){me=t,e.beautifierJson=me.js(e.jsonStr,ee[\"a\"].js),ue((function(t){fe=t,e.setEditorValue(\"editorJson\",e.beautifierJson)}))}))},onClose:function(){},setEditorValue:function(e,t){var a=this;this.jsonEditor?this.jsonEditor.setValue(t):(this.jsonEditor=fe.editor.create(document.getElementById(e),{value:t,theme:\"vs-dark\",language:\"json\",automaticLayout:!0}),this.jsonEditor.onKeyDown((function(e){49===e.keyCode&&(e.metaKey||e.ctrlKey)&&a.refresh()})))},exportJsonFile:function(){var e=this;this.$prompt(\"文件名:\",\"导出文件\",{inputValue:\"\".concat(+new Date,\".json\"),closeOnClickModal:!1,inputPlaceholder:\"请输入文件名\"}).then((function(t){var a=t.value;a||(a=\"\".concat(+new Date,\".json\"));var o=e.jsonEditor.getValue(),n=new Blob([o],{type:\"text/plain;charset=utf-8\"});Object(x[\"saveAs\"])(n,a)}))},refresh:function(){try{this.$emit(\"refresh\",JSON.parse(this.jsonEditor.getValue()))}catch(e){this.$notify({title:\"错误\",message:\"JSON格式错误，请检查\",type:\"error\"})}}}},Ce=ke,Oe=(a(\"80e9\"),Object(d[\"a\"])(Ce,De,xe,!1,null,\"44793736\",null)),Me=Oe.exports,Ee=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a(\"div\",{staticClass:\"right-board\"},[a(\"el-tabs\",{staticClass:\"center-tabs\",model:{value:e.currentTab,callback:function(t){e.currentTab=t},expression:\"currentTab\"}},[a(\"el-tab-pane\",{attrs:{label:\"组件属性\",name:\"field\"}}),a(\"el-tab-pane\",{attrs:{label:\"表单属性\",name:\"form\"}})],1),a(\"div\",{staticClass:\"field-box\"},[a(\"a\",{staticClass:\"document-link\",attrs:{target:\"_blank\",href:e.documentLink,title:\"查看组件文档\"}},[a(\"i\",{staticClass:\"el-icon-link\"})]),a(\"el-scrollbar\",{staticClass:\"right-scrollbar\"},[a(\"el-form\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"field\"===e.currentTab&&e.showField,expression:\"currentTab==='field' && showField\"}],attrs:{size:\"small\",\"label-width\":\"90px\"}},[e.activeData.__config__.changeTag?a(\"el-form-item\",{attrs:{label:\"组件类型\"}},[a(\"el-select\",{style:{width:\"100%\"},attrs:{placeholder:\"请选择组件类型\"},on:{change:e.tagChange},model:{value:e.activeData.__config__.tagIcon,callback:function(t){e.$set(e.activeData.__config__,\"tagIcon\",t)},expression:\"activeData.__config__.tagIcon\"}},e._l(e.tagList,(function(t){return a(\"el-option-group\",{key:t.label,attrs:{label:t.label}},e._l(t.options,(function(t){return a(\"el-option\",{key:t.__config__.label,attrs:{label:t.__config__.label,value:t.__config__.tagIcon}},[a(\"svg-icon\",{staticClass:\"node-icon\",attrs:{\"icon-class\":t.__config__.tagIcon}}),a(\"span\",[e._v(\" \"+e._s(t.__config__.label))])],1)})),1)})),1)],1):e._e(),void 0!==e.activeData.__vModel__?a(\"el-form-item\",{attrs:{label:\"字段名\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入字段名（v-model）\"},model:{value:e.activeData.__vModel__,callback:function(t){e.$set(e.activeData,\"__vModel__\",t)},expression:\"activeData.__vModel__\"}})],1):e._e(),void 0!==e.activeData.__config__.componentName?a(\"el-form-item\",{attrs:{label:\"组件名\"}},[e._v(\" \"+e._s(e.activeData.__config__.componentName)+\" \")]):e._e(),void 0!==e.activeData.__config__.label?a(\"el-form-item\",{attrs:{label:\"标题\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入标题\"},on:{input:e.changeRenderKey},model:{value:e.activeData.__config__.label,callback:function(t){e.$set(e.activeData.__config__,\"label\",t)},expression:\"activeData.__config__.label\"}})],1):e._e(),void 0!==e.activeData.placeholder?a(\"el-form-item\",{attrs:{label:\"占位提示\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入占位提示\"},on:{input:e.changeRenderKey},model:{value:e.activeData.placeholder,callback:function(t){e.$set(e.activeData,\"placeholder\",t)},expression:\"activeData.placeholder\"}})],1):e._e(),void 0!==e.activeData[\"start-placeholder\"]?a(\"el-form-item\",{attrs:{label:\"开始占位\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入占位提示\"},model:{value:e.activeData[\"start-placeholder\"],callback:function(t){e.$set(e.activeData,\"start-placeholder\",t)},expression:\"activeData['start-placeholder']\"}})],1):e._e(),void 0!==e.activeData[\"end-placeholder\"]?a(\"el-form-item\",{attrs:{label:\"结束占位\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入占位提示\"},model:{value:e.activeData[\"end-placeholder\"],callback:function(t){e.$set(e.activeData,\"end-placeholder\",t)},expression:\"activeData['end-placeholder']\"}})],1):e._e(),void 0!==e.activeData.__config__.span?a(\"el-form-item\",{attrs:{label:\"表单栅格\"}},[a(\"el-slider\",{attrs:{max:24,min:1,marks:{12:\"\"}},on:{change:e.spanChange},model:{value:e.activeData.__config__.span,callback:function(t){e.$set(e.activeData.__config__,\"span\",t)},expression:\"activeData.__config__.span\"}})],1):e._e(),\"rowFormItem\"===e.activeData.__config__.layout&&void 0!==e.activeData.gutter?a(\"el-form-item\",{attrs:{label:\"栅格间隔\"}},[a(\"el-input-number\",{attrs:{min:0,placeholder:\"栅格间隔\"},model:{value:e.activeData.gutter,callback:function(t){e.$set(e.activeData,\"gutter\",t)},expression:\"activeData.gutter\"}})],1):e._e(),\"rowFormItem\"===e.activeData.__config__.layout&&void 0!==e.activeData.type?a(\"el-form-item\",{attrs:{label:\"布局模式\"}},[a(\"el-radio-group\",{model:{value:e.activeData.type,callback:function(t){e.$set(e.activeData,\"type\",t)},expression:\"activeData.type\"}},[a(\"el-radio-button\",{attrs:{label:\"default\"}}),a(\"el-radio-button\",{attrs:{label:\"flex\"}})],1)],1):e._e(),void 0!==e.activeData.justify&&\"flex\"===e.activeData.type?a(\"el-form-item\",{attrs:{label:\"水平排列\"}},[a(\"el-select\",{style:{width:\"100%\"},attrs:{placeholder:\"请选择水平排列\"},model:{value:e.activeData.justify,callback:function(t){e.$set(e.activeData,\"justify\",t)},expression:\"activeData.justify\"}},e._l(e.justifyOptions,(function(e,t){return a(\"el-option\",{key:t,attrs:{label:e.label,value:e.value}})})),1)],1):e._e(),void 0!==e.activeData.align&&\"flex\"===e.activeData.type?a(\"el-form-item\",{attrs:{label:\"垂直排列\"}},[a(\"el-radio-group\",{model:{value:e.activeData.align,callback:function(t){e.$set(e.activeData,\"align\",t)},expression:\"activeData.align\"}},[a(\"el-radio-button\",{attrs:{label:\"top\"}}),a(\"el-radio-button\",{attrs:{label:\"middle\"}}),a(\"el-radio-button\",{attrs:{label:\"bottom\"}})],1)],1):e._e(),void 0!==e.activeData.__config__.labelWidth?a(\"el-form-item\",{attrs:{label:\"标签宽度\"}},[a(\"el-input\",{attrs:{type:\"number\",placeholder:\"请输入标签宽度\"},model:{value:e.activeData.__config__.labelWidth,callback:function(t){e.$set(e.activeData.__config__,\"labelWidth\",e._n(t))},expression:\"activeData.__config__.labelWidth\"}})],1):e._e(),e.activeData.style&&void 0!==e.activeData.style.width?a(\"el-form-item\",{attrs:{label:\"组件宽度\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入组件宽度\",clearable:\"\"},model:{value:e.activeData.style.width,callback:function(t){e.$set(e.activeData.style,\"width\",t)},expression:\"activeData.style.width\"}})],1):e._e(),void 0!==e.activeData.__vModel__?a(\"el-form-item\",{attrs:{label:\"默认值\"}},[a(\"el-input\",{attrs:{value:e.setDefaultValue(e.activeData.__config__.defaultValue),placeholder:\"请输入默认值\"},on:{input:e.onDefaultValueInput}})],1):e._e(),\"el-checkbox-group\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"至少应选\"}},[a(\"el-input-number\",{attrs:{value:e.activeData.min,min:0,placeholder:\"至少应选\"},on:{input:function(t){return e.$set(e.activeData,\"min\",t||void 0)}}})],1):e._e(),\"el-checkbox-group\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"最多可选\"}},[a(\"el-input-number\",{attrs:{value:e.activeData.max,min:0,placeholder:\"最多可选\"},on:{input:function(t){return e.$set(e.activeData,\"max\",t||void 0)}}})],1):e._e(),e.activeData.__slot__&&void 0!==e.activeData.__slot__.prepend?a(\"el-form-item\",{attrs:{label:\"前缀\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入前缀\"},model:{value:e.activeData.__slot__.prepend,callback:function(t){e.$set(e.activeData.__slot__,\"prepend\",t)},expression:\"activeData.__slot__.prepend\"}})],1):e._e(),e.activeData.__slot__&&void 0!==e.activeData.__slot__.append?a(\"el-form-item\",{attrs:{label:\"后缀\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入后缀\"},model:{value:e.activeData.__slot__.append,callback:function(t){e.$set(e.activeData.__slot__,\"append\",t)},expression:\"activeData.__slot__.append\"}})],1):e._e(),void 0!==e.activeData[\"prefix-icon\"]?a(\"el-form-item\",{attrs:{label:\"前图标\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入前图标名称\"},model:{value:e.activeData[\"prefix-icon\"],callback:function(t){e.$set(e.activeData,\"prefix-icon\",t)},expression:\"activeData['prefix-icon']\"}},[a(\"el-button\",{attrs:{slot:\"append\",icon:\"el-icon-thumb\"},on:{click:function(t){return e.openIconsDialog(\"prefix-icon\")}},slot:\"append\"},[e._v(\" 选择 \")])],1)],1):e._e(),void 0!==e.activeData[\"suffix-icon\"]?a(\"el-form-item\",{attrs:{label:\"后图标\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入后图标名称\"},model:{value:e.activeData[\"suffix-icon\"],callback:function(t){e.$set(e.activeData,\"suffix-icon\",t)},expression:\"activeData['suffix-icon']\"}},[a(\"el-button\",{attrs:{slot:\"append\",icon:\"el-icon-thumb\"},on:{click:function(t){return e.openIconsDialog(\"suffix-icon\")}},slot:\"append\"},[e._v(\" 选择 \")])],1)],1):e._e(),void 0!==e.activeData[\"icon\"]&&\"el-button\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"按钮图标\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入按钮图标名称\"},model:{value:e.activeData[\"icon\"],callback:function(t){e.$set(e.activeData,\"icon\",t)},expression:\"activeData['icon']\"}},[a(\"el-button\",{attrs:{slot:\"append\",icon:\"el-icon-thumb\"},on:{click:function(t){return e.openIconsDialog(\"icon\")}},slot:\"append\"},[e._v(\" 选择 \")])],1)],1):e._e(),\"el-cascader\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"选项分隔符\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入选项分隔符\"},model:{value:e.activeData.separator,callback:function(t){e.$set(e.activeData,\"separator\",t)},expression:\"activeData.separator\"}})],1):e._e(),void 0!==e.activeData.autosize?a(\"el-form-item\",{attrs:{label:\"最小行数\"}},[a(\"el-input-number\",{attrs:{min:1,placeholder:\"最小行数\"},model:{value:e.activeData.autosize.minRows,callback:function(t){e.$set(e.activeData.autosize,\"minRows\",t)},expression:\"activeData.autosize.minRows\"}})],1):e._e(),void 0!==e.activeData.autosize?a(\"el-form-item\",{attrs:{label:\"最大行数\"}},[a(\"el-input-number\",{attrs:{min:1,placeholder:\"最大行数\"},model:{value:e.activeData.autosize.maxRows,callback:function(t){e.$set(e.activeData.autosize,\"maxRows\",t)},expression:\"activeData.autosize.maxRows\"}})],1):e._e(),e.isShowMin?a(\"el-form-item\",{attrs:{label:\"最小值\"}},[a(\"el-input-number\",{attrs:{placeholder:\"最小值\"},model:{value:e.activeData.min,callback:function(t){e.$set(e.activeData,\"min\",t)},expression:\"activeData.min\"}})],1):e._e(),e.isShowMax?a(\"el-form-item\",{attrs:{label:\"最大值\"}},[a(\"el-input-number\",{attrs:{placeholder:\"最大值\"},model:{value:e.activeData.max,callback:function(t){e.$set(e.activeData,\"max\",t)},expression:\"activeData.max\"}})],1):e._e(),void 0!==e.activeData.height?a(\"el-form-item\",{attrs:{label:\"组件高度\"}},[a(\"el-input-number\",{attrs:{placeholder:\"高度\"},on:{input:e.changeRenderKey},model:{value:e.activeData.height,callback:function(t){e.$set(e.activeData,\"height\",t)},expression:\"activeData.height\"}})],1):e._e(),e.isShowStep?a(\"el-form-item\",{attrs:{label:\"步长\"}},[a(\"el-input-number\",{attrs:{placeholder:\"步数\"},model:{value:e.activeData.step,callback:function(t){e.$set(e.activeData,\"step\",t)},expression:\"activeData.step\"}})],1):e._e(),\"el-input-number\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"精度\"}},[a(\"el-input-number\",{attrs:{min:0,placeholder:\"精度\"},model:{value:e.activeData.precision,callback:function(t){e.$set(e.activeData,\"precision\",t)},expression:\"activeData.precision\"}})],1):e._e(),\"el-input-number\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"按钮位置\"}},[a(\"el-radio-group\",{model:{value:e.activeData[\"controls-position\"],callback:function(t){e.$set(e.activeData,\"controls-position\",t)},expression:\"activeData['controls-position']\"}},[a(\"el-radio-button\",{attrs:{label:\"\"}},[e._v(\" 默认 \")]),a(\"el-radio-button\",{attrs:{label:\"right\"}},[e._v(\" 右侧 \")])],1)],1):e._e(),void 0!==e.activeData.maxlength?a(\"el-form-item\",{attrs:{label:\"最多输入\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入字符长度\"},model:{value:e.activeData.maxlength,callback:function(t){e.$set(e.activeData,\"maxlength\",t)},expression:\"activeData.maxlength\"}},[a(\"template\",{slot:\"append\"},[e._v(\" 个字符 \")])],2)],1):e._e(),void 0!==e.activeData[\"active-text\"]?a(\"el-form-item\",{attrs:{label:\"开启提示\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入开启提示\"},model:{value:e.activeData[\"active-text\"],callback:function(t){e.$set(e.activeData,\"active-text\",t)},expression:\"activeData['active-text']\"}})],1):e._e(),void 0!==e.activeData[\"inactive-text\"]?a(\"el-form-item\",{attrs:{label:\"关闭提示\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入关闭提示\"},model:{value:e.activeData[\"inactive-text\"],callback:function(t){e.$set(e.activeData,\"inactive-text\",t)},expression:\"activeData['inactive-text']\"}})],1):e._e(),void 0!==e.activeData[\"active-value\"]?a(\"el-form-item\",{attrs:{label:\"开启值\"}},[a(\"el-input\",{attrs:{value:e.setDefaultValue(e.activeData[\"active-value\"]),placeholder:\"请输入开启值\"},on:{input:function(t){return e.onSwitchValueInput(t,\"active-value\")}}})],1):e._e(),void 0!==e.activeData[\"inactive-value\"]?a(\"el-form-item\",{attrs:{label:\"关闭值\"}},[a(\"el-input\",{attrs:{value:e.setDefaultValue(e.activeData[\"inactive-value\"]),placeholder:\"请输入关闭值\"},on:{input:function(t){return e.onSwitchValueInput(t,\"inactive-value\")}}})],1):e._e(),void 0!==e.activeData.type&&\"el-date-picker\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"时间类型\"}},[a(\"el-select\",{style:{width:\"100%\"},attrs:{placeholder:\"请选择时间类型\"},on:{change:e.dateTypeChange},model:{value:e.activeData.type,callback:function(t){e.$set(e.activeData,\"type\",t)},expression:\"activeData.type\"}},e._l(e.dateOptions,(function(e,t){return a(\"el-option\",{key:t,attrs:{label:e.label,value:e.value}})})),1)],1):e._e(),void 0!==e.activeData.name?a(\"el-form-item\",{attrs:{label:\"文件字段名\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入上传文件字段名\"},model:{value:e.activeData.name,callback:function(t){e.$set(e.activeData,\"name\",t)},expression:\"activeData.name\"}})],1):e._e(),void 0!==e.activeData.accept?a(\"el-form-item\",{attrs:{label:\"文件类型\"}},[a(\"el-select\",{style:{width:\"100%\"},attrs:{placeholder:\"请选择文件类型\",clearable:\"\"},model:{value:e.activeData.accept,callback:function(t){e.$set(e.activeData,\"accept\",t)},expression:\"activeData.accept\"}},[a(\"el-option\",{attrs:{label:\"图片\",value:\"image/*\"}}),a(\"el-option\",{attrs:{label:\"视频\",value:\"video/*\"}}),a(\"el-option\",{attrs:{label:\"音频\",value:\"audio/*\"}}),a(\"el-option\",{attrs:{label:\"excel\",value:\".xls,.xlsx\"}}),a(\"el-option\",{attrs:{label:\"word\",value:\".doc,.docx\"}}),a(\"el-option\",{attrs:{label:\"pdf\",value:\".pdf\"}}),a(\"el-option\",{attrs:{label:\"txt\",value:\".txt\"}})],1)],1):e._e(),void 0!==e.activeData.__config__.fileSize?a(\"el-form-item\",{attrs:{label:\"文件大小\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入文件大小\"},model:{value:e.activeData.__config__.fileSize,callback:function(t){e.$set(e.activeData.__config__,\"fileSize\",e._n(t))},expression:\"activeData.__config__.fileSize\"}},[a(\"el-select\",{style:{width:\"66px\"},attrs:{slot:\"append\"},slot:\"append\",model:{value:e.activeData.__config__.sizeUnit,callback:function(t){e.$set(e.activeData.__config__,\"sizeUnit\",t)},expression:\"activeData.__config__.sizeUnit\"}},[a(\"el-option\",{attrs:{label:\"KB\",value:\"KB\"}}),a(\"el-option\",{attrs:{label:\"MB\",value:\"MB\"}}),a(\"el-option\",{attrs:{label:\"GB\",value:\"GB\"}})],1)],1)],1):e._e(),void 0!==e.activeData.action?a(\"el-form-item\",{attrs:{label:\"上传地址\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入上传地址\",clearable:\"\"},model:{value:e.activeData.action,callback:function(t){e.$set(e.activeData,\"action\",t)},expression:\"activeData.action\"}})],1):e._e(),void 0!==e.activeData[\"list-type\"]?a(\"el-form-item\",{attrs:{label:\"列表类型\"}},[a(\"el-radio-group\",{attrs:{size:\"small\"},model:{value:e.activeData[\"list-type\"],callback:function(t){e.$set(e.activeData,\"list-type\",t)},expression:\"activeData['list-type']\"}},[a(\"el-radio-button\",{attrs:{label:\"text\"}},[e._v(\" text \")]),a(\"el-radio-button\",{attrs:{label:\"picture\"}},[e._v(\" picture \")]),a(\"el-radio-button\",{attrs:{label:\"picture-card\"}},[e._v(\" picture-card \")])],1)],1):e._e(),void 0!==e.activeData.type&&\"el-button\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"按钮类型\"}},[a(\"el-select\",{style:{width:\"100%\"},model:{value:e.activeData.type,callback:function(t){e.$set(e.activeData,\"type\",t)},expression:\"activeData.type\"}},[a(\"el-option\",{attrs:{label:\"primary\",value:\"primary\"}}),a(\"el-option\",{attrs:{label:\"success\",value:\"success\"}}),a(\"el-option\",{attrs:{label:\"warning\",value:\"warning\"}}),a(\"el-option\",{attrs:{label:\"danger\",value:\"danger\"}}),a(\"el-option\",{attrs:{label:\"info\",value:\"info\"}}),a(\"el-option\",{attrs:{label:\"text\",value:\"text\"}})],1)],1):e._e(),void 0!==e.activeData.__config__.buttonText?a(\"el-form-item\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"picture-card\"!==e.activeData[\"list-type\"],expression:\"'picture-card' !== activeData['list-type']\"}],attrs:{label:\"按钮文字\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入按钮文字\"},model:{value:e.activeData.__config__.buttonText,callback:function(t){e.$set(e.activeData.__config__,\"buttonText\",t)},expression:\"activeData.__config__.buttonText\"}})],1):e._e(),\"el-button\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"按钮文字\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入按钮文字\"},model:{value:e.activeData.__slot__.default,callback:function(t){e.$set(e.activeData.__slot__,\"default\",t)},expression:\"activeData.__slot__.default\"}})],1):e._e(),void 0!==e.activeData[\"range-separator\"]?a(\"el-form-item\",{attrs:{label:\"分隔符\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入分隔符\"},model:{value:e.activeData[\"range-separator\"],callback:function(t){e.$set(e.activeData,\"range-separator\",t)},expression:\"activeData['range-separator']\"}})],1):e._e(),void 0!==e.activeData[\"picker-options\"]?a(\"el-form-item\",{attrs:{label:\"时间段\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入时间段\"},model:{value:e.activeData[\"picker-options\"].selectableRange,callback:function(t){e.$set(e.activeData[\"picker-options\"],\"selectableRange\",t)},expression:\"activeData['picker-options'].selectableRange\"}})],1):e._e(),void 0!==e.activeData.format?a(\"el-form-item\",{attrs:{label:\"时间格式\"}},[a(\"el-input\",{attrs:{value:e.activeData.format,placeholder:\"请输入时间格式\"},on:{input:function(t){return e.setTimeValue(t)}}})],1):e._e(),[\"el-checkbox-group\",\"el-radio-group\",\"el-select\"].indexOf(e.activeData.__config__.tag)>-1?[a(\"el-divider\",[e._v(\"选项\")]),a(\"draggable\",{attrs:{list:e.activeData.__slot__.options,animation:340,group:\"selectItem\",handle:\".option-drag\"}},e._l(e.activeData.__slot__.options,(function(t,o){return a(\"div\",{key:o,staticClass:\"select-item\"},[a(\"div\",{staticClass:\"select-line-icon option-drag\"},[a(\"i\",{staticClass:\"el-icon-s-operation\"})]),a(\"el-input\",{attrs:{placeholder:\"选项名\",size:\"small\"},model:{value:t.label,callback:function(a){e.$set(t,\"label\",a)},expression:\"item.label\"}}),a(\"el-input\",{attrs:{placeholder:\"选项值\",size:\"small\",value:t.value},on:{input:function(a){return e.setOptionValue(t,a)}}}),a(\"div\",{staticClass:\"close-btn select-line-icon\",on:{click:function(t){return e.activeData.__slot__.options.splice(o,1)}}},[a(\"i\",{staticClass:\"el-icon-remove-outline\"})])],1)})),0),a(\"div\",{staticStyle:{\"margin-left\":\"20px\"}},[a(\"el-button\",{staticStyle:{\"padding-bottom\":\"0\"},attrs:{icon:\"el-icon-circle-plus-outline\",type:\"text\"},on:{click:e.addSelectItem}},[e._v(\" 添加选项 \")])],1),a(\"el-divider\")]:e._e(),[\"el-cascader\"].indexOf(e.activeData.__config__.tag)>-1?[a(\"el-divider\",[e._v(\"选项\")]),a(\"el-form-item\",{attrs:{label:\"数据类型\"}},[a(\"el-radio-group\",{attrs:{size:\"small\"},model:{value:e.activeData.__config__.dataType,callback:function(t){e.$set(e.activeData.__config__,\"dataType\",t)},expression:\"activeData.__config__.dataType\"}},[a(\"el-radio-button\",{attrs:{label:\"dynamic\"}},[e._v(\" 动态数据 \")]),a(\"el-radio-button\",{attrs:{label:\"static\"}},[e._v(\" 静态数据 \")])],1)],1),\"dynamic\"===e.activeData.__config__.dataType?[a(\"el-form-item\",{attrs:{label:\"标签键名\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入标签键名\"},model:{value:e.activeData.props.props.label,callback:function(t){e.$set(e.activeData.props.props,\"label\",t)},expression:\"activeData.props.props.label\"}})],1),a(\"el-form-item\",{attrs:{label:\"值键名\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入值键名\"},model:{value:e.activeData.props.props.value,callback:function(t){e.$set(e.activeData.props.props,\"value\",t)},expression:\"activeData.props.props.value\"}})],1),a(\"el-form-item\",{attrs:{label:\"子级键名\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入子级键名\"},model:{value:e.activeData.props.props.children,callback:function(t){e.$set(e.activeData.props.props,\"children\",t)},expression:\"activeData.props.props.children\"}})],1)]:e._e(),\"static\"===e.activeData.__config__.dataType?a(\"el-tree\",{attrs:{draggable:\"\",data:e.activeData.options,\"node-key\":\"id\",\"expand-on-click-node\":!1,\"render-content\":e.renderContent}}):e._e(),\"static\"===e.activeData.__config__.dataType?a(\"div\",{staticStyle:{\"margin-left\":\"20px\"}},[a(\"el-button\",{staticStyle:{\"padding-bottom\":\"0\"},attrs:{icon:\"el-icon-circle-plus-outline\",type:\"text\"},on:{click:e.addTreeItem}},[e._v(\" 添加父级 \")])],1):e._e(),a(\"el-divider\")]:e._e(),void 0!==e.activeData.__config__.optionType?a(\"el-form-item\",{attrs:{label:\"选项样式\"}},[a(\"el-radio-group\",{model:{value:e.activeData.__config__.optionType,callback:function(t){e.$set(e.activeData.__config__,\"optionType\",t)},expression:\"activeData.__config__.optionType\"}},[a(\"el-radio-button\",{attrs:{label:\"default\"}},[e._v(\" 默认 \")]),a(\"el-radio-button\",{attrs:{label:\"button\"}},[e._v(\" 按钮 \")])],1)],1):e._e(),void 0!==e.activeData[\"active-color\"]?a(\"el-form-item\",{attrs:{label:\"开启颜色\"}},[a(\"el-color-picker\",{model:{value:e.activeData[\"active-color\"],callback:function(t){e.$set(e.activeData,\"active-color\",t)},expression:\"activeData['active-color']\"}})],1):e._e(),void 0!==e.activeData[\"inactive-color\"]?a(\"el-form-item\",{attrs:{label:\"关闭颜色\"}},[a(\"el-color-picker\",{model:{value:e.activeData[\"inactive-color\"],callback:function(t){e.$set(e.activeData,\"inactive-color\",t)},expression:\"activeData['inactive-color']\"}})],1):e._e(),void 0!==e.activeData.__config__.showLabel&&void 0!==e.activeData.__config__.labelWidth?a(\"el-form-item\",{attrs:{label:\"显示标签\"}},[a(\"el-switch\",{model:{value:e.activeData.__config__.showLabel,callback:function(t){e.$set(e.activeData.__config__,\"showLabel\",t)},expression:\"activeData.__config__.showLabel\"}})],1):e._e(),void 0!==e.activeData.branding?a(\"el-form-item\",{attrs:{label:\"品牌烙印\"}},[a(\"el-switch\",{on:{input:e.changeRenderKey},model:{value:e.activeData.branding,callback:function(t){e.$set(e.activeData,\"branding\",t)},expression:\"activeData.branding\"}})],1):e._e(),void 0!==e.activeData[\"allow-half\"]?a(\"el-form-item\",{attrs:{label:\"允许半选\"}},[a(\"el-switch\",{model:{value:e.activeData[\"allow-half\"],callback:function(t){e.$set(e.activeData,\"allow-half\",t)},expression:\"activeData['allow-half']\"}})],1):e._e(),void 0!==e.activeData[\"show-text\"]?a(\"el-form-item\",{attrs:{label:\"辅助文字\"}},[a(\"el-switch\",{on:{change:e.rateTextChange},model:{value:e.activeData[\"show-text\"],callback:function(t){e.$set(e.activeData,\"show-text\",t)},expression:\"activeData['show-text']\"}})],1):e._e(),void 0!==e.activeData[\"show-score\"]?a(\"el-form-item\",{attrs:{label:\"显示分数\"}},[a(\"el-switch\",{on:{change:e.rateScoreChange},model:{value:e.activeData[\"show-score\"],callback:function(t){e.$set(e.activeData,\"show-score\",t)},expression:\"activeData['show-score']\"}})],1):e._e(),void 0!==e.activeData[\"show-stops\"]?a(\"el-form-item\",{attrs:{label:\"显示间断点\"}},[a(\"el-switch\",{model:{value:e.activeData[\"show-stops\"],callback:function(t){e.$set(e.activeData,\"show-stops\",t)},expression:\"activeData['show-stops']\"}})],1):e._e(),void 0!==e.activeData.range?a(\"el-form-item\",{attrs:{label:\"范围选择\"}},[a(\"el-switch\",{on:{change:e.rangeChange},model:{value:e.activeData.range,callback:function(t){e.$set(e.activeData,\"range\",t)},expression:\"activeData.range\"}})],1):e._e(),void 0!==e.activeData.__config__.border&&\"default\"===e.activeData.__config__.optionType?a(\"el-form-item\",{attrs:{label:\"是否带边框\"}},[a(\"el-switch\",{model:{value:e.activeData.__config__.border,callback:function(t){e.$set(e.activeData.__config__,\"border\",t)},expression:\"activeData.__config__.border\"}})],1):e._e(),\"el-color-picker\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"颜色格式\"}},[a(\"el-select\",{style:{width:\"100%\"},attrs:{placeholder:\"请选择颜色格式\",clearable:\"\"},on:{change:e.colorFormatChange},model:{value:e.activeData[\"color-format\"],callback:function(t){e.$set(e.activeData,\"color-format\",t)},expression:\"activeData['color-format']\"}},e._l(e.colorFormatOptions,(function(e,t){return a(\"el-option\",{key:t,attrs:{label:e.label,value:e.value}})})),1)],1):e._e(),void 0===e.activeData.size||\"button\"!==e.activeData.__config__.optionType&&!e.activeData.__config__.border&&\"el-color-picker\"!==e.activeData.__config__.tag&&\"el-button\"!==e.activeData.__config__.tag?e._e():a(\"el-form-item\",{attrs:{label:\"组件尺寸\"}},[a(\"el-radio-group\",{model:{value:e.activeData.size,callback:function(t){e.$set(e.activeData,\"size\",t)},expression:\"activeData.size\"}},[a(\"el-radio-button\",{attrs:{label:\"medium\"}},[e._v(\" 中等 \")]),a(\"el-radio-button\",{attrs:{label:\"small\"}},[e._v(\" 较小 \")]),a(\"el-radio-button\",{attrs:{label:\"mini\"}},[e._v(\" 迷你 \")])],1)],1),void 0!==e.activeData[\"show-word-limit\"]?a(\"el-form-item\",{attrs:{label:\"输入统计\"}},[a(\"el-switch\",{model:{value:e.activeData[\"show-word-limit\"],callback:function(t){e.$set(e.activeData,\"show-word-limit\",t)},expression:\"activeData['show-word-limit']\"}})],1):e._e(),\"el-input-number\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"严格步数\"}},[a(\"el-switch\",{model:{value:e.activeData[\"step-strictly\"],callback:function(t){e.$set(e.activeData,\"step-strictly\",t)},expression:\"activeData['step-strictly']\"}})],1):e._e(),\"el-cascader\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"是否多选\"}},[a(\"el-switch\",{model:{value:e.activeData.props.props.multiple,callback:function(t){e.$set(e.activeData.props.props,\"multiple\",t)},expression:\"activeData.props.props.multiple\"}})],1):e._e(),\"el-cascader\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"展示全路径\"}},[a(\"el-switch\",{model:{value:e.activeData[\"show-all-levels\"],callback:function(t){e.$set(e.activeData,\"show-all-levels\",t)},expression:\"activeData['show-all-levels']\"}})],1):e._e(),\"el-cascader\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"可否筛选\"}},[a(\"el-switch\",{model:{value:e.activeData.filterable,callback:function(t){e.$set(e.activeData,\"filterable\",t)},expression:\"activeData.filterable\"}})],1):e._e(),void 0!==e.activeData.clearable?a(\"el-form-item\",{attrs:{label:\"能否清空\"}},[a(\"el-switch\",{model:{value:e.activeData.clearable,callback:function(t){e.$set(e.activeData,\"clearable\",t)},expression:\"activeData.clearable\"}})],1):e._e(),void 0!==e.activeData.__config__.showTip?a(\"el-form-item\",{attrs:{label:\"显示提示\"}},[a(\"el-switch\",{model:{value:e.activeData.__config__.showTip,callback:function(t){e.$set(e.activeData.__config__,\"showTip\",t)},expression:\"activeData.__config__.showTip\"}})],1):e._e(),\"el-upload\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"多选文件\"}},[a(\"el-switch\",{model:{value:e.activeData.multiple,callback:function(t){e.$set(e.activeData,\"multiple\",t)},expression:\"activeData.multiple\"}})],1):e._e(),void 0!==e.activeData[\"auto-upload\"]?a(\"el-form-item\",{attrs:{label:\"自动上传\"}},[a(\"el-switch\",{model:{value:e.activeData[\"auto-upload\"],callback:function(t){e.$set(e.activeData,\"auto-upload\",t)},expression:\"activeData['auto-upload']\"}})],1):e._e(),void 0!==e.activeData.readonly?a(\"el-form-item\",{attrs:{label:\"是否只读\"}},[a(\"el-switch\",{model:{value:e.activeData.readonly,callback:function(t){e.$set(e.activeData,\"readonly\",t)},expression:\"activeData.readonly\"}})],1):e._e(),void 0!==e.activeData.disabled?a(\"el-form-item\",{attrs:{label:\"是否禁用\"}},[a(\"el-switch\",{model:{value:e.activeData.disabled,callback:function(t){e.$set(e.activeData,\"disabled\",t)},expression:\"activeData.disabled\"}})],1):e._e(),\"el-select\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"能否搜索\"}},[a(\"el-switch\",{model:{value:e.activeData.filterable,callback:function(t){e.$set(e.activeData,\"filterable\",t)},expression:\"activeData.filterable\"}})],1):e._e(),\"el-select\"===e.activeData.__config__.tag?a(\"el-form-item\",{attrs:{label:\"是否多选\"}},[a(\"el-switch\",{on:{change:e.multipleChange},model:{value:e.activeData.multiple,callback:function(t){e.$set(e.activeData,\"multiple\",t)},expression:\"activeData.multiple\"}})],1):e._e(),void 0!==e.activeData.__config__.required?a(\"el-form-item\",{attrs:{label:\"是否必填\"}},[a(\"el-switch\",{model:{value:e.activeData.__config__.required,callback:function(t){e.$set(e.activeData.__config__,\"required\",t)},expression:\"activeData.__config__.required\"}})],1):e._e(),e.activeData.__config__.layoutTree?[a(\"el-divider\",[e._v(\"布局结构树\")]),a(\"el-tree\",{attrs:{data:[e.activeData.__config__],props:e.layoutTreeProps,\"node-key\":\"renderKey\",\"default-expand-all\":\"\",draggable:\"\"},scopedSlots:e._u([{key:\"default\",fn:function(t){var o=t.node,n=t.data;return a(\"span\",{},[a(\"span\",{staticClass:\"node-label\"},[a(\"svg-icon\",{staticClass:\"node-icon\",attrs:{\"icon-class\":n.__config__?n.__config__.tagIcon:n.tagIcon}}),e._v(\" \"+e._s(o.label)+\" \")],1)])}}],null,!1,3924665115)})]:e._e(),Array.isArray(e.activeData.__config__.regList)?[a(\"el-divider\",[e._v(\"正则校验\")]),e._l(e.activeData.__config__.regList,(function(t,o){return a(\"div\",{key:o,staticClass:\"reg-item\"},[a(\"span\",{staticClass:\"close-btn\",on:{click:function(t){return e.activeData.__config__.regList.splice(o,1)}}},[a(\"i\",{staticClass:\"el-icon-close\"})]),a(\"el-form-item\",{attrs:{label:\"表达式\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入正则\"},model:{value:t.pattern,callback:function(a){e.$set(t,\"pattern\",a)},expression:\"item.pattern\"}})],1),a(\"el-form-item\",{staticStyle:{\"margin-bottom\":\"0\"},attrs:{label:\"错误提示\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入错误提示\"},model:{value:t.message,callback:function(a){e.$set(t,\"message\",a)},expression:\"item.message\"}})],1)],1)})),a(\"div\",{staticStyle:{\"margin-left\":\"20px\"}},[a(\"el-button\",{attrs:{icon:\"el-icon-circle-plus-outline\",type:\"text\"},on:{click:e.addReg}},[e._v(\" 添加规则 \")])],1)]:e._e()],2),a(\"el-form\",{directives:[{name:\"show\",rawName:\"v-show\",value:\"form\"===e.currentTab,expression:\"currentTab === 'form'\"}],attrs:{size:\"small\",\"label-width\":\"90px\"}},[a(\"el-form-item\",{attrs:{label:\"表单名\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入表单名（ref）\"},model:{value:e.formConf.formRef,callback:function(t){e.$set(e.formConf,\"formRef\",t)},expression:\"formConf.formRef\"}})],1),a(\"el-form-item\",{attrs:{label:\"表单模型\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入数据模型\"},model:{value:e.formConf.formModel,callback:function(t){e.$set(e.formConf,\"formModel\",t)},expression:\"formConf.formModel\"}})],1),a(\"el-form-item\",{attrs:{label:\"校验模型\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入校验模型\"},model:{value:e.formConf.formRules,callback:function(t){e.$set(e.formConf,\"formRules\",t)},expression:\"formConf.formRules\"}})],1),a(\"el-form-item\",{attrs:{label:\"表单尺寸\"}},[a(\"el-radio-group\",{model:{value:e.formConf.size,callback:function(t){e.$set(e.formConf,\"size\",t)},expression:\"formConf.size\"}},[a(\"el-radio-button\",{attrs:{label:\"medium\"}},[e._v(\" 中等 \")]),a(\"el-radio-button\",{attrs:{label:\"small\"}},[e._v(\" 较小 \")]),a(\"el-radio-button\",{attrs:{label:\"mini\"}},[e._v(\" 迷你 \")])],1)],1),a(\"el-form-item\",{attrs:{label:\"标签对齐\"}},[a(\"el-radio-group\",{model:{value:e.formConf.labelPosition,callback:function(t){e.$set(e.formConf,\"labelPosition\",t)},expression:\"formConf.labelPosition\"}},[a(\"el-radio-button\",{attrs:{label:\"left\"}},[e._v(\" 左对齐 \")]),a(\"el-radio-button\",{attrs:{label:\"right\"}},[e._v(\" 右对齐 \")]),a(\"el-radio-button\",{attrs:{label:\"top\"}},[e._v(\" 顶部对齐 \")])],1)],1),a(\"el-form-item\",{attrs:{label:\"标签宽度\"}},[a(\"el-input\",{attrs:{type:\"number\",placeholder:\"请输入标签宽度\"},model:{value:e.formConf.labelWidth,callback:function(t){e.$set(e.formConf,\"labelWidth\",e._n(t))},expression:\"formConf.labelWidth\"}})],1),a(\"el-form-item\",{attrs:{label:\"栅格间隔\"}},[a(\"el-input-number\",{attrs:{min:0,placeholder:\"栅格间隔\"},model:{value:e.formConf.gutter,callback:function(t){e.$set(e.formConf,\"gutter\",t)},expression:\"formConf.gutter\"}})],1),a(\"el-form-item\",{attrs:{label:\"禁用表单\"}},[a(\"el-switch\",{model:{value:e.formConf.disabled,callback:function(t){e.$set(e.formConf,\"disabled\",t)},expression:\"formConf.disabled\"}})],1),a(\"el-form-item\",{attrs:{label:\"表单按钮\"}},[a(\"el-switch\",{model:{value:e.formConf.formBtns,callback:function(t){e.$set(e.formConf,\"formBtns\",t)},expression:\"formConf.formBtns\"}})],1),a(\"el-form-item\",{attrs:{label:\"显示未选中组件边框\"}},[a(\"el-switch\",{model:{value:e.formConf.unFocusedComponentBorder,callback:function(t){e.$set(e.formConf,\"unFocusedComponentBorder\",t)},expression:\"formConf.unFocusedComponentBorder\"}})],1)],1)],1)],1),a(\"treeNode-dialog\",{attrs:{visible:e.dialogVisible,title:\"添加选项\"},on:{\"update:visible\":function(t){e.dialogVisible=t},commit:e.addNode}}),a(\"icons-dialog\",{attrs:{visible:e.iconsVisible,current:e.activeData[e.currentIconModel]},on:{\"update:visible\":function(t){e.iconsVisible=t},select:e.setIcon}})],1)},Ie=[],Le=(a(\"7db0\"),a(\"caad\"),a(\"1276\"),a(\"3022\")),je=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a(\"div\",[a(\"el-dialog\",e._g(e._b({attrs:{\"close-on-click-modal\":!1,\"modal-append-to-body\":!1},on:{open:e.onOpen,close:e.onClose}},\"el-dialog\",e.$attrs,!1),e.$listeners),[a(\"el-row\",{attrs:{gutter:0}},[a(\"el-form\",{ref:\"elForm\",attrs:{model:e.formData,rules:e.rules,size:\"small\",\"label-width\":\"100px\"}},[a(\"el-col\",{attrs:{span:24}},[a(\"el-form-item\",{attrs:{label:\"选项名\",prop:\"label\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入选项名\",clearable:\"\"},model:{value:e.formData.label,callback:function(t){e.$set(e.formData,\"label\",t)},expression:\"formData.label\"}})],1)],1),a(\"el-col\",{attrs:{span:24}},[a(\"el-form-item\",{attrs:{label:\"选项值\",prop:\"value\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入选项值\",clearable:\"\"},model:{value:e.formData.value,callback:function(t){e.$set(e.formData,\"value\",t)},expression:\"formData.value\"}},[a(\"el-select\",{style:{width:\"100px\"},attrs:{slot:\"append\"},slot:\"append\",model:{value:e.dataType,callback:function(t){e.dataType=t},expression:\"dataType\"}},e._l(e.dataTypeOptions,(function(e,t){return a(\"el-option\",{key:t,attrs:{label:e.label,value:e.value,disabled:e.disabled}})})),1)],1)],1)],1)],1)],1),a(\"div\",{attrs:{slot:\"footer\"},slot:\"footer\"},[a(\"el-button\",{attrs:{type:\"primary\"},on:{click:e.handelConfirm}},[e._v(\" 确定 \")]),a(\"el-button\",{on:{click:e.close}},[e._v(\" 取消 \")])],1)],1)],1)},Te=[],ze=\"drawingItems\",Pe=\"1.1\",$e=\"DRAWING_ITEMS_VERSION\",Be=\"idGlobal\",Re=\"treeNodeId\",Ae=\"formConf\";function Se(){var e=localStorage.getItem($e);if(e!==Pe)return localStorage.setItem($e,Pe),Ve([]),null;var t=localStorage.getItem(ze);return t?JSON.parse(t):null}function Ve(e){localStorage.setItem(ze,JSON.stringify(e))}function Ne(){var e=localStorage.getItem(Be);return e?parseInt(e,10):100}function Fe(e){localStorage.setItem(Be,\"\".concat(e))}function qe(){var e=localStorage.getItem(Re);return e?parseInt(e,10):100}function We(e){localStorage.setItem(Re,\"\".concat(e))}function Ue(){var e=localStorage.getItem(Ae);return e?JSON.parse(e):null}function Ke(e){localStorage.setItem(Ae,JSON.stringify(e))}var He=qe(),Ge={components:{},inheritAttrs:!1,props:[],data:function(){return{id:He,formData:{label:void 0,value:void 0},rules:{label:[{required:!0,message:\"请输入选项名\",trigger:\"blur\"}],value:[{required:!0,message:\"请输入选项值\",trigger:\"blur\"}]},dataType:\"string\",dataTypeOptions:[{label:\"字符串\",value:\"string\"},{label:\"数字\",value:\"number\"}]}},computed:{},watch:{\"formData.value\":function(e){this.dataType=Object(ee[\"d\"])(e)?\"number\":\"string\"},id:function(e){We(e)}},created:function(){},mounted:function(){},methods:{onOpen:function(){this.formData={label:void 0,value:void 0}},onClose:function(){},close:function(){this.$emit(\"update:visible\",!1)},handelConfirm:function(){var e=this;this.$refs.elForm.validate((function(t){t&&(\"number\"===e.dataType&&(e.formData.value=parseFloat(e.formData.value)),e.formData.id=e.id++,e.$emit(\"commit\",e.formData),e.close())}))}}},Je=Ge,Ye=Object(d[\"a\"])(Je,je,Te,!1,null,\"454850e0\",null),Ze=Ye.exports,Qe=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a(\"div\",{staticClass:\"icon-dialog\"},[a(\"el-dialog\",e._g(e._b({attrs:{width:\"980px\",\"modal-append-to-body\":!1},on:{open:e.onOpen,close:e.onClose}},\"el-dialog\",e.$attrs,!1),e.$listeners),[a(\"div\",{attrs:{slot:\"title\"},slot:\"title\"},[e._v(\" 选择图标 \"),a(\"el-input\",{style:{width:\"260px\"},attrs:{size:\"mini\",placeholder:\"请输入图标名称\",\"prefix-icon\":\"el-icon-search\",clearable:\"\"},model:{value:e.key,callback:function(t){e.key=t},expression:\"key\"}})],1),a(\"ul\",{staticClass:\"icon-ul\"},e._l(e.iconList,(function(t){return a(\"li\",{key:t,class:e.active===t?\"active-item\":\"\",on:{click:function(a){return e.onSelect(t)}}},[a(\"i\",{class:t}),a(\"div\",[e._v(e._s(t))])])})),0)])],1)},Xe=[],et=a(\"cfcd\"),tt=et.map((function(e){return\"el-icon-\".concat(e)})),at={inheritAttrs:!1,props:[\"current\"],data:function(){return{iconList:tt,active:null,key:\"\"}},watch:{key:function(e){this.iconList=e?tt.filter((function(t){return t.indexOf(e)>-1})):tt}},methods:{onOpen:function(){this.active=this.current,this.key=\"\"},onClose:function(){},onSelect:function(e){this.active=e,this.$emit(\"select\",e),this.$emit(\"update:visible\",!1)}}},ot=at,nt=(a(\"d8d7\"),Object(d[\"a\"])(ot,Qe,Xe,!1,null,\"3ba3d51c\",null)),it=nt.exports,lt={formRef:\"elForm\",formModel:\"formData\",size:\"medium\",labelPosition:\"right\",labelWidth:100,formRules:\"rules\",gutter:15,disabled:!1,span:24,formBtns:!0},ct=[{__config__:{label:\"单行文本\",labelWidth:null,showLabel:!0,changeTag:!0,tag:\"el-input\",tagIcon:\"input\",defaultValue:void 0,required:!0,layout:\"colFormItem\",span:24,document:\"https://element.eleme.cn/#/zh-CN/component/input\",regList:[]},__slot__:{prepend:\"\",append:\"\"},placeholder:\"请输入\",style:{width:\"100%\"},clearable:!0,\"prefix-icon\":\"\",\"suffix-icon\":\"\",maxlength:null,\"show-word-limit\":!1,readonly:!1,disabled:!1},{__config__:{label:\"多行文本\",labelWidth:null,showLabel:!0,tag:\"el-input\",tagIcon:\"textarea\",defaultValue:void 0,required:!0,layout:\"colFormItem\",span:24,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/input\"},type:\"textarea\",placeholder:\"请输入\",autosize:{minRows:4,maxRows:4},style:{width:\"100%\"},maxlength:null,\"show-word-limit\":!1,readonly:!1,disabled:!1},{__config__:{label:\"密码\",showLabel:!0,labelWidth:null,changeTag:!0,tag:\"el-input\",tagIcon:\"password\",defaultValue:void 0,layout:\"colFormItem\",span:24,required:!0,regList:[],document:\"https://element.eleme.cn/#/zh-CN/component/input\"},__slot__:{prepend:\"\",append:\"\"},placeholder:\"请输入\",\"show-password\":!0,style:{width:\"100%\"},clearable:!0,\"prefix-icon\":\"\",\"suffix-icon\":\"\",maxlength:null,\"show-word-limit\":!1,readonly:!1,disabled:!1},{__config__:{label:\"计数器\",showLabel:!0,changeTag:!0,labelWidth:null,tag:\"el-input-number\",tagIcon:\"number\",defaultValue:void 0,span:24,layout:\"colFormItem\",required:!0,regList:[],document:\"https://element.eleme.cn/#/zh-CN/component/input-number\"},placeholder:\"\",min:void 0,max:void 0,step:1,\"step-strictly\":!1,precision:void 0,\"controls-position\":\"\",disabled:!1},{__config__:{label:\"编辑器\",showLabel:!0,changeTag:!0,labelWidth:null,tag:\"tinymce\",tagIcon:\"rich-text\",defaultValue:null,span:24,layout:\"colFormItem\",required:!0,regList:[],document:\"http://tinymce.ax-z.cn\"},placeholder:\"请输入\",height:300,branding:!1}],rt=[{__config__:{label:\"下拉选择\",showLabel:!0,labelWidth:null,tag:\"el-select\",tagIcon:\"select\",layout:\"colFormItem\",span:24,required:!0,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/select\"},__slot__:{options:[{label:\"选项一\",value:1},{label:\"选项二\",value:2}]},placeholder:\"请选择\",style:{width:\"100%\"},clearable:!0,disabled:!1,filterable:!1,multiple:!1},{__config__:{label:\"级联选择\",showLabel:!0,labelWidth:null,tag:\"el-cascader\",tagIcon:\"cascader\",layout:\"colFormItem\",defaultValue:[],dataType:\"dynamic\",span:24,required:!0,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/cascader\"},options:[{id:1,value:1,label:\"选项1\",children:[{id:2,value:2,label:\"选项1-1\"}]}],placeholder:\"请选择\",style:{width:\"100%\"},props:{props:{multiple:!1,label:\"label\",value:\"value\",children:\"children\"}},\"show-all-levels\":!0,disabled:!1,clearable:!0,filterable:!1,separator:\"/\"},{__config__:{label:\"单选框组\",labelWidth:null,showLabel:!0,tag:\"el-radio-group\",tagIcon:\"radio\",changeTag:!0,defaultValue:void 0,layout:\"colFormItem\",span:24,optionType:\"default\",regList:[],required:!0,border:!1,document:\"https://element.eleme.cn/#/zh-CN/component/radio\"},__slot__:{options:[{label:\"选项一\",value:1},{label:\"选项二\",value:2}]},style:{},size:\"medium\",disabled:!1},{__config__:{label:\"多选框组\",tag:\"el-checkbox-group\",tagIcon:\"checkbox\",defaultValue:[],span:24,showLabel:!0,labelWidth:null,layout:\"colFormItem\",optionType:\"default\",required:!0,regList:[],changeTag:!0,border:!1,document:\"https://element.eleme.cn/#/zh-CN/component/checkbox\"},__slot__:{options:[{label:\"选项一\",value:1},{label:\"选项二\",value:2}]},style:{},size:\"medium\",min:null,max:null,disabled:!1},{__config__:{label:\"开关\",tag:\"el-switch\",tagIcon:\"switch\",defaultValue:!1,span:24,showLabel:!0,labelWidth:null,layout:\"colFormItem\",required:!0,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/switch\"},style:{},disabled:!1,\"active-text\":\"\",\"inactive-text\":\"\",\"active-color\":null,\"inactive-color\":null,\"active-value\":!0,\"inactive-value\":!1},{__config__:{label:\"滑块\",tag:\"el-slider\",tagIcon:\"slider\",defaultValue:null,span:24,showLabel:!0,layout:\"colFormItem\",labelWidth:null,required:!0,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/slider\"},disabled:!1,min:0,max:100,step:1,\"show-stops\":!1,range:!1},{__config__:{label:\"时间选择\",tag:\"el-time-picker\",tagIcon:\"time\",defaultValue:null,span:24,showLabel:!0,layout:\"colFormItem\",labelWidth:null,required:!0,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/time-picker\"},placeholder:\"请选择\",style:{width:\"100%\"},disabled:!1,clearable:!0,\"picker-options\":{selectableRange:\"00:00:00-23:59:59\"},format:\"HH:mm:ss\",\"value-format\":\"HH:mm:ss\"},{__config__:{label:\"时间范围\",tag:\"el-time-picker\",tagIcon:\"time-range\",span:24,showLabel:!0,labelWidth:null,layout:\"colFormItem\",defaultValue:null,required:!0,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/time-picker\"},style:{width:\"100%\"},disabled:!1,clearable:!0,\"is-range\":!0,\"range-separator\":\"至\",\"start-placeholder\":\"开始时间\",\"end-placeholder\":\"结束时间\",format:\"HH:mm:ss\",\"value-format\":\"HH:mm:ss\"},{__config__:{label:\"日期选择\",tag:\"el-date-picker\",tagIcon:\"date\",defaultValue:null,showLabel:!0,labelWidth:null,span:24,layout:\"colFormItem\",required:!0,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/date-picker\"},placeholder:\"请选择\",type:\"date\",style:{width:\"100%\"},disabled:!1,clearable:!0,format:\"yyyy-MM-dd\",\"value-format\":\"yyyy-MM-dd\",readonly:!1},{__config__:{label:\"日期范围\",tag:\"el-date-picker\",tagIcon:\"date-range\",defaultValue:null,span:24,showLabel:!0,labelWidth:null,required:!0,layout:\"colFormItem\",regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/date-picker\"},style:{width:\"100%\"},type:\"daterange\",\"range-separator\":\"至\",\"start-placeholder\":\"开始日期\",\"end-placeholder\":\"结束日期\",disabled:!1,clearable:!0,format:\"yyyy-MM-dd\",\"value-format\":\"yyyy-MM-dd\",readonly:!1},{__config__:{label:\"评分\",tag:\"el-rate\",tagIcon:\"rate\",defaultValue:0,span:24,showLabel:!0,labelWidth:null,layout:\"colFormItem\",required:!0,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/rate\"},style:{},max:5,\"allow-half\":!1,\"show-text\":!1,\"show-score\":!1,disabled:!1},{__config__:{label:\"颜色选择\",tag:\"el-color-picker\",tagIcon:\"color\",span:24,defaultValue:null,showLabel:!0,labelWidth:null,layout:\"colFormItem\",required:!0,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/color-picker\"},\"show-alpha\":!1,\"color-format\":\"\",disabled:!1,size:\"medium\"},{__config__:{label:\"上传\",tag:\"el-upload\",tagIcon:\"upload\",layout:\"colFormItem\",defaultValue:null,showLabel:!0,labelWidth:null,required:!0,span:24,showTip:!1,buttonText:\"点击上传\",regList:[],changeTag:!0,fileSize:2,sizeUnit:\"MB\",document:\"https://element.eleme.cn/#/zh-CN/component/upload\"},__slot__:{\"list-type\":!0},action:\"https://jsonplaceholder.typicode.com/posts/\",disabled:!1,accept:\"\",name:\"file\",\"auto-upload\":!0,\"list-type\":\"text\",multiple:!1}],st=[{__config__:{layout:\"rowFormItem\",tagIcon:\"row\",label:\"行容器\",layoutTree:!0,document:\"https://element.eleme.cn/#/zh-CN/component/layout#row-attributes\"},type:\"default\",justify:\"start\",align:\"top\"},{__config__:{label:\"按钮\",showLabel:!0,changeTag:!0,labelWidth:null,tag:\"el-button\",tagIcon:\"button\",span:24,layout:\"colFormItem\",document:\"https://element.eleme.cn/#/zh-CN/component/button\"},__slot__:{default:\"主要按钮\"},type:\"primary\",icon:\"el-icon-search\",round:!1,size:\"medium\",plain:!1,circle:!1,disabled:!1}],ut={date:\"yyyy-MM-dd\",week:\"yyyy 第 WW 周\",month:\"yyyy-MM\",year:\"yyyy\",datetime:\"yyyy-MM-dd HH:mm:ss\",daterange:\"yyyy-MM-dd\",monthrange:\"yyyy-MM\",datetimerange:\"yyyy-MM-dd HH:mm:ss\"},dt=[\"tinymce\"],_t={components:{TreeNodeDialog:Ze,IconsDialog:it},props:[\"showField\",\"activeData\",\"formConf\"],data:function(){return{currentTab:\"field\",currentNode:null,dialogVisible:!1,iconsVisible:!1,currentIconModel:null,dateTypeOptions:[{label:\"日(date)\",value:\"date\"},{label:\"周(week)\",value:\"week\"},{label:\"月(month)\",value:\"month\"},{label:\"年(year)\",value:\"year\"},{label:\"日期时间(datetime)\",value:\"datetime\"}],dateRangeTypeOptions:[{label:\"日期范围(daterange)\",value:\"daterange\"},{label:\"月范围(monthrange)\",value:\"monthrange\"},{label:\"日期时间范围(datetimerange)\",value:\"datetimerange\"}],colorFormatOptions:[{label:\"hex\",value:\"hex\"},{label:\"rgb\",value:\"rgb\"},{label:\"rgba\",value:\"rgba\"},{label:\"hsv\",value:\"hsv\"},{label:\"hsl\",value:\"hsl\"}],justifyOptions:[{label:\"start\",value:\"start\"},{label:\"end\",value:\"end\"},{label:\"center\",value:\"center\"},{label:\"space-around\",value:\"space-around\"},{label:\"space-between\",value:\"space-between\"}],layoutTreeProps:{label:function(e,t){var a=e.__config__;return e.componentName||\"\".concat(a.label,\": \").concat(e.__vModel__)}}}},computed:{documentLink:function(){return this.activeData.__config__.document||\"https://element.eleme.cn/#/zh-CN/component/installation\"},dateOptions:function(){return void 0!==this.activeData.type&&\"el-date-picker\"===this.activeData.__config__.tag?void 0===this.activeData[\"start-placeholder\"]?this.dateTypeOptions:this.dateRangeTypeOptions:[]},tagList:function(){return[{label:\"输入型组件\",options:ct},{label:\"选择型组件\",options:rt}]},activeTag:function(){return this.activeData.__config__.tag},isShowMin:function(){return[\"el-input-number\",\"el-slider\"].indexOf(this.activeTag)>-1},isShowMax:function(){return[\"el-input-number\",\"el-slider\",\"el-rate\"].indexOf(this.activeTag)>-1},isShowStep:function(){return[\"el-input-number\",\"el-slider\"].indexOf(this.activeTag)>-1}},watch:{formConf:{handler:function(e){Ke(e)},deep:!0}},methods:{addReg:function(){this.activeData.__config__.regList.push({pattern:\"\",message:\"\"})},addSelectItem:function(){this.activeData.__slot__.options.push({label:\"\",value:\"\"})},addTreeItem:function(){++this.idGlobal,this.dialogVisible=!0,this.currentNode=this.activeData.options},renderContent:function(e,t){var a=this,o=t.node,n=t.data;t.store;return e(\"div\",{class:\"custom-tree-node\"},[e(\"span\",[o.label]),e(\"span\",{class:\"node-operation\"},[e(\"i\",{on:{click:function(){return a.append(n)}},class:\"el-icon-plus\",attrs:{title:\"添加\"}}),e(\"i\",{on:{click:function(){return a.remove(o,n)}},class:\"el-icon-delete\",attrs:{title:\"删除\"}})])])},append:function(e){e.children||this.$set(e,\"children\",[]),this.dialogVisible=!0,this.currentNode=e.children},remove:function(e,t){this.activeData.__config__.defaultValue=[];var a=e.parent,o=a.data.children||a.data,n=o.findIndex((function(e){return e.id===t.id}));o.splice(n,1)},addNode:function(e){this.currentNode.push(e)},setOptionValue:function(e,t){e.value=Object(ee[\"d\"])(t)?+t:t},setDefaultValue:function(e){return Array.isArray(e)?e.join(\",\"):\"boolean\"===typeof e?\"\".concat(e):e},onDefaultValueInput:function(e){Object(Le[\"isArray\"])(this.activeData.__config__.defaultValue)?this.$set(this.activeData.__config__,\"defaultValue\",e.split(\",\").map((function(e){return Object(ee[\"d\"])(e)?+e:e}))):[\"true\",\"false\"].indexOf(e)>-1?this.$set(this.activeData.__config__,\"defaultValue\",JSON.parse(e)):this.$set(this.activeData.__config__,\"defaultValue\",Object(ee[\"d\"])(e)?+e:e)},onSwitchValueInput:function(e,t){[\"true\",\"false\"].indexOf(e)>-1?this.$set(this.activeData,t,JSON.parse(e)):this.$set(this.activeData,t,Object(ee[\"d\"])(e)?+e:e)},setTimeValue:function(e,t){var a=\"week\"===t?ut.date:e;this.$set(this.activeData.__config__,\"defaultValue\",null),this.$set(this.activeData,\"value-format\",a),this.$set(this.activeData,\"format\",e)},spanChange:function(e){this.formConf.span=e},multipleChange:function(e){this.$set(this.activeData.__config__,\"defaultValue\",e?[]:\"\")},dateTypeChange:function(e){this.setTimeValue(ut[e],e)},rangeChange:function(e){this.$set(this.activeData.__config__,\"defaultValue\",e?[this.activeData.min,this.activeData.max]:this.activeData.min)},rateTextChange:function(e){e&&(this.activeData[\"show-score\"]=!1)},rateScoreChange:function(e){e&&(this.activeData[\"show-text\"]=!1)},colorFormatChange:function(e){this.activeData.__config__.defaultValue=null,this.activeData[\"show-alpha\"]=e.indexOf(\"a\")>-1,this.activeData.__config__.renderKey=+new Date},openIconsDialog:function(e){this.iconsVisible=!0,this.currentIconModel=e},setIcon:function(e){this.activeData[this.currentIconModel]=e},tagChange:function(e){var t=ct.find((function(t){return t.__config__.tagIcon===e}));t||(t=rt.find((function(t){return t.__config__.tagIcon===e}))),this.$emit(\"tag-change\",t)},changeRenderKey:function(){dt.includes(this.activeData.__config__.tag)&&(this.activeData.__config__.renderKey=+new Date)}}},pt=_t,mt=(a(\"66a2\"),Object(d[\"a\"])(pt,Ee,Ie,!1,null,\"0c0004cd\",null)),ft=mt.exports,vt=[{__config__:{label:\"单行文本\",labelWidth:null,showLabel:!0,changeTag:!0,tag:\"el-input\",tagIcon:\"input\",defaultValue:void 0,required:!0,layout:\"colFormItem\",span:24,document:\"https://element.eleme.cn/#/zh-CN/component/input\",regList:[{pattern:\"/^1(3|4|5|7|8|9)\\\\d{9}$/\",message:\"手机号格式错误\"}]},__slot__:{prepend:\"\",append:\"\"},__vModel__:\"mobile\",placeholder:\"请输入手机号\",style:{width:\"100%\"},clearable:!0,\"prefix-icon\":\"el-icon-mobile\",\"suffix-icon\":\"\",maxlength:11,\"show-word-limit\":!0,readonly:!1,disabled:!1}],ht=a(\"cf05\"),bt=a.n(ht),gt=function(){var e=this,t=e.$createElement,a=e._self._c||t;return a(\"div\",[a(\"el-dialog\",e._g(e._b({attrs:{width:\"500px\",\"close-on-click-modal\":!1,\"modal-append-to-body\":!1},on:{open:e.onOpen,close:e.onClose}},\"el-dialog\",e.$attrs,!1),e.$listeners),[a(\"el-row\",{attrs:{gutter:15}},[a(\"el-form\",{ref:\"elForm\",attrs:{model:e.formData,rules:e.rules,size:\"medium\",\"label-width\":\"100px\"}},[a(\"el-col\",{attrs:{span:24}},[a(\"el-form-item\",{attrs:{label:\"生成类型\",prop:\"type\"}},[a(\"el-radio-group\",{model:{value:e.formData.type,callback:function(t){e.$set(e.formData,\"type\",t)},expression:\"formData.type\"}},e._l(e.typeOptions,(function(t,o){return a(\"el-radio-button\",{key:o,attrs:{label:t.value,disabled:t.disabled}},[e._v(\" \"+e._s(t.label)+\" \")])})),1)],1),e.showFileName?a(\"el-form-item\",{attrs:{label:\"文件名\",prop:\"fileName\"}},[a(\"el-input\",{attrs:{placeholder:\"请输入文件名\",clearable:\"\"},model:{value:e.formData.fileName,callback:function(t){e.$set(e.formData,\"fileName\",t)},expression:\"formData.fileName\"}})],1):e._e()],1)],1)],1),a(\"div\",{attrs:{slot:\"footer\"},slot:\"footer\"},[a(\"el-button\",{on:{click:e.close}},[e._v(\" 取消 \")]),a(\"el-button\",{attrs:{type:\"primary\"},on:{click:e.handelConfirm}},[e._v(\" 确定 \")])],1)],1)],1)},wt=[],yt={inheritAttrs:!1,props:[\"showFileName\"],data:function(){return{formData:{fileName:void 0,type:\"file\"},rules:{fileName:[{required:!0,message:\"请输入文件名\",trigger:\"blur\"}],type:[{required:!0,message:\"生成类型不能为空\",trigger:\"change\"}]},typeOptions:[{label:\"页面\",value:\"file\"},{label:\"弹窗\",value:\"dialog\"}]}},computed:{},watch:{},mounted:function(){},methods:{onOpen:function(){this.showFileName&&(this.formData.fileName=\"\".concat(+new Date,\".vue\"))},onClose:function(){},close:function(e){this.$emit(\"update:visible\",!1)},handelConfirm:function(){var e=this;this.$refs.elForm.validate((function(t){t&&(e.$emit(\"confirm\",Object(g[\"a\"])({},e.formData)),e.close())}))}}},Dt=yt,xt=Object(d[\"a\"])(Dt,gt,wt,!1,null,\"5c9eaea8\",null),kt=xt.exports,Ct={itemBtns:function(e,t,a,o){var n=this.$listeners,i=n.copyItem,l=n.deleteItem;return[e(\"span\",{class:\"drawing-item-copy\",attrs:{title:\"复制\"},on:{click:function(e){i(t,o),e.stopPropagation()}}},[e(\"i\",{class:\"el-icon-copy-document\"})]),e(\"span\",{class:\"drawing-item-delete\",attrs:{title:\"删除\"},on:{click:function(e){l(a,o),e.stopPropagation()}}},[e(\"i\",{class:\"el-icon-delete\"})])]}},Ot={colFormItem:function(e,t,a,o){var n=this,i=this.$listeners.activeItem,l=t.__config__,c=this.activeId===l.formId?\"drawing-item active-from-item\":\"drawing-item\";this.formConf.unFocusedComponentBorder&&(c+=\" unfocus-bordered\");var r=l.labelWidth?\"\".concat(l.labelWidth,\"px\"):null;return!1===l.showLabel&&(r=\"0\"),e(\"el-col\",{attrs:{span:l.span},class:c,nativeOn:{click:function(e){i(t),e.stopPropagation()}}},[e(\"el-form-item\",{attrs:{\"label-width\":r,label:l.showLabel?l.label:\"\",required:l.required}},[e(O[\"a\"],{key:l.renderKey,attrs:{conf:t},on:{input:function(e){n.$set(l,\"defaultValue\",e)}}})]),Ct.itemBtns.apply(this,arguments)])},rowFormItem:function(e,t,a,o){var n=this.$listeners.activeItem,i=this.activeId===t.__config__.formId?\"drawing-row-item active-from-item\":\"drawing-row-item\",l=Mt.apply(this,arguments);return\"flex\"===t.type&&(l=e(\"el-row\",{attrs:{type:t.type,justify:t.justify,align:t.align}},[l])),e(\"el-col\",{attrs:{span:t.__config__.span}},[e(\"el-row\",{attrs:{gutter:t.__config__.gutter},class:i,nativeOn:{click:function(e){n(t),e.stopPropagation()}}},[e(\"span\",{class:\"component-name\"},[t.__config__.componentName]),e(y.a,{attrs:{list:t.__config__.children,animation:340,group:\"componentsGroup\"},class:\"drag-wrapper\"},[l]),Ct.itemBtns.apply(this,arguments)])])}};function Mt(e,t,a,o){var n=this,i=t.__config__;return Array.isArray(i.children)?i.children.map((function(t,a){var o=Ot[t.__config__.layout];return o?o.call(n,e,t,a,i.children):Et.call(n)})):null}function Et(){throw new Error(\"没有与\".concat(this.element.__config__.layout,\"匹配的layout\"))}var It,Lt,jt,Tt,zt,Pt={components:{render:O[\"a\"],draggable:y.a},props:[\"element\",\"index\",\"drawingList\",\"activeId\",\"formConf\"],render:function(e){var t=Ot[this.element.__config__.layout];return t?t.call(this,e,this.element,this.index,this.drawingList):Et.call(this)}},$t=Pt,Bt=Object(d[\"a\"])($t,It,Lt,!1,null,null,null),Rt=Bt.exports,At=Se(),St=Ue(),Vt=Ne(),Nt={components:{draggable:y.a,render:O[\"a\"],FormDrawer:ye,JsonDrawer:Me,RightPanel:ft,CodeTypeDialog:kt,DraggableItem:Rt},data:function(){return{logo:bt.a,idGlobal:Vt,formConf:lt,inputComponents:ct,selectComponents:rt,layoutComponents:st,labelWidth:100,drawingList:vt,drawingData:{},activeId:vt[0].formId,drawerVisible:!1,formData:{},dialogVisible:!1,jsonDrawerVisible:!1,generateConf:null,showFileName:!1,activeData:vt[0],saveDrawingListDebounce:Object(D[\"a\"])(340,Ve),saveIdGlobalDebounce:Object(D[\"a\"])(340,Fe),leftComponents:[{title:\"输入型组件\",list:ct},{title:\"选择型组件\",list:rt},{title:\"布局型组件\",list:st}]}},computed:{},watch:{\"activeData.__config__.label\":function(e,t){void 0!==this.activeData.placeholder&&this.activeData.__config__.tag&&Tt===this.activeId&&(this.activeData.placeholder=this.activeData.placeholder.replace(t,\"\")+e)},activeId:{handler:function(e){Tt=e},immediate:!0},drawingList:{handler:function(e){this.saveDrawingListDebounce(e),0===e.length&&(this.idGlobal=100)},deep:!0},idGlobal:{handler:function(e){this.saveIdGlobalDebounce(e)},immediate:!0}},mounted:function(){var e=this;Array.isArray(At)&&At.length>0?this.drawingList=At:this.drawingList=vt,this.activeFormItem(this.drawingList[0]),St&&(this.formConf=St),de((function(e){jt=e}));var t=new C.a(\"#copyNode\",{text:function(t){var a=e.generateCode();return e.$notify({title:\"成功\",message:\"代码已复制到剪切板，可粘贴。\",type:\"success\"}),a}});t.on(\"error\",(function(t){e.$message.error(\"代码复制失败\")}))},methods:{activeFormItem:function(e){this.activeData=e,this.activeId=e.__config__.formId},onEnd:function(e){e.from!==e.to&&(this.activeData=zt,this.activeId=this.idGlobal)},addComponent:function(e){var t=this.cloneComponent(e);this.drawingList.push(t),this.activeFormItem(t)},cloneComponent:function(e){var t=Object(ee[\"b\"])(e),a=t.__config__;return a.span=this.formConf.span,this.createIdAndKey(t),void 0!==t.placeholder&&(t.placeholder+=a.label),zt=t,zt},createIdAndKey:function(e){var t=this,a=e.__config__;return a.formId=++this.idGlobal,a.renderKey=+new Date,\"colFormItem\"===a.layout?e.__vModel__=\"field\".concat(this.idGlobal):\"rowFormItem\"===a.layout&&(a.componentName=\"row\".concat(this.idGlobal),!Array.isArray(a.children)&&(a.children=[]),delete a.label),Array.isArray(a.children)&&(a.children=a.children.map((function(e){return t.createIdAndKey(e)}))),e},AssembleFormData:function(){this.formData=Object(g[\"a\"])({fields:Object(ee[\"b\"])(this.drawingList)},this.formConf)},generate:function(e){var t=this[\"exec\".concat(Object(ee[\"e\"])(this.operationType))];this.generateConf=e,t&&t(e)},execRun:function(e){this.AssembleFormData(),this.drawerVisible=!0},execDownload:function(e){var t=this.generateCode(),a=new Blob([t],{type:\"text/plain;charset=utf-8\"});Object(x[\"saveAs\"])(a,e.fileName)},execCopy:function(e){document.getElementById(\"copyNode\").click()},empty:function(){var e=this;this.$confirm(\"确定要清空所有组件吗？\",\"提示\",{type:\"warning\"}).then((function(){e.drawingList=[],e.idGlobal=100}))},drawingItemCopy:function(e,t){var a=Object(ee[\"b\"])(e);a=this.createIdAndKey(a),t.push(a),this.activeFormItem(a)},drawingItemDelete:function(e,t){var a=this;t.splice(e,1),this.$nextTick((function(){var e=a.drawingList.length;e&&a.activeFormItem(a.drawingList[e-1])}))},generateCode:function(){var e=this.generateConf.type;this.AssembleFormData();var t=z(Object(G[\"a\"])(this.formData,e)),a=T(H(this.formData,e)),o=P(Z(this.formData));return jt.html(a+t+o,ee[\"a\"].html)},showJson:function(){this.AssembleFormData(),this.jsonDrawerVisible=!0},download:function(){this.dialogVisible=!0,this.showFileName=!0,this.operationType=\"download\"},run:function(){this.dialogVisible=!0,this.showFileName=!1,this.operationType=\"run\"},copy:function(){this.dialogVisible=!0,this.showFileName=!1,this.operationType=\"copy\"},tagChange:function(e){var t=this;e=this.cloneComponent(e);var a=e.__config__;e.__vModel__=this.activeData.__vModel__,a.formId=this.activeId,a.span=this.activeData.__config__.span,this.activeData.__config__.tag=a.tag,this.activeData.__config__.tagIcon=a.tagIcon,this.activeData.__config__.document=a.document,Object(b[\"a\"])(this.activeData.__config__.defaultValue)===Object(b[\"a\"])(a.defaultValue)&&(a.defaultValue=this.activeData.__config__.defaultValue),Object.keys(e).forEach((function(a){void 0!==t.activeData[a]&&(e[a]=t.activeData[a])})),this.activeData=e,this.updateDrawingList(e,this.drawingList)},updateDrawingList:function(e,t){var a=this,o=t.findIndex((function(e){return e.__config__.formId===a.activeId}));o>-1?t.splice(o,1,e):t.forEach((function(t){Array.isArray(t.__config__.children)&&a.updateDrawingList(e,t.__config__.children)}))},refreshJson:function(e){this.drawingList=Object(ee[\"b\"])(e.fields),delete e.fields,this.formConf=e}}},Ft=Nt,qt=(a(\"6828\"),Object(d[\"a\"])(Ft,v,h,!1,null,null,null)),Wt=qt.exports;l.a.use(f.a);var Ut=[{path:\"/\",name:\"home\",component:Wt},{path:\"/parser\",name:\"parser\",component:function(){return a.e(\"parser-example\").then(a.bind(null,\"b8fa\"))}},{path:\"/tinymce\",name:\"tinymce\",component:function(){return a.e(\"tinymce-example\").then(a.bind(null,\"a5aa\"))}}],Kt=new f.a({routes:Ut}),Ht=Kt,Gt=(a(\"b20f\"),a(\"ddb0\"),function(){var e=this,t=e.$createElement,a=e._self._c||t;return e.isExternal?a(\"div\",e._g({staticClass:\"svg-external-icon svg-icon\",style:e.styleExternalIcon},e.$listeners)):a(\"svg\",e._g({class:e.svgClass,attrs:{\"aria-hidden\":\"true\"}},e.$listeners),[a(\"use\",{attrs:{\"xlink:href\":e.iconName}})])}),Jt=[];function Yt(e){return/^(https?:|mailto:|tel:)/.test(e)}var Zt={name:\"SvgIcon\",props:{iconClass:{type:String,required:!0},className:{type:String,default:\"\"}},computed:{isExternal:function(){return Yt(this.iconClass)},iconName:function(){return\"#icon-\".concat(this.iconClass)},svgClass:function(){return this.className?\"svg-icon \".concat(this.className):\"svg-icon\"},styleExternalIcon:function(){return{mask:\"url(\".concat(this.iconClass,\") no-repeat 50% 50%\"),\"-webkit-mask\":\"url(\".concat(this.iconClass,\") no-repeat 50% 50%\")}}}},Qt=Zt,Xt=(a(\"c2eb\"),Object(d[\"a\"])(Qt,Gt,Jt,!1,null,\"19957a58\",null)),ea=Xt.exports;l.a.component(\"svg-icon\",ea);var ta=a(\"51ff\"),aa=function(e){return e.keys().map(e)};aa(ta);var oa=a(\"31c6\");l.a.component(\"tinymce\",oa[\"a\"]),l.a.config.productionTip=!1,new l.a({router:Ht,render:function(e){return e(p)}}).$mount(\"#app\")},\"8bbf\":function(e,t){e.exports=Vue},9413:function(e,t,a){\"use strict\";a.r(t);a(\"4160\"),a(\"159b\");t[\"default\"]={options:function(e,t,a){var o=[];return t.__slot__.options.forEach((function(a){\"button\"===t.__config__.optionType?o.push(e(\"el-checkbox-button\",{attrs:{label:a.value}},[a.label])):o.push(e(\"el-checkbox\",{attrs:{label:a.value,border:t.border}},[a.label]))})),o}}},9977:function(e,t,a){var o={\"./el-button.js\":\"aace\",\"./el-checkbox-group.js\":\"9413\",\"./el-input.js\":\"167d\",\"./el-radio-group.js\":\"2cfa\",\"./el-select.js\":\"7f29\",\"./el-upload.js\":\"0f88\"};function n(e){var t=i(e);return a(t)}function i(e){if(!a.o(o,e)){var t=new Error(\"Cannot find module '\"+e+\"'\");throw t.code=\"MODULE_NOT_FOUND\",t}return o[e]}n.keys=function(){return Object.keys(o)},n.resolve=i,e.exports=n,n.id=\"9977\"},\"9d82\":function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-upload\",use:\"icon-upload-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-upload\"><defs><style type=\"text/css\"></style></defs><path d=\"M530.944 458.24l4.8 3.456 122.176 106.816a32 32 0 0 1-37.44 51.584l-4.672-3.392L546.56 556.16v280.704a32 32 0 0 1-26.24 31.488l-5.76 0.512a32 32 0 0 1-31.424-26.24l-0.512-5.76-0.064-280.704-69.12 60.48a32 32 0 0 1-40.96 0.896l-4.16-3.968a32 32 0 0 1-0.96-40.96l4.032-4.16 122.176-106.816a32 32 0 0 1 37.312-3.456zM497.92 128c128.128 0 239.168 82.304 275.52 199.04 123.968 11.264 221.312 113.088 221.312 237.44 0 128.128-103.68 232.96-234.88 238.272h-5.888l-35.52 0.192a32 32 0 0 1-0.192-64l35.264-0.128 4.672-0.064c96.384-3.84 172.544-80.896 172.544-174.272 0-96.128-80.512-174.464-179.584-174.464h-1.984a32 32 0 0 1-32-25.28C695.872 264.96 604.736 192 497.92 192 381.824 192 285.44 277.76 274.816 388.48a32 32 0 0 1-28.352 28.8c-83.968 9.152-147.84 78.208-147.84 159.552l0.192 7.936c3.84 85.76 77.056 154.112 166.592 154.112h45.632a32 32 0 0 1 0 64h-45.632C142.016 802.944 40.32 708.032 34.88 586.88l-0.192-9.28c0-106.88 76.352-197.184 179.968-219.904C239.488 226.112 357.76 128 497.856 128z\" p-id=\"7923\" /></symbol>'});l.a.add(c);t[\"default\"]=c},a393:function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-cascader\",use:\"icon-cascader-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-cascader\"><defs><style type=\"text/css\"></style></defs><path d=\"M772.87036133 734.06115723c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714843H475.90991211c-56.60705567 0-102.66723633-46.06018067-102.66723633-102.66723633V600.82446289h305.859375c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012S827.9942627 467.50537109 772.87036133 467.50537109c-43.34106445 0-80.00793458 27.93273926-93.76831055 66.57714844H373.24267578V401.01062011h321.92687989c55.12390137 0 99.94812012-44.82421875 99.94812011-99.94812011V190.07312011C795.11767578 134.94921875 750.29345703 90.125 695.16955567 90.125H251.12963867C196.0057373 90.125 151.18151855 134.94921875 151.18151855 190.07312011V301.0625c0 55.12390137 44.82421875 99.94812012 99.94812012 99.94812012h55.53588867v296.96044921c0 93.35632325 75.97045898 169.32678223 169.32678224 169.32678223h203.19213866c13.76037598 38.64440918 50.42724609 66.57714844 93.76831055 66.57714844 55.12390137 0 99.94812012-44.82421875 99.94812012-99.94812012s-44.90661622-99.86572266-100.03051758-99.86572265z m0-199.89624024c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857423s-14.91394043 33.28857422-33.28857422 33.28857421-33.28857422-14.91394043-33.28857422-33.28857421 14.91394043-33.28857422 33.28857422-33.28857422zM217.75866699 301.0625V190.07312011c0-18.37463379 14.91394043-33.28857422 33.28857423-33.28857421h444.03991698c18.37463379 0 33.28857422 14.91394043 33.28857422 33.28857422V301.0625c0 18.37463379-14.91394043 33.28857422-33.28857422 33.28857422H251.12963867c-18.37463379 0-33.37097168-14.91394043-33.37097168-33.28857422z m555.11169434 566.23535156c-18.37463379 0-33.28857422-14.91394043-33.28857422-33.28857422 0-18.37463379 14.91394043-33.28857422 33.28857422-33.28857422s33.28857422 14.91394043 33.28857422 33.28857422c0.08239747 18.29223633-14.91394043 33.28857422-33.28857422 33.28857422z\" p-id=\"972\" /></symbol>'});l.a.add(c);t[\"default\"]=c},aace:function(e,t,a){\"use strict\";a.r(t),t[\"default\"]={default:function(e,t,a){return t.__slot__[a]}}},afc4:function(e,t){tinymce.addI18n(\"zh_CN\",{Redo:\"重做\",Undo:\"撤销\",Cut:\"剪切\",Copy:\"复制\",Paste:\"粘贴\",\"Select all\":\"全选\",\"New document\":\"新文件\",Ok:\"确定\",Cancel:\"取消\",\"Visual aids\":\"网格线\",Bold:\"粗体\",Italic:\"斜体\",Underline:\"下划线\",Strikethrough:\"删除线\",Superscript:\"上标\",Subscript:\"下标\",\"Clear formatting\":\"清除格式\",\"Align left\":\"左边对齐\",\"Align center\":\"中间对齐\",\"Align right\":\"右边对齐\",Justify:\"两端对齐\",\"Bullet list\":\"项目符号\",\"Numbered list\":\"编号列表\",\"Decrease indent\":\"减少缩进\",\"Increase indent\":\"增加缩进\",Close:\"关闭\",Formats:\"格式\",\"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.\":\"你的浏览器不支持打开剪贴板，请使用Ctrl+X/C/V等快捷键。\",Headers:\"标题\",\"Header 1\":\"标题1\",\"Header 2\":\"标题2\",\"Header 3\":\"标题3\",\"Header 4\":\"标题4\",\"Header 5\":\"标题5\",\"Header 6\":\"标题6\",Headings:\"标题\",\"Heading 1\":\"标题1\",\"Heading 2\":\"标题2\",\"Heading 3\":\"标题3\",\"Heading 4\":\"标题4\",\"Heading 5\":\"标题5\",\"Heading 6\":\"标题6\",Preformatted:\"预先格式化的\",Div:\"Div\",Pre:\"Pre\",Code:\"代码\",Paragraph:\"段落\",Blockquote:\"引文区块\",Inline:\"文本\",Blocks:\"基块\",\"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.\":\"当前为纯文本粘贴模式，再次点击可以回到普通粘贴模式。\",Fonts:\"字体\",\"Font Sizes\":\"字号\",Class:\"类型\",\"Browse for an image\":\"浏览图像\",OR:\"或\",\"Drop an image here\":\"拖放一张图像至此\",Upload:\"上传\",Block:\"块\",Align:\"对齐\",Default:\"默认\",Circle:\"空心圆\",Disc:\"实心圆\",Square:\"方块\",\"Lower Alpha\":\"小写英文字母\",\"Lower Greek\":\"小写希腊字母\",\"Lower Roman\":\"小写罗马字母\",\"Upper Alpha\":\"大写英文字母\",\"Upper Roman\":\"大写罗马字母\",\"Anchor...\":\"锚点...\",Name:\"名称\",Id:\"标识符\",\"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.\":\"标识符应该以字母开头，后跟字母、数字、破折号、点、冒号或下划线。\",\"You have unsaved changes are you sure you want to navigate away?\":\"你还有文档尚未保存，确定要离开？\",\"Restore last draft\":\"恢复上次的草稿\",\"Special character...\":\"特殊字符...\",\"Source code\":\"源代码\",\"Insert/Edit code sample\":\"插入/编辑代码示例\",Language:\"语言\",\"Code sample...\":\"示例代码...\",\"Color Picker\":\"选色器\",R:\"R\",G:\"G\",B:\"B\",\"Left to right\":\"从左到右\",\"Right to left\":\"从右到左\",\"Emoticons...\":\"表情符号...\",\"Metadata and Document Properties\":\"元数据和文档属性\",Title:\"标题\",Keywords:\"关键词\",Description:\"描述\",Robots:\"机器人\",Author:\"作者\",Encoding:\"编码\",Fullscreen:\"全屏\",Action:\"操作\",Shortcut:\"快捷键\",Help:\"帮助\",Address:\"地址\",\"Focus to menubar\":\"移动焦点到菜单栏\",\"Focus to toolbar\":\"移动焦点到工具栏\",\"Focus to element path\":\"移动焦点到元素路径\",\"Focus to contextual toolbar\":\"移动焦点到上下文菜单\",\"Insert link (if link plugin activated)\":\"插入链接 (如果链接插件已激活)\",\"Save (if save plugin activated)\":\"保存(如果保存插件已激活)\",\"Find (if searchreplace plugin activated)\":\"查找(如果查找替换插件已激活)\",\"Plugins installed ({0}):\":\"已安装插件 ({0}):\",\"Premium plugins:\":\"优秀插件：\",\"Learn more...\":\"了解更多...\",\"You are using {0}\":\"你正在使用 {0}\",Plugins:\"插件\",\"Handy Shortcuts\":\"快捷键\",\"Horizontal line\":\"水平分割线\",\"Insert/edit image\":\"插入/编辑图片\",\"Image description\":\"图片描述\",Source:\"地址\",Dimensions:\"大小\",\"Constrain proportions\":\"保持纵横比\",General:\"普通\",Advanced:\"高级\",Style:\"样式\",\"Vertical space\":\"垂直边距\",\"Horizontal space\":\"水平边距\",Border:\"边框\",\"Insert image\":\"插入图片\",\"Image...\":\"图片...\",\"Image list\":\"图片列表\",\"Rotate counterclockwise\":\"逆时针旋转\",\"Rotate clockwise\":\"顺时针旋转\",\"Flip vertically\":\"垂直翻转\",\"Flip horizontally\":\"水平翻转\",\"Edit image\":\"编辑图片\",\"Image options\":\"图片选项\",\"Zoom in\":\"放大\",\"Zoom out\":\"缩小\",Crop:\"裁剪\",Resize:\"调整大小\",Orientation:\"方向\",Brightness:\"亮度\",Sharpen:\"锐化\",Contrast:\"对比度\",\"Color levels\":\"颜色层次\",Gamma:\"伽马值\",Invert:\"反转\",Apply:\"应用\",Back:\"后退\",\"Insert date/time\":\"插入日期/时间\",\"Date/time\":\"日期/时间\",\"Insert/Edit Link\":\"插入/编辑链接\",\"Insert/edit link\":\"插入/编辑链接\",\"Text to display\":\"显示文字\",Url:\"地址\",\"Open link in...\":\"链接打开位置...\",\"Current window\":\"当前窗口\",None:\"无\",\"New window\":\"在新窗口打开\",\"Remove link\":\"删除链接\",Anchors:\"锚点\",\"Link...\":\"链接...\",\"Paste or type a link\":\"粘贴或输入链接\",\"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?\":\"你所填写的URL地址为邮件地址，需要加上mailto:前缀吗？\",\"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?\":\"你所填写的URL地址属于外部链接，需要加上http://:前缀吗？\",\"Link list\":\"链接列表\",\"Insert video\":\"插入视频\",\"Insert/edit video\":\"插入/编辑视频\",\"Insert/edit media\":\"插入/编辑媒体\",\"Alternative source\":\"镜像\",\"Alternative source URL\":\"替代来源网址\",\"Media poster (Image URL)\":\"封面(图片地址)\",\"Paste your embed code below:\":\"将内嵌代码粘贴在下面:\",Embed:\"内嵌\",\"Media...\":\"多媒体...\",\"Nonbreaking space\":\"不间断空格\",\"Page break\":\"分页符\",\"Paste as text\":\"粘贴为文本\",Preview:\"预览\",\"Print...\":\"打印...\",Save:\"保存\",Find:\"查找\",\"Replace with\":\"替换为\",Replace:\"替换\",\"Replace all\":\"全部替换\",Previous:\"上一个\",Next:\"下一个\",\"Find and replace...\":\"查找并替换...\",\"Could not find the specified string.\":\"未找到搜索内容.\",\"Match case\":\"区分大小写\",\"Find whole words only\":\"全字匹配\",\"Spell check\":\"拼写检查\",Ignore:\"忽略\",\"Ignore all\":\"全部忽略\",Finish:\"完成\",\"Add to Dictionary\":\"添加到字典\",\"Insert table\":\"插入表格\",\"Table properties\":\"表格属性\",\"Delete table\":\"删除表格\",Cell:\"单元格\",Row:\"行\",Column:\"列\",\"Cell properties\":\"单元格属性\",\"Merge cells\":\"合并单元格\",\"Split cell\":\"拆分单元格\",\"Insert row before\":\"在上方插入\",\"Insert row after\":\"在下方插入\",\"Delete row\":\"删除行\",\"Row properties\":\"行属性\",\"Cut row\":\"剪切行\",\"Copy row\":\"复制行\",\"Paste row before\":\"粘贴到上方\",\"Paste row after\":\"粘贴到下方\",\"Insert column before\":\"在左侧插入\",\"Insert column after\":\"在右侧插入\",\"Delete column\":\"删除列\",Cols:\"列\",Rows:\"行\",Width:\"宽\",Height:\"高\",\"Cell spacing\":\"单元格外间距\",\"Cell padding\":\"单元格内边距\",\"Show caption\":\"显示标题\",Left:\"左对齐\",Center:\"居中\",Right:\"右对齐\",\"Cell type\":\"单元格类型\",Scope:\"范围\",Alignment:\"对齐方式\",\"H Align\":\"水平对齐\",\"V Align\":\"垂直对齐\",Top:\"顶部对齐\",Middle:\"垂直居中\",Bottom:\"底部对齐\",\"Header cell\":\"表头单元格\",\"Row group\":\"行组\",\"Column group\":\"列组\",\"Row type\":\"行类型\",Header:\"表头\",Body:\"表体\",Footer:\"表尾\",\"Border color\":\"边框颜色\",\"Insert template...\":\"插入模板...\",Templates:\"模板\",Template:\"模板\",\"Text color\":\"文字颜色\",\"Background color\":\"背景色\",\"Custom...\":\"自定义...\",\"Custom color\":\"自定义颜色\",\"No color\":\"无\",\"Remove color\":\"移除颜色\",\"Table of Contents\":\"内容列表\",\"Show blocks\":\"显示区块边框\",\"Show invisible characters\":\"显示不可见字符\",\"Word count\":\"字数\",Count:\"计数\",Document:\"文档\",Selection:\"选择\",Words:\"单词\",\"Words: {0}\":\"字数：{0}\",\"{0} words\":\"{0} 字\",File:\"文件\",Edit:\"编辑\",Insert:\"插入\",View:\"视图\",Format:\"格式\",Table:\"表格\",Tools:\"工具\",\"Powered by {0}\":\"由{0}驱动\",\"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help\":\"在编辑区按ALT-F9打开菜单，按ALT-F10打开工具栏，按ALT-0查看帮助\",\"Image title\":\"图片标题\",\"Border width\":\"边框宽度\",\"Border style\":\"边框样式\",Error:\"错误\",Warn:\"警告\",Valid:\"有效\",\"To open the popup, press Shift+Enter\":\"按Shitf+Enter键打开对话框\",\"Rich Text Area. Press ALT-0 for help.\":\"编辑区。按Alt+0键打开帮助。\",\"System Font\":\"系统字体\",\"Failed to upload image: {0}\":\"图片上传失败: {0}\",\"Failed to load plugin: {0} from url {1}\":\"插件加载失败: {0} 来自链接 {1}\",\"Failed to load plugin url: {0}\":\"插件加载失败 链接: {0}\",\"Failed to initialize plugin: {0}\":\"插件初始化失败: {0}\",example:\"示例\",Search:\"搜索\",All:\"全部\",Currency:\"货币\",Text:\"文字\",Quotations:\"引用\",Mathematical:\"数学\",\"Extended Latin\":\"拉丁语扩充\",Symbols:\"符号\",Arrows:\"箭头\",\"User Defined\":\"自定义\",\"dollar sign\":\"美元符号\",\"currency sign\":\"货币符号\",\"euro-currency sign\":\"欧元符号\",\"colon sign\":\"冒号\",\"cruzeiro sign\":\"克鲁赛罗币符号\",\"french franc sign\":\"法郎符号\",\"lira sign\":\"里拉符号\",\"mill sign\":\"密尔符号\",\"naira sign\":\"奈拉符号\",\"peseta sign\":\"比塞塔符号\",\"rupee sign\":\"卢比符号\",\"won sign\":\"韩元符号\",\"new sheqel sign\":\"新谢克尔符号\",\"dong sign\":\"越南盾符号\",\"kip sign\":\"老挝基普符号\",\"tugrik sign\":\"图格里克符号\",\"drachma sign\":\"德拉克马符号\",\"german penny symbol\":\"德国便士符号\",\"peso sign\":\"比索符号\",\"guarani sign\":\"瓜拉尼符号\",\"austral sign\":\"澳元符号\",\"hryvnia sign\":\"格里夫尼亚符号\",\"cedi sign\":\"塞地符号\",\"livre tournois sign\":\"里弗弗尔符号\",\"spesmilo sign\":\"spesmilo符号\",\"tenge sign\":\"坚戈符号\",\"indian rupee sign\":\"印度卢比\",\"turkish lira sign\":\"土耳其里拉\",\"nordic mark sign\":\"北欧马克\",\"manat sign\":\"马纳特符号\",\"ruble sign\":\"卢布符号\",\"yen character\":\"日元字样\",\"yuan character\":\"人民币元字样\",\"yuan character, in hong kong and taiwan\":\"元字样（港台地区）\",\"yen/yuan character variant one\":\"元字样（大写）\",\"Loading emoticons...\":\"加载表情符号...\",\"Could not load emoticons\":\"不能加载表情符号\",People:\"人类\",\"Animals and Nature\":\"动物和自然\",\"Food and Drink\":\"食物和饮品\",Activity:\"活动\",\"Travel and Places\":\"旅游和地点\",Objects:\"物件\",Flags:\"旗帜\",Characters:\"字符\",\"Characters (no spaces)\":\"字符(无空格)\",\"{0} characters\":\"{0} 个字符\",\"Error: Form submit field collision.\":\"错误: 表单提交字段冲突。\",\"Error: No form element found.\":\"错误: 没有表单控件。\",Update:\"更新\",\"Color swatch\":\"颜色样本\",Turquoise:\"青绿色\",Green:\"绿色\",Blue:\"蓝色\",Purple:\"紫色\",\"Navy Blue\":\"海军蓝\",\"Dark Turquoise\":\"深蓝绿色\",\"Dark Green\":\"深绿色\",\"Medium Blue\":\"中蓝色\",\"Medium Purple\":\"中紫色\",\"Midnight Blue\":\"深蓝色\",Yellow:\"黄色\",Orange:\"橙色\",Red:\"红色\",\"Light Gray\":\"浅灰色\",Gray:\"灰色\",\"Dark Yellow\":\"暗黄色\",\"Dark Orange\":\"深橙色\",\"Dark Red\":\"深红色\",\"Medium Gray\":\"中灰色\",\"Dark Gray\":\"深灰色\",\"Light Green\":\"浅绿色\",\"Light Yellow\":\"浅黄色\",\"Light Red\":\"浅红色\",\"Light Purple\":\"浅紫色\",\"Light Blue\":\"浅蓝色\",\"Dark Purple\":\"深紫色\",\"Dark Blue\":\"深蓝色\",Black:\"黑色\",White:\"白色\",\"Switch to or from fullscreen mode\":\"切换全屏模式\",\"Open help dialog\":\"打开帮助对话框\",history:\"历史\",styles:\"样式\",formatting:\"格式化\",alignment:\"对齐\",indentation:\"缩进\",\"permanent pen\":\"记号笔\",comments:\"备注\",\"Format Painter\":\"格式刷\",\"Insert/edit iframe\":\"插入/编辑框架\",Capitalization:\"大写\",lowercase:\"小写\",UPPERCASE:\"大写\",\"Title Case\":\"首字母大写\",\"Permanent Pen Properties\":\"永久笔属性\",\"Permanent pen properties...\":\"永久笔属性...\",Font:\"字体\",Size:\"字号\",\"More...\":\"更多...\",\"Spellcheck Language\":\"拼写检查语言\",\"Select...\":\"选择...\",Preferences:\"首选项\",Yes:\"是\",No:\"否\",\"Keyboard Navigation\":\"键盘指引\",Version:\"版本\",Anchor:\"锚点\",\"Special character\":\"特殊符号\",\"Code sample\":\"代码示例\",Color:\"颜色\",Emoticons:\"表情\",\"Document properties\":\"文档属性\",Image:\"图片\",\"Insert link\":\"插入链接\",Target:\"打开方式\",Link:\"链接\",Poster:\"封面\",Media:\"媒体\",Print:\"打印\",Prev:\"上一个\",\"Find and replace\":\"查找和替换\",\"Whole words\":\"全字匹配\",Spellcheck:\"拼写检查\",Caption:\"标题\",\"Insert template\":\"插入模板\"})},b20f:function(e,t,a){},b9af:function(e,t,a){},beaa:function(e,t,a){\"use strict\";t[\"a\"]={\"el-input\":\"blur\",\"el-input-number\":\"blur\",\"el-select\":\"change\",\"el-radio-group\":\"change\",\"el-checkbox-group\":\"change\",\"el-cascader\":\"change\",\"el-time-picker\":\"change\",\"el-date-picker\":\"change\",\"el-rate\":\"change\",tinymce:\"blur\"}},c2eb:function(e,t,a){\"use strict\";var o=a(\"2db0\"),n=a.n(o);n.a},c630:function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-rich-text\",use:\"icon-rich-text-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-rich-text\"><defs><style type=\"text/css\"></style></defs><path d=\"M834.2654461 933.87476599H189.7345539A99.37494442 99.37494442 0 0 1 90.12523401 834.2654461V189.7345539A99.37494442 99.37494442 0 0 1 189.7345539 90.12523401h644.53089221A99.37494442 99.37494442 0 0 1 933.87476599 189.7345539v644.53089221A99.37494442 99.37494442 0 0 1 834.2654461 933.87476599zM189.7345539 140.04708127a49.68747262 49.68747262 0 0 0-49.68747263 49.68747263v644.53089221a49.68747262 49.68747262 0 0 0 49.68747262 49.68747262h644.53089221a49.68747262 49.68747262 0 0 0 49.68747263-49.68747262V189.7345539a49.68747262 49.68747262 0 0 0-49.68747263-49.68747263z\" p-id=\"1803\" /><path d=\"M561.68747262 239.18765188h247.73423676a23.43748728 23.43748728 0 0 1 24.84373673 24.84373591 23.43748728 23.43748728 0 0 1-24.84373673 24.84373589H561.68747262a23.43748728 23.43748728 0 0 1-24.84373672-24.84373589 23.43748728 23.43748728 0 0 1 24.84373672-24.84373591z m0 123.9843057h247.73423676a24.84373591 24.84373591 0 0 1 0 49.68747262H561.68747262a24.84373591 24.84373591 0 1 1 0-49.68747262z m0 123.98430652h247.73423676a24.84373591 24.84373591 0 0 1 0 49.68747181H561.68747262a24.84373591 24.84373591 0 0 1 0-49.68747181zM214.57829062 611.1405698h594.84341876a24.84373591 24.84373591 0 0 1 0 49.68747263H214.57829062a24.84373591 24.84373591 0 0 1 0-49.68747263z m0 123.98430652h594.84341876a24.84373591 24.84373591 0 0 1 0 49.6874718H214.57829062a24.84373591 24.84373591 0 1 1 0-49.6874718z m52.03122061-280.07797001h133.82805103l32.10935696 81.79682959h46.87497372l-123.51555642-297.65608402H311.14073697l-121.40618308 297.65608403h46.87497373z m61.87496594-156.32803812a171.56240497 171.56240497 0 0 0 4.92187226-19.68748901 72.18745972 72.18745972 0 0 1 5.15624688 19.68748901l49.45309717 123.98430652H279.03137918z\" p-id=\"1804\" /></symbol>'});l.a.add(c);t[\"default\"]=c},c88b:function(e,t,a){\"use strict\";a.d(t,\"b\",(function(){return i}));a(\"4160\"),a(\"159b\");var o={};function n(e,t){var a=document.getElementById(e),n=t||function(){};if(!a){o[e]=[];var i=document.createElement(\"script\");i.src=e,i.id=e,i.async=1,document.body.appendChild(i);var l=\"onload\"in i?c.bind(i):r.bind(i);l(i)}function c(t){var a=this;t.onload=function(){a.onerror=a.onload=null,o[e].forEach((function(e){e(null,t)})),delete o[e]},t.onerror=function(){a.onerror=a.onload=null,n(new Error(\"Failed to load \".concat(e)),t)}}function r(t){var a=this;t.onreadystatechange=function(){\"complete\"!==a.readyState&&\"loaded\"!==a.readyState||(a.onreadystatechange=null,o[e].forEach((function(e){e(null,t)})),delete o[e])}}o[e].push(n)}function i(e,t){var a=e.shift();e.length?n(a,(function(){return i(e,t)})):n(a,t)}t[\"a\"]=n},c95d:function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-row\",use:\"icon-row-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-row\"><defs><style type=\"text/css\"></style></defs><path d=\"M152 854.856875h325.7146875V237.715625H134.856875v600q0 6.99375 5.0746875 12.0684375T152 854.856875z m737.143125-17.1421875v-600H546.284375v617.1421875H872q6.99375 0 12.0684375-5.07375t5.0746875-12.0684375z m68.5715625-651.429375V837.715625q0 35.3821875-25.16625 60.5484375T872 923.4284375H152q-35.383125 0-60.5484375-25.1653125T66.284375 837.7146875V186.284375q0-35.3821875 25.16625-60.5484375T152 100.5715625h720q35.383125 0 60.5484375 25.1653125t25.16625 60.5484375z\" p-id=\"1183\" /></symbol>'});l.a.add(c);t[\"default\"]=c},cf05:function(e,t,a){e.exports=a.p+\"img/logo.e1bc3747.png\"},cfcd:function(e){e.exports=JSON.parse('[\"platform-eleme\",\"eleme\",\"delete-solid\",\"delete\",\"s-tools\",\"setting\",\"user-solid\",\"user\",\"phone\",\"phone-outline\",\"more\",\"more-outline\",\"star-on\",\"star-off\",\"s-goods\",\"goods\",\"warning\",\"warning-outline\",\"question\",\"info\",\"remove\",\"circle-plus\",\"success\",\"error\",\"zoom-in\",\"zoom-out\",\"remove-outline\",\"circle-plus-outline\",\"circle-check\",\"circle-close\",\"s-help\",\"help\",\"minus\",\"plus\",\"check\",\"close\",\"picture\",\"picture-outline\",\"picture-outline-round\",\"upload\",\"upload2\",\"download\",\"camera-solid\",\"camera\",\"video-camera-solid\",\"video-camera\",\"message-solid\",\"bell\",\"s-cooperation\",\"s-order\",\"s-platform\",\"s-fold\",\"s-unfold\",\"s-operation\",\"s-promotion\",\"s-home\",\"s-release\",\"s-ticket\",\"s-management\",\"s-open\",\"s-shop\",\"s-marketing\",\"s-flag\",\"s-comment\",\"s-finance\",\"s-claim\",\"s-custom\",\"s-opportunity\",\"s-data\",\"s-check\",\"s-grid\",\"menu\",\"share\",\"d-caret\",\"caret-left\",\"caret-right\",\"caret-bottom\",\"caret-top\",\"bottom-left\",\"bottom-right\",\"back\",\"right\",\"bottom\",\"top\",\"top-left\",\"top-right\",\"arrow-left\",\"arrow-right\",\"arrow-down\",\"arrow-up\",\"d-arrow-left\",\"d-arrow-right\",\"video-pause\",\"video-play\",\"refresh\",\"refresh-right\",\"refresh-left\",\"finished\",\"sort\",\"sort-up\",\"sort-down\",\"rank\",\"loading\",\"view\",\"c-scale-to-original\",\"date\",\"edit\",\"edit-outline\",\"folder\",\"folder-opened\",\"folder-add\",\"folder-remove\",\"folder-delete\",\"folder-checked\",\"tickets\",\"document-remove\",\"document-delete\",\"document-copy\",\"document-checked\",\"document\",\"document-add\",\"printer\",\"paperclip\",\"takeaway-box\",\"search\",\"monitor\",\"attract\",\"mobile\",\"scissors\",\"umbrella\",\"headset\",\"brush\",\"mouse\",\"coordinate\",\"magic-stick\",\"reading\",\"data-line\",\"data-board\",\"pie-chart\",\"data-analysis\",\"collection-tag\",\"film\",\"suitcase\",\"suitcase-1\",\"receiving\",\"collection\",\"files\",\"notebook-1\",\"notebook-2\",\"toilet-paper\",\"office-building\",\"school\",\"table-lamp\",\"house\",\"no-smoking\",\"smoking\",\"shopping-cart-full\",\"shopping-cart-1\",\"shopping-cart-2\",\"shopping-bag-1\",\"shopping-bag-2\",\"sold-out\",\"sell\",\"present\",\"box\",\"bank-card\",\"money\",\"coin\",\"wallet\",\"discount\",\"price-tag\",\"news\",\"guide\",\"male\",\"female\",\"thumb\",\"cpu\",\"link\",\"connection\",\"open\",\"turn-off\",\"set-up\",\"chat-round\",\"chat-line-round\",\"chat-square\",\"chat-dot-round\",\"chat-dot-square\",\"chat-line-square\",\"message\",\"postcard\",\"position\",\"turn-off-microphone\",\"microphone\",\"close-notification\",\"bangzhu\",\"time\",\"odometer\",\"crop\",\"aim\",\"switch-button\",\"full-screen\",\"copy-document\",\"mic\",\"stopwatch\",\"medal-1\",\"medal\",\"trophy\",\"trophy-1\",\"first-aid-kit\",\"discover\",\"place\",\"location\",\"location-outline\",\"location-information\",\"add-location\",\"delete-location\",\"map-location\",\"alarm-clock\",\"timer\",\"watch-1\",\"watch\",\"lock\",\"unlock\",\"key\",\"service\",\"mobile-phone\",\"bicycle\",\"truck\",\"ship\",\"basketball\",\"football\",\"soccer\",\"baseball\",\"wind-power\",\"light-rain\",\"lightning\",\"heavy-rain\",\"sunrise\",\"sunrise-1\",\"sunset\",\"sunny\",\"cloudy\",\"partly-cloudy\",\"cloudy-and-sunny\",\"moon\",\"moon-night\",\"dish\",\"dish-1\",\"food\",\"chicken\",\"fork-spoon\",\"knife-fork\",\"burger\",\"tableware\",\"sugar\",\"dessert\",\"ice-cream\",\"hot-water\",\"water-cup\",\"coffee-cup\",\"cold-drink\",\"goblet\",\"goblet-full\",\"goblet-square\",\"goblet-square-full\",\"refrigerator\",\"grape\",\"watermelon\",\"cherry\",\"apple\",\"pear\",\"orange\",\"coffee\",\"ice-tea\",\"ice-drink\",\"milk-tea\",\"potato-strips\",\"lollipop\",\"ice-cream-square\",\"ice-cream-round\"]')},d8d7:function(e,t,a){\"use strict\";var o=a(\"b9af\"),n=a.n(o);n.a},d8dc:function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-radio\",use:\"icon-radio-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-radio\"><defs><style type=\"text/css\"></style></defs><path d=\"M507.39346659 71.84873358c241.53533667 0 437.39770766 195.85422109 437.39770767 437.37442191 0 241.53766571-195.86237099 437.38955776-437.39770767 437.38955776-241.50040803 0-437.34997219-195.85189205-437.34997219-437.38955776C70.0434944 267.70295467 265.89189347 71.84873358 507.39346659 71.84873358L507.39346659 71.84873358zM507.39346659 282.81899805c-125.00686734 0-226.37039389 101.38914133-226.37039388 226.41813048 0 125.01268821 101.36352768 226.39717262 226.37039388 226.39717262 125.04295993 0 226.42395136-101.38448441 226.42395136-226.39717262C733.81625401 384.20813938 632.43642653 282.81899805 507.39346659 282.81899805L507.39346659 282.81899805zM507.39346659 120.78172615c-214.46664192 0-388.42047261 173.95150279-388.4204726 388.44026539 0 214.51204949 173.95499463 388.46122325 388.4204726 388.46122325 214.52369237 0 388.46005817-173.94800981 388.46005818-388.46122325C895.85236082 294.73322894 721.91715897 120.78172615 507.39346659 120.78172615z\" p-id=\"880\" /></symbol>'});l.a.add(c);t[\"default\"]=c},d9b9:function(e,t,a){\"use strict\";var o=a(\"0f05\"),n=a.n(o);n.a},e6df:function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-date-range\",use:\"icon-date-range-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-date-range\"><defs><style type=\"text/css\"></style></defs><path d=\"M887.466667 192.853333h-100.693334V119.466667c0-10.24-6.826667-17.066667-17.066666-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H303.786667V119.466667c0-10.24-6.826667-17.066667-17.066667-17.066667s-17.066667 6.826667-17.066667 17.066667v73.386666H168.96c-46.08 0-85.333333 37.546667-85.333333 85.333334V836.266667c0 46.08 37.546667 85.333333 85.333333 85.333333H887.466667c46.08 0 85.333333-37.546667 85.333333-85.333333V278.186667c0-47.786667-37.546667-85.333333-85.333333-85.333334z m-718.506667 34.133334h100.693333v66.56c0 10.24 6.826667 17.066667 17.066667 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56h450.56v66.56c0 10.24 6.826667 17.066667 17.066666 17.066666s17.066667-6.826667 17.066667-17.066666v-66.56H887.466667c27.306667 0 51.2 22.186667 51.2 51.2v88.746666H117.76v-88.746666c0-29.013333 22.186667-51.2 51.2-51.2zM887.466667 887.466667H168.96c-27.306667 0-51.2-22.186667-51.2-51.2V401.066667H938.666667V836.266667c0 27.306667-22.186667 51.2-51.2 51.2z\" p-id=\"1377\" /><path d=\"M858.453333 493.226667H327.68c-10.24 0-17.066667 6.826667-17.066667 17.066666v114.346667h-116.053333c-10.24 0-17.066667 6.826667-17.066667 17.066667v133.12c0 10.24 6.826667 17.066667 17.066667 17.066666H460.8c10.24 0 17.066667-6.826667 17.066667-17.066666v-114.346667h380.586666c10.24 0 17.066667-6.826667 17.066667-17.066667v-133.12c0-10.24-6.826667-17.066667-17.066667-17.066666z m-413.013333 34.133333v97.28h-98.986667v-97.28h98.986667z m-230.4 131.413333h98.986667v98.986667h-98.986667v-98.986667z m131.413333 97.28v-97.28h98.986667v97.28h-98.986667z m133.12-228.693333h97.28v98.986667h-97.28v-98.986667z m131.413334 0h98.986666v98.986667h-98.986666v-98.986667z m230.4 97.28h-98.986667v-98.986667h98.986667v98.986667z\" p-id=\"1378\" /></symbol>'});l.a.add(c);t[\"default\"]=c},eb1c:function(e,t,a){\"use strict\";a.r(t);var o=a(\"e017\"),n=a.n(o),i=a(\"21a1\"),l=a.n(i),c=new n.a({id:\"icon-slider\",use:\"icon-slider-usage\",viewBox:\"0 0 1024 1024\",content:'<symbol class=\"icon\" viewBox=\"0 0 1024 1024\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\" id=\"icon-slider\"><defs><style type=\"text/css\"></style></defs><path d=\"M951.453125 476.84375H523.671875a131.8359375 131.8359375 0 0 0-254.1796875 0H72.546875v70.3125h196.9453125a131.8359375 131.8359375 0 0 0 254.1796875 0H951.453125z\" p-id=\"1239\" /></symbol>'});l.a.add(c);t[\"default\"]=c},ed08:function(module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.d(__webpack_exports__,\"e\",(function(){return titleCase})),__webpack_require__.d(__webpack_exports__,\"d\",(function(){return isNumberStr})),__webpack_require__.d(__webpack_exports__,\"c\",(function(){return exportDefault})),__webpack_require__.d(__webpack_exports__,\"a\",(function(){return beautifierConf})),__webpack_require__.d(__webpack_exports__,\"b\",(function(){return deepClone}));var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(\"4160\"),core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_0__),core_js_modules_es_array_index_of__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(\"c975\"),core_js_modules_es_array_index_of__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(core_js_modules_es_array_index_of__WEBPACK_IMPORTED_MODULE_1__),core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(\"a15b\"),core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_2___default=__webpack_require__.n(core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_2__),core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(\"d3b7\"),core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_3___default=__webpack_require__.n(core_js_modules_es_object_to_string__WEBPACK_IMPORTED_MODULE_3__),core_js_modules_es_regexp_constructor__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(\"4d63\"),core_js_modules_es_regexp_constructor__WEBPACK_IMPORTED_MODULE_4___default=__webpack_require__.n(core_js_modules_es_regexp_constructor__WEBPACK_IMPORTED_MODULE_4__),core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(\"ac1f\"),core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_5___default=__webpack_require__.n(core_js_modules_es_regexp_exec__WEBPACK_IMPORTED_MODULE_5__),core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(\"25f0\"),core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_6___default=__webpack_require__.n(core_js_modules_es_regexp_to_string__WEBPACK_IMPORTED_MODULE_6__),core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(\"5319\"),core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_7___default=__webpack_require__.n(core_js_modules_es_string_replace__WEBPACK_IMPORTED_MODULE_7__),core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__(\"1276\"),core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_8___default=__webpack_require__.n(core_js_modules_es_string_split__WEBPACK_IMPORTED_MODULE_8__),core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__(\"159b\"),core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_9___default=__webpack_require__.n(core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_9__),_Users_zhangwenjian_Code_form_generator_node_modules_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_10__=__webpack_require__(\"53ca\");function indent(e,t){var a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:2;if(0===t)return e;var o,n=t<0,i=[],l=\"\";if(n)t*=-1,o=new RegExp(\"(^\\\\s{0,\".concat(t*a,\"})\"),\"g\");else for(var c=0;c<t*a;c++)l+=\" \";return e.split(\"\\n\").forEach((function(e){e=n?e.replace(o,\"\"):l+e,i.push(e)})),i.join(\"\\n\")}function titleCase(e){return e.replace(/( |^)[a-z]/g,(function(e){return e.toUpperCase()}))}function camelCase(e){return e.replace(/-[a-z]/g,(function(e){return e.substr(-1).toUpperCase()}))}function isNumberStr(e){return/^[+-]?(0|([1-9]\\d*))(\\.\\d+)?$/g.test(e)}var exportDefault=\"export default \",beautifierConf={html:{indent_size:\"2\",indent_char:\" \",max_preserve_newlines:\"-1\",preserve_newlines:!1,keep_array_indentation:!1,break_chained_methods:!1,indent_scripts:\"separate\",brace_style:\"end-expand\",space_before_conditional:!0,unescape_strings:!1,jslint_happy:!1,end_with_newline:!0,wrap_line_length:\"110\",indent_inner_html:!0,comma_first:!1,e4x:!0,indent_empty_lines:!0},js:{indent_size:\"2\",indent_char:\" \",max_preserve_newlines:\"-1\",preserve_newlines:!1,keep_array_indentation:!1,break_chained_methods:!1,indent_scripts:\"normal\",brace_style:\"end-expand\",space_before_conditional:!0,unescape_strings:!1,jslint_happy:!0,end_with_newline:!0,wrap_line_length:\"110\",indent_inner_html:!0,comma_first:!1,e4x:!0,indent_empty_lines:!0}};function stringify(e){return JSON.stringify(e,(function(e,t){return\"function\"===typeof t?\"\".concat(t):t}))}function parse(str){JSON.parse(str,(function(k,v){return v.indexOf&&v.indexOf(\"function\")>-1?eval(\"(\".concat(v,\")\")):v}))}function jsonClone(e){return parse(stringify(e))}function deepClone(e){var t=Object.prototype.toString;if(!e||\"object\"!==Object(_Users_zhangwenjian_Code_form_generator_node_modules_babel_runtime_helpers_esm_typeof__WEBPACK_IMPORTED_MODULE_10__[\"a\"])(e))return e;if(e.nodeType&&\"cloneNode\"in e)return e.cloneNode(!0);if(\"[object Date]\"===t.call(e))return new Date(e.getTime());if(\"[object RegExp]\"===t.call(e)){var a=[];return e.global&&a.push(\"g\"),e.multiline&&a.push(\"m\"),e.ignoreCase&&a.push(\"i\"),new RegExp(e.source,a.join(\"\"))}var o=Array.isArray(e)?[]:e.constructor?new e.constructor:{};for(var n in e)o[n]=deepClone(e[n]);return o}},f4a7:function(module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.d(__webpack_exports__,\"a\",(function(){return makeUpJs}));var core_js_modules_es_array_concat__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(\"99af\"),core_js_modules_es_array_concat__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(core_js_modules_es_array_concat__WEBPACK_IMPORTED_MODULE_0__),core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(\"4160\"),core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_1__),core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(\"a15b\"),core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_2___default=__webpack_require__.n(core_js_modules_es_array_join__WEBPACK_IMPORTED_MODULE_2__),core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(\"b64b\"),core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_3___default=__webpack_require__.n(core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_3__),core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(\"159b\"),core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_4___default=__webpack_require__.n(core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_4__),util__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(\"3022\"),util__WEBPACK_IMPORTED_MODULE_5___default=__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_5__),_utils_index__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(\"ed08\"),_ruleTrigger__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(\"beaa\"),units={KB:\"1024\",MB:\"1024 / 1024\",GB:\"1024 / 1024 / 1024\"},confGlobal,inheritAttrs={file:\"\",dialog:\"inheritAttrs: false,\"};function makeUpJs(e,t){confGlobal=e=Object(_utils_index__WEBPACK_IMPORTED_MODULE_6__[\"b\"])(e);var a=[],o=[],n=[],i=[],l=mixinMethod(t),c=[];e.fields.forEach((function(e){buildAttributes(e,a,o,n,l,i,c)}));var r=buildexport(e,t,a.join(\"\\n\"),o.join(\"\\n\"),n.join(\"\\n\"),c.join(\"\\n\"),i.join(\"\\n\"),l.join(\"\\n\"));return confGlobal=null,r}function buildAttributes(e,t,a,o,n,i,l){var c=e.__config__,r=e.__slot__;if(buildData(e,t),buildRules(e,a),(e.options||r&&r.options&&r.options.length)&&(buildOptions(e,o),\"dynamic\"===c.dataType)){var s=\"\".concat(e.__vModel__,\"Options\"),u=Object(_utils_index__WEBPACK_IMPORTED_MODULE_6__[\"e\"])(s);buildOptionMethod(\"get\".concat(u),s,n)}e.props&&e.props.props&&buildProps(e,i),e.action&&\"el-upload\"===c.tag&&(l.push(\"\".concat(e.__vModel__,\"Action: '\").concat(e.action,\"',\\n      \").concat(e.__vModel__,\"fileList: [],\")),n.push(buildBeforeUpload(e)),e[\"auto-upload\"]||n.push(buildSubmitUpload(e))),c.children&&c.children.forEach((function(e){buildAttributes(e,t,a,o,n,i,l)}))}function mixinMethod(e){var t=[],a={file:confGlobal.formBtns?{submitForm:\"submitForm() {\\n        this.$refs['\".concat(confGlobal.formRef,\"'].validate(valid => {\\n          if(!valid) return\\n          // TODO 提交表单\\n        })\\n      },\"),resetForm:\"resetForm() {\\n        this.$refs['\".concat(confGlobal.formRef,\"'].resetFields()\\n      },\")}:null,dialog:{onOpen:\"onOpen() {},\",onClose:\"onClose() {\\n        this.$refs['\".concat(confGlobal.formRef,\"'].resetFields()\\n      },\"),close:\"close() {\\n        this.$emit('update:visible', false)\\n      },\",handelConfirm:\"handelConfirm() {\\n        this.$refs['\".concat(confGlobal.formRef,\"'].validate(valid => {\\n          if(!valid) return\\n          this.close()\\n        })\\n      },\")}},o=a[e];return o&&Object.keys(o).forEach((function(e){t.push(o[e])})),t}function buildData(e,t){var a=e.__config__;if(void 0!==e.__vModel__){var o=JSON.stringify(a.defaultValue);t.push(\"\".concat(e.__vModel__,\": \").concat(o,\",\"))}}function buildRules(scheme,ruleList){var config=scheme.__config__;if(void 0!==scheme.__vModel__){var rules=[];if(_ruleTrigger__WEBPACK_IMPORTED_MODULE_7__[\"a\"][config.tag]){if(config.required){var type=Object(util__WEBPACK_IMPORTED_MODULE_5__[\"isArray\"])(config.defaultValue)?\"type: 'array',\":\"\",message=Object(util__WEBPACK_IMPORTED_MODULE_5__[\"isArray\"])(config.defaultValue)?\"请至少选择一个\".concat(config.label):scheme.placeholder;void 0===message&&(message=\"\".concat(config.label,\"不能为空\")),rules.push(\"{ required: true, \".concat(type,\" message: '\").concat(message,\"', trigger: '\").concat(_ruleTrigger__WEBPACK_IMPORTED_MODULE_7__[\"a\"][config.tag],\"' }\"))}config.regList&&Object(util__WEBPACK_IMPORTED_MODULE_5__[\"isArray\"])(config.regList)&&config.regList.forEach((function(item){item.pattern&&rules.push(\"{ pattern: \".concat(eval(item.pattern),\", message: '\").concat(item.message,\"', trigger: '\").concat(_ruleTrigger__WEBPACK_IMPORTED_MODULE_7__[\"a\"][config.tag],\"' }\"))})),ruleList.push(\"\".concat(scheme.__vModel__,\": [\").concat(rules.join(\",\"),\"],\"))}}}function buildOptions(e,t){if(void 0!==e.__vModel__){var a=e.options;a||(a=e.__slot__.options),\"dynamic\"===e.__config__.dataType&&(a=[]);var o=\"\".concat(e.__vModel__,\"Options: \").concat(JSON.stringify(a),\",\");t.push(o)}}function buildProps(e,t){var a=\"\".concat(e.__vModel__,\"Props: \").concat(JSON.stringify(e.props.props),\",\");t.push(a)}function buildBeforeUpload(e){var t=e.__config__,a=units[t.sizeUnit],o=\"\",n=\"\",i=[];t.fileSize&&(o=\"let isRightSize = file.size / \".concat(a,\" < \").concat(t.fileSize,\"\\n    if(!isRightSize){\\n      this.$message.error('文件大小超过 \").concat(t.fileSize).concat(t.sizeUnit,\"')\\n    }\"),i.push(\"isRightSize\")),e.accept&&(n=\"let isAccept = new RegExp('\".concat(e.accept,\"').test(file.type)\\n    if(!isAccept){\\n      this.$message.error('应该选择\").concat(e.accept,\"类型的文件')\\n    }\"),i.push(\"isAccept\"));var l=\"\".concat(e.__vModel__,\"BeforeUpload(file) {\\n    \").concat(o,\"\\n    \").concat(n,\"\\n    return \").concat(i.join(\"&&\"),\"\\n  },\");return i.length?l:\"\"}function buildSubmitUpload(e){var t=\"submitUpload() {\\n    this.$refs['\".concat(e.__vModel__,\"'].submit()\\n  },\");return t}function buildOptionMethod(e,t,a){var o=\"\".concat(e,\"() {\\n    // TODO 发起请求获取数据\\n    this.\").concat(t,\"\\n  },\");a.push(o)}function buildexport(e,t,a,o,n,i,l,c){var r=\"\".concat(_utils_index__WEBPACK_IMPORTED_MODULE_6__[\"c\"],\"{\\n  \").concat(inheritAttrs[t],\"\\n  components: {},\\n  props: [],\\n  data () {\\n    return {\\n      \").concat(e.formModel,\": {\\n        \").concat(a,\"\\n      },\\n      \").concat(e.formRules,\": {\\n        \").concat(o,\"\\n      },\\n      \").concat(i,\"\\n      \").concat(n,\"\\n      \").concat(l,\"\\n    }\\n  },\\n  computed: {},\\n  watch: {},\\n  created () {},\\n  mounted () {},\\n  methods: {\\n    \").concat(c,\"\\n  }\\n}\");return r}},fca0:function(e,t,a){}});"
  },
  {
    "path": "static/form-generator/js/parser-example.ce55fa09.js",
    "content": "(window[\"webpackJsonp\"]=window[\"webpackJsonp\"]||[]).push([[\"parser-example\"],{\"045a\":function(e,_,r){},2638:function(e,_,r){\"use strict\";function o(){return o=Object.assign||function(e){for(var _,r=1;r<arguments.length;r++)for(var o in _=arguments[r],_)Object.prototype.hasOwnProperty.call(_,o)&&(e[o]=_[o]);return e},o.apply(this,arguments)}var t=[\"attrs\",\"props\",\"domProps\"],n=[\"class\",\"style\",\"directives\"],l=[\"on\",\"nativeOn\"],a=function(e){return e.reduce((function(e,_){for(var r in _)if(e[r])if(-1!==t.indexOf(r))e[r]=o({},e[r],_[r]);else if(-1!==n.indexOf(r)){var a=e[r]instanceof Array?e[r]:[e[r]],s=_[r]instanceof Array?_[r]:[_[r]];e[r]=a.concat(s)}else if(-1!==l.indexOf(r))for(var c in _[r])if(e[r][c]){var u=e[r][c]instanceof Array?e[r][c]:[e[r][c]],f=_[r][c]instanceof Array?_[r][c]:[_[r][c]];e[r][c]=u.concat(f)}else e[r][c]=_[r][c];else if(\"hook\"==r)for(var d in _[r])e[r][d]=e[r][d]?i(e[r][d],_[r][d]):_[r][d];else e[r]=_[r];else e[r]=_[r];return e}),{})},i=function(e,_){return function(){e&&e.apply(this,arguments),_&&_.apply(this,arguments)}};e.exports=a},4212:function(e,_,r){\"use strict\";var o=r(\"045a\"),t=r.n(o);t.a},b8fa:function(e,_,r){\"use strict\";r.r(_);var o,t,n=function(){var e=this,_=e.$createElement,r=e._self._c||_;return r(\"div\",{staticClass:\"test-form\"},[r(\"parser\",{attrs:{\"form-conf\":e.formConf},on:{submit:e.sumbitForm1}}),r(\"parser\",{key:e.key2,attrs:{\"form-conf\":e.formConf},on:{submit:e.sumbitForm2}}),r(\"el-button\",{on:{click:e.change}},[e._v(\" change \")])],1)},l=[],a=(r(\"4160\"),r(\"159b\"),r(\"f50d\")),i=a[\"a\"],s=r(\"2877\"),c=Object(s[\"a\"])(i,o,t,!1,null,null,null),u=c.exports,f={components:{Parser:u},props:{},data:function(){return{key2:+new Date,formConf:{fields:[{__config__:{label:\"单行文本\",labelWidth:null,showLabel:!0,changeTag:!0,tag:\"el-input\",tagIcon:\"input\",required:!0,layout:\"colFormItem\",span:24,document:\"https://element.eleme.cn/#/zh-CN/component/input\",regList:[{pattern:\"/^1(3|4|5|7|8|9)\\\\d{9}$/\",message:\"手机号格式错误\"}]},__slot__:{prepend:\"\",append:\"\"},__vModel__:\"mobile\",placeholder:\"请输入手机号\",style:{width:\"100%\"},clearable:!0,\"prefix-icon\":\"el-icon-mobile\",\"suffix-icon\":\"\",maxlength:11,\"show-word-limit\":!0,readonly:!1,disabled:!1},{__config__:{label:\"日期范围\",tag:\"el-date-picker\",tagIcon:\"date-range\",defaultValue:null,span:24,showLabel:!0,labelWidth:null,required:!0,layout:\"colFormItem\",regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/date-picker\",formId:101,renderKey:1585980082729},style:{width:\"100%\"},type:\"daterange\",\"range-separator\":\"至\",\"start-placeholder\":\"开始日期\",\"end-placeholder\":\"结束日期\",disabled:!1,clearable:!0,format:\"yyyy-MM-dd\",\"value-format\":\"yyyy-MM-dd\",readonly:!1,__vModel__:\"field101\"},{__config__:{layout:\"rowFormItem\",tagIcon:\"row\",label:\"行容器\",layoutTree:!0,children:[{__config__:{label:\"评分\",tag:\"el-rate\",tagIcon:\"rate\",defaultValue:0,span:24,showLabel:!0,labelWidth:null,layout:\"colFormItem\",required:!0,regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/rate\",formId:102,renderKey:1586839671259},style:{},max:5,\"allow-half\":!1,\"show-text\":!1,\"show-score\":!1,disabled:!1,__vModel__:\"field102\"}],document:\"https://element.eleme.cn/#/zh-CN/component/layout\",formId:101,span:24,renderKey:1586839668999,componentName:\"row101\",gutter:15},type:\"default\",justify:\"start\",align:\"top\"},{__config__:{label:\"按钮\",showLabel:!0,changeTag:!0,labelWidth:null,tag:\"el-button\",tagIcon:\"button\",span:24,layout:\"colFormItem\",document:\"https://element.eleme.cn/#/zh-CN/component/button\",renderKey:1594288459289},__slot__:{default:\"测试按钮1\"},type:\"primary\",icon:\"el-icon-search\",round:!1,size:\"medium\",plain:!1,circle:!1,disabled:!1,on:{click:\"clickTestButton1\"}}],__methods__:{clickTestButton1:function(){console.log(\"%c【测试按钮1】点击事件里可以访问当前表单：\\n                1) formModel='formData', 所以this.formData可以拿到当前表单的model\\n                2) formRef='elForm', 所以this.$refs.elForm可以拿到当前表单的ref(vue组件)\\n              \",\"color:#409EFF;font-size: 15px\"),console.log(\"表单的Model：\",this.formData),console.log(\"表单的ref：\",this.$refs.elForm)}},formRef:\"elForm\",formModel:\"formData\",size:\"small\",labelPosition:\"right\",labelWidth:100,formRules:\"rules\",gutter:15,disabled:!1,span:24,formBtns:!0,unFocusedComponentBorder:!1},formConf2:{fields:[{__config__:{label:\"单行文本\",labelWidth:null,showLabel:!0,changeTag:!0,tag:\"el-input\",tagIcon:\"input\",required:!0,layout:\"colFormItem\",span:24,document:\"https://element.eleme.cn/#/zh-CN/component/input\",regList:[{pattern:\"/^1(3|4|5|7|8|9)\\\\d{9}$/\",message:\"手机号格式错误\"}]},__slot__:{prepend:\"\",append:\"\"},__vModel__:\"mobile\",placeholder:\"请输入手机号\",style:{width:\"100%\"},clearable:!0,\"prefix-icon\":\"el-icon-mobile\",\"suffix-icon\":\"\",maxlength:11,\"show-word-limit\":!0,readonly:!1,disabled:!1},{__config__:{label:\"日期范围\",tag:\"el-date-picker\",tagIcon:\"date-range\",defaultValue:null,span:24,showLabel:!0,labelWidth:null,required:!0,layout:\"colFormItem\",regList:[],changeTag:!0,document:\"https://element.eleme.cn/#/zh-CN/component/date-picker\",formId:101,renderKey:1585980082729},style:{width:\"100%\"},type:\"daterange\",\"range-separator\":\"至\",\"start-placeholder\":\"开始日期\",\"end-placeholder\":\"结束日期\",disabled:!1,clearable:!0,format:\"yyyy-MM-dd\",\"value-format\":\"yyyy-MM-dd\",readonly:!1,__vModel__:\"field101\"}],formRef:\"elForm\",formModel:\"formData\",size:\"small\",labelPosition:\"right\",labelWidth:100,formRules:\"rules\",gutter:15,disabled:!1,span:24,formBtns:!0,unFocusedComponentBorder:!1}}},computed:{},watch:{},created:function(){},mounted:function(){var e=this;setTimeout((function(){var _={mobile:\"18836662555\"};e.fillFormData(e.formConf,_),e.key2=+new Date}),2e3)},methods:{fillFormData:function(e,_){e.fields.forEach((function(e){var r=_[e.__vModel__];r&&(e.__config__.defaultValue=r)}))},change:function(){this.key2=+new Date;var e=this.formConf;this.formConf=this.formConf2,this.formConf2=e},sumbitForm1:function(e){console.log(\"sumbitForm1提交数据：\",e)},sumbitForm2:function(e){console.log(\"sumbitForm2提交数据：\",e)}}},d=f,m=(r(\"4212\"),Object(s[\"a\"])(d,n,l,!1,null,\"77b1aafa\",null));_[\"default\"]=m.exports},f50d:function(module,__webpack_exports__,__webpack_require__){\"use strict\";var core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(\"4160\"),core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_0__),core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(\"d81d\"),core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(core_js_modules_es_array_map__WEBPACK_IMPORTED_MODULE_1__),core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(\"b64b\"),core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_2___default=__webpack_require__.n(core_js_modules_es_object_keys__WEBPACK_IMPORTED_MODULE_2__),core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(\"159b\"),core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_3___default=__webpack_require__.n(core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_3__),_Users_zhangwenjian_Code_form_generator_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(\"ade3\"),_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(\"2638\"),_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_5___default=__webpack_require__.n(_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_5__),_Users_zhangwenjian_Code_form_generator_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(\"5530\"),_utils_index__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(\"ed08\"),_components_render_render_js__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__(\"4758\"),ruleTrigger={\"el-input\":\"blur\",\"el-input-number\":\"blur\",\"el-select\":\"change\",\"el-radio-group\":\"change\",\"el-checkbox-group\":\"change\",\"el-cascader\":\"change\",\"el-time-picker\":\"change\",\"el-date-picker\":\"change\",\"el-rate\":\"change\"},layouts={colFormItem:function(e,_){var r=_.__config__,o=buildListeners.call(this,_),t=r.labelWidth?\"\".concat(r.labelWidth,\"px\"):null;return!1===r.showLabel&&(t=\"0\"),e(\"el-col\",{attrs:{span:r.span}},[e(\"el-form-item\",{attrs:{\"label-width\":t,prop:_.__vModel__,label:r.showLabel?r.label:\"\"}},[e(_components_render_render_js__WEBPACK_IMPORTED_MODULE_8__[\"a\"],{attrs:{conf:_},on:Object(_Users_zhangwenjian_Code_form_generator_node_modules_babel_runtime_helpers_esm_objectSpread2__WEBPACK_IMPORTED_MODULE_6__[\"a\"])({},o)})])])},rowFormItem:function(e,_){var r=renderChildren.apply(this,arguments);return\"flex\"===_.type&&(r=e(\"el-row\",{attrs:{type:_.type,justify:_.justify,align:_.align}},[r])),e(\"el-col\",{attrs:{span:_.span}},[e(\"el-row\",{attrs:{gutter:_.gutter}},[r])])}};function renderFrom(e){var _=this.formConfCopy;return e(\"el-row\",{attrs:{gutter:_.gutter}},[e(\"el-form\",_vue_babel_helper_vue_jsx_merge_props__WEBPACK_IMPORTED_MODULE_5___default()([{attrs:{size:_.size,\"label-position\":_.labelPosition,disabled:_.disabled,\"label-width\":\"\".concat(_.labelWidth,\"px\")},ref:_.formRef},{props:{model:this[_.formModel]}},{attrs:{rules:this[_.formRules]}}]),[renderFormItem.call(this,e,_.fields),_.formBtns&&formBtns.call(this,e)])])}function formBtns(e){return e(\"el-col\",[e(\"el-form-item\",{attrs:{size:\"large\"}},[e(\"el-button\",{attrs:{type:\"primary\"},on:{click:this.submitForm}},[\"提交\"]),e(\"el-button\",{on:{click:this.resetForm}},[\"重置\"])])])}function renderFormItem(e,_){var r=this;return _.map((function(_){var o=_.__config__,t=layouts[o.layout];if(t)return t.call(r,e,_);throw new Error(\"没有与\".concat(o.layout,\"匹配的layout\"))}))}function renderChildren(e,_){var r=_.__config__;return Array.isArray(r.children)?renderFormItem.call(this,e,r.children):null}function setValue(e,_,r){this.$set(_,\"defaultValue\",e),this.$set(this[this.formConf.formModel],r.__vModel__,e)}function buildListeners(e){var _=this,r=e.__config__,o=this.formConf.__methods__||{},t={};return Object.keys(o).forEach((function(e){t[e]=function(r){return o[e].call(_,r)}})),t.input=function(o){return setValue.call(_,o,r,e)},t}__webpack_exports__[\"a\"]={components:{render:_components_render_render_js__WEBPACK_IMPORTED_MODULE_8__[\"a\"]},props:{formConf:{type:Object,required:!0}},data:function(){var e,_=(e={formConfCopy:Object(_utils_index__WEBPACK_IMPORTED_MODULE_7__[\"b\"])(this.formConf)},Object(_Users_zhangwenjian_Code_form_generator_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"a\"])(e,this.formConf.formModel,{}),Object(_Users_zhangwenjian_Code_form_generator_node_modules_babel_runtime_helpers_esm_defineProperty__WEBPACK_IMPORTED_MODULE_4__[\"a\"])(e,this.formConf.formRules,{}),e);return this.initFormData(_.formConfCopy.fields,_[this.formConf.formModel]),this.buildRules(_.formConfCopy.fields,_[this.formConf.formRules]),_},methods:{initFormData:function(e,_){var r=this;e.forEach((function(e){var o=e.__config__;e.__vModel__&&(_[e.__vModel__]=o.defaultValue),o.children&&r.initFormData(o.children,_)}))},buildRules:function buildRules(componentList,rules){var _this4=this;componentList.forEach((function(cur){var config=cur.__config__;if(Array.isArray(config.regList)){if(config.required){var required={required:config.required,message:cur.placeholder};Array.isArray(config.defaultValue)&&(required.type=\"array\",required.message=\"请至少选择一个\".concat(config.label)),void 0===required.message&&(required.message=\"\".concat(config.label,\"不能为空\")),config.regList.push(required)}rules[cur.__vModel__]=config.regList.map((function(item){return item.pattern&&(item.pattern=eval(item.pattern)),item.trigger=ruleTrigger&&ruleTrigger[config.tag],item}))}config.children&&_this4.buildRules(config.children,rules)}))},resetForm:function(){this.formConfCopy=Object(_utils_index__WEBPACK_IMPORTED_MODULE_7__[\"b\"])(this.formConf),this.$refs[this.formConf.formRef].resetFields()},submitForm:function(){var e=this;this.$refs[this.formConf.formRef].validate((function(_){return!!_&&(e.$emit(\"submit\",e[e.formConf.formModel]),!0)}))}},render:function(e){return renderFrom.call(this,e)}}}}]);"
  },
  {
    "path": "static/form-generator/js/preview.8ce4e0db.js",
    "content": "(function(e){function t(t){for(var n,i,_=t[0],s=t[1],l=t[2],d=0,u=[];d<_.length;d++)i=_[d],Object.prototype.hasOwnProperty.call(o,i)&&o[i]&&u.push(o[i][0]),o[i]=0;for(n in s)Object.prototype.hasOwnProperty.call(s,n)&&(e[n]=s[n]);c&&c(t);while(u.length)u.shift()();return a.push.apply(a,l||[]),r()}function r(){for(var e,t=0;t<a.length;t++){for(var r=a[t],n=!0,_=1;_<r.length;_++){var s=r[_];0!==o[s]&&(n=!1)}n&&(a.splice(t--,1),e=i(i.s=r[0]))}return e}var n={},o={preview:0},a=[];function i(t){if(n[t])return n[t].exports;var r=n[t]={i:t,l:!1,exports:{}};return e[t].call(r.exports,r,r.exports,i),r.l=!0,r.exports}i.m=e,i.c=n,i.d=function(e,t,r){i.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},i.r=function(e){\"undefined\"!==typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(e,\"__esModule\",{value:!0})},i.t=function(e,t){if(1&t&&(e=i(e)),8&t)return e;if(4&t&&\"object\"===typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(i.r(r),Object.defineProperty(r,\"default\",{enumerable:!0,value:e}),2&t&&\"string\"!=typeof e)for(var n in e)i.d(r,n,function(t){return e[t]}.bind(null,n));return r},i.n=function(e){var t=e&&e.__esModule?function(){return e[\"default\"]}:function(){return e};return i.d(t,\"a\",t),t},i.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},i.p=\"/form-generator/\";var _=window[\"webpackJsonp\"]=window[\"webpackJsonp\"]||[],s=_.push.bind(_);_.push=t,_=_.slice();for(var l=0;l<_.length;l++)t(_[l]);var c=s;a.push([1,\"chunk-vendors\"]),r()})({1:function(e,t,r){e.exports=r(\"2c42\")},\"2c42\":function(module,__webpack_exports__,__webpack_require__){\"use strict\";__webpack_require__.r(__webpack_exports__);var core_js_modules_es_array_concat__WEBPACK_IMPORTED_MODULE_0__=__webpack_require__(\"99af\"),core_js_modules_es_array_concat__WEBPACK_IMPORTED_MODULE_0___default=__webpack_require__.n(core_js_modules_es_array_concat__WEBPACK_IMPORTED_MODULE_0__),core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_1__=__webpack_require__(\"4160\"),core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_1___default=__webpack_require__.n(core_js_modules_es_array_for_each__WEBPACK_IMPORTED_MODULE_1__),core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_2__=__webpack_require__(\"159b\"),core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_2___default=__webpack_require__.n(core_js_modules_web_dom_collections_for_each__WEBPACK_IMPORTED_MODULE_2__),_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_3__=__webpack_require__(\"e260\"),_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_3___default=__webpack_require__.n(_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_array_iterator_js__WEBPACK_IMPORTED_MODULE_3__),_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_4__=__webpack_require__(\"e6cf\"),_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_4___default=__webpack_require__.n(_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_promise_js__WEBPACK_IMPORTED_MODULE_4__),_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_5__=__webpack_require__(\"cca6\"),_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_5___default=__webpack_require__.n(_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_object_assign_js__WEBPACK_IMPORTED_MODULE_5__),_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_6__=__webpack_require__(\"a79d\"),_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_6___default=__webpack_require__.n(_Users_zhangwenjian_Code_form_generator_node_modules_core_js_modules_es_promise_finally_js__WEBPACK_IMPORTED_MODULE_6__),vue__WEBPACK_IMPORTED_MODULE_7__=__webpack_require__(\"8bbf\"),vue__WEBPACK_IMPORTED_MODULE_7___default=__webpack_require__.n(vue__WEBPACK_IMPORTED_MODULE_7__),_utils_loadScript__WEBPACK_IMPORTED_MODULE_8__=__webpack_require__(\"c88b\"),_components_tinymce_index_vue__WEBPACK_IMPORTED_MODULE_9__=__webpack_require__(\"31c6\");vue__WEBPACK_IMPORTED_MODULE_7___default.a.component(\"tinymce\",_components_tinymce_index_vue__WEBPACK_IMPORTED_MODULE_9__[\"a\"]);var $previewApp=document.getElementById(\"previewApp\"),childAttrs={file:\"\",dialog:' width=\"600px\" class=\"dialog-width\" v-if=\"visible\" :visible.sync=\"visible\" :modal-append-to-body=\"false\" '};function buildLinks(e){var t=\"\";return e.forEach((function(e){t+='<link href=\"'.concat(e,'\" rel=\"stylesheet\">')})),t}function init(e){if(\"refreshFrame\"===e.data.type){var t=e.data.data,r=childAttrs[t.generateConf.type],n=\"\";Array.isArray(t.links)&&t.links.length>0&&(n=buildLinks(t.links)),$previewApp.innerHTML=\"\".concat(n,\"<style>\").concat(t.css,'</style><div id=\"app\"></div>'),Array.isArray(t.scripts)&&t.scripts.length>0?Object(_utils_loadScript__WEBPACK_IMPORTED_MODULE_8__[\"b\"])(t.scripts,(function(){newVue(r,t.js,t.html)})):newVue(r,t.js,t.html)}}function newVue(attrs,main,html){main=eval(\"(\".concat(main,\")\")),main.template=\"<div>\".concat(html,\"</div>\"),new vue__WEBPACK_IMPORTED_MODULE_7___default.a({components:{child:main},data:function(){return{visible:!0}},template:\"<div><child \".concat(attrs,\"/></div>\")}).$mount(\"#app\")}window.addEventListener(\"message\",init,!1)},\"31c6\":function(e,t,r){\"use strict\";var n,o=function(){var e=this,t=e.$createElement,r=e._self._c||t;return r(\"textarea\",{staticStyle:{visibility:\"hidden\"},attrs:{id:e.tinymceId}})},a=[],i=(r(\"99af\"),r(\"d3b7\"),r(\"25f0\"),r(\"c88b\")),_=r(\"5f72\"),s=r.n(_);function l(e){if(n)e(n);else{var t=s.a.Loading.service({fullscreen:!0,lock:!0,text:\"富文本资源加载中...\",spinner:\"el-icon-loading\",background:\"rgba(255, 255, 255, 0.5)\"});Object(i[\"a\"])(\"https://lib.baomitu.com/tinymce/5.3.2/tinymce.min.js\",(function(){t.close(),n=tinymce,e(n)}))}}var c=[\"advlist anchor autolink autosave code codesample directionality emoticons fullscreen hr image imagetools insertdatetime link lists media nonbreaking noneditable pagebreak paste preview print save searchreplace spellchecker tabfocus table template textpattern visualblocks visualchars wordcount\"],d=[\"code searchreplace bold italic underline strikethrough alignleft aligncenter alignright outdent indent blockquote removeformat subscript superscript codesample hr bullist numlist link image charmap preview anchor pagebreak insertdatetime media table emoticons forecolor backcolor fullscreen\"],u=r(\"cc06\"),p=1,m={props:{id:{type:String,default:function(){return 1e4===p&&(p=1),\"tinymce\".concat(+new Date).concat(p++)}},value:{default:\"\"}},data:function(){return{tinymceId:this.id}},mounted:function(){var e=this;l((function(t){r(\"afc4\");var n={selector:\"#\".concat(e.tinymceId),language:\"zh_CN\",menubar:\"file edit insert view format table\",plugins:c,toolbar:d,height:300,branding:!1,object_resizing:!1,end_container_on_empty_block:!0,powerpaste_word_import:\"clean\",code_dialog_height:450,code_dialog_width:1e3,advlist_bullet_styles:\"square\",advlist_number_styles:\"default\",default_link_target:\"_blank\",link_title:!1,nonbreaking_force_tab:!0};n=Object.assign(n,e.$attrs),n.init_instance_callback=function(t){e.value&&t.setContent(e.value),e.vModel(t)},t.init(n)}))},destroyed:function(){this.destroyTinymce()},methods:{vModel:function(e){var t=this,r=Object(u[\"a\"])(250,e.setContent);this.$watch(\"value\",(function(t,n){e&&t!==n&&t!==e.getContent()&&(\"string\"!==typeof t&&(t=t.toString()),r.call(e,t))})),e.on(\"change keyup undo redo\",(function(){t.$emit(\"input\",e.getContent())}))},destroyTinymce:function(){if(window.tinymce){var e=window.tinymce.get(this.tinymceId);e&&e.destroy()}}}},g=m,f=r(\"2877\"),h=Object(f[\"a\"])(g,o,a,!1,null,null,null);t[\"a\"]=h.exports},\"5f72\":function(e,t){e.exports=ELEMENT},\"8bbf\":function(e,t){e.exports=Vue},afc4:function(e,t){tinymce.addI18n(\"zh_CN\",{Redo:\"重做\",Undo:\"撤销\",Cut:\"剪切\",Copy:\"复制\",Paste:\"粘贴\",\"Select all\":\"全选\",\"New document\":\"新文件\",Ok:\"确定\",Cancel:\"取消\",\"Visual aids\":\"网格线\",Bold:\"粗体\",Italic:\"斜体\",Underline:\"下划线\",Strikethrough:\"删除线\",Superscript:\"上标\",Subscript:\"下标\",\"Clear formatting\":\"清除格式\",\"Align left\":\"左边对齐\",\"Align center\":\"中间对齐\",\"Align right\":\"右边对齐\",Justify:\"两端对齐\",\"Bullet list\":\"项目符号\",\"Numbered list\":\"编号列表\",\"Decrease indent\":\"减少缩进\",\"Increase indent\":\"增加缩进\",Close:\"关闭\",Formats:\"格式\",\"Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.\":\"你的浏览器不支持打开剪贴板，请使用Ctrl+X/C/V等快捷键。\",Headers:\"标题\",\"Header 1\":\"标题1\",\"Header 2\":\"标题2\",\"Header 3\":\"标题3\",\"Header 4\":\"标题4\",\"Header 5\":\"标题5\",\"Header 6\":\"标题6\",Headings:\"标题\",\"Heading 1\":\"标题1\",\"Heading 2\":\"标题2\",\"Heading 3\":\"标题3\",\"Heading 4\":\"标题4\",\"Heading 5\":\"标题5\",\"Heading 6\":\"标题6\",Preformatted:\"预先格式化的\",Div:\"Div\",Pre:\"Pre\",Code:\"代码\",Paragraph:\"段落\",Blockquote:\"引文区块\",Inline:\"文本\",Blocks:\"基块\",\"Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.\":\"当前为纯文本粘贴模式，再次点击可以回到普通粘贴模式。\",Fonts:\"字体\",\"Font Sizes\":\"字号\",Class:\"类型\",\"Browse for an image\":\"浏览图像\",OR:\"或\",\"Drop an image here\":\"拖放一张图像至此\",Upload:\"上传\",Block:\"块\",Align:\"对齐\",Default:\"默认\",Circle:\"空心圆\",Disc:\"实心圆\",Square:\"方块\",\"Lower Alpha\":\"小写英文字母\",\"Lower Greek\":\"小写希腊字母\",\"Lower Roman\":\"小写罗马字母\",\"Upper Alpha\":\"大写英文字母\",\"Upper Roman\":\"大写罗马字母\",\"Anchor...\":\"锚点...\",Name:\"名称\",Id:\"标识符\",\"Id should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.\":\"标识符应该以字母开头，后跟字母、数字、破折号、点、冒号或下划线。\",\"You have unsaved changes are you sure you want to navigate away?\":\"你还有文档尚未保存，确定要离开？\",\"Restore last draft\":\"恢复上次的草稿\",\"Special character...\":\"特殊字符...\",\"Source code\":\"源代码\",\"Insert/Edit code sample\":\"插入/编辑代码示例\",Language:\"语言\",\"Code sample...\":\"示例代码...\",\"Color Picker\":\"选色器\",R:\"R\",G:\"G\",B:\"B\",\"Left to right\":\"从左到右\",\"Right to left\":\"从右到左\",\"Emoticons...\":\"表情符号...\",\"Metadata and Document Properties\":\"元数据和文档属性\",Title:\"标题\",Keywords:\"关键词\",Description:\"描述\",Robots:\"机器人\",Author:\"作者\",Encoding:\"编码\",Fullscreen:\"全屏\",Action:\"操作\",Shortcut:\"快捷键\",Help:\"帮助\",Address:\"地址\",\"Focus to menubar\":\"移动焦点到菜单栏\",\"Focus to toolbar\":\"移动焦点到工具栏\",\"Focus to element path\":\"移动焦点到元素路径\",\"Focus to contextual toolbar\":\"移动焦点到上下文菜单\",\"Insert link (if link plugin activated)\":\"插入链接 (如果链接插件已激活)\",\"Save (if save plugin activated)\":\"保存(如果保存插件已激活)\",\"Find (if searchreplace plugin activated)\":\"查找(如果查找替换插件已激活)\",\"Plugins installed ({0}):\":\"已安装插件 ({0}):\",\"Premium plugins:\":\"优秀插件：\",\"Learn more...\":\"了解更多...\",\"You are using {0}\":\"你正在使用 {0}\",Plugins:\"插件\",\"Handy Shortcuts\":\"快捷键\",\"Horizontal line\":\"水平分割线\",\"Insert/edit image\":\"插入/编辑图片\",\"Image description\":\"图片描述\",Source:\"地址\",Dimensions:\"大小\",\"Constrain proportions\":\"保持纵横比\",General:\"普通\",Advanced:\"高级\",Style:\"样式\",\"Vertical space\":\"垂直边距\",\"Horizontal space\":\"水平边距\",Border:\"边框\",\"Insert image\":\"插入图片\",\"Image...\":\"图片...\",\"Image list\":\"图片列表\",\"Rotate counterclockwise\":\"逆时针旋转\",\"Rotate clockwise\":\"顺时针旋转\",\"Flip vertically\":\"垂直翻转\",\"Flip horizontally\":\"水平翻转\",\"Edit image\":\"编辑图片\",\"Image options\":\"图片选项\",\"Zoom in\":\"放大\",\"Zoom out\":\"缩小\",Crop:\"裁剪\",Resize:\"调整大小\",Orientation:\"方向\",Brightness:\"亮度\",Sharpen:\"锐化\",Contrast:\"对比度\",\"Color levels\":\"颜色层次\",Gamma:\"伽马值\",Invert:\"反转\",Apply:\"应用\",Back:\"后退\",\"Insert date/time\":\"插入日期/时间\",\"Date/time\":\"日期/时间\",\"Insert/Edit Link\":\"插入/编辑链接\",\"Insert/edit link\":\"插入/编辑链接\",\"Text to display\":\"显示文字\",Url:\"地址\",\"Open link in...\":\"链接打开位置...\",\"Current window\":\"当前窗口\",None:\"无\",\"New window\":\"在新窗口打开\",\"Remove link\":\"删除链接\",Anchors:\"锚点\",\"Link...\":\"链接...\",\"Paste or type a link\":\"粘贴或输入链接\",\"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?\":\"你所填写的URL地址为邮件地址，需要加上mailto:前缀吗？\",\"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?\":\"你所填写的URL地址属于外部链接，需要加上http://:前缀吗？\",\"Link list\":\"链接列表\",\"Insert video\":\"插入视频\",\"Insert/edit video\":\"插入/编辑视频\",\"Insert/edit media\":\"插入/编辑媒体\",\"Alternative source\":\"镜像\",\"Alternative source URL\":\"替代来源网址\",\"Media poster (Image URL)\":\"封面(图片地址)\",\"Paste your embed code below:\":\"将内嵌代码粘贴在下面:\",Embed:\"内嵌\",\"Media...\":\"多媒体...\",\"Nonbreaking space\":\"不间断空格\",\"Page break\":\"分页符\",\"Paste as text\":\"粘贴为文本\",Preview:\"预览\",\"Print...\":\"打印...\",Save:\"保存\",Find:\"查找\",\"Replace with\":\"替换为\",Replace:\"替换\",\"Replace all\":\"全部替换\",Previous:\"上一个\",Next:\"下一个\",\"Find and replace...\":\"查找并替换...\",\"Could not find the specified string.\":\"未找到搜索内容.\",\"Match case\":\"区分大小写\",\"Find whole words only\":\"全字匹配\",\"Spell check\":\"拼写检查\",Ignore:\"忽略\",\"Ignore all\":\"全部忽略\",Finish:\"完成\",\"Add to Dictionary\":\"添加到字典\",\"Insert table\":\"插入表格\",\"Table properties\":\"表格属性\",\"Delete table\":\"删除表格\",Cell:\"单元格\",Row:\"行\",Column:\"列\",\"Cell properties\":\"单元格属性\",\"Merge cells\":\"合并单元格\",\"Split cell\":\"拆分单元格\",\"Insert row before\":\"在上方插入\",\"Insert row after\":\"在下方插入\",\"Delete row\":\"删除行\",\"Row properties\":\"行属性\",\"Cut row\":\"剪切行\",\"Copy row\":\"复制行\",\"Paste row before\":\"粘贴到上方\",\"Paste row after\":\"粘贴到下方\",\"Insert column before\":\"在左侧插入\",\"Insert column after\":\"在右侧插入\",\"Delete column\":\"删除列\",Cols:\"列\",Rows:\"行\",Width:\"宽\",Height:\"高\",\"Cell spacing\":\"单元格外间距\",\"Cell padding\":\"单元格内边距\",\"Show caption\":\"显示标题\",Left:\"左对齐\",Center:\"居中\",Right:\"右对齐\",\"Cell type\":\"单元格类型\",Scope:\"范围\",Alignment:\"对齐方式\",\"H Align\":\"水平对齐\",\"V Align\":\"垂直对齐\",Top:\"顶部对齐\",Middle:\"垂直居中\",Bottom:\"底部对齐\",\"Header cell\":\"表头单元格\",\"Row group\":\"行组\",\"Column group\":\"列组\",\"Row type\":\"行类型\",Header:\"表头\",Body:\"表体\",Footer:\"表尾\",\"Border color\":\"边框颜色\",\"Insert template...\":\"插入模板...\",Templates:\"模板\",Template:\"模板\",\"Text color\":\"文字颜色\",\"Background color\":\"背景色\",\"Custom...\":\"自定义...\",\"Custom color\":\"自定义颜色\",\"No color\":\"无\",\"Remove color\":\"移除颜色\",\"Table of Contents\":\"内容列表\",\"Show blocks\":\"显示区块边框\",\"Show invisible characters\":\"显示不可见字符\",\"Word count\":\"字数\",Count:\"计数\",Document:\"文档\",Selection:\"选择\",Words:\"单词\",\"Words: {0}\":\"字数：{0}\",\"{0} words\":\"{0} 字\",File:\"文件\",Edit:\"编辑\",Insert:\"插入\",View:\"视图\",Format:\"格式\",Table:\"表格\",Tools:\"工具\",\"Powered by {0}\":\"由{0}驱动\",\"Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help\":\"在编辑区按ALT-F9打开菜单，按ALT-F10打开工具栏，按ALT-0查看帮助\",\"Image title\":\"图片标题\",\"Border width\":\"边框宽度\",\"Border style\":\"边框样式\",Error:\"错误\",Warn:\"警告\",Valid:\"有效\",\"To open the popup, press Shift+Enter\":\"按Shitf+Enter键打开对话框\",\"Rich Text Area. Press ALT-0 for help.\":\"编辑区。按Alt+0键打开帮助。\",\"System Font\":\"系统字体\",\"Failed to upload image: {0}\":\"图片上传失败: {0}\",\"Failed to load plugin: {0} from url {1}\":\"插件加载失败: {0} 来自链接 {1}\",\"Failed to load plugin url: {0}\":\"插件加载失败 链接: {0}\",\"Failed to initialize plugin: {0}\":\"插件初始化失败: {0}\",example:\"示例\",Search:\"搜索\",All:\"全部\",Currency:\"货币\",Text:\"文字\",Quotations:\"引用\",Mathematical:\"数学\",\"Extended Latin\":\"拉丁语扩充\",Symbols:\"符号\",Arrows:\"箭头\",\"User Defined\":\"自定义\",\"dollar sign\":\"美元符号\",\"currency sign\":\"货币符号\",\"euro-currency sign\":\"欧元符号\",\"colon sign\":\"冒号\",\"cruzeiro sign\":\"克鲁赛罗币符号\",\"french franc sign\":\"法郎符号\",\"lira sign\":\"里拉符号\",\"mill sign\":\"密尔符号\",\"naira sign\":\"奈拉符号\",\"peseta sign\":\"比塞塔符号\",\"rupee sign\":\"卢比符号\",\"won sign\":\"韩元符号\",\"new sheqel sign\":\"新谢克尔符号\",\"dong sign\":\"越南盾符号\",\"kip sign\":\"老挝基普符号\",\"tugrik sign\":\"图格里克符号\",\"drachma sign\":\"德拉克马符号\",\"german penny symbol\":\"德国便士符号\",\"peso sign\":\"比索符号\",\"guarani sign\":\"瓜拉尼符号\",\"austral sign\":\"澳元符号\",\"hryvnia sign\":\"格里夫尼亚符号\",\"cedi sign\":\"塞地符号\",\"livre tournois sign\":\"里弗弗尔符号\",\"spesmilo sign\":\"spesmilo符号\",\"tenge sign\":\"坚戈符号\",\"indian rupee sign\":\"印度卢比\",\"turkish lira sign\":\"土耳其里拉\",\"nordic mark sign\":\"北欧马克\",\"manat sign\":\"马纳特符号\",\"ruble sign\":\"卢布符号\",\"yen character\":\"日元字样\",\"yuan character\":\"人民币元字样\",\"yuan character, in hong kong and taiwan\":\"元字样（港台地区）\",\"yen/yuan character variant one\":\"元字样（大写）\",\"Loading emoticons...\":\"加载表情符号...\",\"Could not load emoticons\":\"不能加载表情符号\",People:\"人类\",\"Animals and Nature\":\"动物和自然\",\"Food and Drink\":\"食物和饮品\",Activity:\"活动\",\"Travel and Places\":\"旅游和地点\",Objects:\"物件\",Flags:\"旗帜\",Characters:\"字符\",\"Characters (no spaces)\":\"字符(无空格)\",\"{0} characters\":\"{0} 个字符\",\"Error: Form submit field collision.\":\"错误: 表单提交字段冲突。\",\"Error: No form element found.\":\"错误: 没有表单控件。\",Update:\"更新\",\"Color swatch\":\"颜色样本\",Turquoise:\"青绿色\",Green:\"绿色\",Blue:\"蓝色\",Purple:\"紫色\",\"Navy Blue\":\"海军蓝\",\"Dark Turquoise\":\"深蓝绿色\",\"Dark Green\":\"深绿色\",\"Medium Blue\":\"中蓝色\",\"Medium Purple\":\"中紫色\",\"Midnight Blue\":\"深蓝色\",Yellow:\"黄色\",Orange:\"橙色\",Red:\"红色\",\"Light Gray\":\"浅灰色\",Gray:\"灰色\",\"Dark Yellow\":\"暗黄色\",\"Dark Orange\":\"深橙色\",\"Dark Red\":\"深红色\",\"Medium Gray\":\"中灰色\",\"Dark Gray\":\"深灰色\",\"Light Green\":\"浅绿色\",\"Light Yellow\":\"浅黄色\",\"Light Red\":\"浅红色\",\"Light Purple\":\"浅紫色\",\"Light Blue\":\"浅蓝色\",\"Dark Purple\":\"深紫色\",\"Dark Blue\":\"深蓝色\",Black:\"黑色\",White:\"白色\",\"Switch to or from fullscreen mode\":\"切换全屏模式\",\"Open help dialog\":\"打开帮助对话框\",history:\"历史\",styles:\"样式\",formatting:\"格式化\",alignment:\"对齐\",indentation:\"缩进\",\"permanent pen\":\"记号笔\",comments:\"备注\",\"Format Painter\":\"格式刷\",\"Insert/edit iframe\":\"插入/编辑框架\",Capitalization:\"大写\",lowercase:\"小写\",UPPERCASE:\"大写\",\"Title Case\":\"首字母大写\",\"Permanent Pen Properties\":\"永久笔属性\",\"Permanent pen properties...\":\"永久笔属性...\",Font:\"字体\",Size:\"字号\",\"More...\":\"更多...\",\"Spellcheck Language\":\"拼写检查语言\",\"Select...\":\"选择...\",Preferences:\"首选项\",Yes:\"是\",No:\"否\",\"Keyboard Navigation\":\"键盘指引\",Version:\"版本\",Anchor:\"锚点\",\"Special character\":\"特殊符号\",\"Code sample\":\"代码示例\",Color:\"颜色\",Emoticons:\"表情\",\"Document properties\":\"文档属性\",Image:\"图片\",\"Insert link\":\"插入链接\",Target:\"打开方式\",Link:\"链接\",Poster:\"封面\",Media:\"媒体\",Print:\"打印\",Prev:\"上一个\",\"Find and replace\":\"查找和替换\",\"Whole words\":\"全字匹配\",Spellcheck:\"拼写检查\",Caption:\"标题\",\"Insert template\":\"插入模板\"})},c88b:function(e,t,r){\"use strict\";r.d(t,\"b\",(function(){return a}));r(\"4160\"),r(\"159b\");var n={};function o(e,t){var r=document.getElementById(e),o=t||function(){};if(!r){n[e]=[];var a=document.createElement(\"script\");a.src=e,a.id=e,a.async=1,document.body.appendChild(a);var i=\"onload\"in a?_.bind(a):s.bind(a);i(a)}function _(t){var r=this;t.onload=function(){r.onerror=r.onload=null,n[e].forEach((function(e){e(null,t)})),delete n[e]},t.onerror=function(){r.onerror=r.onload=null,o(new Error(\"Failed to load \".concat(e)),t)}}function s(t){var r=this;t.onreadystatechange=function(){\"complete\"!==r.readyState&&\"loaded\"!==r.readyState||(r.onreadystatechange=null,n[e].forEach((function(e){e(null,t)})),delete n[e])}}n[e].push(o)}function a(e,t){var r=e.shift();e.length?o(r,(function(){return a(e,t)})):o(r,t)}t[\"a\"]=o}});"
  },
  {
    "path": "static/form-generator/js/tinymce-example.641995ab.js",
    "content": "(window[\"webpackJsonp\"]=window[\"webpackJsonp\"]||[]).push([[\"tinymce-example\"],{a5aa:function(e,t,n){\"use strict\";n.r(t);var a=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n(\"div\",[n(\"Tinymce\",{attrs:{height:300,placeholder:\"在这里输入文字\"},model:{value:e.defaultValue,callback:function(t){e.defaultValue=t},expression:\"defaultValue\"}})],1)},c=[],u=n(\"31c6\"),l={components:{Tinymce:u[\"a\"]},props:{},data:function(){return{defaultValue:\"<p>配置文档参阅：http://tinymce.ax-z.cn</p>\"}},computed:{},watch:{},created:function(){},mounted:function(){},methods:{}},o=l,i=n(\"2877\"),p=Object(i[\"a\"])(o,a,c,!1,null,null,null);t[\"default\"]=p.exports}}]);"
  },
  {
    "path": "static/form-generator/preview.html",
    "content": "<!doctype html><html lang=\"zh\"><head><meta charset=\"utf-8\"><meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge\"><meta name=\"viewport\" content=\"width=device-width,initial-scale=1\"><link rel=\"icon\" href=\"/form-generator/favicon.ico\"><title>form-generator-preview</title><link href=\"https://lib.baomitu.com/element-ui/2.13.2/theme-chalk/index.css\" rel=\"stylesheet\"><script src=\"https://lib.baomitu.com/vue/2.6.11/vue.min.js\"></script><script src=\"https://lib.baomitu.com/vue-router/3.1.3/vue-router.min.js\"></script><script src=\"https://lib.baomitu.com/element-ui/2.13.2/index.js\"></script><style>body{margin:0;padding:0;overflow-x:hidden;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;text-rendering:optimizeLegibility;height:calc(100vh - 33px);padding:12px;box-sizing:border-box;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}input,textarea{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji}</style><link href=\"/form-generator/js/chunk-vendors.971555db.js\" rel=\"preload\" as=\"script\"><link href=\"/form-generator/js/preview.8ce4e0db.js\" rel=\"preload\" as=\"script\"></head><body><noscript><strong>抱歉，javascript被禁用，请开启后重试。</strong></noscript><div id=\"previewApp\"></div><script src=\"/form-generator/js/chunk-vendors.971555db.js\"></script><script src=\"/form-generator/js/preview.8ce4e0db.js\"></script></body></html>"
  },
  {
    "path": "stop.sh",
    "content": "#!/bin/bash\nkillall go-admin # kill go-admin service\necho \"stop go-admin success\"\nps -aux | grep go-admin"
  },
  {
    "path": "template/api_migrate.template",
    "content": "package version\n\nimport (\n\t\"gorm.io/gorm\"\n\t\"runtime\"\n    \"time\"\n\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\n\t\"go-admin/cmd/migrate/migration\"\n\tcommon \"go-admin/common/models\"\n)\n\ntype Menu struct {\n\tMenuId     int    `json:\"menuId\" gorm:\"primaryKey;autoIncrement\"`\n\tMenuName   string `json:\"menuName\" gorm:\"size:128;\"`\n\tTitle      string `json:\"title\" gorm:\"size:128;\"`\n\tIcon       string `json:\"icon\" gorm:\"size:128;\"`\n\tPath       string `json:\"path\" gorm:\"size:128;\"`\n\tPaths      string `json:\"paths\" gorm:\"size:128;\"`\n\tMenuType   string `json:\"menuType\" gorm:\"size:1;\"`\n\tAction     string `json:\"action\" gorm:\"size:16;\"`\n\tPermission string `json:\"permission\" gorm:\"size:255;\"`\n\tParentId   int    `json:\"parentId\" gorm:\"size:11;\"`\n\tNoCache    bool   `json:\"noCache\" gorm:\"size:8;\"`\n\tBreadcrumb string `json:\"breadcrumb\" gorm:\"size:255;\"`\n\tComponent  string `json:\"component\" gorm:\"size:255;\"`\n\tSort       int    `json:\"sort\" gorm:\"size:4;\"`\n\tVisible    string `json:\"visible\" gorm:\"size:1;\"`\n\tCreateBy   string `json:\"createBy\" gorm:\"size:128;\"`\n\tUpdateBy   string `json:\"updateBy\" gorm:\"size:128;\"`\n\tIsFrame    string `json:\"isFrame\" gorm:\"size:1;DEFAULT:0;\"`\n\tCreatedAt time.Time  `json:\"createdAt\"`\n    UpdatedAt time.Time  `json:\"updatedAt\"`\n    DeletedAt *time.Time `json:\"deletedAt\"`\n}\n\nfunc (Menu) TableName() string {\n\treturn \"sys_menu\"\n}\n\nfunc init() {\n\t_, fileName, _, _ := runtime.Caller(0)\n\tmigration.Migrate.SetVersion(migration.GetFilename(fileName), _{{.GenerateTime}}Test)\n}\n\nfunc _{{.GenerateTime}}Test(db *gorm.DB, version string) error {\n\treturn db.Transaction(func(tx *gorm.DB) error {\n\n        timeNow := pkg.GetCurrentTime()\n        Mmenu := Menu{}\n        Mmenu.MenuName = \"{{.TBName}}Manage\"\n        Mmenu.Title = \"{{.TableComment}}\"\n        Mmenu.Icon = \"pass\"\n        Mmenu.Path = \"/{{.TBName}}\"\n        Mmenu.MenuType = \"M\"\n        Mmenu.Action = \"无\"\n        Mmenu.ParentId = 0\n        Mmenu.NoCache = false\n        Mmenu.Component = \"Layout\"\n        Mmenu.Sort = 0\n        Mmenu.Visible = \"0\"\n        Mmenu.IsFrame = \"0\"\n        Mmenu.CreateBy = \"1\"\n        Mmenu.UpdateBy = \"1\"\n        Mmenu.CreatedAt = timeNow\n        Mmenu.UpdatedAt = timeNow\n        // Mmenu.MenuId, err = Mmenu.Create(db)\n        err := tx.Create(&Mmenu).Error\n        if err != nil {\n            return err\n        }\n        Cmenu := Menu{}\n        Cmenu.MenuName = \"{{.TBName}}\"\n        Cmenu.Title = \"{{.TableComment}}\"\n        Cmenu.Icon = \"pass\"\n        Cmenu.Path = \"{{.TBName}}\"\n        Cmenu.MenuType = \"C\"\n        Cmenu.Action = \"无\"\n        Cmenu.Permission = \"{{.PackageName}}:{{.BusinessName}}:list\"\n        Cmenu.ParentId = Mmenu.MenuId\n        Cmenu.NoCache = false\n        Cmenu.Component = \"/{{.BusinessName}}/index\"\n        Cmenu.Sort = 0\n        Cmenu.Visible = \"0\"\n        Cmenu.IsFrame = \"0\"\n        Cmenu.CreateBy = \"1\"\n        Cmenu.UpdateBy = \"1\"\n        Cmenu.CreatedAt = timeNow\n        Cmenu.UpdatedAt = timeNow\n        // Cmenu.MenuId, err = Cmenu.Create(db)\n        err = tx.Create(&Cmenu).Error\n        if err != nil {\n            return err\n        }\n\n        MList := Menu{}\n        MList.MenuName = \"\"\n        MList.Title = \"分页获取{{.TableComment}}\"\n        MList.Icon = \"\"\n        MList.Path = \"{{.TBName}}\"\n        MList.MenuType = \"F\"\n        MList.Action = \"无\"\n        MList.Permission = \"{{.PackageName}}:{{.BusinessName}}:query\"\n        MList.ParentId = Cmenu.MenuId\n        MList.NoCache = false\n        MList.Sort = 0\n        MList.Visible = \"0\"\n        MList.IsFrame = \"0\"\n        MList.CreateBy = \"1\"\n        MList.UpdateBy = \"1\"\n        MList.CreatedAt = timeNow\n        MList.UpdatedAt = timeNow\n        // MList.MenuId, err = MList.Create(db)\n        err = tx.Create(&MList).Error\n        if err != nil {\n            return err\n        }\n\n        MCreate := Menu{}\n        MCreate.MenuName = \"\"\n        MCreate.Title = \"创建{{.TableComment}}\"\n        MCreate.Icon = \"\"\n        MCreate.Path = \"{{.TBName}}\"\n        MCreate.MenuType = \"F\"\n        MCreate.Action = \"无\"\n        MCreate.Permission = \"{{.PackageName}}:{{.BusinessName}}:add\"\n        MCreate.ParentId = Cmenu.MenuId\n        MCreate.NoCache = false\n        MCreate.Sort = 0\n        MCreate.Visible = \"0\"\n        MCreate.IsFrame = \"0\"\n        MCreate.CreateBy = \"1\"\n        MCreate.UpdateBy = \"1\"\n        MCreate.CreatedAt = timeNow\n        MCreate.UpdatedAt = timeNow\n        // MCreate.MenuId, err = MCreate.Create(db)\n        err = tx.Create(&MCreate).Error\n        if err != nil {\n            return err\n        }\n\n        MUpdate := Menu{}\n        MUpdate.MenuName = \"\"\n        MUpdate.Title = \"修改{{.TableComment}}\"\n        MUpdate.Icon = \"\"\n        MUpdate.Path = \"{{.TBName}}\"\n        MUpdate.MenuType = \"F\"\n        MUpdate.Action = \"无\"\n        MUpdate.Permission =\"{{.PackageName}}:{{.BusinessName}}:edit\"\n        MUpdate.ParentId = Cmenu.MenuId\n        MUpdate.NoCache = false\n        MUpdate.Sort = 0\n        MUpdate.Visible = \"0\"\n        MUpdate.IsFrame = \"0\"\n        MUpdate.CreateBy = \"1\"\n        MUpdate.UpdateBy = \"1\"\n        MUpdate.CreatedAt = timeNow\n        MUpdate.UpdatedAt = timeNow\n        // MUpdate.MenuId, err = MUpdate.Create(db)\n        err = tx.Create(&MUpdate).Error\n        if err != nil {\n            return err\n        }\n\n        MDelete := Menu{}\n        MDelete.MenuName = \"\"\n        MDelete.Title = \"删除{{.TableComment}}\"\n        MDelete.Icon = \"\"\n        MDelete.Path = \"{{.TBName}}\"\n        MDelete.MenuType = \"F\"\n        MDelete.Action = \"无\"\n        MDelete.Permission = \"{{.PackageName}}:{{.BusinessName}}:remove\"\n        MDelete.ParentId = Cmenu.MenuId\n        MDelete.NoCache = false\n        MDelete.Sort = 0\n        MDelete.Visible = \"0\"\n        MDelete.IsFrame = \"0\"\n        MDelete.CreateBy = \"1\"\n        MDelete.UpdateBy = \"1\"\n        MDelete.CreatedAt = timeNow\n        MDelete.UpdatedAt = timeNow\n        // MDelete.MenuId, err = MDelete.Create(db)\n        err = tx.Create(&MDelete).Error\n        if err != nil {\n            return err\n        }\n\n        var InterfaceId = 63\n        Amenu := Menu{}\n        Amenu.MenuName = \"{{.TBName}}\"\n        Amenu.Title = \"{{.TableComment}}\"\n        Amenu.Icon = \"bug\"\n        Amenu.Path = \"{{.TBName}}\"\n        Amenu.MenuType = \"M\"\n        Amenu.Action = \"无\"\n        Amenu.ParentId = InterfaceId\n        Amenu.NoCache = false\n        Amenu.Sort = 0\n        Amenu.Visible = \"1\"\n        Amenu.IsFrame = \"0\"\n        Amenu.CreateBy = \"1\"\n        Amenu.UpdateBy = \"1\"\n        Amenu.CreatedAt = timeNow\n        Amenu.UpdatedAt = timeNow\n        // Amenu.MenuId, err = Amenu.Create(db)\n        err = tx.Create(&Amenu).Error\n        if err != nil {\n            return err\n        }\n\n        AList := Menu{}\n        AList.MenuName = \"\"\n        AList.Title = \"分页获取{{.TableComment}}\"\n        AList.Icon = \"bug\"\n        AList.Path = \"/api/v1/{{.ModuleName}}\"\n        AList.MenuType = \"A\"\n        AList.Action = \"GET\"\n        AList.ParentId = Amenu.MenuId\n        AList.NoCache = false\n        AList.Sort = 0\n        AList.Visible = \"1\"\n        AList.IsFrame = \"0\"\n        AList.CreateBy = \"1\"\n        AList.UpdateBy = \"1\"\n        AList.CreatedAt = timeNow\n        AList.UpdatedAt = timeNow\n        // AList.MenuId, err = AList.Create(db)\n        err = tx.Create(&AList).Error\n        if err != nil {\n            return err\n        }\n\n        AGet := Menu{}\n        AGet.MenuName = \"\"\n        AGet.Title = \"根据id获取{{.TableComment}}\"\n        AGet.Icon = \"bug\"\n        AGet.Path = \"/api/v1/{{.ModuleName}}/:id\"\n        AGet.MenuType = \"A\"\n        AGet.Action = \"GET\"\n        AGet.ParentId = Amenu.MenuId\n        AGet.NoCache = false\n        AGet.Sort = 0\n        AGet.Visible = \"1\"\n        AGet.IsFrame = \"0\"\n        AGet.CreateBy = \"1\"\n        AGet.UpdateBy = \"1\"\n        AGet.CreatedAt = timeNow\n        AGet.UpdatedAt = timeNow\n        // AGet.MenuId, err = AGet.Create(db)\n        err = tx.Create(&AGet).Error\n        if err != nil {\n            return err\n        }\n\n        ACreate := Menu{}\n        ACreate.MenuName = \"\"\n        ACreate.Title = \"创建{{.TableComment}}\"\n        ACreate.Icon = \"bug\"\n        ACreate.Path = \"/api/v1/{{.ModuleName}}\"\n        ACreate.MenuType = \"A\"\n        ACreate.Action = \"POST\"\n        ACreate.ParentId = Amenu.MenuId\n        ACreate.NoCache = false\n        ACreate.Sort = 0\n        ACreate.Visible = \"1\"\n        ACreate.IsFrame = \"0\"\n        ACreate.CreateBy = \"1\"\n        ACreate.UpdateBy = \"1\"\n        ACreate.CreatedAt = timeNow\n        ACreate.UpdatedAt = timeNow\n        // ACreate.MenuId, err = ACreate.Create(db)\n        err = tx.Create(&ACreate).Error\n        if err != nil {\n            return err\n        }\n\n        AUpdate := Menu{}\n        AUpdate.MenuName = \"\"\n        AUpdate.Title = \"修改{{.TableComment}}\"\n        AUpdate.Icon = \"bug\"\n        AUpdate.Path = \"/api/v1/{{.ModuleName}}/:id\"\n        AUpdate.MenuType = \"A\"\n        AUpdate.Action = \"PUT\"\n        AUpdate.ParentId = Amenu.MenuId\n        AUpdate.NoCache = false\n        AUpdate.Sort = 0\n        AUpdate.Visible = \"1\"\n        AUpdate.IsFrame = \"0\"\n        AUpdate.CreateBy = \"1\"\n        AUpdate.UpdateBy = \"1\"\n        AUpdate.CreatedAt = timeNow\n        AUpdate.UpdatedAt = timeNow\n        // AUpdate.MenuId, err = AUpdate.Create(db)\n        err = tx.Create(&AUpdate).Error\n        if err != nil {\n            return err\n        }\n\n        ADelete := Menu{}\n        ADelete.MenuName = \"\"\n        ADelete.Title = \"删除{{.TableComment}}\"\n        ADelete.Icon = \"bug\"\n        ADelete.Path = \"/api/v1/{{.ModuleName}}\"\n        ADelete.MenuType = \"A\"\n        ADelete.Action = \"DELETE\"\n        ADelete.ParentId = Amenu.MenuId\n        ADelete.NoCache = false\n        ADelete.Sort = 0\n        ADelete.Visible = \"1\"\n        ADelete.IsFrame = \"0\"\n        ADelete.CreateBy = \"1\"\n        ADelete.UpdateBy = \"1\"\n        ADelete.CreatedAt = timeNow\n        ADelete.UpdatedAt = timeNow\n        //ADelete.MenuId, err = ADelete.Create(db)\n        err = tx.Create(&ADelete).Error\n        if err != nil {\n            return err\n        }\n\n\t\treturn tx.Create(&common.Migration{\n\t\t\tVersion: version,\n\t\t}).Error\n\t})\n}"
  },
  {
    "path": "template/cmd_api.template",
    "content": "package api\n\nimport \"go-admin/app/{{.appName}}/router\"\n\nfunc init() {\n\t//注册路由 fixme 其他应用的路由，在本目录新建文件放在init方法\n\tAppRouters = append(AppRouters, router.InitRouter)\n}"
  },
  {
    "path": "template/migrate.template",
    "content": "package {{.Package}}\n\nimport (\n\t\"gorm.io/gorm\"\n\t\"runtime\"\n\n\t\"go-admin/cmd/migrate/migration\"\n\tcommon \"go-admin/common/models\"\n)\n\nfunc init() {\n\t_, fileName, _, _ := runtime.Caller(0)\n\tmigration.Migrate.SetVersion(migration.GetFilename(fileName), _{{.GenerateTime}}Test)\n}\n\nfunc _{{.GenerateTime}}Test(db *gorm.DB, version string) error {\n\treturn db.Transaction(func(tx *gorm.DB) error {\n\n\t    // TODO: 这里开始写入要变更的内容\n\n\t    // TODO: 例如 修改表字段 使用过程中请删除此段代码\n\t\t//err := tx.Migrator().RenameColumn(&models.SysConfig{}, \"config_id\", \"id\")\n\t\t//if err != nil {\n\t\t// \treturn err\n\t\t//}\n\n\t\t// TODO: 例如 新增表结构 使用过程中请删除此段代码\n\t\t//err = tx.Debug().Migrator().AutoMigrate(\n        //\t\tnew(models.CasbinRule),\n        // \t\t)\n        //if err != nil {\n        // \treturn err\n        //}\n\n\n\t\treturn tx.Create(&common.Migration{\n\t\t\tVersion: version,\n\t\t}).Error\n\t})\n}\n"
  },
  {
    "path": "template/router.template",
    "content": "package router\n\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\t_ \"github.com/gin-gonic/gin\"\n\tlog \"github.com/go-admin-team/go-admin-core/logger\"\n\t\"github.com/go-admin-team/go-admin-core/sdk\"\n\t// \"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\tcommon \"go-admin/common/middleware\"\n\t\"os\"\n)\n\nvar (\n\trouterNoCheckRole = make([]func(*gin.RouterGroup), 0)\n\trouterCheckRole   = make([]func(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware), 0)\n)\n\n// InitRouter 路由初始化\nfunc InitRouter() {\n\tvar r *gin.Engine\n\th := sdk.Runtime.GetEngine()\n\tif h == nil {\n\t\th = gin.New()\n\t\tsdk.Runtime.SetEngine(h)\n\t}\n\tswitch h.(type) {\n\tcase *gin.Engine:\n\t\tr = h.(*gin.Engine)\n\tdefault:\n\t\tlog.Fatal(\"not support other engine\")\n\t\tos.Exit(-1)\n\t}\n\n\t// the jwt middleware\n\tauthMiddleware, err := common.AuthInit()\n\tif err != nil {\n\t\tlog.Fatalf(\"JWT Init Error, %s\", err.Error())\n\t}\n\n\t// 注册业务路由\n\tInitBusinessRouter(r, authMiddleware)\n}\n\nfunc InitBusinessRouter(r *gin.Engine, authMiddleware *jwt.GinJWTMiddleware) *gin.Engine {\n\n\t// 无需认证的路由\n\tnoCheckRoleRouter(r)\n\t// 需要认证的路由\n\tcheckRoleRouter(r, authMiddleware)\n\n\treturn r\n}\n\n// noCheckRoleRouter 无需认证的路由\nfunc noCheckRoleRouter(r *gin.Engine) {\n\t// 可根据业务需求来设置接口版本\n\tv := r.Group(\"/api/v1\")\n\n\tfor _, f := range routerNoCheckRole {\n\t\tf(v)\n\t}\n}\n\n// checkRoleRouter 需要认证的路由\nfunc checkRoleRouter(r *gin.Engine, authMiddleware *jwtauth.GinJWTMiddleware) {\n\t// 可根据业务需求来设置接口版本\n\tv := r.Group(\"/api/v1\")\n\n\tfor _, f := range routerCheckRole {\n\t\tf(v, authMiddleware)\n\t}\n}\n"
  },
  {
    "path": "template/v4/actions/router_check_role.go.template",
    "content": "package router\n\nimport (\n    \"github.com/gin-gonic/gin\"\n    jwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\n    \"go-admin/app/{{.PackageName}}/models\"\n    \"go-admin/app/{{.PackageName}}/service/dto\"\n    \"go-admin/common/actions\"\n    \"go-admin/common/middleware\"\n)\n\nfunc init()  {\n\trouterCheckRole = append(routerCheckRole, register{{.ClassName}}Router)\n}\n\n// 需认证的路由代码\nfunc register{{.ClassName}}Router(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n    r := v1.Group(\"/{{.ModuleName}}\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n    {\n        model := &models.{{.ClassName}}{}\n        r.GET(\"\", actions.PermissionAction(), actions.IndexAction(model, new(dto.{{.ClassName}}Search), func() interface{} {\n            list := make([]models.{{.ClassName}}, 0)\n            return &list\n        }))\n        r.GET(\"/:id\", actions.PermissionAction(), actions.ViewAction(new(dto.{{.ClassName}}ById), nil))\n        r.POST(\"\", actions.CreateAction(new(dto.{{.ClassName}}Control)))\n        r.PUT(\"/:id\", actions.PermissionAction(), actions.UpdateAction(new(dto.{{.ClassName}}Control)))\n        r.DELETE(\"\", actions.PermissionAction(), actions.DeleteAction(new(dto.{{.ClassName}}ById)))\n    }\n}\n"
  },
  {
    "path": "template/v4/actions/router_no_check_role.go.template",
    "content": "package router\n\nimport (\n    \"github.com/gin-gonic/gin\"\n\n    \"go-admin/app/{{.PackageName}}/middleware\"\n    \"go-admin/app/{{.PackageName}}/models\"\n    \"go-admin/app/{{.PackageName}}/service/dto\"\n    \"go-admin/common/actions\"\n)\n\nfunc init()  {\n\trouterNoCheckRole = append(routerNoCheckRole, register{{.ClassName}}Router)\n}\n\n// 无需认证的路由代码\nfunc register{{.ClassName}}Router(v1 *gin.RouterGroup) {\n    r := v1.Group(\"/{{.ModuleName}}\")\n        {\n            model := &models.{{.ClassName}}{}\n            r.GET(\"\", actions.IndexAction(model, new(dto.{{.ClassName}}Search), func() interface{} {\n                list := make([]models.{{.ClassName}}, 0)\n                return &list\n            }))\n            r.GET(\"/:id\", actions.ViewAction(new(dto.{{.ClassName}}ById), nil))\n            r.POST(\"\", actions.CreateAction(new(dto.{{.ClassName}}Control)))\n            r.PUT(\"/:id\", actions.UpdateAction(new(dto.{{.ClassName}}Control)))\n            r.DELETE(\"\", actions.DeleteAction(new(dto.{{.ClassName}}ById)))\n        }\n}\n"
  },
  {
    "path": "template/v4/dto.go.template",
    "content": "package dto\n\nimport (\n    {{- $bb := false -}}\n    {{- range .Columns -}}\n    {{- $z := .IsQuery -}}\n    {{- if ($z) -}}\n    {{- if eq .GoType \"time.Time\" -}}{{- $bb = true -}}{{- end -}}\n    {{- end -}}\n    {{- end -}}\n    {{- range .Columns -}}\n    {{- if eq .GoField \"CreatedAt\" -}}\n    {{- else if eq .GoField \"UpdatedAt\" -}}\n    {{- else if eq .GoField \"DeletedAt\" -}}\n    {{- else -}}\n    {{- if eq .GoType \"time.Time\" -}}{{- $bb = true -}}{{- end -}}\n    {{- end -}}\n    {{- end -}}\n    {{- if eq $bb true }}\n    \"time\"\n    {{- end }}\n\n\t\"go-admin/app/{{.PackageName}}/models\"\n\t\"go-admin/common/dto\"\n\tcommon \"go-admin/common/models\"\n)\n\ntype {{.ClassName}}GetPageReq struct {\n\tdto.Pagination     `search:\"-\"`\n    {{- $tablename := .TBName -}}\n    {{- range .Columns -}}\n    {{$z := .IsQuery}}\n    {{- if ($z) }}\n    {{.GoField}} {{.GoType}} `form:\"{{.JsonField}}\"  search:\"type:{{if eq .QueryType \"EQ\"}}exact{{ else if eq .QueryType \"NE\"}}iexact{{ else if eq .QueryType \"LIKE\"}}contains{{ else if eq .QueryType \"GT\"}}gt{{ else if eq .QueryType \"GTE\"}}gte{{ else if eq .QueryType \"LT\"}}lt{{ else if eq .QueryType \"LTE\"}}lte{{- end }};column:{{.ColumnName}};table:{{$tablename}}\" comment:\"{{.ColumnComment}}\"`\n    {{- end }}\n    {{- end }}\n    {{.ClassName}}Order\n}\n\ntype {{.ClassName}}Order struct {\n    {{ $tablename := .TBName }}\n    {{- range .Columns -}}\n    {{.GoField}} string `form:\"{{.JsonField}}Order\"  search:\"type:order;column:{{.ColumnName}};table:{{$tablename}}\"`\n    {{ end }}\n}\n\nfunc (m *{{.ClassName}}GetPageReq) GetNeedSearch() interface{} {\n\treturn *m\n}\n\ntype {{.ClassName}}InsertReq struct {\n    {{- range .Columns -}}\n    {{$x := .Pk}}\n    {{- if ($x) }}\n    {{.GoField}} {{.GoType}} `json:\"-\" comment:\"{{.ColumnComment}}\"` // {{.ColumnComment}}\n    {{- else if eq .GoField \"CreatedAt\" -}}\n    {{- else if eq .GoField \"UpdatedAt\" -}}\n    {{- else if eq .GoField \"DeletedAt\" -}}\n    {{- else if eq .GoField \"CreateBy\" -}}\n    {{- else if eq .GoField \"UpdateBy\" -}}\n    {{- else }}\n    {{.GoField}} {{.GoType}} `json:\"{{.JsonField}}\" comment:\"{{.ColumnComment}}\"`\n    {{- end -}}\n    {{- end }}\n    common.ControlBy\n}\n\nfunc (s *{{.ClassName}}InsertReq) Generate(model *models.{{.ClassName}})  {\n\t {{- range .Columns -}}\n    {{$x := .Pk}}\n    {{- if ($x) }}\n    if s.{{.GoField}} == 0 {\n        model.Model = common.Model{ {{.GoField}}: s.{{.GoField}} }\n    }\n    {{- else if eq .GoField \"CreatedAt\" -}}\n    {{- else if eq .GoField \"UpdatedAt\" -}}\n    {{- else if eq .GoField \"DeletedAt\" -}}\n    {{- else if eq .GoField \"CreateBy\"}}\n    model.{{.GoField}} = s.{{.GoField}} // 添加这而，需要记录是被谁创建的\n    {{- else if eq .GoField \"UpdateBy\" -}}\n    {{- else }}\n    model.{{.GoField}} = s.{{.GoField}}\n    {{- end -}}\n    {{- end }}\n}\n\nfunc (s *{{.ClassName}}InsertReq) GetId() interface{} {\n\treturn s.{{.PkGoField}}\n}\n\ntype {{.ClassName}}UpdateReq struct {\n    {{- range .Columns -}}\n    {{$x := .Pk}}\n    {{- if ($x) }}\n    {{.GoField}} {{.GoType}} `uri:\"{{.JsonField}}\" comment:\"{{.ColumnComment}}\"` // {{.ColumnComment}}\n    {{- else if eq .GoField \"CreatedAt\" -}}\n    {{- else if eq .GoField \"UpdatedAt\" -}}\n    {{- else if eq .GoField \"DeletedAt\" -}}\n    {{- else if eq .GoField \"CreateBy\" -}}\n    {{- else if eq .GoField \"UpdateBy\" -}}\n    {{- else }}\n    {{.GoField}} {{.GoType}} `json:\"{{.JsonField}}\" comment:\"{{.ColumnComment}}\"`\n    {{- end -}}\n    {{- end }}\n    common.ControlBy\n}\n\nfunc (s *{{.ClassName}}UpdateReq) Generate(model *models.{{.ClassName}})  {\n\t {{- range .Columns -}}\n    {{$x := .Pk}}\n    {{- if ($x) }}\n    if s.{{.GoField}} == 0 {\n        model.Model = common.Model{ {{.GoField}}: s.{{.GoField}} }\n    }\n    {{- else if eq .GoField \"CreatedAt\" -}}\n    {{- else if eq .GoField \"UpdatedAt\" -}}\n    {{- else if eq .GoField \"DeletedAt\" -}}\n    {{- else if eq .GoField \"CreateBy\" -}}\n    {{- else if eq .GoField \"UpdateBy\"}}\n    model.{{.GoField}} = s.{{.GoField}} // 添加这而，需要记录是被谁更新的\n    {{- else }}\n    model.{{.GoField}} = s.{{.GoField}}\n    {{- end -}}\n    {{- end }}\n}\n\nfunc (s *{{.ClassName}}UpdateReq) GetId() interface{} {\n\treturn s.{{.PkGoField}}\n}\n\n// {{.ClassName}}GetReq 功能获取请求参数\ntype {{.ClassName}}GetReq struct {\n\t{{- range .Columns -}}\n    {{$x := .Pk}}\n    {{- if ($x) }}\n     {{.GoField}} {{.GoType}} `uri:\"{{.JsonField}}\"`\n    {{- end }}\n    {{- end }}\n}\nfunc (s *{{.ClassName}}GetReq) GetId() interface{} {\n\treturn s.{{.PkGoField}}\n}\n\n// {{.ClassName}}DeleteReq 功能删除请求参数\ntype {{.ClassName}}DeleteReq struct {\n\tIds []int `json:\"ids\"`\n}\n\nfunc (s *{{.ClassName}}DeleteReq) GetId() interface{} {\n\treturn s.Ids\n}\n"
  },
  {
    "path": "template/v4/js.go.template",
    "content": "import request from '@/utils/request'\n\n// 查询{{.ClassName}}列表\nexport function list{{.ClassName}}(query) {\n    return request({\n        url: '/api/v1/{{.ModuleName}}',\n        method: 'get',\n        params: query\n    })\n}\n\n// 查询{{.ClassName}}详细\nexport function get{{.ClassName}} ({{.PkJsonField}}) {\n    return request({\n        url: '/api/v1/{{.ModuleName}}/' + {{.PkJsonField}},\n        method: 'get'\n    })\n}\n\n\n// 新增{{.ClassName}}\nexport function add{{.ClassName}}(data) {\n    return request({\n        url: '/api/v1/{{.ModuleName}}',\n        method: 'post',\n        data: data\n    })\n}\n\n// 修改{{.ClassName}}\nexport function update{{.ClassName}}(data) {\n    return request({\n        url: '/api/v1/{{.ModuleName}}/'+data.{{.PkJsonField}},\n        method: 'put',\n        data: data\n    })\n}\n\n// 删除{{.ClassName}}\nexport function del{{.ClassName}}(data) {\n    return request({\n        url: '/api/v1/{{.ModuleName}}',\n        method: 'delete',\n        data: data\n    })\n}\n\n"
  },
  {
    "path": "template/v4/model.go.template",
    "content": "package models\n\nimport (\n    {{- $bb := false -}}\n    {{- range .Columns -}}\n    {{- $z := .IsQuery -}}\n    {{- if ($z) -}}\n    {{- if eq .GoType \"time.Time\" -}}{{- $bb = true -}}{{- end -}}\n    {{- end -}}\n    {{- end -}}\n    {{- range .Columns -}}\n    {{- if eq .GoField \"CreatedAt\" -}}\n    {{- else if eq .GoField \"UpdatedAt\" -}}\n    {{- else if eq .GoField \"DeletedAt\" -}}\n    {{- else -}}\n    {{- if eq .GoType \"time.Time\" -}}{{- $bb = true -}}{{- end -}}\n    {{- end -}}\n    {{- end -}}\n    {{- if eq $bb true }}\n    \"time\"\n    {{- end }}\n\n\t\"go-admin/common/models\"\n\n)\n\ntype {{.ClassName}} struct {\n    models.Model\n    {{ range .Columns -}}\n    {{$x := .Pk}}\n    {{- if ($x) }}\n    {{- else if eq .GoField \"CreatedAt\" -}}\n    {{- else if eq .GoField \"UpdatedAt\" -}}\n    {{- else if eq .GoField \"DeletedAt\" -}}\n    {{- else if eq .GoField \"CreateBy\" -}}\n    {{- else if eq .GoField \"UpdateBy\" -}}\n    {{- else }}\n    {{.GoField}} {{.GoType}} `json:\"{{.JsonField}}\" gorm:\"type:{{.ColumnType}};comment:{{- if eq .ColumnComment \"\" -}}{{.GoField}}{{- else -}}{{.ColumnComment}}{{end -}}\"` {{end -}}\n    {{- end }}\n    models.ModelTime\n    models.ControlBy\n}\n\nfunc ({{.ClassName}}) TableName() string {\n    return \"{{.TBName}}\"\n}\n\nfunc (e *{{.ClassName}}) Generate() models.ActiveRecord {\n\to := *e\n\treturn &o\n}\n\nfunc (e *{{.ClassName}}) GetId() interface{} {\n\treturn e.{{.PkGoField}}\n}"
  },
  {
    "path": "template/v4/no_actions/apis.go.template",
    "content": "package apis\n\nimport (\n    \"fmt\"\n\n\t\"github.com/gin-gonic/gin\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/api\"\n\t\"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user\"\n\t_ \"github.com/go-admin-team/go-admin-core/sdk/pkg/response\"\n\n\t\"go-admin/app/{{.PackageName}}/models\"\n\t\"go-admin/app/{{.PackageName}}/service\"\n\t\"go-admin/app/{{.PackageName}}/service/dto\"\n\t\"go-admin/common/actions\"\n)\n\ntype {{.ClassName}} struct {\n\tapi.Api\n}\n\n// GetPage 获取{{.TableComment}}列表\n// @Summary 获取{{.TableComment}}列表\n// @Description 获取{{.TableComment}}列表\n// @Tags {{.TableComment}}\n{{- $tablename := .TBName -}}\n{{- range .Columns -}}\n{{$z := .IsQuery}}\n{{- if ($z) }}\n// @Param {{.JsonField}} query {{.GoType}} false \"{{.ColumnComment}}\"\n{{- end -}}\n{{- end }}\n// @Param pageSize query int false \"页条数\"\n// @Param pageIndex query int false \"页码\"\n// @Success 200 {object} response.Response{data=response.Page{list=[]models.{{.ClassName}}}} \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/{{.ModuleName}} [get]\n// @Security Bearer\nfunc (e {{.ClassName}}) GetPage(c *gin.Context) {\n    req := dto.{{.ClassName}}GetPageReq{}\n    s := service.{{.ClassName}}{}\n    err := e.MakeContext(c).\n        MakeOrm().\n        Bind(&req).\n        MakeService(&s.Service).\n        Errors\n   \tif err != nil {\n   \t\te.Logger.Error(err)\n   \t\te.Error(500, err, err.Error())\n   \t\treturn\n   \t}\n\n\tp := actions.GetPermissionFromContext(c)\n\tlist := make([]models.{{.ClassName}}, 0)\n\tvar count int64\n\n\terr = s.GetPage(&req, p, &list, &count)\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"获取{{.TableComment}}失败，\\r\\n失败信息 %s\", err.Error()))\n        return\n\t}\n\n\te.PageOK(list, int(count), req.GetPageIndex(), req.GetPageSize(), \"查询成功\")\n}\n\n// Get 获取{{.TableComment}}\n// @Summary 获取{{.TableComment}}\n// @Description 获取{{.TableComment}}\n// @Tags {{.TableComment}}\n// @Param id path int false \"id\"\n// @Success 200 {object} response.Response{data=models.{{.ClassName}}} \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/{{.ModuleName}}/{id} [get]\n// @Security Bearer\nfunc (e {{.ClassName}}) Get(c *gin.Context) {\n\treq := dto.{{.ClassName}}GetReq{}\n\ts := service.{{.ClassName}}{}\n    err := e.MakeContext(c).\n\t\tMakeOrm().\n\t\tBind(&req).\n\t\tMakeService(&s.Service).\n\t\tErrors\n\tif err != nil {\n\t\te.Logger.Error(err)\n\t\te.Error(500, err, err.Error())\n\t\treturn\n\t}\n\tvar object models.{{.ClassName}}\n\n\tp := actions.GetPermissionFromContext(c)\n\terr = s.Get(&req, p, &object)\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"获取{{.TableComment}}失败，\\r\\n失败信息 %s\", err.Error()))\n        return\n\t}\n\n\te.OK( object, \"查询成功\")\n}\n\n// Insert 创建{{.TableComment}}\n// @Summary 创建{{.TableComment}}\n// @Description 创建{{.TableComment}}\n// @Tags {{.TableComment}}\n// @Accept application/json\n// @Product application/json\n// @Param data body dto.{{.ClassName}}InsertReq true \"data\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"添加成功\"}\"\n// @Router /api/v1/{{.ModuleName}} [post]\n// @Security Bearer\nfunc (e {{.ClassName}}) Insert(c *gin.Context) {\n    req := dto.{{.ClassName}}InsertReq{}\n    s := service.{{.ClassName}}{}\n    err := e.MakeContext(c).\n        MakeOrm().\n        Bind(&req).\n        MakeService(&s.Service).\n        Errors\n    if err != nil {\n        e.Logger.Error(err)\n        e.Error(500, err, err.Error())\n        return\n    }\n\t// 设置创建人\n\treq.SetCreateBy(user.GetUserId(c))\n\n\terr = s.Insert(&req)\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"创建{{.TableComment}}失败，\\r\\n失败信息 %s\", err.Error()))\n        return\n\t}\n\n\te.OK(req.GetId(), \"创建成功\")\n}\n\n// Update 修改{{.TableComment}}\n// @Summary 修改{{.TableComment}}\n// @Description 修改{{.TableComment}}\n// @Tags {{.TableComment}}\n// @Accept application/json\n// @Product application/json\n// @Param id path int true \"id\"\n// @Param data body dto.{{.ClassName}}UpdateReq true \"body\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"修改成功\"}\"\n// @Router /api/v1/{{.ModuleName}}/{id} [put]\n// @Security Bearer\nfunc (e {{.ClassName}}) Update(c *gin.Context) {\n    req := dto.{{.ClassName}}UpdateReq{}\n    s := service.{{.ClassName}}{}\n    err := e.MakeContext(c).\n        MakeOrm().\n        Bind(&req).\n        MakeService(&s.Service).\n        Errors\n    if err != nil {\n        e.Logger.Error(err)\n        e.Error(500, err, err.Error())\n        return\n    }\n\treq.SetUpdateBy(user.GetUserId(c))\n\tp := actions.GetPermissionFromContext(c)\n\n\terr = s.Update(&req, p)\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"修改{{.TableComment}}失败，\\r\\n失败信息 %s\", err.Error()))\n        return\n\t}\n\te.OK( req.GetId(), \"修改成功\")\n}\n\n// Delete 删除{{.TableComment}}\n// @Summary 删除{{.TableComment}}\n// @Description 删除{{.TableComment}}\n// @Tags {{.TableComment}}\n// @Param data body dto.{{.ClassName}}DeleteReq true \"body\"\n// @Success 200 {object} response.Response\t\"{\"code\": 200, \"message\": \"删除成功\"}\"\n// @Router /api/v1/{{.ModuleName}} [delete]\n// @Security Bearer\nfunc (e {{.ClassName}}) Delete(c *gin.Context) {\n    s := service.{{.ClassName}}{}\n    req := dto.{{.ClassName}}DeleteReq{}\n    err := e.MakeContext(c).\n        MakeOrm().\n        Bind(&req).\n        MakeService(&s.Service).\n        Errors\n    if err != nil {\n        e.Logger.Error(err)\n        e.Error(500, err, err.Error())\n        return\n    }\n\n\t// req.SetUpdateBy(user.GetUserId(c))\n\tp := actions.GetPermissionFromContext(c)\n\n\terr = s.Remove(&req, p)\n\tif err != nil {\n\t\te.Error(500, err, fmt.Sprintf(\"删除{{.TableComment}}失败，\\r\\n失败信息 %s\", err.Error()))\n        return\n\t}\n\te.OK( req.GetId(), \"删除成功\")\n}\n"
  },
  {
    "path": "template/v4/no_actions/router_check_role.go.template",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\n\t\"go-admin/app/{{.PackageName}}/apis\"\n\t\"go-admin/common/middleware\"\n\t\"go-admin/common/actions\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, register{{.ClassName}}Router)\n}\n\n// register{{.ClassName}}Router\nfunc register{{.ClassName}}Router(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.{{.ClassName}}{}\n\tr := v1.Group(\"/{{.ModuleName}}\").Use(authMiddleware.MiddlewareFunc()).Use(middleware.AuthCheckRole())\n\t{\n\t\tr.GET(\"\", actions.PermissionAction(), api.GetPage)\n\t\tr.GET(\"/:id\", actions.PermissionAction(), api.Get)\n\t\tr.POST(\"\", api.Insert)\n\t\tr.PUT(\"/:id\", actions.PermissionAction(), api.Update)\n\t\tr.DELETE(\"\", api.Delete)\n\t}\n}"
  },
  {
    "path": "template/v4/no_actions/router_no_check_role.go.template",
    "content": "package router\n\nimport (\n\t\"github.com/gin-gonic/gin\"\n\tjwt \"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth\"\n\n\t\"go-admin/app/{{.PackageName}}/apis\"\n)\n\nfunc init() {\n\trouterCheckRole = append(routerCheckRole, register{{.ClassName}}Router)\n}\n\n// register{{.ClassName}}Router\nfunc register{{.ClassName}}Router(v1 *gin.RouterGroup, authMiddleware *jwt.GinJWTMiddleware) {\n\tapi := apis.{{.ClassName}}{}\n\tr := v1.Group(\"/{{.ModuleName}}\").Use(authMiddleware.MiddlewareFunc())\n\t{\n\t\tr.GET(\"\", api.GetPage)\n\t\tr.GET(\"/:id\", api.Get)\n\t\tr.POST(\"\", api.Insert)\n\t\tr.PUT(\"/:id\", api.Update)\n\t\tr.DELETE(\"\", api.Delete)\n\t}\n}"
  },
  {
    "path": "template/v4/no_actions/service.go.template",
    "content": "package service\n\nimport (\n\t\"errors\"\n\n    \"github.com/go-admin-team/go-admin-core/sdk/service\"\n\t\"gorm.io/gorm\"\n\n\t\"go-admin/app/{{.PackageName}}/models\"\n\t\"go-admin/app/{{.PackageName}}/service/dto\"\n\t\"go-admin/common/actions\"\n\tcDto \"go-admin/common/dto\"\n)\n\ntype {{.ClassName}} struct {\n\tservice.Service\n}\n\n// GetPage 获取{{.ClassName}}列表\nfunc (e *{{.ClassName}}) GetPage(c *dto.{{.ClassName}}GetPageReq, p *actions.DataPermission, list *[]models.{{.ClassName}}, count *int64) error {\n\tvar err error\n\tvar data models.{{.ClassName}}\n\n\terr = e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tcDto.MakeCondition(c.GetNeedSearch()),\n\t\t\tcDto.Paginate(c.GetPageSize(), c.GetPageIndex()),\n\t\t\tactions.Permission(data.TableName(), p),\n\t\t).\n\t\tFind(list).Limit(-1).Offset(-1).\n\t\tCount(count).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"{{.ClassName}}Service GetPage error:%s \\r\\n\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Get 获取{{.ClassName}}对象\nfunc (e *{{.ClassName}}) Get(d *dto.{{.ClassName}}GetReq, p *actions.DataPermission, model *models.{{.ClassName}}) error {\n\tvar data models.{{.ClassName}}\n\n\terr := e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tactions.Permission(data.TableName(), p),\n\t\t).\n\t\tFirst(model, d.GetId()).Error\n\tif err != nil && errors.Is(err, gorm.ErrRecordNotFound) {\n\t\terr = errors.New(\"查看对象不存在或无权查看\")\n\t\te.Log.Errorf(\"Service Get{{.ClassName}} error:%s \\r\\n\", err)\n\t\treturn err\n\t}\n\tif err != nil {\n\t\te.Log.Errorf(\"db error:%s\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Insert 创建{{.ClassName}}对象\nfunc (e *{{.ClassName}}) Insert(c *dto.{{.ClassName}}InsertReq) error {\n    var err error\n    var data models.{{.ClassName}}\n    c.Generate(&data)\n\terr = e.Orm.Create(&data).Error\n\tif err != nil {\n\t\te.Log.Errorf(\"{{.ClassName}}Service Insert error:%s \\r\\n\", err)\n\t\treturn err\n\t}\n\treturn nil\n}\n\n// Update 修改{{.ClassName}}对象\nfunc (e *{{.ClassName}}) Update(c *dto.{{.ClassName}}UpdateReq, p *actions.DataPermission) error {\n    var err error\n    var data = models.{{.ClassName}}{}\n    e.Orm.Scopes(\n            actions.Permission(data.TableName(), p),\n        ).First(&data, c.GetId())\n    c.Generate(&data)\n\n    db := e.Orm.Save(&data)\n    if err = db.Error; err != nil {\n        e.Log.Errorf(\"{{.ClassName}}Service Save error:%s \\r\\n\", err)\n        return err\n    }\n    if db.RowsAffected == 0 {\n        return errors.New(\"无权更新该数据\")\n    }\n    return nil\n}\n\n// Remove 删除{{.ClassName}}\nfunc (e *{{.ClassName}}) Remove(d *dto.{{.ClassName}}DeleteReq, p *actions.DataPermission) error {\n\tvar data models.{{.ClassName}}\n\n\tdb := e.Orm.Model(&data).\n\t\tScopes(\n\t\t\tactions.Permission(data.TableName(), p),\n\t\t).Delete(&data, d.GetId())\n\tif err := db.Error; err != nil {\n        e.Log.Errorf(\"Service Remove{{.ClassName}} error:%s \\r\\n\", err)\n        return err\n    }\n    if db.RowsAffected == 0 {\n        return errors.New(\"无权删除该数据\")\n    }\n\treturn nil\n}\n"
  },
  {
    "path": "template/v4/vue.go.template",
    "content": "{{$tableComment:=.TableComment}}\n<template>\n    <BasicLayout>\n        <template #wrapper>\n            <el-card class=\"box-card\">\n                <el-form ref=\"queryForm\" :model=\"queryParams\" :inline=\"true\" label-width=\"68px\">\n                    {{range .Columns}}\n                        {{- $x := .IsQuery -}}\n                        {{- if (eq $x \"1\") -}}\n                            <el-form-item label=\"{{.ColumnComment}}\" prop=\"{{.JsonField}}\">\n                                {{- if ne .FkTableName \"\" -}}\n                                <el-select v-model=\"queryParams.{{.JsonField}}\"\n                                           placeholder=\"请选择\" clearable size=\"small\" {{if eq .IsEdit \"false\" -}} :disabled=\"isEdit\" {{- end }}>\n                                    <el-option\n                                            v-for=\"dict in {{.JsonField}}Options\"\n                                            :key=\"dict.key\"\n                                            :label=\"dict.value\"\n                                            :value=\"dict.key\"\n                                    />\n                                </el-select>\n                                {{- else -}}\n                                {{if eq .DictType \"\" -}}\n                                    <el-input v-model=\"queryParams.{{.JsonField}}\" placeholder=\"请输入{{.ColumnComment}}\" clearable\n                                              size=\"small\" @keyup.enter.native=\"handleQuery\"/>\n                                {{- else -}}\n                                    <el-select v-model=\"queryParams.{{.JsonField}}\"\n                                               placeholder=\"{{$tableComment}}{{.ColumnComment}}\" clearable size=\"small\">\n                                        <el-option\n                                                v-for=\"dict in {{.JsonField}}Options\"\n                                                :key=\"dict.value\"\n                                                :label=\"dict.label\"\n                                                :value=\"dict.value\"\n                                        />\n                                    </el-select>\n                                {{- end}}\n                                {{- end}}\n                            </el-form-item>\n                        {{end}}\n                    {{- end }}\n                    <el-form-item>\n                        <el-button type=\"primary\" icon=\"el-icon-search\" size=\"mini\" @click=\"handleQuery\">搜索</el-button>\n                        <el-button icon=\"el-icon-refresh\" size=\"mini\" @click=\"resetQuery\">重置</el-button>\n                    </el-form-item>\n                </el-form>\n\n                <el-row :gutter=\"10\" class=\"mb8\">\n                    <el-col :span=\"1.5\">\n                        <el-button\n                                v-permisaction=\"['{{.PackageName}}:{{.BusinessName}}:add']\"\n                                type=\"primary\"\n                                icon=\"el-icon-plus\"\n                                size=\"mini\"\n                                @click=\"handleAdd\"\n                        >新增\n                        </el-button>\n                    </el-col>\n                    <el-col :span=\"1.5\">\n                        <el-button\n                                v-permisaction=\"['{{.PackageName}}:{{.BusinessName}}:edit']\"\n                                type=\"success\"\n                                icon=\"el-icon-edit\"\n                                size=\"mini\"\n                                :disabled=\"single\"\n                                @click=\"handleUpdate\"\n                        >修改\n                        </el-button>\n                    </el-col>\n                    <el-col :span=\"1.5\">\n                        <el-button\n                                v-permisaction=\"['{{.PackageName}}:{{.BusinessName}}:remove']\"\n                                type=\"danger\"\n                                icon=\"el-icon-delete\"\n                                size=\"mini\"\n                                :disabled=\"multiple\"\n                                @click=\"handleDelete\"\n                        >删除\n                        </el-button>\n                    </el-col>\n                </el-row>\n\n                <el-table v-loading=\"loading\" :data=\"{{.BusinessName}}List\" @selection-change=\"handleSelectionChange\">\n                    <el-table-column type=\"selection\" width=\"55\" align=\"center\"/>\n                    {{- range .Columns -}}\n                        {{- $x := .IsList -}}\n                        {{- if (eq $x \"1\") }}\n                            {{- if ne .FkTableName \"\" -}}\n                            <el-table-column label=\"{{.ColumnComment}}\" align=\"center\" prop=\"{{.JsonField}}\" :formatter=\"{{.JsonField}}Format\" width=\"100\">\n                                <template slot-scope=\"scope\">\n                                    {{ \"{{\" }} {{.JsonField}}Format(scope.row) {{\"}}\"}}\n                                </template>\n                            </el-table-column>\n\n                            {{- else -}}\n                            {{- if ne .DictType \"\" -}}\n                                <el-table-column label=\"{{.ColumnComment}}\" align=\"center\" prop=\"{{.JsonField}}\"\n                                                 :formatter=\"{{.JsonField}}Format\" width=\"100\">\n                                    <template slot-scope=\"scope\">\n                                        {{ \"{{\" }} {{.JsonField}}Format(scope.row) {{\"}}\"}}\n                                    </template>\n                                </el-table-column>\n\n                            {{- end -}}\n                            {{- if eq .DictType \"\" -}}\n                                {{- if eq .HtmlType \"datetime\" -}}\n                                <el-table-column label=\"{{.ColumnComment}}\" align=\"center\" prop=\"{{.JsonField}}\"\n                                                 :show-overflow-tooltip=\"true\">\n                                    <template slot-scope=\"scope\">\n                                    <span>{{ \"{{\" }} parseTime(scope.row.{{.JsonField}}) {{\"}}\"}}</span>\n                                    </template>\n                                </el-table-column>\n                                {{- else -}}\n                                <el-table-column label=\"{{.ColumnComment}}\" align=\"center\" prop=\"{{.JsonField}}\"\n                                                 :show-overflow-tooltip=\"true\"/>\n                                {{- end -}}\n                            {{- end -}}\n                            {{- end -}}\n                        {{- end }}\n                    {{- end }}\n                    <el-table-column label=\"操作\" align=\"center\" class-name=\"small-padding fixed-width\">\n                        <template slot-scope=\"scope\">\n                          <el-button\n                             slot=\"reference\"\n                             v-permisaction=\"['{{.PackageName}}:{{.BusinessName}}:edit']\"\n                             size=\"mini\"\n                             type=\"text\"\n                             icon=\"el-icon-edit\"\n                             @click=\"handleUpdate(scope.row)\"\n                           >修改\n                           </el-button>\n                         <el-popconfirm\n                            class=\"delete-popconfirm\"\n                            title=\"确认要删除吗?\"\n                            confirm-button-text=\"删除\"\n                            @confirm=\"handleDelete(scope.row)\"\n                         >\n                            <el-button\n                              slot=\"reference\"\n                              v-permisaction=\"['{{.PackageName}}:{{.BusinessName}}:remove']\"\n                              size=\"mini\"\n                              type=\"text\"\n                              icon=\"el-icon-delete\"\n                            >删除\n                            </el-button>\n                         </el-popconfirm>\n                        </template>\n                    </el-table-column>\n                </el-table>\n\n                <pagination\n                        v-show=\"total>0\"\n                        :total=\"total\"\n                        :page.sync=\"queryParams.pageIndex\"\n                        :limit.sync=\"queryParams.pageSize\"\n                        @pagination=\"getList\"\n                />\n\n                <!-- 添加或修改对话框 -->\n                <el-dialog :title=\"title\" :visible.sync=\"open\" width=\"500px\">\n                    <el-form ref=\"form\" :model=\"form\" :rules=\"rules\" label-width=\"80px\">\n                        {{ range .Columns }}\n                            {{- $x := .IsInsert -}}\n                            {{- if (eq $x \"1\") -}}\n                                {{- if (.Pk) }}\n                                {{- else if eq .GoField \"CreatedAt\" -}}\n                                {{- else if eq .GoField \"UpdatedAt\" -}}\n                                {{- else if eq .GoField \"DeletedAt\" -}}\n                                {{- else if eq .GoField \"UpdateBy\" -}}\n                                {{- else if eq .GoField \"CreateBy\" -}}\n                                {{- else }}\n                                    <el-form-item label=\"{{.ColumnComment}}\" prop=\"{{.JsonField}}\">\n                                        {{ if eq \"input\" .HtmlType -}}\n                                            <el-input v-model{{if eq .GoType \"int64\" -}}.number{{- end}}=\"form.{{.JsonField}}\" placeholder=\"{{.ColumnComment}}\"\n                                                      {{if eq .IsEdit \"false\" -}}:disabled=\"isEdit\" {{- end}}/>\n                                        {{- else if eq \"select\" .HtmlType -}}\n                                            {{- if ne .FkTableName \"\" -}}\n                                            <el-select v-model=\"form.{{.JsonField}}\"\n                                                       placeholder=\"请选择\" {{if eq .IsEdit \"false\" -}} :disabled=\"isEdit\" {{- end }}>\n                                                <el-option\n                                                        v-for=\"dict in {{.JsonField}}Options\"\n                                                        :key=\"dict.key\"\n                                                        :label=\"dict.value\"\n                                                        :value=\"dict.key\"\n                                                />\n                                            </el-select>\n                                            {{- else -}}\n                                            <el-select v-model=\"form.{{.JsonField}}\"\n                                                       placeholder=\"请选择\" {{if eq .IsEdit \"false\" -}} :disabled=\"isEdit\" {{- end }}>\n                                                <el-option\n                                                        v-for=\"dict in {{.JsonField}}Options\"\n                                                        :key=\"dict.value\"\n                                                        :label=\"dict.label\"\n                                                        :value=\"dict.value\"\n                                                />\n                                            </el-select>\n                                            {{- end -}}\n                                        {{- else if eq \"radio\" .HtmlType -}}\n                                            <el-radio-group v-model=\"form.{{.JsonField}}\">\n                                                <el-radio\n                                                        v-for=\"dict in {{.JsonField}}Options\"\n                                                        :key=\"dict.value\"\n                                                        :label=\"dict.value\"\n                                                >{{\"{{\"}} dict.label {{\"}}\"}}</el-radio>\n                                            </el-radio-group>\n                                        {{- else if eq \"file\" .HtmlType -}}\n                                            <el-input\n                                                v-model=\"form.{{.JsonField}}\"\n                                                placeholder=\"图片\"\n                                            />\n                                            <el-button type=\"primary\" @click=\"fileShow{{.GoField}}\">选择文件</el-button>\n                                        {{- else if eq \"datetime\" .HtmlType -}}\n                                            <el-date-picker\n                                                    v-model=\"form.{{.JsonField}}\"\n                                                    type=\"datetime\"\n                                                    placeholder=\"选择日期\">\n                                            </el-date-picker>\n                                        {{- else if eq \"textarea\" .HtmlType -}}\n                                            <el-input\n                                                    v-model=\"form.{{.JsonField}}\"\n                                                    type=\"textarea\"\n                                                    :rows=\"2\"\n                                                    placeholder=\"请输入内容\">\n                                            </el-input>\n                                        {{- end }}\n                                    </el-form-item>\n                                {{- end }}\n                            {{- end }}\n                        {{- end }}\n                    </el-form>\n                    <div slot=\"footer\" class=\"dialog-footer\">\n                        <el-button type=\"primary\" @click=\"submitForm\">确 定</el-button>\n                        <el-button @click=\"cancel\">取 消</el-button>\n                    </div>\n                </el-dialog>\n            </el-card>\n        </template>\n    </BasicLayout>\n</template>\n\n<script>\n    import {add{{.ClassName}}, del{{.ClassName}}, get{{.ClassName}}, list{{.ClassName}}, update{{.ClassName}}} from '@/api/{{ .PackageName}}/{{ .MLTBName}}'\n    {{ $package:=.PackageName }}\n    {{range .Columns}}\n    {{- if ne .FkTableName \"\" -}}\n    import {list{{.FkTableNameClass}} } from '@/api/{{ $package }}/{{ .FkTableNamePackage}}'\n    {{ end -}}\n    {{- end -}}\n\n    export default {\n        name: '{{.ClassName}}',\n        components: {\n        },\n        data() {\n            return {\n                // 遮罩层\n                loading: true,\n                // 选中数组\n                ids: [],\n                // 非单个禁用\n                single: true,\n                // 非多个禁用\n                multiple: true,\n                // 总条数\n                total: 0,\n                // 弹出层标题\n                title: '',\n                // 是否显示弹出层\n                open: false,\n                isEdit: false,\n                // 类型数据字典\n                typeOptions: [],\n                {{.BusinessName}}List: [],\n                {{range .Columns}}\n                {{- if ne .DictType \"\" -}}\n                {{.JsonField}}Options: [],\n                {{- end -}}\n                {{- end }}\n                // 关系表类型\n                {{range .Columns}}\n                {{- if ne .FkTableName \"\" -}}\n                {{.JsonField}}Options :[],\n                {{ end -}}\n                {{- end }}\n                // 查询参数\n                queryParams: {\n                    pageIndex: 1,\n                    pageSize: 10,\n                    {{ range .Columns }}\n                    {{- if (.IsQuery) -}}\n                    {{.JsonField}}:undefined,\n                    {{ end -}}\n                    {{- end }}\n                },\n                // 表单参数\n                form: {\n                },\n                // 表单校验\n                rules: {\n                {{- range .Columns -}}\n                {{- $x := .IsQuery -}}\n                {{- if (eq $x \"1\") -}}\n                {{.JsonField}}:  [ {required: true, message: '{{.ColumnComment}}不能为空', trigger: 'blur'} ],\n                {{ end }}\n                {{- end -}}\n            }\n        }\n        },\n        created() {\n            this.getList()\n            {{range .Columns}}\n            {{- if ne .DictType \"\" -}}\n            this.getDicts('{{.DictType}}').then(response => {\n                this.{{.JsonField}}Options = response.data\n            })\n            {{ end -}}\n            {{- if ne .FkTableName \"\" -}}\n            this.get{{.FkTableNameClass}}Items()\n            {{ end -}}\n            {{- end -}}\n        },\n        methods: {\n            /** 查询参数列表 */\n            getList() {\n                this.loading = true\n                list{{.ClassName}}(this.addDateRange(this.queryParams, this.dateRange)).then(response => {\n                        this.{{.BusinessName}}List = response.data.list\n                        this.total = response.data.count\n                        this.loading = false\n                    }\n                )\n            },\n            // 取消按钮\n            cancel() {\n                this.open = false\n                this.reset()\n            },\n            // 表单重置\n            reset() {\n                this.form = {\n                {{ range .Columns}}\n                {{- $x := .IsInsert -}}\n                {{- if (eq $x \"1\") -}}\n                {{- if eq .GoField \"CreatedAt\" -}}\n                {{- else if eq .GoField \"UpdatedAt\" -}}\n                {{- else if eq .GoField \"DeletedAt\" -}}\n                {{- else if eq .GoField \"UpdateBy\" -}}\n                {{- else if eq .GoField \"CreateBy\" -}}\n                {{- else }}\n                {{.JsonField}}: undefined,\n                {{- end }}\n                {{- end -}}\n                {{- end }}\n            }\n                this.resetForm('form')\n            },\n            getImgList: function() {\n              this.form[this.fileIndex] = this.$refs['fileChoose'].resultList[0].fullUrl\n            },\n            fileClose: function() {\n              this.fileOpen = false\n            },\n            {{range .Columns}}\n            {{- if ne .DictType \"\" -}}\n            {{.JsonField}}Format(row) {\n                return this.selectDictLabel(this.{{.JsonField}}Options, row.{{.JsonField}})\n            },\n            {{ end -}}\n            {{- if ne .FkTableName \"\" -}}\n            {{.JsonField}}Format(row) {\n                return this.selectItemsLabel(this.{{.JsonField}}Options, row.{{.JsonField}})\n            },\n            {{ end -}}\n            {{- end -}}\n            // 关系\n            {{range .Columns}}\n            {{- if ne .FkTableName \"\" -}}\n            get{{.FkTableNameClass}}Items() {\n               this.getItems(list{{.FkTableNameClass}}, undefined).then(res => {\n                   this.{{.JsonField}}Options = this.setItems(res, '{{.FkLabelId}}', '{{.FkLabelName}}')\n               })\n            },\n            {{ end -}}\n            {{- end -}}\n            // 文件\n            {{range .Columns}}\n            {{- if eq .HtmlType \"file\" -}}\n            fileShow{{.GoField}}: function() {\n              this.fileOpen = true\n              this.fileIndex = '{{.JsonField}}'\n            },\n            {{ end -}}\n            {{- end -}}\n            /** 搜索按钮操作 */\n            handleQuery() {\n                this.queryParams.pageIndex = 1\n                this.getList()\n            },\n            /** 重置按钮操作 */\n            resetQuery() {\n                this.dateRange = []\n                this.resetForm('queryForm')\n                this.handleQuery()\n            },\n            /** 新增按钮操作 */\n            handleAdd() {\n                this.reset()\n                this.open = true\n                this.title = '添加{{.TableComment}}'\n                this.isEdit = false\n            },\n            // 多选框选中数据\n            handleSelectionChange(selection) {\n                this.ids = selection.map(item => item.{{.PkJsonField}})\n                this.single = selection.length !== 1\n                this.multiple = !selection.length\n            },\n            /** 修改按钮操作 */\n            handleUpdate(row) {\n                this.reset()\n                const {{.PkJsonField}} =\n                row.{{.PkJsonField}} || this.ids\n                get{{.ClassName}}({{.PkJsonField}}).then(response => {\n                    this.form = response.data\n                    this.open = true\n                    this.title = '修改{{.TableComment}}'\n                    this.isEdit = true\n                })\n            },\n            /** 提交按钮 */\n            submitForm: function () {\n                this.$refs['form'].validate(valid => {\n                    if (valid) {\n                        if (this.form.{{.PkJsonField}} !== undefined) {\n                            update{{.ClassName}}(this.form).then(response => {\n                                if (response.code === 200) {\n                                    this.msgSuccess(response.msg)\n                                    this.open = false\n                                    this.getList()\n                                } else {\n                                    this.msgError(response.msg)\n                                }\n                            })\n                        } else {\n                            add{{.ClassName}}(this.form).then(response => {\n                                if (response.code === 200) {\n                                    this.msgSuccess(response.msg)\n                                    this.open = false\n                                    this.getList()\n                                } else {\n                                    this.msgError(response.msg)\n                                }\n                            })\n                        }\n                    }\n                })\n            },\n            /** 删除按钮操作 */\n            handleDelete(row) {\n                var Ids = (row.{{.PkJsonField}} && [row.{{.PkJsonField}}]) || this.ids\n\n                this.$confirm('是否确认删除编号为\"' + Ids + '\"的数据项?', '警告', {\n                    confirmButtonText: '确定',\n                    cancelButtonText: '取消',\n                    type: 'warning'\n                }).then(function () {\n                      return del{{.ClassName}}( { 'ids': Ids })\n                }).then((response) => {\n                   if (response.code === 200) {\n                     this.msgSuccess(response.msg)\n                     this.open = false\n                     this.getList()\n                   } else {\n                     this.msgError(response.msg)\n                   }\n                }).catch(function () {\n                })\n            }\n        }\n    }\n</script>\n"
  },
  {
    "path": "test/api.go.template",
    "content": "package apis\n\nimport (\n\"github.com/gin-gonic/gin\"\n\"github.com/gin-gonic/gin/binding\"\n\"go-admin/models\"\n\"github.com/go-admin-team/go-admin-core/sdk/pkg\"\n\"go-admin/utils\"\n\"net/http\"\n)\n\n// @Summary 配置列表数据\n// @Description 获取JSON\n// @Tags 配置\n// @Param configKey query string false \"configKey\"\n// @Param configName query string false \"configName\"\n// @Param configType query string false \"configType\"\n// @Param pageSize query int false \"页条数\"\n// @Param pageIndex query int false \"页码\"\n// @Success 200 {object} app.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/configList [get]\n// @Security Bearer\nfunc Get{{.ClassName}}List(c *gin.Context) {\nvar data models.{{.ClassName}}\nvar err error\nvar pageSize = 10\nvar pageIndex = 1\n\nif size := c.Request.FormValue(\"pageSize\"); size != \"\" {\npageSize = pkg.StrToInt(err, size)\n}\n\nif index := c.Request.FormValue(\"pageIndex\"); index != \"\" {\npageIndex = pkg.StrToInt(err, index)\n}\n\n{{ range .Columns -}}\n    {{$z := .IsQuery}}\n    {{- if ($z) -}}\n        data.{{.GoField}} = c.Request.FormValue(\"{{.JsonField}}\")\n    {{ end }}\n{{- end -}}\n\ndata.DataScope = utils.GetUserIdStr(c)\nresult, count, err := data.GetPage(pageSize, pageIndex)\npkg.HasError(err, \"\", -1)\n\nvar mp = make(map[string]interface{}, 3)\nmp[\"list\"] = result\nmp[\"count\"] = count\nmp[\"pageIndex\"] = pageIndex\nmp[\"pageIndex\"] = pageSize\n\nvar res app.Response\nres.Data = mp\n\nc.JSON(http.StatusOK, res.ReturnOK())\n}\n\n// @Summary 获取配置\n// @Description 获取JSON\n// @Tags 配置\n// @Param configId path int true \"配置编码\"\n// @Success 200 {object} app.Response \"{\"code\": 200, \"data\": [...]}\"\n// @Router /api/v1/config/{configId} [get]\n// @Security Bearer\nfunc Get{{.ClassName}}(c *gin.Context) {\nvar data models.{{.ClassName}}\ndata.{{.PkGoField}}, _ = utils.StringToInt(c.Param(\"{{.PkJsonField}}\"))\nresult, err := data.Get()\npkg.HasError(err, \"抱歉未找到相关信息\", -1)\n\nvar res app.Response\nres.Data = result\n\nc.JSON(http.StatusOK, res.ReturnOK())\n}\n\n// @Summary 添加配置\n// @Description 获取JSON\n// @Tags 配置\n// @Accept  application/json\n// @Product application/json\n// @Param data body models.{{.ClassName}} true \"data\"\n// @Success 200 {string} string    \"{\"code\": 200, \"message\": \"添加成功\"}\"\n// @Success 200 {string} string    \"{\"code\": -1, \"message\": \"添加失败\"}\"\n// @Router /api/v1/dict/data [post]\n// @Security Bearer\nfunc Insert{{.ClassName}}(c *gin.Context) {\nvar data models.{{.ClassName}}\nerr := c.BindWith(&data, binding.JSON)\ndata.CreateBy = utils.GetUserIdStr(c)\npkg.HasError(err, \"\", 500)\nresult, err := data.Create()\npkg.HasError(err, \"\", -1)\n\nvar res app.Response\nres.Data = result\nc.JSON(http.StatusOK, res.ReturnOK())\n\n}\n\nfunc Update{{.ClassName}}(c *gin.Context) {\nvar data models.{{.ClassName}}\nerr := c.BindWith(&data, binding.JSON)\npkg.HasError(err, \"数据解析失败\", -1)\ndata.UpdateBy = utils.GetUserIdStr(c)\nresult, err := data.Update(data.{{.PkGoField}})\npkg.HasError(err, \"\", -1)\n\nvar res app.Response\nres.Data = result\nc.JSON(http.StatusOK, res.ReturnOK())\n}\n\nfunc Delete{{.ClassName}}(c *gin.Context) {\nvar data models.{{.ClassName}}\nid, err := utils.StringToInt(c.Param(\"{{.PkJsonField}}\"))\ndata.UpdateBy = utils.GetUserIdStr(c)\n_, err = data.Delete(id)\npkg.HasError(err, \"修改失败\", 500)\n\nvar res app.Response\nres.Msg = \"删除成功\"\nc.JSON(http.StatusOK, res.ReturnOK())\n}\n"
  },
  {
    "path": "test/gen_test.go",
    "content": "package test\n\nimport (\n\t//\"go-admin/models/tools\"\n\t//\"os\"\n\t\"testing\"\n\t//\"text/template\"\n)\n\nfunc TestGoModelTemplate(t *testing.T) {\n\t//t1, err := template.ParseFiles(\"model.go.template\")\n\t//if err != nil {\n\t//\tt.Error(err)\n\t//}\n\t//table := tools.SysTables{}\n\t//table.TBName = \"sys_tables\"\n\t//tab, err := table.Get()\n\t//if err != nil {\n\t//\tt.Error(err)\n\t//}\n\t//file, err := os.Create(\"models/\" + table.PackageName + \".go\")\n\t//if err != nil {\n\t//\tt.Error(err)\n\t//}\n\t//defer file.Close()\n\t//\n\t//_ = t1.Execute(file, tab)\n\tt.Log(\"\")\n}\n\nfunc TestGoApiTemplate(t *testing.T) {\n\t//t1, err := template.ParseFiles(\"api.go.template\")\n\t//if err != nil {\n\t//\tt.Error(err)\n\t//}\n\t//table := tools.SysTables{}\n\t//table.TBName = \"sys_tables\"\n\t//tab, _ := table.Get()\n\t//file, err := os.Create(\"apis/\" + table.PackageName + \".go\")\n\t//if err != nil {\n\t//\tt.Error(err)\n\t//}\n\t//defer file.Close()\n\t//\n\t//_ = t1.Execute(file, tab)\n\tt.Log(\"\")\n}\n"
  },
  {
    "path": "test/model.go.template",
    "content": "package models\n\nimport (\norm \"go-admin/global\"\n\"go-admin/utils\"\n\"time\"\n)\n\ntype {{.ClassName}} struct {\n\n{{ range .Columns -}}\n    {{$x := .Pk}}\n    // {{.ColumnComment}}\n    {{if ($x)}}{{.GoField}} {{.GoType}} `json:\"{{.JsonField}}\" gorm:\"column:{{.ColumnName}};primary_key\"`{{else}}{{.GoField}} {{.GoType}} `json:\"{{.JsonField}}\" gorm:\"column:{{.ColumnName}};\"`{{end}}\n{{ end -}}\n}\n\n// 创建{{.ClassName}}\nfunc (e *{{.ClassName}}) Create() ({{.ClassName}}, error) {\nvar doc {{.ClassName}}\ndoc.IsDel = \"0\"\ne.CreateTime = time.Now().String()\nresult := orm.Eloquent.Table(\"{{.TableName}}\").Create(&e)\nif result.Error != nil {\nerr := result.Error\nreturn doc, err\n}\ndoc = *e\nreturn doc, nil\n}\n\n// 获取{{.ClassName}}\nfunc (e *{{.ClassName}}) Get() ({{.ClassName}}, error) {\nvar doc {{.ClassName}}\n\ntable := orm.Eloquent.Table(\"{{.TableName}}\")\n{{ range .Columns -}}\n    {{$z := .IsQuery}}\n    {{- if ($z) -}}if e.{{.GoField}} !=  \"\" {\n    table = table.Where(\"{{.ColumnName}} = ?\", e.{{.GoField}})\n    }\n    {{ end }}\n{{- end -}}\n\nif err := table.First(&doc).Error; err != nil {\nreturn doc, err\n}\nreturn doc, nil\n}\n\n// 获取{{.ClassName}}带分页\nfunc (e *{{.ClassName}}) GetPage(pageSize int, pageIndex int) ([]{{.ClassName}}, int32, error) {\nvar doc []{{.ClassName}}\n\ntable := orm.Eloquent.Table(\"{{.TableName}}\")\n{{ range .Columns -}}\n    {{$z := .IsQuery}}\n    {{- if ($z) -}}if e.{{.GoField}} !=  \"\" {\n    table = table.Where(\"{{.ColumnName}} = ?\", e.{{.GoField}})\n    }\n    {{ end }}\n{{- end -}}\n\n// 数据权限控制\ndataPermission := new(DataPermission)\ndataPermission.UserId, _ = utils.StringToInt(e.DataScope)\ntable,err := dataPermission.GetDataScope(\"{{.TableName}}\", table)\nif err != nil {\nreturn nil, 0, err\n}\nvar count int32\ntable = table.Offset((pageIndex - 1) * pageSize).Limit(pageSize)\nif err := table.Find(&doc).Offset(-1).Limit(-1).Count(&count).Error; err != nil {\nreturn nil, 0, err\n}\nreturn doc, count, nil\n}\n\n// 更新{{.ClassName}}\nfunc (e *{{.ClassName}}) Update(id int) (update {{.ClassName}}, err error) {\nif err = orm.Eloquent.Table(\"{{.TableName}}\").Where(\"{{.PkColumn}} = ?\", id).First(&update).Error; err != nil {\nreturn\n}\n\n//参数1:是要修改的数据\n//参数2:是修改的数据\nif err = orm.Eloquent.Table(\"{{.TableName}}\").Model(&update).Updates(&e).Error; err != nil {\nreturn\n}\nreturn\n}\n\n// 删除{{.ClassName}}\nfunc (e *{{.ClassName}}) Delete(id int) (success bool, err error) {\n\nif err = orm.Eloquent.Table(\"{{.TableName}}\").Where(\"{{.PkColumn}} = ?\", id).Delete(&{{.ClassName}}{}).Error; err != nil {\nsuccess = false\nreturn\n}\nsuccess = true\nreturn\n}\n\n"
  }
]