diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b6cf066 --- /dev/null +++ b/.gitignore @@ -0,0 +1,31 @@ +.DS_Store +.buildpath +.hgignore.swp +.project +.orig +.swp +.idea/ +.settings/ +.vscode/ +vender/ +log/ +composer.lock +gitpush.sh +pkg/ +bin/ +cbuild +*/.DS_Store +config/config.toml +main +.vscode +go.sum + +node_modules/ +src/ +dist/ +package.json +package-lock.json +webpack.config.js +.svn + +go_build_main_go.exe \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..65c5ca8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/README.md b/README.md index 9be5124..32ecee3 100644 --- a/README.md +++ b/README.md @@ -1,92 +1,74 @@ -# easygoadmin +# gin layui 后台管理框架 + +# 文档地址: http://docs.gin.layui.easygoadmin.vip/#/ -## Getting started +## 1.数据表创建 -To make it easy for you to get started with GitLab, here's a list of recommended next steps. +参考文档: -Already a pro? Just edit this README.md and make it your own. Want to make it easy? [Use the template at the bottom](#editing-this-readme)! -## Add your files +![image-20221027110638685](https://s3.bmp.ovh/imgs/2022/10/27/69556e9fef62702c.png) + +如type或status这两个字段注释一定要用上面的格式写, 这样才能自动生成响应的功能, 其他需要类似功能的字段也是. -- [ ] [Create](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#create-a-file) or [upload](https://docs.gitlab.com/ee/user/project/repository/web_editor.html#upload-a-file) files -- [ ] [Add files using the command line](https://docs.gitlab.com/ee/gitlab-basics/add-file.html#add-a-file-using-the-command-line) or push an existing Git repository with the following command: ``` -cd existing_repo -git remote add origin https://gitlab.52pay.top/go/easygoadmin.git -git branch -M main -git push -uf origin main +`create_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', +`update_time` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '最新更新时间', ``` -## Integrate with your tools +create_time和update_time建议用上面两个 -- [ ] [Set up project integrations](https://gitlab.52pay.top/go/easygoadmin/-/settings/integrations) -## Collaborate with your team +## 2.生成控制器和模型 -- [ ] [Invite team members and collaborators](https://docs.gitlab.com/ee/user/project/members/) -- [ ] [Create a new merge request](https://docs.gitlab.com/ee/user/project/merge_requests/creating_merge_requests.html) -- [ ] [Automatically close issues from merge requests](https://docs.gitlab.com/ee/user/project/issues/managing_issues.html#closing-issues-automatically) -- [ ] [Enable merge request approvals](https://docs.gitlab.com/ee/user/project/merge_requests/approvals/) -- [ ] [Automatically merge when pipeline succeeds](https://docs.gitlab.com/ee/user/project/merge_requests/merge_when_pipeline_succeeds.html) +![image-20221027110827161](https://s3.bmp.ovh/imgs/2022/10/27/91e43c94a845efde.png) -## Test and Deploy +建议使用代码生成器 -Use the built-in continuous integration in GitLab. +手动在这个目录下创建模型 -- [ ] [Get started with GitLab CI/CD](https://docs.gitlab.com/ee/ci/quick_start/index.html) -- [ ] [Analyze your code for known vulnerabilities with Static Application Security Testing(SAST)](https://docs.gitlab.com/ee/user/application_security/sast/) -- [ ] [Deploy to Kubernetes, Amazon EC2, or Amazon ECS using Auto Deploy](https://docs.gitlab.com/ee/topics/autodevops/requirements.html) -- [ ] [Use pull-based deployments for improved Kubernetes management](https://docs.gitlab.com/ee/user/clusters/agent/) -- [ ] [Set up protected environments](https://docs.gitlab.com/ee/ci/environments/protected_environments.html) +![image-20221027111007276](https://s3.bmp.ovh/imgs/2022/10/27/a63cf3be840ae457.png) -*** +## 3.路由 -# Editing this README +系统根据表名创建一个路由文件, 但是这个文件的路由不会被注册到程序, 所有需要把里面的路由复制到router.go文件, 或者采用下面的方式: -When you're ready to make this README your own, just edit this file and use the handy template below (or feel free to structure it however you want - this is just a starting point!). Thank you to [makeareadme.com](https://www.makeareadme.com/) for this template. +![image-20221027111320157](https://s3.bmp.ovh/imgs/2022/10/27/70c423b9c2ca9399.png) -## Suggestions for a good README -Every project is different, so consider which of these sections apply to yours. The sections used in the template are suggestions for most open source projects. Also keep in mind that while a README can be too long and detailed, too long is better than too short. If you think your README is too long, consider utilizing another form of documentation rather than cutting out information. +![image-20221027111424630](https://s3.bmp.ovh/imgs/2022/10/27/a90070a884a889f6.png) -## Name -Choose a self-explaining name for your project. +需要放到需要使用的中间件下面 -## Description -Let people know what your project can do specifically. Provide context and add a link to any reference visitors might be unfamiliar with. A list of Features or a Background subsection can also be added here. If there are alternatives to your project, this is a good place to list differentiating factors. -## Badges -On some READMEs, you may see small images that convey metadata, such as whether or not all the tests are passing for the project. You can use Shields to add some to your README. Many services also have instructions for adding a badge. -## Visuals -Depending on what you are making, it can be a good idea to include screenshots or even a video (you'll frequently see GIFs rather than actual videos). Tools like ttygif can help, but check out Asciinema for a more sophisticated method. +## 4.开发中需要注意的问题 -## Installation -Within a particular ecosystem, there may be a common way of installing things, such as using Yarn, NuGet, or Homebrew. However, consider the possibility that whoever is reading your README is a novice and would like more guidance. Listing specific steps helps remove ambiguity and gets people to using your project as quickly as possible. If it only runs in a specific context like a particular programming language version or operating system or has dependencies that have to be installed manually, also add a Requirements subsection. +[介绍 · Go语言中文文档-xorm (topgoer.com)](http://xorm.topgoer.com/) -## Usage -Use examples liberally, and show the expected output if you can. It's helpful to have inline the smallest example of usage that you can demonstrate, while providing links to more sophisticated examples if they are too long to reasonably include in the README. +### 4.1 修改数据 -## Support -Tell people where they can go to for help. It can be any combination of an issue tracker, a chat room, an email address, etc. +![image-20221027111712928](https://s3.bmp.ovh/imgs/2022/10/27/f4b5afe77e813906.png) -## Roadmap -If you have ideas for releases in the future, it is a good idea to list them in the README. +使用结构体修改数据的时候一定要加上 Cols 指定要修改的字段, 要修改几个加几个, 不然有概率会出现不可预知的问题, 或者使用Map[string]interface{}类型修改数据 -## Contributing -State if you are open to contributions and what your requirements are for accepting them. +### 4.2 配置文件 -For people who want to make changes to your project, it's helpful to have some documentation on how to get started. Perhaps there is a script that they should run or some environment variables that they need to set. Make these steps explicit. These instructions could also be useful to your future self. +``` +config/config.toml +``` -You can also document commands to lint the code or run tests. These steps help to ensure high code quality and reduce the likelihood that the changes inadvertently break something. Having instructions for running tests is especially helpful if it requires external setup, such as starting a Selenium server for testing in a browser. +这个是配置文件, 一般git忽略掉这样测试环境和线上不会被覆盖, 发上线的的时候最好手动创建 -## Authors and acknowledgment -Show your appreciation to those who have contributed to the project. +系统后台 sql 文件 -## License -For open source projects, say how it is licensed. +也可以参考这里的技术文档生成模型 + +![](https://s3.bmp.ovh/imgs/2022/10/27/c6924e94288fdb57.jpg) + + + +xorm reverse mysql 数据库账号t:数据库密码@/数据库名?charset=utf8mb4 templates/goxorm app/model -## Project status -If you have run out of energy or time for your project, put a note at the top of the README saying that development has slowed down or stopped completely. Someone may choose to fork your project or volunteer to step in as a maintainer or owner, allowing your project to keep going. You can also make an explicit request for maintainers. diff --git a/app/controller/ad.go b/app/controller/ad.go new file mode 100644 index 0000000..680ff85 --- /dev/null +++ b/app/controller/ad.go @@ -0,0 +1,215 @@ +/** + * 广告管理-控制器 + * @author + * @since 2021/11/15 + * @File : ad + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" + "strings" +) + +var Ad = new(adCtl) + +type adCtl struct{} + +func (c *adCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "ad_index.html").WriteTpl() +} + +func (c *adCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.AdPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用分页查询方法 + list, count, err := service.Ad.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *adCtl) Edit(ctx *gin.Context) { + // 查询记录 + id := gconv.Int(ctx.Query("id")) + if id > 0 { + info := &model.Ad{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 广告图片 + if info.Cover != "" { + info.Cover = utils.GetImageUrl(info.Cover) + } + + // 富文本图片替换处理 + if info.Content != "" { + info.Content = strings.ReplaceAll(info.Content, "[IMG_URL]", utils.ImageUrl()) + } + + // 广告位列表 + list := make([]model.AdSort, 0) + utils.XormDb.Where("mark=1").Find(&list) + adSortList := make(map[int]string, 0) + for _, v := range list { + adSortList[v.Id] = v.Description + } + + // 渲染模板 + response.BuildTpl(ctx, "ad_edit.html").WriteTpl(gin.H{ + "info": info, + "typeList": common.AD_TYPE_LIST, + "adSortList": adSortList, + }) + } else { + // 添加 + // 渲染模板 + response.BuildTpl(ctx, "ad_edit.html").WriteTpl() + } +} + +func (c *adCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.AdAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Ad.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *adCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.AdUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Ad.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *adCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.Ad.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *adCtl) Status(ctx *gin.Context) { + // 参数绑定 + var req *dto.AdStatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置状态方法 + rows, err := service.Ad.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} diff --git a/app/controller/ad_sort.go b/app/controller/ad_sort.go new file mode 100644 index 0000000..fedcd65 --- /dev/null +++ b/app/controller/ad_sort.go @@ -0,0 +1,181 @@ +/** + * 广告位-控制器 + * @author + * @since 2021/11/15 + * @File : adsort + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var AdSort = new(adSortCtl) + +type adSortCtl struct{} + +func (c *adSortCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "adsort_index.html").WriteTpl() +} + +func (c *adSortCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.AdSortPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用查询分页方法 + list, count, err := service.AdSort.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *adSortCtl) Edit(ctx *gin.Context) { + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 编辑 + info := &model.AdSort{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 渲染模板 + response.BuildTpl(ctx, "adsort_edit.html").WriteTpl(gin.H{ + "info": info, + "platformList": common.ADSORT_PLATFORM_LIST, + }) + } else { + // 添加 + // 渲染模板 + response.BuildTpl(ctx, "adsort_edit.html").WriteTpl(gin.H{ + "platformList": common.ADSORT_PLATFORM_LIST, + }) + } +} + +func (c *adSortCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.AdSortAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.AdSort.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *adSortCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.AdSortUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.AdSort.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *adSortCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.AdSort.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *adSortCtl) GetAdSortList(ctx *gin.Context) { + // 调用查询列表方法 + list := service.AdSort.GetAdSortList() + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} diff --git a/app/controller/analysis.go b/app/controller/analysis.go new file mode 100644 index 0000000..1439a61 --- /dev/null +++ b/app/controller/analysis.go @@ -0,0 +1,21 @@ +/** + * 统计分析 + * @author + * @since 2021/11/30 + * @File : analysis + */ +package controller + +import ( + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" +) + +var Analysis = new(analysisCtl) + +type analysisCtl struct{} + +func (c *analysisCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "analysis_index.html").WriteTpl() +} diff --git a/app/controller/city.go b/app/controller/city.go new file mode 100644 index 0000000..4f97f5b --- /dev/null +++ b/app/controller/city.go @@ -0,0 +1,190 @@ +/** + * 城市管理-控制器 + * @author + * @since 2021/11/13 + * @File : city + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var City = new(cityCtl) + +type cityCtl struct{} + +func (c *cityCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "city_index.html").WriteTpl() +} + +func (c *cityCtl) List(ctx *gin.Context) { + //// 参数 + //var req *dto.CityQueryReq + //if err := ctx.ShouldBind(&req); err != nil { + // ctx.JSON(http.StatusOK, common.JsonResult{ + // Code: -1, + // Msg: err.Error(), + // }) + // return + //} + + // 调用获取列表方法 + list := service.City.GetList(nil) + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} + +func (c *cityCtl) Edit(ctx *gin.Context) { + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 编辑 + info := &model.City{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 渲染模板 + response.BuildTpl(ctx, "city_edit.html").WriteTpl(gin.H{ + "info": info, + "levelList": common.CITY_LEVEL, + }) + } else { + // 添加 + // 渲染模板 + response.BuildTpl(ctx, "city_edit.html").WriteTpl() + } +} + +func (c *cityCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.CityAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.City.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *cityCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.CityUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.City.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *cityCtl) Delete(ctx *gin.Context) { + // 参数 + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.City.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *cityCtl) GetChilds(ctx *gin.Context) { + // 参数验证 + var req *dto.CityChildReq + if err := ctx.ShouldBind(&req); err != nil { + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用获取子级城市 + list, err := service.City.GetChilds(req.CityCode) + if err != nil { + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} diff --git a/app/controller/config.go b/app/controller/config.go new file mode 100644 index 0000000..ce24fdd --- /dev/null +++ b/app/controller/config.go @@ -0,0 +1,123 @@ +/** + * 配置管理-控制器 + * @author + * @since 2021/11/13 + * @File : config + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Config = new(configCtl) + +type configCtl struct{} + +func (c *configCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "config_index.html").WriteTpl(gin.H{ + "configTypeList": common.CONFIG_DATA_TYPE_LIST, + }) +} + +func (c *configCtl) List(ctx *gin.Context) { + // 调用查询列表方法 + list := service.Config.GetList() + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} + +func (c *configCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.ConfigAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Config.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *configCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.ConfigUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Config.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *configCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.Config.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} diff --git a/app/controller/config_data.go b/app/controller/config_data.go new file mode 100644 index 0000000..8d153ed --- /dev/null +++ b/app/controller/config_data.go @@ -0,0 +1,162 @@ +/** + * 配置数据-控制器 + * @author + * @since 2021/11/13 + * @File : config_data + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "github.com/gin-gonic/gin" + "net/http" +) + +var ConfigData = new(configDataCtl) + +type configDataCtl struct{} + +func (c *configDataCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.ConfigDataPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用查询方法 + list, count, err := service.ConfigData.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *configDataCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.ConfigDataAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.ConfigData.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *configDataCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.ConfigDataUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.ConfigData.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *configDataCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.ConfigData.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *configDataCtl) Status(ctx *gin.Context) { + // 参数 + var req *dto.ConfigDataStatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置方法 + rows, err := service.ConfigData.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} diff --git a/app/controller/config_web.go b/app/controller/config_web.go new file mode 100644 index 0000000..54c36ee --- /dev/null +++ b/app/controller/config_web.go @@ -0,0 +1,198 @@ +/** + * 系统配置-控制器 + * @author + * @since 2021/11/15 + * @File : config_web + */ +package controller + +import ( + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/gstr" + "easygoadmin/utils/response" + "encoding/json" + "github.com/gin-gonic/gin" + "net/http" + "regexp" + "strings" + "time" +) + +// 控制器管理对象 +var ConfigWeb = new(configWebCtl) + +type configWebCtl struct{} + +func (c *configWebCtl) Index(ctx *gin.Context) { + if ctx.Request.Method == "POST" { + // 返回结果 + if utils.AppDebug() { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "演示环境,暂无权限操作", + }) + return + } + // key:string类型,value:interface{} 类型能存任何数据类型 + var jsonObj map[string]interface{} + data, _ := ctx.GetRawData() + json.Unmarshal(data, &jsonObj) + // 遍历处理数据源 + for key, val := range jsonObj { + // 参数处理 + if key == "checkbox" { + // 复选框 + + item := gstr.Split(key, "__") + // KEY值 + key = item[0] + } else if strings.Contains(key, "upimage") { + // 单图上传 + + item := gstr.Split(key, "__") + // KEY值 + key = item[0] + if strings.Contains(gconv.String(val), "temp") { + image, _ := utils.SaveImage(gconv.String(val), "config") + // 赋值给参数 + val = image + } else { + // 赋值给参数 + val = gstr.Replace(gconv.String(val), utils.ImageUrl(), "") + } + } else if strings.Contains(key, "upimgs") { + // 多图上传 + item := gstr.Split(key, "__") + // KEY值 + key = item[0] + // 图片地址处理 + urlArr := gstr.Split(gconv.String(val), ",") + list := make([]string, 0) + for _, v := range urlArr { + if strings.Contains(gconv.String(v), "temp") { + image, _ := utils.SaveImage(v, "config") + list = append(list, image) + } else { + image := gstr.Replace(v, utils.ImageUrl(), "") + list = append(list, image) + } + } + // 数组转字符串,逗号分隔 + val = strings.Join(list, ",") + } else if strings.Contains(key, "ueditor") { + item := gstr.Split(key, "__") + // KEY值 + key = item[0] + + // 富文本处理(待完善) + // TODO... + } + + var info model.ConfigData + has, err := utils.XormDb.Where("code=?", key).Get(&info) + if err != nil || !has { + continue + } + + // 更新记录 + entity := &model.ConfigData{Id: info.Id} + entity.Value = gconv.String(val) + entity.UpdateUser = utils.Uid(ctx) + entity.UpdateTime = time.Now().Unix() + entity.Update() + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "保存成功", + }) + return + } + // 配置ID + configId := ctx.Query("configId") + if configId == "" { + configId = "1" + } + + // 获取配置列表 + configData := make([]model.Config, 0) + utils.XormDb.Where("mark=1").Find(&configData) + configList := make(map[string]string) + for _, v := range configData { + configList[gconv.String(v.Id)] = v.Name + } + + // 获取配置项列表 + itemData := make([]model.ConfigData, 0) + utils.XormDb.Where("config_id=? and status=1 and mark=1", configId).OrderBy("sort asc").Find(&itemData) + itemList := make([]map[string]interface{}, 0) + for _, v := range itemData { + item := make(map[string]interface{}) + item["id"] = v.Id + item["title"] = v.Title + item["code"] = v.Code + item["value"] = v.Value + item["type"] = v.Type + + if v.Type == "checkbox" { + // 复选框 + re := regexp.MustCompile(`\r?\n`) + list := gstr.Split(re.ReplaceAllString(v.Options, "|"), "|") + optionsList := make(map[string]string) + for _, val := range list { + re2 := regexp.MustCompile(`:|:|\s+`) + item := gstr.Split(re2.ReplaceAllString(val, "|"), "|") + optionsList[item[0]] = item[1] + } + item["optionsList"] = optionsList + } else if v.Type == "radio" { + // 单选框 + re := regexp.MustCompile(`\r?\n`) + list := gstr.Split(re.ReplaceAllString(v.Options, "|"), "|") + optionsList := make(map[string]string) + for _, v := range list { + re2 := regexp.MustCompile(`:|:|\s+`) + item := gstr.Split(re2.ReplaceAllString(v, "|"), "|") + optionsList[item[0]] = item[1] + } + item["optionsList"] = optionsList + + } else if v.Type == "select" { + // 下拉选择框 + re := regexp.MustCompile(`\r?\n`) + list := gstr.Split(re.ReplaceAllString(v.Options, "|"), "|") + optionsList := make(map[string]string) + for _, v := range list { + re2 := regexp.MustCompile(`:|:|\s+`) + item := gstr.Split(re2.ReplaceAllString(v, "|"), "|") + optionsList[item[0]] = item[1] + } + item["optionsList"] = optionsList + } else if v.Type == "image" { + // 单图片 + item["value"] = utils.GetImageUrl(v.Value) + } else if v.Type == "images" { + // 多图片 + list := gstr.Split(v.Value, ",") + itemList := make([]string, 0) + for _, v := range list { + // 图片地址 + item := utils.GetImageUrl(v) + itemList = append(itemList, item) + } + item["value"] = itemList + } + itemList = append(itemList, item) + } + + // 渲染模板 + response.BuildTpl(ctx, "configweb_index.html").WriteTpl(gin.H{ + "configId": configId, + "configList": configList, + "itemList": itemList, + }) +} diff --git a/app/controller/customer.go b/app/controller/customer.go new file mode 100644 index 0000000..acbd2d0 --- /dev/null +++ b/app/controller/customer.go @@ -0,0 +1,103 @@ +/** + * 用户管理-控制器 + * @author + * @since 2021/11/11 + * @File : user + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "github.com/gin-gonic/gin" + "net/http" +) + +var Coutomer = new(customerCtl) + +type customerCtl struct{} + +// 搜索 根据手机号或订单号 +func (c *customerCtl) Search(ctx *gin.Context) { + // 绑定参数 + var req *dto.CustomerSearchReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用查询列表方法 + data := service.Customer.Search(req) + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: data, + }) +} + +// 购买话费券订单退款 +func (c *customerCtl) CouponRefund(ctx *gin.Context) { + // 绑定参数 + var req *dto.CustomerCouponRefundReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用查询列表方法 + msg, ok := service.Customer.CouponRefund(req, utils.Uid(ctx)) + + if !ok { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: msg, + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "退款成功", + }) +} + +// 购买话费券订单退款 +func (c *customerCtl) RechargeRefund(ctx *gin.Context) { + // 绑定参数 + var req *dto.CustomerCouponRefundReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用方法 + msg, ok := service.Customer.RechargeRefund(req, utils.Uid(ctx)) + + if !ok { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: msg, + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "退款成功", + }) +} diff --git a/app/controller/dept.go b/app/controller/dept.go new file mode 100644 index 0000000..03c9b34 --- /dev/null +++ b/app/controller/dept.go @@ -0,0 +1,169 @@ +/** + * 部门管理-控制器 + * @author + * @since 2021/9/13 + * @File : dept + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Dept = new(deptCtl) + +type deptCtl struct{} + +func (c *deptCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "dept_index.html").WriteTpl() +} + +func (c *deptCtl) List(ctx *gin.Context) { + //// 参数绑定 + //var req *dto.DeptPageReq + //if err := ctx.ShouldBind(&req); err != nil { + // ctx.JSON(http.StatusOK, common.JsonResult{ + // Code: -1, + // Msg: err.Error(), + // }) + // return + //} + + // 调用查询列表方法 + list, err := service.Dept.GetList(nil) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "操作成功", + Data: list, + }) +} + +func (c *deptCtl) Edit(ctx *gin.Context) { + // 查询记录 + id := gconv.Int(ctx.Query("id")) + if id > 0 { + info := &model.Dept{Id: id} + isOk, err := info.Get() + if !isOk || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + } + // 渲染模板 + response.BuildTpl(ctx, "dept_edit.html").WriteTpl(gin.H{ + "info": info, + "typeList": common.DEPT_TYPE_LIST, + }) + } else { + // 渲染模板 + response.BuildTpl(ctx, "dept_edit.html").WriteTpl(gin.H{ + "typeList": common.DEPT_TYPE_LIST, + }) + } +} + +func (c *deptCtl) Add(ctx *gin.Context) { + // 参数绑定 + var req *dto.DeptAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Dept.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *deptCtl) Update(ctx *gin.Context) { + // 参数绑定 + var req *dto.DeptUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Dept.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *deptCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + // 调用删除方法 + rows, err := service.Dept.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *deptCtl) GetDeptList(ctx *gin.Context) { + // 查询部门列表 + list := make([]model.Dept, 0) + utils.XormDb.Where("mark=1").Asc("sort").Find(&list) + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} diff --git a/app/controller/dict.go b/app/controller/dict.go new file mode 100644 index 0000000..bf413c4 --- /dev/null +++ b/app/controller/dict.go @@ -0,0 +1,122 @@ +/** + * 字典管理-控制器 + * @author + * @since 2021/11/13 + * @File : dict + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Dict = new(dictCtl) + +type dictCtl struct{} + +func (c *dictCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "dict_index.html").WriteTpl() +} + +func (c *dictCtl) List(ctx *gin.Context) { + + // 调用查询列表方法 + list := service.Dict.GetList() + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} + +func (c *dictCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.DictAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Dict.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *dictCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.DictUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Dict.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *dictCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + } + + // 调用删除方法 + rows, err := service.Dict.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} diff --git a/app/controller/dict_data.go b/app/controller/dict_data.go new file mode 100644 index 0000000..2c5c761 --- /dev/null +++ b/app/controller/dict_data.go @@ -0,0 +1,134 @@ +/** + * 字典数据-控制器 + * @author + * @since 2021/11/13 + * @File : dict_data + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "github.com/gin-gonic/gin" + "net/http" +) + +var DictData = new(dictDataCtl) + +type dictDataCtl struct{} + +func (c *dictDataCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.DictDataPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用查询分页方法 + list, count, err := service.DictData.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *dictDataCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.DictDataAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.DictData.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *dictDataCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.DictDataUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.DictData.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *dictDataCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.DictData.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} diff --git a/app/controller/example.go b/app/controller/example.go new file mode 100644 index 0000000..9ef81dd --- /dev/null +++ b/app/controller/example.go @@ -0,0 +1,230 @@ +/** + * 演示一管理-控制器 + * @author + * @since 2022-04-19 + * @File : example + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Example = new(exampleCtl) + +type exampleCtl struct{} + +func (c *exampleCtl) Index(ctx *gin.Context) { + // 模板渲染 + response.BuildTpl(ctx, "example_index.html").WriteTpl() +} + +func (c *exampleCtl) T(ctx *gin.Context) { + // 模板渲染 + ctx.String(http.StatusOK, "TTTT") +} + +func (c *exampleCtl) List(ctx *gin.Context) { + // 参数绑定 + var req *dto.ExamplePageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用获取列表方法 + list, count, err := service.Example.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Data: list, + Msg: "操作成功", + Count: count, + }) +} + +func (c *exampleCtl) Edit(ctx *gin.Context) { + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 编辑 + info := &model.Example{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 头像 + if info.Avatar != "" { + info.Avatar = utils.GetImageUrl(info.Avatar) + } + + // 渲染模板 + response.BuildTpl(ctx, "example_edit.html").WriteTpl(gin.H{ + "info": info, + }) + } else { + // 添加 + response.BuildTpl(ctx, "example_edit.html").WriteTpl() + } +} + +func (c *exampleCtl) Add(ctx *gin.Context) { + // 参数绑定 + var req *dto.ExampleAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Example.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *exampleCtl) Update(ctx *gin.Context) { + // 参数绑定 + var req *dto.ExampleUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Example.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *exampleCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.Example.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *exampleCtl) Status(ctx *gin.Context) { + // 参数绑定 + var req *dto.ExampleStatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置状态方法 + rows, err := service.Example.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} + +func (c *exampleCtl) IsVip(ctx *gin.Context) { + // 参数绑定 + var req *dto.ExampleIsVipReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置状态方法 + rows, err := service.Example.IsVip(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} diff --git a/app/controller/example2.go b/app/controller/example2.go new file mode 100644 index 0000000..149ea59 --- /dev/null +++ b/app/controller/example2.go @@ -0,0 +1,193 @@ +/** + * 演示二管理-控制器 + * @author + * @since 2022-04-19 + * @File : example2 + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Example2 = new(example2Ctl) + +type example2Ctl struct{} + +func (c *example2Ctl) Index(ctx *gin.Context) { + // 模板渲染 + response.BuildTpl(ctx, "example2_index.html").WriteTpl() +} + +func (c *example2Ctl) List(ctx *gin.Context) { + // 参数绑定 + var req *dto.Example2PageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用获取列表方法 + list, count, err := service.Example2.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Data: list, + Msg: "操作成功", + Count: count, + }) +} + +func (c *example2Ctl) Edit(ctx *gin.Context) { + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 编辑 + info := &model.Example2{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 渲染模板 + response.BuildTpl(ctx, "example2_edit.html").WriteTpl(gin.H{ + "info": info, + }) + } else { + // 添加 + response.BuildTpl(ctx, "example2_edit.html").WriteTpl() + } +} + +func (c *example2Ctl) Add(ctx *gin.Context) { + // 参数绑定 + var req *dto.Example2AddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Example2.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *example2Ctl) Update(ctx *gin.Context) { + // 参数绑定 + var req *dto.Example2UpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Example2.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *example2Ctl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.Example2.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *example2Ctl) Status(ctx *gin.Context) { + // 参数绑定 + var req *dto.Example2StatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置状态方法 + rows, err := service.Example2.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} diff --git a/app/controller/generate.go b/app/controller/generate.go new file mode 100644 index 0000000..979b4c9 --- /dev/null +++ b/app/controller/generate.go @@ -0,0 +1,119 @@ +/** + * 代码生成器-控制器 + * @author + * @since 2021/11/15 + * @File : generate + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/service" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" + "strconv" + "strings" +) + +// 控制器管理对象 +var Generate = new(generateCtl) + +type generateCtl struct{} + +func (c *generateCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "generate_index.html").WriteTpl() +} + +func (c *generateCtl) List(ctx *gin.Context) { + // 参数验证 + var req *dto.GeneratePageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用查询列表方法 + list, err := service.Generate.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: gconv.Int64(len(list)), + }) +} + +func (c *generateCtl) Generate(ctx *gin.Context) { + // 参数验证 + var req dto.GenerateFileReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 调用生成方法 + err := service.Generate.Generate(req, ctx) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "模块生成成功", + }) +} + +func (c *generateCtl) BatchGenerate(ctx *gin.Context) { + // 生成对象 + var req *dto.BatchGenerateFileReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 参数分析 + tableList := strings.Split(req.Tables, ",") + count := 0 + for _, item := range tableList { + itemList := strings.Split(item, "|") + // 组装参数对象 + var param dto.GenerateFileReq + param.Name = itemList[0] + param.Comment = itemList[1] + // 调用生成方法 + err := service.Generate.Generate(param, ctx) + if err != nil { + continue + } + count++ + } + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "本次共生成【" + strconv.Itoa(count) + "】个模块文件", + }) +} diff --git a/app/controller/index.go b/app/controller/index.go new file mode 100644 index 0000000..2d6fdfd --- /dev/null +++ b/app/controller/index.go @@ -0,0 +1,221 @@ +/** + * 系统主页-控制器 + * @author + * @since 2021/9/7 + * @File : index + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-contrib/sessions" + "github.com/gin-gonic/gin" + "net/http" +) + +// 用户API管理对象 +var Index = new(indexCtl) + +type indexCtl struct{} + +func (c *indexCtl) None(ctx *gin.Context) { + // 记录ID + id := ctx.Param("id") + if id == "" { + ctx.String(http.StatusOK, "") + return + } + res := service.PbShortLink.GetInfoById(ctx, gconv.Int64(id)) + if res.Id == 0 || res.Url == "" { + ctx.String(http.StatusOK, "") + return + } + ctx.Redirect(http.StatusTemporaryRedirect, res.Url) + return + +} + +func (c *indexCtl) Index(ctx *gin.Context) { + // 已登录 + // 获取用户信息 + userInfo := service.Login.GetProfile(ctx) + // 获取菜单列表 + menuList := service.Menu.GetPermissionMenuList(userInfo.Id) + // 渲染模板并绑定数据 + response.BuildTpl(ctx, "index.html").WriteTpl(gin.H{ + "userInfo": userInfo, + "menuList": menuList, + }) +} + +func (c *indexCtl) Main(ctx *gin.Context) { + response.BuildTpl(ctx, "welcome.html").WriteTpl() +} + +// 个人中心 +func (c *indexCtl) UserInfo(ctx *gin.Context) { + if ctx.Request.Method == "POST" { + // 参数验证 + var req *dto.UserInfoReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 更新信息 + _, err := service.User.UpdateUserInfo(req, utils.Uid(ctx)) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) + return + } + // 获取用户信息 + userInfo := service.Login.GetProfile(ctx) + // 渲染模板 + response.BuildTpl(ctx, "user_info.html").WriteTpl(gin.H{ + "userInfo": userInfo, + }) +} + +// 获取系统菜单 +func (c *indexCtl) Menu(ctx *gin.Context) { + // 获取菜单列表 + menuList := service.Menu.GetPermissionList(utils.Uid(ctx)) + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "操作成功", + Data: menuList, + }) +} + +// 获取用户信息 +func (c *indexCtl) User(ctx *gin.Context) { + // 获取用户信息 + user := model.User{} + has, err := utils.XormDb.Id(utils.Uid(ctx)).Get(&user) + if err != nil && !has { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 用户信息 + var profile vo.ProfileInfoVo + profile.Realname = user.Realname + profile.Nickname = user.Nickname + profile.Avatar = utils.GetImageUrl(user.Avatar) + profile.Gender = user.Gender + profile.Mobile = user.Mobile + profile.Email = user.Email + profile.Intro = user.Intro + profile.Address = user.Address + // 角色 + profile.Roles = make([]interface{}, 0) + // 权限 + profile.Authorities = make([]interface{}, 0) + // 获取权限节点 + permissionList := service.Menu.GetPermissionsList(utils.Uid(ctx)) + profile.PermissionList = permissionList + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: profile, + }) +} + +//// 个人中心 +//func (c *indexCtl) UpdateUserInfo(ctx *gin.Context) { +// // 参数验证 +// var req *dto.UserInfoReq +// if err := ctx.ShouldBind(&req); err != nil { +// ctx.JSON(http.StatusOK, common.JsonResult{ +// Code: -1, +// Msg: err.Error(), +// }) +// return +// } +// // 更新信息 +// _, err := service.User.UpdateUserInfo(req, utils.Uid(ctx)) +// if err != nil { +// ctx.JSON(http.StatusOK, common.JsonResult{ +// Code: -1, +// Msg: err.Error(), +// }) +// return +// } +// +// // 返回结果 +// ctx.JSON(http.StatusOK, common.JsonResult{ +// Code: 0, +// Msg: "更新成功", +// }) +//} + +// 更新密码 +func (c *indexCtl) UpdatePwd(ctx *gin.Context) { + // 参数验证 + var req *dto.UpdatePwd + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新密码方法 + rows, err := service.User.UpdatePwd(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新密码成功", + }) +} + +// 注销系统 +func (c *indexCtl) Logout(ctx *gin.Context) { + // 初始化session对象 + session := sessions.Default(ctx) + //session.Set("userId", "") + //session.Save() + // 删除session数据 + //session.Delete("userId") + // 清空session + session.Clear() + // 保存session数据 + session.Save() + // 跳转登录页,方式:301(永久移动),308(永久重定向),307(临时重定向) + ctx.Redirect(http.StatusTemporaryRedirect, "/login") +} diff --git a/app/controller/item.go b/app/controller/item.go new file mode 100644 index 0000000..60cb7dc --- /dev/null +++ b/app/controller/item.go @@ -0,0 +1,214 @@ +/** + * 站点管理-控制器 + * @author + * @since 2021/11/13 + * @File : item + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Item = new(itemCtl) + +type itemCtl struct{} + +func (c *itemCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "item_index.html").WriteTpl(gin.H{ + "typeList": common.ITEM_TYPE_LIST, + }) +} + +func (c *itemCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.ItemPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用分页查询方法 + list, count, err := service.Item.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *itemCtl) Edit(ctx *gin.Context) { + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 编辑 + info := &model.Item{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 站点图片 + info.Image = utils.GetImageUrl(info.Image) + // 渲染模板 + response.BuildTpl(ctx, "item_edit.html").WriteTpl(gin.H{ + "info": info, + "typeList": common.ITEM_TYPE_LIST, + }) + + } else { + // 添加 + // 渲染模板 + response.BuildTpl(ctx, "item_edit.html").WriteTpl(gin.H{ + "typeList": common.ITEM_TYPE_LIST, + }) + } +} + +func (c *itemCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.ItemAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Item.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *itemCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.ItemUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Item.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *itemCtl) Delete(ctx *gin.Context) { + // 参数 + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.Item.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *itemCtl) Status(ctx *gin.Context) { + // 参数 + var req *dto.ItemStatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置方法 + rows, err := service.Item.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} + +func (c *itemCtl) GetItemList(ctx *gin.Context) { + // 查询站点列表 + list := make([]model.Item, 0) + utils.XormDb.Where("status=1 and mark=1").OrderBy("sort asc").Find(&list) + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} diff --git a/app/controller/item_cate.go b/app/controller/item_cate.go new file mode 100644 index 0000000..52c2f5a --- /dev/null +++ b/app/controller/item_cate.go @@ -0,0 +1,206 @@ +/** + * 栏目管理-控制器 + * @author + * @since 2021/11/13 + * @File : item_cate + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var ItemCate = new(itemCateCtl) + +type itemCateCtl struct{} + +func (c *itemCateCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "itemcate_index.html").WriteTpl() +} + +func (c *itemCateCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.ItemCateQueryReq + //if err := ctx.ShouldBind(&req); err != nil { + // ctx.JSON(http.StatusOK, common.JsonResult{ + // Code: -1, + // Msg: err.Error(), + // }) + // return + //} + + // 调用 + list := service.ItemCate.GetList(req) + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} + +func (c *itemCateCtl) Edit(ctx *gin.Context) { + // 站点列表 + result := make([]model.Item, 0) + utils.XormDb.Where("mark=1").Find(&result) + var itemList = map[int]string{} + for _, v := range result { + itemList[v.Id] = v.Name + } + + // 记录ID + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 编辑 + info := &model.ItemCate{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 封面 + if info.IsCover == 1 && info.Cover != "" { + info.Cover = utils.GetImageUrl(info.Cover) + } + + // 渲染模板 + response.BuildTpl(ctx, "itemcate_edit.html").WriteTpl(gin.H{ + "info": info, + "itemList": itemList, + }) + } else { + // 添加 + response.BuildTpl(ctx, "itemcate_edit.html").WriteTpl(gin.H{ + "itemList": itemList, + }) + } +} + +func (c *itemCateCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.ItemCateAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.ItemCate.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *itemCateCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.ItemCateUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.ItemCate.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *itemCateCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.ItemCate.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *itemCateCtl) GetCateList(ctx *gin.Context) { + list := make([]model.ItemCate, 0) + utils.XormDb.Where("status=1 and mark=1").OrderBy("sort asc").Find(&list) + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} + +func (c *itemCateCtl) GetCateTreeList(ctx *gin.Context) { + itemId := gconv.Int(ctx.Query("itemId")) + list, err := service.ItemCate.GetCateTreeList(itemId, 0) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 数据源转换 + result := service.ItemCate.MakeList(list) + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "操作成功", + Data: result, + }) +} diff --git a/app/controller/level.go b/app/controller/level.go new file mode 100644 index 0000000..abedbc8 --- /dev/null +++ b/app/controller/level.go @@ -0,0 +1,185 @@ +/** + * 职级管理-控制器 + * @author + * @since 2021/8/20 + * @File : level + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Level = new(levelCtl) + +type levelCtl struct{} + +func (c *levelCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "level_index.html").WriteTpl() +} + +func (c *levelCtl) List(ctx *gin.Context) { + // 请求参数 + var req *dto.LevelPageReq + // 请求验证 + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 调用获取列表函数 + list, count, err := service.Level.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果集 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Data: list, + Msg: "操作成功", + Count: count, + }) +} + +func (c *levelCtl) Edit(ctx *gin.Context) { + // 查询记录 + id := gconv.Int(ctx.Query("id")) + if id > 0 { + info := &model.Level{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 渲染模板 + response.BuildTpl(ctx, "level_edit.html").WriteTpl(gin.H{ + "info": info, + }) + } else { + // 渲染模板 + response.BuildTpl(ctx, "level_edit.html").WriteTpl() + } +} + +func (c *levelCtl) Add(ctx *gin.Context) { + var req *dto.LevelAddReq + // 请求验证 + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + id, err := service.Level.Add(req, utils.Uid(ctx)) + if err != nil || id <= 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 保存成功 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "保存成功", + }) +} + +func (c *levelCtl) Update(ctx *gin.Context) { + // 参数验证 + var req *dto.LevelUpdateReq + // 请求验证 + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 调用更新方法 + rows, err := service.Level.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 更新成功 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *levelCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + // 调用删除方法 + rows, err := service.Level.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 删除成功 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *levelCtl) Status(ctx *gin.Context) { + var req *dto.LevelStatusReq + // 请求验证 + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + rows, err := service.Level.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 设置成功 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} diff --git a/app/controller/link.go b/app/controller/link.go new file mode 100644 index 0000000..f8f7bb4 --- /dev/null +++ b/app/controller/link.go @@ -0,0 +1,209 @@ +/** + * 友链管理-控制器 + * @author + * @since 2021/11/13 + * @File : link + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Link = new(linkCtl) + +type linkCtl struct{} + +func (c *linkCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "link_index.html").WriteTpl(gin.H{ + "typeList": common.LINK_TYPE_LIST, + "platformList": common.LINK_PLATFORM_LIST, + }) +} + +func (c *linkCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.LinkPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用分页查询方法 + list, count, err := service.Link.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *linkCtl) Edit(ctx *gin.Context) { + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 修改 + info := &model.Link{Id: id} + has, err := info.Get() + if err != nil || !has { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 友链图片 + if info.Image != "" { + info.Image = utils.GetImageUrl(info.Image) + } + + // 渲染模板 + response.BuildTpl(ctx, "link_edit.html").WriteTpl(gin.H{ + "info": info, + "typeList": common.LINK_TYPE_LIST, + "formList": common.LINK_FORM_LIST, + "platformList": common.LINK_PLATFORM_LIST, + }) + } else { + // 添加 + response.BuildTpl(ctx, "link_edit.html").WriteTpl(gin.H{ + "typeList": common.LINK_TYPE_LIST, + "formList": common.LINK_FORM_LIST, + "platformList": common.LINK_PLATFORM_LIST, + }) + } +} + +func (c *linkCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.LinkAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Link.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结构 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *linkCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.LinkUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Link.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *linkCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.Link.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *linkCtl) Status(ctx *gin.Context) { + // 参数 + var req *dto.LinkStatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置方法 + rows, err := service.Link.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} diff --git a/app/controller/login.go b/app/controller/login.go new file mode 100644 index 0000000..092e64c --- /dev/null +++ b/app/controller/login.go @@ -0,0 +1,151 @@ +/** + * 登录-控制器 + * @author + * @since 2021/9/7 + * @File : login + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/service" + "easygoadmin/utils/common" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "github.com/mojocn/base64Captcha" + "net/http" +) + +// 用户控制器管理对象 +var Login = new(loginCtl) + +type loginCtl struct{} + +// 系统登录 +func (c *loginCtl) Login(ctx *gin.Context) { + if ctx.Request.Method == "POST" { + var req *dto.LoginReq + // 获取参数并验证 + if err := ctx.ShouldBind(&req); err != nil { + // 返回错误信息 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "登录错误", + }) + return + } + + // 校验验证码 + verifyRes := base64Captcha.VerifyCaptcha(req.IdKey, req.Captcha) + if !verifyRes { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "验证码不正确", + }) + return + } + + // 系统登录 + if err := service.Login.UserLogin(req.UserName, req.Password, ctx); err != nil { + // 登录错误 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 登录成功 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "登录成功", + }) + return + } + // 渲染模板 + response.BuildTpl(ctx, "login.html").WriteTpl() + return +} + +// 客服登录 +func (c *loginCtl) LoginKf(ctx *gin.Context) { + if ctx.Request.Method == "POST" { + var req *dto.LoginReq + // 获取参数并验证 + if err := ctx.ShouldBind(&req); err != nil { + // 返回错误信息 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "登录错误", + }) + return + } + + // 校验验证码 + verifyRes := base64Captcha.VerifyCaptcha(req.IdKey, req.Captcha) + if !verifyRes { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "验证码不正确", + }) + return + } + + // 系统登录 + if err := service.Login.UserLogin(req.UserName, req.Password, ctx); err != nil { + // 登录错误 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 登录成功 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "登录成功", + }) + return + } + // 渲染模板 + response.BuildTpl(ctx, "login_kf.html").WriteTpl() + return +} + +// 客服 +func (c *loginCtl) Customer(ctx *gin.Context) { + // 渲染模板 + ctx.HTML(http.StatusOK, "customer.html", gin.H{}) + //response.BuildTpl(ctx, "customer.html").WriteTpl() + return +} + +// 验证码 +func (c *loginCtl) Captcha(ctx *gin.Context) { + // 验证码参数配置:字符,公式,验证码配置 + var configC = base64Captcha.ConfigCharacter{ + Height: 60, + Width: 240, + //const CaptchaModeNumber:数字,CaptchaModeAlphabet:字母,CaptchaModeArithmetic:算术,CaptchaModeNumberAlphabet:数字字母混合. + Mode: base64Captcha.CaptchaModeAlphabet, + ComplexOfNoiseText: base64Captcha.CaptchaComplexLower, + ComplexOfNoiseDot: base64Captcha.CaptchaComplexLower, + IsShowHollowLine: false, + IsShowNoiseDot: false, + IsShowNoiseText: false, + IsShowSlimeLine: false, + IsShowSineLine: false, + CaptchaLen: 4, + } + ///create a characters captcha. + idKeyC, capC := base64Captcha.GenerateCaptcha("", configC) + //以base64编码 + base64stringC := base64Captcha.CaptchaWriteToBase64Encoding(capC) + + // 返回结果集 + ctx.JSON(http.StatusOK, common.CaptchaRes{ + Code: 0, + IdKey: idKeyC, + Data: base64stringC, + Msg: "操作成功", + }) +} diff --git a/app/controller/login_log.go b/app/controller/login_log.go new file mode 100644 index 0000000..cc188fd --- /dev/null +++ b/app/controller/login_log.go @@ -0,0 +1,83 @@ +/** + * 登录日志-控制器 + * @author + * @since 2021/11/12 + * @File : login_log + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/service" + "easygoadmin/utils/common" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var LoginLog = new(loginLogCtl) + +type loginLogCtl struct{} + +func (c *loginLogCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "loginlog_index.html").WriteTpl() +} + +func (c *loginLogCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.LoginLogPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用分页查询方法 + list, count, err := service.LoginLog.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *loginLogCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.LoginLog.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} diff --git a/app/controller/member.go b/app/controller/member.go new file mode 100644 index 0000000..fc48c02 --- /dev/null +++ b/app/controller/member.go @@ -0,0 +1,214 @@ +/** + * 会员管理-控制器 + * @author + * @since 2021/11/13 + * @File : member + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Member = new(memberCtl) + +type memberCtl struct{} + +func (c *memberCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "member_index.html").WriteTpl() +} + +func (c *memberCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.MemberPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用分页查询方法 + list, count, err := service.Member.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *memberCtl) Edit(ctx *gin.Context) { + + // 会员等级 + list := make([]model.MemberLevel, 0) + utils.XormDb.Where("mark=1").Find(&list) + memberLevelList := make(map[int]string, 0) + for _, v := range list { + memberLevelList[v.Id] = v.Name + } + + // 记录ID + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 编辑 + info := &model.Member{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 头像 + if info.Avatar != "" { + info.Avatar = utils.GetImageUrl(info.Avatar) + } + // 渲染模板 + response.BuildTpl(ctx, "member_edit.html").WriteTpl(gin.H{ + "info": info, + "memberLevelList": memberLevelList, + "deviceList": common.MEMBER_DEVICE_LIST, + "sourceList": common.MEMBER_SOURCE_LIST, + }) + } else { + // 添加 + response.BuildTpl(ctx, "member_edit.html").WriteTpl(gin.H{ + "memberLevelList": memberLevelList, + "deviceList": common.MEMBER_DEVICE_LIST, + "sourceList": common.MEMBER_SOURCE_LIST, + }) + } +} + +func (c *memberCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.MemberAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Member.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *memberCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.MemberUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Member.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *memberCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.Member.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *memberCtl) Status(ctx *gin.Context) { + // 参数 + var req *dto.MemberStatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置方法 + rows, err := service.Member.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} diff --git a/app/controller/member_level.go b/app/controller/member_level.go new file mode 100644 index 0000000..92fed45 --- /dev/null +++ b/app/controller/member_level.go @@ -0,0 +1,177 @@ +/** + * 会员等级-控制器 + * @author + * @since 2021/11/13 + * @File : member_level + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var MemberLevel = new(memberLevelCtl) + +type memberLevelCtl struct{} + +func (c *memberLevelCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "memberlevel_index.html").WriteTpl() +} + +func (c *memberLevelCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.MemberLevelPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用分页查询方法 + list, count, err := service.MemberLevel.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *memberLevelCtl) Edit(ctx *gin.Context) { + // 记录ID + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 编辑 + info := &model.MemberLevel{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 渲染模板 + response.BuildTpl(ctx, "memberlevel_edit.html").WriteTpl(gin.H{ + "info": info, + }) + } else { + // 添加 + response.BuildTpl(ctx, "memberlevel_edit.html").WriteTpl() + } +} + +func (c *memberLevelCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.MemberLevelAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.MemberLevel.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *memberLevelCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.MemberLevelUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.MemberLevel.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *memberLevelCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.MemberLevel.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *memberLevelCtl) GetMemberLevelList(ctx *gin.Context) { + list := make([]model.MemberLevel, 0) + utils.XormDb.Where("mark=1").OrderBy("sort asc").Find(&list) + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} diff --git a/app/controller/menu.go b/app/controller/menu.go new file mode 100644 index 0000000..75798b3 --- /dev/null +++ b/app/controller/menu.go @@ -0,0 +1,234 @@ +/** + * 菜单管理-控制器 + * @author + * @since 2021/9/13 + * @File : menu + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Menu = new(menuCtl) + +type menuCtl struct{} + +func (c *menuCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "menu_index.html").WriteTpl() +} + +func (c *menuCtl) List(ctx *gin.Context) { + //// 参数绑定 + //var req *dto.MenuQueryReq + //if err := ctx.Bind(&req); err != nil { + // ctx.JSON(http.StatusOK, common.JsonResult{ + // Code: -1, + // Msg: err.Error(), + // }) + // return + //} + + // 调用查询列表方法 + list, err := service.Menu.GetList(nil) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} + +func (c *menuCtl) Edit(ctx *gin.Context) { + // 获取菜单列表 + menuTreeList, _ := service.Menu.GetTreeList() + // 数据源转换 + menuList := service.Menu.MakeList(menuTreeList) + + // 记录ID + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 编辑 + info := &model.Menu{Id: id} + has, err := info.Get() + if err != nil || !has { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 获取节点 + funcList := make([]model.Menu, 0) + utils.XormDb.Where("pid=? and type=1 and mark=1", id).Find(&funcList) + sortList := make([]interface{}, 0) + for _, v := range funcList { + sortList = append(sortList, v.Sort) + } + + // 渲染模板 + response.BuildTpl(ctx, "menu_edit.html").WriteTpl(gin.H{ + "info": info, + "typeList": common.MENU_TYPE_LIST, + "funcList": sortList, + "menuList": menuList, + }) + } else { + // 添加 + + pid := ctx.GetInt("pid") + var info model.Menu + info.Pid = pid + info.Status = 1 + info.Target = 1 + + // 渲染模板 + response.BuildTpl(ctx, "menu_edit.html").WriteTpl(gin.H{ + "info": info, + "typeList": common.MENU_TYPE_LIST, + "funcList": make([]interface{}, 0), + "menuList": menuList, + }) + } +} + +func (c *menuCtl) Detail(ctx *gin.Context) { + // 记录ID + id := ctx.Query("id") + if id == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + info := model.Menu{Id: gconv.Int(id)} + has, err := info.Get() + if err != nil || !has { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 菜单信息 + menu := dto.MenuInfoVo{} + menu.Menu = info + // 获取权限节点 + if info.Type == 0 { + // 获取角色菜单权限列表 + var menuList []model.Menu + utils.XormDb.Where("pid=?", info.Id).Where("type=1").Where("mark=1").Find(&menuList) + checkedList := make([]int, 0) + for _, v := range menuList { + checkedList = append(checkedList, v.Sort) + } + if len(checkedList) > 0 { + menu.CheckedList = checkedList + } else { + menu.CheckedList = make([]int, 0) + } + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: menu, + }) +} + +func (c *menuCtl) Add(ctx *gin.Context) { + // 参数绑定 + var req *dto.MenuAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Menu.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *menuCtl) Update(ctx *gin.Context) { + // 参数绑定 + var req *dto.MenuUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Menu.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *menuCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + // 调用删除方法 + rows, err := service.Menu.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} diff --git a/app/controller/notice.go b/app/controller/notice.go new file mode 100644 index 0000000..11fb566 --- /dev/null +++ b/app/controller/notice.go @@ -0,0 +1,205 @@ +/** + * 通知公告-控制器 + * @author + * @since 2021/11/13 + * @File : notice + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" + "strings" +) + +var Notice = new(noticeCtl) + +type noticeCtl struct{} + +func (c *noticeCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "notice_index.html").WriteTpl(gin.H{ + "sourceList": common.NOTICE_SOURCE_LIST, + }) +} + +func (c *noticeCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.NoticePageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用分页查询方法 + list, count, err := service.Notice.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *noticeCtl) Edit(ctx *gin.Context) { + // 查询记录 + id := gconv.Int(ctx.Query("id")) + if id > 0 { + info := &model.Notice{Id: id} + has, err := info.Get() + if !has || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 富文本图片替换处理 + if info.Content != "" { + info.Content = strings.ReplaceAll(info.Content, "[IMG_URL]", utils.ImageUrl()) + } + + // 渲染模板 + response.BuildTpl(ctx, "notice_edit.html").WriteTpl(gin.H{ + "info": info, + "sourceList": common.NOTICE_SOURCE_LIST, + }) + } else { + // 渲染模板 + response.BuildTpl(ctx, "notice_edit.html").WriteTpl(gin.H{ + "sourceList": common.NOTICE_SOURCE_LIST, + }) + } +} + +func (c *noticeCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.NoticeAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Notice.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *noticeCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.NoticeUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Notice.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *noticeCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.Notice.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *noticeCtl) Status(ctx *gin.Context) { + // 参数 + var req *dto.NoticeStatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置状态方法 + rows, err := service.Notice.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} diff --git a/app/controller/oper_log.go b/app/controller/oper_log.go new file mode 100644 index 0000000..50efc88 --- /dev/null +++ b/app/controller/oper_log.go @@ -0,0 +1,49 @@ +/** + * 操作日志-控制器 + * @author + * @since 2021/11/12 + * @File : OperLog + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/service" + "easygoadmin/utils/common" + "github.com/gin-gonic/gin" + "net/http" +) + +var OperLog = new(operLogCtl) + +type operLogCtl struct{} + +func (c *operLogCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.OperLogPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用分页查询方法 + list, count, err := service.OperLog.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} diff --git a/app/controller/position.go b/app/controller/position.go new file mode 100644 index 0000000..5c19a29 --- /dev/null +++ b/app/controller/position.go @@ -0,0 +1,204 @@ +/** + * 岗位管理-控制器 + * @author + * @since 2021/9/10 + * @File : position + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Position = new(positionCtl) + +type positionCtl struct{} + +func (c *positionCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "position_index.html").WriteTpl() +} + +func (c *positionCtl) List(ctx *gin.Context) { + // 参数绑定 + var req *dto.PositionPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用查询列表方法 + list, count, err := service.Position.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "操作成功", + Data: list, + Count: count, + }) +} + +func (c *positionCtl) Edit(ctx *gin.Context) { + // 查询记录 + id := gconv.Int(ctx.Query("id")) + if id > 0 { + info := &model.Position{Id: id} + isOk, err := info.Get() + if !isOk || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + } + // 渲染模板 + response.BuildTpl(ctx, "position_edit.html").WriteTpl(gin.H{ + "info": info, + }) + } else { + // 渲染模板 + response.BuildTpl(ctx, "position_edit.html").WriteTpl() + } + +} + +func (c *positionCtl) Add(ctx *gin.Context) { + // 参数绑定 + var req *dto.PositionAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Position.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *positionCtl) Update(ctx *gin.Context) { + // 参数绑定 + var req *dto.PositionUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Position.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *positionCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + // 调用删除方法 + rows, err := service.Position.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 删除成功 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *positionCtl) Status(ctx *gin.Context) { + // 参数绑定 + var req *dto.PositionStatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置状态方法 + rows, err := service.Position.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} + +func (c *positionCtl) GetPositionList(ctx *gin.Context) { + // 查询岗位列表 + list := make([]model.Position, 0) + utils.XormDb.Where("status=1 and mark=1").Asc("sort").Find(&list) + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} diff --git a/app/controller/role.go b/app/controller/role.go new file mode 100644 index 0000000..02c9e3c --- /dev/null +++ b/app/controller/role.go @@ -0,0 +1,204 @@ +/** + * 角色管理-控制器 + * @author + * @since 2021/9/13 + * @File : role + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var Role = new(roleCtl) + +type roleCtl struct{} + +func (c *roleCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "role_index.html").WriteTpl() +} + +func (c *roleCtl) List(ctx *gin.Context) { + // 绑定参数 + var req *dto.RolePageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用查询列表方法 + list, count, err := service.Role.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + Count: count, + }) +} + +func (c *roleCtl) Edit(ctx *gin.Context) { + // 查询记录 + id := gconv.Int(ctx.Query("id")) + if id > 0 { + info := &model.Role{Id: id} + isOk, err := info.Get() + if !isOk || err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + } + // 渲染模板 + response.BuildTpl(ctx, "role_edit.html").WriteTpl(gin.H{ + "info": info, + }) + } else { + // 渲染模板 + response.BuildTpl(ctx, "role_edit.html").WriteTpl() + } +} + +func (c *roleCtl) Add(ctx *gin.Context) { + // 参数绑定 + var req *dto.RoleAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.Role.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *roleCtl) Update(ctx *gin.Context) { + // 参数绑定 + var req *dto.RoleUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.Role.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新方法", + }) +} + +func (c *roleCtl) Delete(ctx *gin.Context) { + // 记录ID + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.Role.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *roleCtl) Status(ctx *gin.Context) { + // 参数绑定 + var req *dto.RoleStatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置状态方法 + rows, err := service.Role.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} + +func (c *roleCtl) GetRoleList(ctx *gin.Context) { + // 获取角色列表 + list := make([]model.Role, 0) + utils.XormDb.Where("status=1 and mark=1").Asc("sort").Find(&list) + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: list, + }) +} diff --git a/app/controller/role_menu.go b/app/controller/role_menu.go new file mode 100644 index 0000000..25051ba --- /dev/null +++ b/app/controller/role_menu.go @@ -0,0 +1,76 @@ +/** + * 角色菜单-控制器 + * @author + * @since 2021/9/14 + * @File : role_menu + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/service" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "github.com/gin-gonic/gin" + "net/http" +) + +var RoleMenu = new(roleMenuCtl) + +type roleMenuCtl struct{} + +func (c *roleMenuCtl) Index(ctx *gin.Context) { + // 角色ID + roleId := ctx.Param("roleId") + if roleId == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "角色ID不能为空", + }) + return + } + + // 获取角色菜单权限列表 + list, err := service.RoleMenu.GetRoleMenuList(gconv.Int(roleId)) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Data: list, + Msg: "操作成功", + }) +} + +func (c *roleMenuCtl) Save(ctx *gin.Context) { + var req *dto.RoleMenuSaveReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用保存方法 + err := service.RoleMenu.Save(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "保存成功", + }) +} diff --git a/app/controller/test.go b/app/controller/test.go new file mode 100644 index 0000000..4025e6e --- /dev/null +++ b/app/controller/test.go @@ -0,0 +1,91 @@ +package controller + +import ( + "easygoadmin/utils" + "easygoadmin/utils/common" + "encoding/json" + "fmt" + "github.com/gin-gonic/gin" + "net/http" +) + +// 用户API管理对象 +var Test = new(testCtl) + +type testCtl struct{} + +func (c *testCtl) Test(ctx *gin.Context) { + //cache := utils.GetRedisHelper() + //cache.Set(ctx, "cacheTest", "1112", 10*time.Minute) + //utils.SendSms("18583618609", "【B卡特权】优惠券购买成功!请下载B卡特权APP进行使用。下载或需要帮助请点击: https://d.shareyi.top/2 ,退订回T", "Cloud") + // goodsId 类型:2移动 3电信 4联通 + //strLQ, okLQ := utils.OrderDirectAdd("19828267470", "recharge202210231337", "work.shareyi.top:9097", 1, 100) + //strLQ, okLQ := utils.OrderDirectAdd("19888888888", "recharge202210231338", "work.shareyi.top:9097", 1, 100) + //{"code":1019,"message":"您的IP不在IP白名单内,联系平台添加","result":null,"sign":null} + //if !okLQ { + // logs.Error("调快充接口失败") + //} + //logs.Debug("strLQ, okLQ----------------------", strLQ, okLQ) + //a, b := utils.Refund(36, "recharge2022102617412013698", "4200001627202210267407543317", "", 95) + //logs.Debug(a, b) + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Data: nil, + Msg: "查询成功2", + Count: 0, + }) +} + +func (c *testCtl) Test2(ctx *gin.Context) { + //panic("this is panic") + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Data: nil, + Msg: "查询成功2", + Count: 0, + }) +} + +func (c *testCtl) TestJwt(ctx *gin.Context) { + str, err := utils.GenerateToken(1, "18583638609", "asd") + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + } + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Data: nil, + Msg: "查询成功: " + str, + Count: 0, + }) +} + +type TestReq struct { + Jwt string `form:"jwt"` // 用户名 +} + +func (c *testCtl) TestCheckJwt(ctx *gin.Context) { + jwt := ctx.Query("jwt") + fmt.Println("req", jwt) + str, err := utils.ParseToken(jwt) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + } + jsonStr, _ := json.Marshal(str) + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Data: nil, + Msg: "查询成功: " + string(jsonStr), + Count: 0, + }) +} diff --git a/app/controller/upload.go b/app/controller/upload.go new file mode 100644 index 0000000..241376d --- /dev/null +++ b/app/controller/upload.go @@ -0,0 +1,42 @@ +/** + * 文件上传-控制器 + * @author + * @since 2021/11/18 + * @File : upload + */ +package controller + +import ( + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/common" + "github.com/gin-gonic/gin" + "net/http" +) + +// 控制器管理对象 +var Upload = new(uploadCtl) + +type uploadCtl struct{} + +func (c *uploadCtl) UploadImage(ctx *gin.Context) { + // 调用上传方法 + result, err := service.Upload.UploadImage(ctx) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 拼接图片地址 + result.FileUrl = utils.GetImageUrl(result.FileUrl) + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "上传成功", + Data: result, + }) +} diff --git a/app/controller/user.go b/app/controller/user.go new file mode 100644 index 0000000..36d3106 --- /dev/null +++ b/app/controller/user.go @@ -0,0 +1,302 @@ +/** + * 用户管理-控制器 + * @author + * @since 2021/11/11 + * @File : user + */ +package controller + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/response" + "github.com/gin-gonic/gin" + "net/http" +) + +var User = new(userCtl) + +type userCtl struct{} + +func (c *userCtl) Index(ctx *gin.Context) { + // 渲染模板 + response.BuildTpl(ctx, "user_index.html").WriteTpl() +} + +func (c *userCtl) List(ctx *gin.Context) { + // 参数 + var req *dto.UserPageReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用获取列表方法 + list, count, err := service.User.GetList(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Data: list, + Msg: "查询成功", + Count: count, + }) +} + +func (c *userCtl) Edit(ctx *gin.Context) { + // 获取职级 + levelAll := make([]model.Level, 0) + utils.XormDb.Where("status=1 and mark=1").Find(&levelAll) + levelList := make(map[int]string, 0) + for _, v := range levelAll { + levelList[v.Id] = v.Name + } + // 获取岗位 + positionAll := make([]model.Position, 0) + utils.XormDb.Where("status=1 and mark=1").Find(&positionAll) + positionList := make(map[int]string, 0) + for _, v := range positionAll { + positionList[v.Id] = v.Name + } + // 获取部门列表 + deptData, _ := service.Dept.GetDeptTreeList() + deptList := service.Dept.MakeList(deptData) + // 获取角色 + roleData := make([]model.Role, 0) + utils.XormDb.Where("status=1 and mark=1").Find(&roleData) + roleList := make(map[int]string) + for _, v := range roleData { + roleList[v.Id] = v.Name + } + + // 记录ID + id := gconv.Int(ctx.Query("id")) + if id > 0 { + // 编辑 + info := &model.User{Id: id} + has, err := info.Get() + if err != nil || !has { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + var userInfo = vo.UserInfoVo{} + userInfo.User = *info + // 头像 + userInfo.Avatar = utils.GetImageUrl(info.Avatar) + + // 角色ID + var userRoleList []model.UserRole + utils.XormDb.Where("user_id=?", info.Id).Find(&userRoleList) + roleIds := make([]interface{}, 0) + for _, v := range userRoleList { + roleIds = append(roleIds, v.RoleId) + } + userInfo.RoleIds = roleIds + + // 渲染模板 + response.BuildTpl(ctx, "user_edit.html").WriteTpl(gin.H{ + "info": userInfo, + "genderList": utils.GENDER_LIST, + "levelList": levelList, + "positionList": positionList, + "deptList": deptList, + "roleList": roleList, + }) + } else { + // 添加 + response.BuildTpl(ctx, "user_edit.html").WriteTpl(gin.H{ + "genderList": utils.GENDER_LIST, + "levelList": levelList, + "positionList": positionList, + "deptList": deptList, + "roleList": roleList, + }) + } +} + +func (c *userCtl) Add(ctx *gin.Context) { + // 参数 + var req *dto.UserAddReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用添加方法 + rows, err := service.User.Add(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "添加成功", + }) +} + +func (c *userCtl) Update(ctx *gin.Context) { + // 参数 + var req *dto.UserUpdateReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用更新方法 + rows, err := service.User.Update(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "更新成功", + }) +} + +func (c *userCtl) Delete(ctx *gin.Context) { + // 参数 + ids := ctx.Param("ids") + if ids == "" { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "记录ID不能为空", + }) + return + } + + // 调用删除方法 + rows, err := service.User.Delete(ids) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "删除成功", + }) +} + +func (c *userCtl) Status(ctx *gin.Context) { + // 参数 + var req *dto.UserStatusReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用设置方法 + rows, err := service.User.Status(req, utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "设置成功", + }) +} + +func (c *userCtl) ResetPwd(ctx *gin.Context) { + // 参数验证 + var req *dto.UserResetPwdReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 调用重置密码方法 + rows, err := service.User.ResetPwd(gconv.Int(req.Id), utils.Uid(ctx)) + if err != nil || rows == 0 { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "重置密码成功", + }) +} + +func (c *userCtl) CheckUser(ctx *gin.Context) { + // 参数验证 + var req *dto.CheckUserReq + if err := ctx.ShouldBind(&req); err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + // 调用检查用户方法 + user, err := service.User.CheckUser(req) + if err != nil { + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: err.Error(), + }) + return + } + + // 返回结果 + ctx.JSON(http.StatusOK, common.JsonResult{ + Code: 0, + Msg: "查询成功", + Data: user, + }) +} diff --git a/app/dto/ad.go b/app/dto/ad.go new file mode 100644 index 0000000..aaeeb96 --- /dev/null +++ b/app/dto/ad.go @@ -0,0 +1,57 @@ +/** + * 广告Dto + * @author + * @since 2021/11/15 + * @File : ad + */ +package dto + +// 列表查询 +type AdPageReq struct { + Title string `form:"title"` // 广告标题 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加广告 +type AdAddReq struct { + Title string `form:"title" binding:"required"` // 广告标题 + AdSortId string `form:"adSortId" binding:"required"` // 广告位ID + Cover string `form:"cover"` // 广告图片 + Type string `form:"type" binding:"required"` // 广告格式:1图片 2文字 3视频 4推荐 + Description string `form:"description" binding:"required"` // 广告描述 + Content string `form:"content"` // 广告内容 + Url string `form:"url" binding:"required"` // 广告链接 + Width string `form:"width"` // 广告宽度 + Height string `form:"height"` // 广告高度 + StartTime string `form:"startTime" binding:"required"` // 开始时间 + EndTime string `form:"endTime" binding:"required"` // 结束时间 + Status string `form:"status" binding:"required"` // 状态:1在用 2停用 + Sort string `form:"sort"` // 排序 + Note string `form:"note"` // 备注 +} + +// 更新广告 +type AdUpdateReq struct { + Id string `form:"id" binding:"required"` + Title string `form:"title" binding:"required"` // 广告标题 + AdSortId string `form:"adSortId" binding:"required"` // 广告位ID + Cover string `form:"cover"` // 广告图片 + Type string `form:"type" binding:"required"` // 广告格式:1图片 2文字 3视频 4推荐 + Description string `form:"description" binding:"required"` // 广告描述 + Content string `form:"content"` // 广告内容 + Url string `form:"url" binding:"required"` // 广告链接 + Width string `form:"width"` // 广告宽度 + Height string `form:"height"` // 广告高度 + StartTime string `form:"startTime" binding:"required"` // 开始时间 + EndTime string `form:"endTime" binding:"required"` // 结束时间 + Status string `form:"status" binding:"required"` // 状态:1在用 2停用 + Sort string `form:"sort"` // 排序 + Note string `form:"note"` // 备注 +} + +// 设置状态 +type AdStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} diff --git a/app/dto/ad_sort.go b/app/dto/ad_sort.go new file mode 100644 index 0000000..5b04e71 --- /dev/null +++ b/app/dto/ad_sort.go @@ -0,0 +1,35 @@ +/** + * 广告位Dto + * @author + * @since 2021/11/15 + * @File : ad_sort + */ +package dto + +// 列表查询条件 +type AdSortPageReq struct { + Description string `form:"name"` // 广告位描述 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加广告位 +type AdSortAddReq struct { + Description string `form:"description" binding:"required"` // 广告位描述 + ItemId string `form:"itemId" binding:"required"` // 站点ID + CateId string `form:"cateId" binding:"required"` // 栏目ID + LocId string `form:"locId" binding:"required"` // 广告页面位置 + Platform string `form:"platform" binding:"required"` // 站点类型:1PC网站 2WAP手机站 3微信小程序 4APP移动端 + Sort string `form:"sort"` // 广告位排序 +} + +// 更新广告位 +type AdSortUpdateReq struct { + Id string `form:"id" binding:"required"` + Description string `form:"description" binding:"required"` // 广告位描述 + ItemId string `form:"itemId" binding:"required"` // 站点ID + CateId string `form:"cateId" binding:"required"` // 栏目ID + LocId string `form:"locId" binding:"required"` // 广告页面位置 + Platform string `form:"platform" binding:"required"` // 站点类型:1PC网站 2WAP手机站 3微信小程序 4APP移动端 + Sort string `form:"sort"` // 广告位排序 +} diff --git a/app/dto/city.go b/app/dto/city.go new file mode 100644 index 0000000..947844e --- /dev/null +++ b/app/dto/city.go @@ -0,0 +1,45 @@ +/** + * 城市Dto + * @author + * @since 2021/11/13 + * @File : city + */ +package dto + +// 列表查询条件 +type CityQueryReq struct { + Name string `form:"name"` // 城市名称 + Pid int `form:"pid"` // 上级ID +} + +// 添加城市 +type CityAddReq struct { + Pid string `form:"pid"` // 父级编号 + Level string `form:"level" binding:"required"` // 城市级别:1省 2市 3区 + Name string `form:"name" binding:"required"` // 城市名称 + Citycode string `form:"citycode"` // 城市编号(区号) + PAdcode string `form:"pAdcode"` // 父级地理编号 + Adcode string `form:"adcode"` // 地理编号 + Lng string `form:"lng"` // 城市坐标中心点经度(* 1e6):如果是中国,此值是 1e7 + Lat string `form:"lat"` // 城市坐标中心点纬度(* 1e6) + Sort string `form:"sort"` // 排序号 +} + +// 编辑城市 +type CityUpdateReq struct { + Id string `form:"id" binding:"required"` // 主键ID + Pid string `form:"pid"` // 父级编号 + Level string `form:"level" binding:"required"` // 城市级别:1省 2市 3区 + Name string `form:"name" binding:"required"` // 城市名称 + Citycode string `form:"citycode"` // 城市编号(区号) + PAdcode string `form:"pAdcode"` // 父级地理编号 + Adcode string `form:"adcode"` // 地理编号 + Lng string `form:"lng"` // 城市坐标中心点经度(* 1e6):如果是中国,此值是 1e7 + Lat string `form:"lat"` // 城市坐标中心点纬度(* 1e6) + Sort string `form:"sort"` // 排序号 +} + +// 获取子级城市 +type CityChildReq struct { + CityCode string `form:"citycode" binding:"required"` +} diff --git a/app/dto/config.go b/app/dto/config.go new file mode 100644 index 0000000..8014490 --- /dev/null +++ b/app/dto/config.go @@ -0,0 +1,20 @@ +/** + * 配置Dto + * @author + * @since 2021/11/13 + * @File : config + */ +package dto + +// 添加配置 +type ConfigAddReq struct { + Name string `form:"name" binding:"required"` // 配置名称 + Sort int `form:"sort"` // 显示顺序 +} + +// 修改配置 +type ConfigUpdateReq struct { + Id int `form:"id" binding:"required"` // 主键ID + Name string `form:"name" binding:"required"` // 配置名称 + Sort int `form:"sort"` // 显示顺序 +} diff --git a/app/dto/config_data.go b/app/dto/config_data.go new file mode 100644 index 0000000..f6f026a --- /dev/null +++ b/app/dto/config_data.go @@ -0,0 +1,46 @@ +/** + * 配置数据Dto + * @author + * @since 2021/11/13 + * @File : config_data + */ +package dto + +// 字典项列表查询条件 +type ConfigDataPageReq struct { + ConfigId int `form:"configId"` // 字典ID + Title string `form:"name"` // 配置标题 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加字典项 +type ConfigDataAddReq struct { + Title string `form:"title" binding:"required"` // 配置标题 + Code string `form:"code" binding:"required"` // 配置编码 + Value string `form:"value"` // 配置值 + Options string `form:"options"` // 配置项 + ConfigId string `form:"configId" binding:"required"` // 配置ID + Type string `form:"type" binding:"required"` // 配置类型 + Sort string `form:"sort"` // 排序 + Note string `form:"note"` // 配置说明 +} + +// 更新字典项 +type ConfigDataUpdateReq struct { + Id string `form:"id" binding:"required"` + Title string `form:"title" binding:"required"` // 配置标题 + Code string `form:"code" binding:"required"` // 配置编码 + Value string `form:"value"` // 配置值 + Options string `form:"options"` // 配置项 + ConfigId string `form:"configId" binding:"required"` // 配置ID + Type string `form:"type" binding:"required"` // 配置类型 + Sort string `form:"sort"` // 排序 + Note string `form:"note"` // 配置说明 +} + +// 设置状态 +type ConfigDataStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} diff --git a/app/dto/customer.go b/app/dto/customer.go new file mode 100644 index 0000000..3be6464 --- /dev/null +++ b/app/dto/customer.go @@ -0,0 +1,18 @@ +/** + * Dto + * @author + * @since 2021/11/11 + * @File : user + */ +package dto + +// 用户分页查询条件 +type CustomerSearchReq struct { + Mobile string `form:"mobile"` // 手机号 + OutTradeNo string `form:"out_trade_no"` // 订单号 +} + +// 用户分页查询条件 +type CustomerCouponRefundReq struct { + Ids string `form:"ids"` // 退款订单id +} diff --git a/app/dto/dept.go b/app/dto/dept.go new file mode 100644 index 0000000..a26dab4 --- /dev/null +++ b/app/dto/dept.go @@ -0,0 +1,45 @@ +/** + * 部门Dto + * @author + * @since 2021/9/13 + * @File : dept + */ +package dto + +import "easygoadmin/app/model" + +// 分页查询条件 +type DeptPageReq struct { + Name string `form:"name"` // 部门名称 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加部门 +type DeptAddReq struct { + Name string `form:"name" binding:"required"` + Code string `form:"code" binding:"required"` + Fullname string `form:"fullname" binding:"required"` + Type string `form:"type" binding:"required"` + Pid string `form:"pid"` + Sort string `form:"sort"` + Note string +} + +// 部门编辑 +type DeptUpdateReq struct { + Id string `form:"id" binding:"required"` + Name string `form:"name" binding:"required"` + Code string `form:"code" binding:"required"` + Fullname string `form:"fullname" binding:"required"` + Type string `form:"type" binding:"required"` + Pid string `form:"pid"` + Sort string `form:"sort"` + Note string +} + +// 部门树结构 +type DeptTreeNode struct { + model.Dept + Children []*DeptTreeNode `json:"children"` // 子栏目 +} diff --git a/app/dto/dict.go b/app/dto/dict.go new file mode 100644 index 0000000..1acc4ac --- /dev/null +++ b/app/dto/dict.go @@ -0,0 +1,24 @@ +/** + * 字典Dto + * @author + * @since 2021/11/13 + * @File : dict + */ +package dto + +// 添加字典 +type DictAddReq struct { + Name string `form:"name" binding:"required"` // 字典名称 + Code string `form:"code" binding:"required"` // 字典值 + Sort int `form:"sort"` // 显示顺序 + Note string `form:"note"` // 字典备注 +} + +// 修改字典 +type DictUpdateReq struct { + Id int `form:"id" binding:"required"` // 主键ID + Name string `form:"name" binding:"required"` // 字典名称 + Code string `form:"code" binding:"required"` // 字典值 + Sort int `form:"sort"` // 显示顺序 + Note string `form:"note"` // 字典备注 +} diff --git a/app/dto/dict_data.go b/app/dto/dict_data.go new file mode 100644 index 0000000..10eaa7a --- /dev/null +++ b/app/dto/dict_data.go @@ -0,0 +1,34 @@ +/** + * 字典数据Dto + * @author + * @since 2021/11/13 + * @File : dict_data + */ +package dto + +// 字典项列表查询条件 +type DictDataPageReq struct { + DictId int `form:"dictId"` // 字典ID + Name string `form:"name"` // 字典项名称 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加字典项 +type DictDataAddReq struct { + Name string `form:"name,unique" binding:"required"` // 字典项名称 + Code string `form:"code" binding:"required"` // 字典项值 + DictId string `form:"dictId" binding:"required"` // 字典类型ID + Note string `form:"note"` // 备注 + Sort string `form:"sort"` // 显示顺序 +} + +// 更新字典项 +type DictDataUpdateReq struct { + Id string `form:"id" binding:"required"` + Name string `form:"name,unique" binding:"required"` // 字典项名称 + Code string `form:"code" binding:"required"` // 字典项值 + DictId string `form:"dictId" binding:"required"` // 字典类型ID + Note string `form:"note"` // 备注 + Sort string `form:"sort"` // 显示顺序 +} diff --git a/app/dto/example.go b/app/dto/example.go new file mode 100644 index 0000000..77fb0a3 --- /dev/null +++ b/app/dto/example.go @@ -0,0 +1,65 @@ +package dto + +// 分页查询 +type ExamplePageReq struct { + Name string `form:"name"` // 测试名称 + + Status int `form:"status"` // 状态:1正常 2停用 + + Type int `form:"type"` // 类型:1京东 2淘宝 3拼多多 4唯品会 + + IsVip int `form:"isVip"` // 是否VIP:1是 2否 + + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加演示一 +type ExampleAddReq struct { + Name string `form:"name" binding:"required"` // 测试名称 + + Avatar string `form:"avatar" binding:"required"` // 头像 + + Content string `form:"content" binding:"required"` // 内容 + + Status string `form:"status" binding:"required"` // 状态:1正常 2停用 + + Type string `form:"type" binding:"required"` // 类型:1京东 2淘宝 3拼多多 4唯品会 + + IsVip string `form:"isVip" binding:"required"` // 是否VIP:1是 2否 + + Sort string `form:"sort" binding:"required"` // 排序号 + +} + +// 编辑演示一 +type ExampleUpdateReq struct { + Id string `form:"id" binding:"required"` + + Name string `form:"name" binding:"required"` // 测试名称 + + Avatar string `form:"avatar" binding:"required"` // 头像 + + Content string `form:"content" binding:"required"` // 内容 + + Status string `form:"status" binding:"required"` // 状态:1正常 2停用 + + Type string `form:"type" binding:"required"` // 类型:1京东 2淘宝 3拼多多 4唯品会 + + IsVip string `form:"isVip" binding:"required"` // 是否VIP:1是 2否 + + Sort string `form:"sort" binding:"required"` // 排序号 + +} + +// 设置状态 +type ExampleStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} + +// 设置是否VIP +type ExampleIsVipReq struct { + Id string `form:"id" binding:"required"` + IsVip string `form:"isVip" binding:"required"` +} diff --git a/app/dto/example2.go b/app/dto/example2.go new file mode 100644 index 0000000..74fd819 --- /dev/null +++ b/app/dto/example2.go @@ -0,0 +1,39 @@ +package dto + +// 分页查询 +type Example2PageReq struct { + Name string `form:"name"` // 演示名称 + + Status int `form:"status"` // 状态:1正常 2停用 + + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加演示二 +type Example2AddReq struct { + Name string `form:"name" binding:"required"` // 演示名称 + + Status string `form:"status" binding:"required"` // 状态:1正常 2停用 + + Sort string `form:"sort" binding:"required"` // 排序号 + +} + +// 编辑演示二 +type Example2UpdateReq struct { + Id string `form:"id" binding:"required"` + + Name string `form:"name" binding:"required"` // 演示名称 + + Status string `form:"status" binding:"required"` // 状态:1正常 2停用 + + Sort string `form:"sort" binding:"required"` // 排序号 + +} + +// 设置状态 +type Example2StatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} diff --git a/app/dto/generate.go b/app/dto/generate.go new file mode 100644 index 0000000..c19ab32 --- /dev/null +++ b/app/dto/generate.go @@ -0,0 +1,26 @@ +/** + * 代码生成器Dto + * @author + * @since 2021/11/15 + * @File : generate + */ +package dto + +// 分页查询条件 +type GeneratePageReq struct { + Name string `form:"name"` // 表名称 + Comment string `form:"comment"` // 表描述 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 生成文件 +type GenerateFileReq struct { + Name string `form:"name"` // 表名称 + Comment string `form:"comment"` // 表描述 +} + +// 批量生成文件 +type BatchGenerateFileReq struct { + Tables string `form:"tables"` // 表名称 +} diff --git a/app/dto/item.go b/app/dto/item.go new file mode 100644 index 0000000..003d7c5 --- /dev/null +++ b/app/dto/item.go @@ -0,0 +1,44 @@ +/** + * 站点Dto + * @author + * @since 2021/11/13 + * @File : item + */ +package dto + +// 分页查询条件 +type ItemPageReq struct { + Name string `form:"name"` // 站点名称 + Type int `form:"type"` // 站点类型 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加站点 +type ItemAddReq struct { + Name string `form:"name" binding:"required"` // 站点名称 + Type string `form:"type" binding:"required"` // 站点类型:1普通站点 2其他 + Url string `form:"url" binding:"required"` // 站点地址 + Image string `form:"image"` // 站点图片 + Status string `form:"status" binding:"required"` // 状态:1在用 2停用 + Note string `form:"note"` // 站点备注 + Sort string `form:"sort"` // 显示顺序 +} + +// 更新站点 +type ItemUpdateReq struct { + Id string `form:"id" binding:"required"` + Name string `form:"name" binding:"required"` // 站点名称 + Type string `form:"type" binding:"required"` // 站点类型:1普通站点 2其他 + Url string `form:"url" binding:"required"` // 站点地址 + Image string `form:"image"` // 站点图片 + Status string `form:"status" binding:"required"` // 状态:1在用 2停用 + Note string `form:"note"` // 站点备注 + Sort string `form:"sort"` // 显示顺序 +} + +// 设置状态 +type ItemStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} diff --git a/app/dto/item_cate.go b/app/dto/item_cate.go new file mode 100644 index 0000000..cc3fde2 --- /dev/null +++ b/app/dto/item_cate.go @@ -0,0 +1,41 @@ +/** + * 栏目Dto + * @author + * @since 2021/11/13 + * @File : item_cate + */ +package dto + +// 栏目查询条件 +type ItemCateQueryReq struct { + Name string `form:"name"` // 栏目名称 +} + +// 添加站点 +type ItemCateAddReq struct { + Name string `form:"name" binding:"required"` // 栏目名称 + Pid string `form:"pid"` // 父级ID + ItemId string `form:"itemId" binding:"required"` // 站点ID + Pinyin string `form:"pinyin" binding:"required"` // 拼音(全) + Code string `form:"code" binding:"required"` // 拼音(简) + IsCover string `form:"isCover" binding:"required"` // 是否有封面:1是 2否 + Cover string `form:"cover"` // 封面 + Status string `form:"status" binding:"required"` // 状态:1启用 2停用 + Note string `form:"note"` // 备注 + Sort string `form:"sort"` // 排序 +} + +// 修改 +type ItemCateUpdateReq struct { + Id string `form:"id" binding:"required"` + Name string `form:"name" binding:"required"` // 栏目名称 + Pid string `form:"pid"` // 父级ID + ItemId string `form:"itemId" binding:"required"` // 站点ID + Pinyin string `form:"pinyin" binding:"required"` // 拼音(全) + Code string `form:"code" binding:"required"` // 拼音(简) + IsCover string `form:"isCover" binding:"required"` // 是否有封面:1是 2否 + Cover string `form:"cover"` // 封面 + Status string `form:"status" binding:"required"` // 状态:1启用 2停用 + Note string `form:"note"` // 备注 + Sort string `form:"sort"` // 排序 +} diff --git a/app/dto/level.go b/app/dto/level.go new file mode 100644 index 0000000..25460e2 --- /dev/null +++ b/app/dto/level.go @@ -0,0 +1,35 @@ +/** + * 职级Dto + * @author + * @since 2021/9/6 + * @File : level + */ +package dto + +// 分页查询 +type LevelPageReq struct { + Name string `form:"name"` // 职级名称 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加职级 +type LevelAddReq struct { + Name string `form:"name" binding:"required"` + Status string `form:"status" binding:"required"` + Sort string `form:"sort"` +} + +// 编辑职级 +type LevelUpdateReq struct { + Id string `form:"id" binding:"required"` + Name string `form:"name" binding:"required"` + Status string `form:"status" binding:"required"` + Sort string `form:"sort"` +} + +// 设置状态 +type LevelStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} diff --git a/app/dto/link.go b/app/dto/link.go new file mode 100644 index 0000000..5659ff5 --- /dev/null +++ b/app/dto/link.go @@ -0,0 +1,53 @@ +/** + * 友链Dto + * @author + * @since 2021/11/13 + * @File : link + */ +package dto + +// 分页查询条件 +type LinkPageReq struct { + Name string `form:"name"` // 友链名称 + Type int `form:"type"` // 友链类型 + Platform int `form:"platform"` // 投放平台 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加友链 +type LinkAddReq struct { + Name string `form:"name" binding:"required"` // 友链名称 + Type string `form:"type" binding:"required"` // 类型:1友情链接 2合作伙伴 + Url string `form:"url"` // 友链地址 + ItemId string `form:"itemId"` // 站点ID + CateId string `form:"cateId"` // 栏目ID + Platform string `form:"platform" binding:"required"` // 平台:1PC站 2WAP站 3微信小程序 4APP应用 + Form string `form:"form" binding:"required"` // 友链形式:1文字链接 2图片链接 + Image string `form:"image"` // 友链图片 + Status string `form:"status" binding:"required"` // 状态:1在用 2停用 + Sort string `form:"sort"` // 显示顺序 + Note string `form:"note"` // 备注 +} + +// 修改友链 +type LinkUpdateReq struct { + Id string `form:"id" binding:"required"` + Name string `form:"name" binding:"required"` // 友链名称 + Type string `form:"type" binding:"required"` // 类型:1友情链接 2合作伙伴 + Url string `form:"url"` // 友链地址 + ItemId string `form:"itemId"` // 站点ID + CateId string `form:"cateId"` // 栏目ID + Platform string `form:"platform" binding:"required"` // 平台:1PC站 2WAP站 3微信小程序 4APP应用 + Form string `form:"form" binding:"required"` // 友链形式:1文字链接 2图片链接 + Image string `form:"image"` // 友链图片 + Status string `form:"status" binding:"required"` // 状态:1在用 2停用 + Sort string `form:"sort"` // 显示顺序 + Note string `form:"note"` // 备注 +} + +// 设置状态 +type LinkStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} diff --git a/app/dto/login.go b/app/dto/login.go new file mode 100644 index 0000000..bae463d --- /dev/null +++ b/app/dto/login.go @@ -0,0 +1,15 @@ +/** + * 登录Dto + * @author + * @since 2021/9/9 + * @File : login + */ +package dto + +// 系统登录 +type LoginReq struct { + UserName string `form:"username" binding:"required,min=4,max=30"` + Password string `form:"password" binding:"required,min=6,max=12"` + Captcha string `form:"captcha" binding:"required,min=4,max=6"` + IdKey string `form:"idKey" binding:"required"` +} diff --git a/app/dto/login_log.go b/app/dto/login_log.go new file mode 100644 index 0000000..5775f98 --- /dev/null +++ b/app/dto/login_log.go @@ -0,0 +1,14 @@ +/** + * 登录日志Dto + * @author + * @since 2021/11/12 + * @File : login_log + */ +package dto + +// 分页信息查询条件 +type LoginLogPageReq struct { + Username string `form:"username"` // 用户账号 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} diff --git a/app/dto/member.go b/app/dto/member.go new file mode 100644 index 0000000..5382d00 --- /dev/null +++ b/app/dto/member.go @@ -0,0 +1,64 @@ +/** + * 会员Dto + * @author + * @since 2021/11/13 + * @File : member + */ +package dto + +// 分页查询条件 +type MemberPageReq struct { + Username string `form:"username"` // 用户名 + Gender int `form:"gender"` // 性别(1男 2女 3未知) + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加会员 +type MemberAddReq struct { + Username string `form:"username,unique" binding:"required"` // 用户名 + Password string `form:"password" binding:"required"` // 登录密码 + MemberLevel string `form:"memberLevel" binding:"required"` // 会员等级 + Realname string `form:"realname" binding:"required"` // 真实姓名 + Nickname string `form:"nickname" binding:"required"` // 用户昵称 + Gender string `form:"gender" binding:"required"` // 性别(1男 2女 3未知) + Avatar string `form:"avatar" binding:"required"` // 用户头像 + Birthday string `form:"birthday" binding:"required"` // 出生日期 + ProvinceCode string `form:"provinceCode" binding:"required"` // 省份编号 + CityCode string `form:"cityCode" binding:"required"` // 市区编号 + DistrictCode string `form:"districtCode" binding:"required"` // 区县编号 + Address string `form:"address" binding:"required"` // 详细地址 + Intro string `form:"intro"` // 个人简介 + Signature string `form:"signature"` // 个性签名 + Device string `form:"device" binding:"required"` // 设备类型:1苹果 2安卓 3WAP站 4PC站 5后台添加 + Source string `form:"source" binding:"required"` // 来源:1、APP注册;2、后台添加; + Status string `form:"status" binding:"required"` // 是否启用 1、启用 2、停用 +} + +// 更新会员 +type MemberUpdateReq struct { + Id string `form:"id" binding:"required"` + Username string `form:"username,unique" binding:"required"` // 用户名 + Password string `form:"password" binding:"required"` // 登录密码 + MemberLevel string `form:"memberLevel" binding:"required"` // 会员等级 + Realname string `form:"realname" binding:"required"` // 真实姓名 + Nickname string `form:"nickname" binding:"required"` // 用户昵称 + Gender string `form:"gender" binding:"required"` // 性别(1男 2女 3未知) + Avatar string `form:"avatar" binding:"required"` // 用户头像 + Birthday string `form:"birthday" binding:"required"` // 出生日期 + ProvinceCode string `form:"provinceCode" binding:"required"` // 省份编号 + CityCode string `form:"cityCode" binding:"required"` // 市区编号 + DistrictCode string `form:"districtCode" binding:"required"` // 区县编号 + Address string `form:"address" binding:"required"` // 详细地址 + Intro string `form:"intro"` // 个人简介 + Signature string `form:"signature"` // 个性签名 + Device string `form:"device" binding:"required"` // 设备类型:1苹果 2安卓 3WAP站 4PC站 5后台添加 + Source string `form:"source" binding:"required"` // 来源:1、APP注册;2、后台添加; + Status string `form:"status" binding:"required"` // 是否启用 1、启用 2、停用 +} + +// 设置状态 +type MemberStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} diff --git a/app/dto/member_level.go b/app/dto/member_level.go new file mode 100644 index 0000000..c29017f --- /dev/null +++ b/app/dto/member_level.go @@ -0,0 +1,27 @@ +/** + * 会员等级Dto + * @author + * @since 2021/11/13 + * @File : member_level + */ +package dto + +// 查询会员等级 +type MemberLevelPageReq struct { + Name string `form:"name"` // 等级名称 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加会员等级 +type MemberLevelAddReq struct { + Name string `form:"name" binding:"required"` // 级别名称 + Sort string `form:"sort"` // 排序号 +} + +// 更新会员等级 +type MemberLevelUpdateReq struct { + Id string `form:"id" binding:"required"` + Name string `form:"name" binding:"required"` // 级别名称 + Sort string `form:"sort"` // 排序号 +} diff --git a/app/dto/menu.go b/app/dto/menu.go new file mode 100644 index 0000000..d0075cf --- /dev/null +++ b/app/dto/menu.go @@ -0,0 +1,51 @@ +/** + * 菜单Dto + * @author + * @since 2021/9/13 + * @File : menu + */ +package dto + +import "easygoadmin/app/model" + +// 列表查询条件 +type MenuQueryReq struct { + Title string `form:"name"` // 菜单标题 +} + +// 添加菜单 +type MenuAddReq struct { + Name string `form:"name" binding:"required"` // 菜单标题 + Icon string `form:"icon" binding:"required"` // 图标 + Url string `form:"url" binding:"required"` // URL地址 + Pid string `form:"pid"` // 上级ID + Type string `form:"type"` // 类型:1模块 2导航 3菜单 4节点 + Permission string `form:"permission"` // 权限标识 + Status string `form:"status" binding:"required"` // 状态:1正常 2禁用 + Target string `form:"target"` // 打开方式:1内部打开 2外部打开 + Note string `form:"note"` // 菜单备注 + Sort string `form:"sort"` // 显示顺序 + Func string `form:"func"` // 权限节点 +} + +// 更新菜单 +type MenuUpdateReq struct { + Id string `form:"id" binding:"required"` + Name string `form:"name" binding:"required"` // 菜单标题 + Icon string `form:"icon" binding:"required"` // 图标 + Url string `form:"url" binding:"required"` // URL地址 + Pid string `form:"pid"` // 上级ID + Type string `form:"type"` // 类型:1模块 2导航 3菜单 4节点 + Permission string `form:"permission"` // 权限标识 + Status string `form:"status" binding:"required"` // 状态:1正常 2禁用 + Target string `form:"target"` // 打开方式:1内部打开 2外部打开 + Note string `form:"note"` // 菜单备注 + Sort string `form:"sort"` // 显示顺序 + Func string `form:"func"` // 权限节点 +} + +// 菜单信息 +type MenuInfoVo struct { + model.Menu + CheckedList []int `form:"checkedList"` // 权限节点列表 +} diff --git a/app/dto/notice.go b/app/dto/notice.go new file mode 100644 index 0000000..b0f053d --- /dev/null +++ b/app/dto/notice.go @@ -0,0 +1,40 @@ +/** + * 通知公告Dto + * @author + * @since 2021/11/13 + * @File : notice + */ +package dto + +// 分页查询 +type NoticePageReq struct { + Title string `form:"title"` // 通知标题 + Source int `form:"source"` // 通知来源 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加通知公告 +type NoticeAddReq struct { + Title string `form:"title" binding:"required"` // 通知标题 + Content string `form:"content" binding:"required"` // 通知内容 + Source string `form:"source" binding:"required"` // 来源:1内部通知 2外部新闻 + IsTop string `form:"isTop" binding:"required"` // 是否置顶:1是 2否 + Status string `form:"status" binding:"required"` // 状态:1已发布 2待发布 +} + +// 更新通知公告 +type NoticeUpdateReq struct { + Id string `form:"id" binding:"required"` + Title string `form:"title" binding:"required"` // 通知标题 + Content string `form:"content" binding:"required"` // 通知内容 + Source string `form:"source" binding:"required"` // 来源:1内部通知 2外部新闻 + IsTop string `form:"isTop" binding:"required"` // 是否置顶:1是 2否 + Status string `form:"status" binding:"required"` // 状态:1已发布 2待发布 +} + +// 设置状态 +type NoticeStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} diff --git a/app/dto/oper_log.go b/app/dto/oper_log.go new file mode 100644 index 0000000..6b20841 --- /dev/null +++ b/app/dto/oper_log.go @@ -0,0 +1,15 @@ +/** + * 操作日志Dto + * @author + * @since 2021/11/12 + * @File : oper_log + */ +package dto + +// 分页查询条件 +type OperLogPageReq struct { + Username string `form:"username"` // 操作账号 + Model string `form:"model"` // 操作模块 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} diff --git a/app/dto/position.go b/app/dto/position.go new file mode 100644 index 0000000..0547934 --- /dev/null +++ b/app/dto/position.go @@ -0,0 +1,35 @@ +/** + * 岗位Dto + * @author + * @since 2021/9/10 + * @File : position + */ +package dto + +// 分页查询条件 +type PositionPageReq struct { + Name string `form:"name"` // 岗位名称 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加岗位 +type PositionAddReq struct { + Name string `form:"name" binding:"required"` + Status string `form:"status" binding:"required"` + Sort string `form:"sort"` +} + +// 更新岗位 +type PositionUpdateReq struct { + Id string `form:"id" binding:"required"` + Name string `form:"name" binding:"required"` + Status string `form:"status" binding:"required"` + Sort string `form:"sort"` +} + +// 设置状态 +type PositionStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} diff --git a/app/dto/role.go b/app/dto/role.go new file mode 100644 index 0000000..83340ca --- /dev/null +++ b/app/dto/role.go @@ -0,0 +1,39 @@ +/** + * 角色Dto + * @author + * @since 2021/9/13 + * @File : role + */ +package dto + +// 分页查询条件 +type RolePageReq struct { + Name string `form:"name"` // 角色名称 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加角色 +type RoleAddReq struct { + Name string `form:"name" binding:"required"` + Code string `form:"code" binding:"required"` + Status string `form:"status" binding:"required"` + Sort string `form:"sort"` + Note string `form:"note"` +} + +// 更新角色 +type RoleUpdateReq struct { + Id string `form:"id" binding:"required"` + Name string `form:"name" binding:"required"` + Code string `form:"code" binding:"required"` + Status string `form:"status" binding:"required"` + Sort string `form:"sort"` + Note string `form:"note"` +} + +// 设置状态 +type RoleStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} diff --git a/app/dto/role_menu.go b/app/dto/role_menu.go new file mode 100644 index 0000000..cc1a348 --- /dev/null +++ b/app/dto/role_menu.go @@ -0,0 +1,13 @@ +/** + * 角色菜单Dto + * @author + * @since 2021/9/14 + * @File : role_menu + */ +package dto + +// 角色菜单数据 +type RoleMenuSaveReq struct { + RoleId int `form:"roleId" binding:"required"` + MenuIds string `form:"menuIds" binding:"required"` +} diff --git a/app/dto/user.go b/app/dto/user.go new file mode 100644 index 0000000..e9c4cd9 --- /dev/null +++ b/app/dto/user.go @@ -0,0 +1,101 @@ +/** + * 用户Dto + * @author + * @since 2021/11/11 + * @File : user + */ +package dto + +// 用户分页查询条件 +type UserPageReq struct { + Realname string `form:"realname"` // 用户名 + Gender int `form:"gender"` // 性别 + Page int `form:"page"` // 页码 + Limit int `form:"limit"` // 每页数 +} + +// 添加用户 +type UserAddReq struct { + Realname string `form:"realname" binding:"required"` + Nickname string `form:"nickname" binding:"required"` + Gender string `form:"gender" binding:""` + Avatar string `form:"avatar" binding:""` + Mobile string `form:"mobile" binding:"required"` + Email string `form:"email" binding:""` + Birthday string `form:"birthday" binding:""` + DeptId string `form:"deptId" binding:""` + LevelId string `form:"levelId" binding:""` + PositionId string `form:"positionId" binding:""` + ProvinceCode string `form:"provinceCode" binding:""` // 省份编号 + CityCode string `form:"cityCode" binding:""` // 市区编号 + DistrictCode string `form:"districtCode" binding:""` // 区县编号 + Address string `form:"address"` + Username string `form:"username" binding:"required"` + Password string `form:"password"` + Intro string `form:"intro"` + Status string `form:"status"` + Note string `form:"note"` + Sort string `form:"sort"` + RoleIds string `form:"roleIds"` // 用户角色 +} + +// 更新用户 +type UserUpdateReq struct { + Id string `form:"id" binding:"required"` + Realname string `form:"realname" binding:"required"` + Nickname string `form:"nickname" binding:"required"` + Gender string `form:"gender" binding:""` + Avatar string `form:"avatar" binding:""` + Mobile string `form:"mobile" binding:"required"` + Email string `form:"email" binding:""` + Birthday string `form:"birthday" binding:""` + DeptId string `form:"deptId" binding:""` + LevelId string `form:"levelId" binding:""` + PositionId string `form:"positionId" binding:""` + ProvinceCode string `form:"provinceCode" binding:""` // 省份编号 + CityCode string `form:"cityCode" binding:""` // 市区编号 + DistrictCode string `form:"districtCode" binding:""` // 区县编号 + Address string `form:"address"` + Username string `form:"username" binding:"required"` + Password string `form:"password"` + Intro string `form:"intro"` + Status string `form:"status"` + Note string `form:"note"` + Sort string `form:"sort"` + RoleIds string `form:"roleIds"` // 用户角色 +} + +// 设置状态 +type UserStatusReq struct { + Id string `form:"id" binding:"required"` + Status string `form:"status" binding:"required"` +} + +// 重置密码 +type UserResetPwdReq struct { + Id int `form:"id" binding:"required"` +} + +// 检查用户 +type CheckUserReq struct { + Username string `form:"username" binding:"required"` // 用户名 +} + +// 更新密码 +type UpdatePwd struct { + OldPassword string `form:"oldPassword" binding:"required"` // 旧密码 + NewPassword string `form:"newPassword" binding:"required"` // 新密码 + RePassword string `form:"rePassword" binding:"required"` // 确认密码 +} + +// 用户中心 +type UserInfoReq struct { + Avatar string `form:"avatar"` // 头像 + Realname string `form:"realname" binding:"required"` // 真实姓名 + Nickname string `form:"nickname" binding:"required"` // 昵称 + Gender string `form:"gender" binding:"required"` // 性别:1男 2女 3保密 + Mobile string `form:"mobile" binding:"required"` // 手机号码 + Email string `form:"email" binding:"required"` // 邮箱地址 + Address string `form:"address"` // 详细地址 + Intro string `form:"intro"` // 个人简介 +} diff --git a/app/middleware/checklogin.go b/app/middleware/checklogin.go new file mode 100644 index 0000000..70a51b5 --- /dev/null +++ b/app/middleware/checklogin.go @@ -0,0 +1,195 @@ +/** + * 登录验证中间件 + * @author + * @since 2021/8/20 + * @File : checkauth + */ +package middleware + +import ( + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "encoding/json" + "fmt" + "github.com/gin-contrib/sessions" + "github.com/gin-gonic/gin" + "net/http" + "regexp" + "strings" + "time" +) + +func CheckLogin() gin.HandlerFunc { + return func(c *gin.Context) { + //fmt.Println("登录验证中间件") + // 放行设置 + path := c.Request.URL.Path + + urlItem := []string{"/captcha", "/login", "/loginKf", "/"} + urlCusItem := []string{"/customer", "/loginKf"} + if !utils.InStringArray(path, urlItem) && !strings.Contains(path, "resource") { + if !strings.Contains(path, "api") { + if !utils.IsLogin(c) { + // 跳转登录页,方式:301(永久移动),308(永久重定向),307(临时重定向) + if utils.InStringArray(path, urlCusItem) { + c.Redirect(http.StatusTemporaryRedirect, "/loginKf") + return + } + c.Redirect(http.StatusTemporaryRedirect, "/login") + return + } + } + } + // 前置中间件 + c.Next() + } +} + +// 验证权限 +func CheckAuth() gin.HandlerFunc { + return func(c *gin.Context) { + //fmt.Println("登录验证中间件") + // 放行设置 + urlItem := []string{"/captcha", "/login", "/loginKf", "/"} + path := c.Request.URL.Path + match, _ := regexp.Match("/[1-9]\\d*", []byte(path)) + if !utils.InStringArray(c.Request.URL.Path, urlItem) && !strings.Contains(c.Request.URL.Path, "resource") { + if !strings.Contains(c.Request.URL.Path, "api") && !match { + // 初始化session对象 + session := sessions.Default(c) + userId := session.Get("userId") + if userId != 1 && !strings.Contains(path, "edit") { + menuIdArr := getRoleApiIds(c, gconv.Int64(userId)) + if len(menuIdArr) == 0 { + c.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "无权限", + }) + c.Abort() + } + menuId := getMenuId(c, path) + if menuId != "" { + if !utils.InStringArray(menuId, menuIdArr) { + c.JSON(http.StatusOK, common.JsonResult{ + Code: -1, + Msg: "无权限!", + }) + c.Abort() + } + } + } + } + } + // 前置中间件 + c.Next() + } +} + +// 跨域 +func DoCors() gin.HandlerFunc { + return func(c *gin.Context) { + method := c.Request.Method + + origin := c.Request.Header.Get("Origin") + var headerKeys []string + for k, _ := range c.Request.Header { + headerKeys = append(headerKeys, k) + } + headerStr := strings.Join(headerKeys, ", ") + if headerStr != "" { + headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers,AppToken, %s", headerStr) + } else { + headerStr = "access-control-allow-origin, access-control-allow-headers,AppToken" + } + if origin != "" { + //-_-~ + // c.Writer.Header().Set("Access-Control-Allow-Origin", "*") + + c.Header("Access-Control-Allow-Origin", origin) + + //c.Header("Access-Control-Allow-Headers", headerStr) + c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma") + + c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE") + // c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma") + c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers, Content-Type") + c.Header("Access-Control-Max-Age", "172800") + c.Header("Access-Control-Allow-Credentials", "true") + c.Set("content-type", "application/json") + } + + //放行所有OPTIONS方法 + if method == "OPTIONS" { + c.JSON(http.StatusOK, "Options Request!") + //c.AbortWithStatus(http.StatusNoContent) + } + + c.Next() + } +} + +// 根据userId 获取有权限的menuId +func getRoleApiIds(c *gin.Context, userId int64) []string { + apiIdsArr := make([]string, 0) + cache := utils.GetRedisHelper() + cacheKey := fmt.Sprintf("Middleware:GetRoleApiIds:V1:%d", userId) + val := cache.Get(c, cacheKey).Val() + if val != "" { + json.Unmarshal([]byte(val), &apiIdsArr) + return apiIdsArr + } + + userRole := make([]model.UserRole, 0) + // 创建查询实例 + query := utils.XormDb.Where("user_id = ?", gconv.String(userId)).Table("sys_user_role") + err := query.Find(&userRole) + if err != nil { + return apiIdsArr + } + roleArr := make([]string, 0) + for _, item := range userRole { + roleArr = append(roleArr, gconv.String(item.RoleId)) + } + if len(roleArr) > 0 { + //roleMenuArr := make([]int, 0) + roleStr := strings.Join(roleArr, ",") + whereId := fmt.Sprintf("role_id IN (%s)", roleStr) + roleMenu := make([]model.RoleMenu, 0) + errR := utils.XormDb.Where(whereId).Find(&roleMenu) + if errR == nil { + for _, item := range roleMenu { + apiIdsArr = append(apiIdsArr, gconv.String(item.MenuId)) + } + } + } + jsonStr, _ := json.Marshal(apiIdsArr) + cache.Set(c, cacheKey, jsonStr, 2*time.Minute) + + return apiIdsArr +} + +// 根据userId 获取有权限的menuId +func getMenuId(c *gin.Context, path string) string { + menuId := "" + cache := utils.GetRedisHelper() + cacheKey := fmt.Sprintf("Middleware:GetMenuId:V3:%s", path) + val := cache.Get(c, cacheKey).Val() + if val != "" { + return val + } + + var menu model.Menu + // 创建查询实例 + query := utils.XormDb.Where("url = ?", path).Select("id"). + Table("sys_menu") + _, err := query.Get(&menu) + if err != nil || menu.Id == 0 { + return menuId + } + menuId = gconv.String(menu.Id) + cache.Set(c, cacheKey, menuId, 2*time.Minute) + + return menuId +} diff --git a/app/model/ad.go b/app/model/ad.go new file mode 100644 index 0000000..3002e22 --- /dev/null +++ b/app/model/ad.go @@ -0,0 +1,54 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Ad struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(10)"` + Title string `json:"title" xorm:"not null comment('广告标题') index VARCHAR(100)"` + AdSortId int `json:"adSortId" xorm:"not null default 0 comment('广告位ID') index INT(11)"` + Cover string `json:"cover" xorm:"default 'NULL' comment('广告图片') VARCHAR(255)"` + Type int `json:"type" xorm:"not null default 0 comment('广告格式:1图片 2文字 3视频 4推荐') TINYINT(1)"` + Description string `json:"description" xorm:"default 'NULL' comment('广告描述') VARCHAR(150)"` + Content string `json:"content" xorm:"default 'NULL' comment('广告内容') TEXT"` + Url string `json:"url" xorm:"default 'NULL' comment('广告链接') TEXT"` + Width int `json:"width" xorm:"not null default 0 comment('广告宽度') INT(10)"` + Height int `json:"height" xorm:"not null default 0 comment('广告高度') INT(10)"` + StartTime int64 `json:"startTime" xorm:"default 'NULL' comment('开始时间') DATETIME"` + EndTime int64 `json:"endTime" xorm:"default 'NULL' comment('结束时间') DATETIME"` + ViewNum int `json:"viewNum" xorm:"not null default 0 comment('点击率') INT(10)"` + Status int `json:"status" xorm:"not null default 1 comment('状态:1在用 2停用') TINYINT(1)"` + Sort int `json:"sort" xorm:"not null default 125 comment('排序') SMALLINT(5)"` + Note string `json:"note" xorm:"default 'NULL' comment('备注') VARCHAR(255)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(10)"` + CreateTime int64 `json:"create_time" xorm:"not null comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(10)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识(1正常 0删除)') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Ad) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Ad) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Ad) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Ad) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Ad{}) +} + +// 批量删除 +func (r *Ad) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Ad{}) +} diff --git a/app/model/ad_sort.go b/app/model/ad_sort.go new file mode 100644 index 0000000..0aaa98a --- /dev/null +++ b/app/model/ad_sort.go @@ -0,0 +1,45 @@ +package model + +import ( + "easygoadmin/utils" +) + +type AdSort struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(10)"` + Description string `json:"description" xorm:"not null comment('广告位描述') VARCHAR(255)"` + ItemId int `json:"itemId" xorm:"not null default 0 comment('站点ID') INT(10)"` + CateId int `json:"cateId" xorm:"not null default 0 comment('栏目ID') SMALLINT(5)"` + LocId int `json:"locId" xorm:"not null default 0 comment('广告页面位置') SMALLINT(5)"` + Platform int `json:"platform" xorm:"not null default 1 comment('站点类型:1PC网站 2WAP手机站 3微信小程序 4APP移动端') TINYINT(1)"` + Sort int `json:"sort" xorm:"not null default 125 comment('广告位排序') SMALLINT(5)"` + CreateUser int `json:"create_user" xorm:"default 0 comment('添加人') INT(10)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(10)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识(1正常 0删除)') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *AdSort) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *AdSort) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *AdSort) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *AdSort) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&AdSort{}) +} + +// 批量删除 +func (r *AdSort) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&AdSort{}) +} diff --git a/app/model/city.go b/app/model/city.go new file mode 100644 index 0000000..60cd980 --- /dev/null +++ b/app/model/city.go @@ -0,0 +1,48 @@ +package model + +import ( + "easygoadmin/utils" +) + +type City struct { + Id int `json:"id" xorm:"not null pk autoincr comment('编号') INT(11)"` + Pid int `json:"pid" xorm:"not null default 0 comment('父级编号') INT(11)"` + Level int `json:"level" xorm:"not null default 0 comment('城市级别:1省 2市 3区') TINYINT(1)"` + Name string `json:"name" xorm:"not null comment('城市名称') index VARCHAR(50)"` + Citycode string `json:"citycode" xorm:"not null comment('城市编号(区号)') VARCHAR(10)"` + PAdcode string `json:"PAdcode" xorm:"default 'NULL' comment('父级地理编号') VARCHAR(10)"` + Adcode string `json:"adcode" xorm:"default 'NULL' comment('地理编号') VARCHAR(10)"` + Lng string `json:"lng" xorm:"default 'NULL' comment('城市坐标中心点经度(* 1e6):如果是中国,此值是 1e7') VARCHAR(10)""` + Lat string `json:"lat" xorm:"default 'NULL' comment('城市坐标中心点纬度(* 1e6)') VARCHAR(10)""` + Sort int `json:"sort" xorm:"not null default 125 comment('排序号') TINYINT(3)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"not null default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标记') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *City) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *City) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *City) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *City) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&City{}) +} + +// 批量删除 +func (r *City) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&City{}) +} diff --git a/app/model/config.go b/app/model/config.go new file mode 100644 index 0000000..d1e89ee --- /dev/null +++ b/app/model/config.go @@ -0,0 +1,41 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Config struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(11)"` + Name string `json:"name" xorm:"not null comment('分组名称') index VARCHAR(30)"` + Sort int `json:"sort" xorm:"not null comment('排序') TINYINT(2)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"not null default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Config) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Config) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Config) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Config) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Config{}) +} + +// 批量删除 +func (r *Config) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Config{}) +} diff --git a/app/model/config_data.go b/app/model/config_data.go new file mode 100644 index 0000000..398c77d --- /dev/null +++ b/app/model/config_data.go @@ -0,0 +1,48 @@ +package model + +import ( + "easygoadmin/utils" +) + +type ConfigData struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(11)"` + Title string `json:"title" xorm:"not null comment('配置标题') index VARCHAR(50)"` + Code string `json:"code" xorm:"not null comment('配置编码') index VARCHAR(100)"` + Value string `json:"value" xorm:"default 'NULL' comment('配置值') TEXT"` + Options string `json:"options" xorm:"default 'NULL' comment('配置项') VARCHAR(255)"` + ConfigId int `json:"configId" xorm:"not null default 0 comment('配置ID') INT(11)"` + Type string `json:"type" xorm:"not null comment('配置类型') VARCHAR(16)"` + Status int `json:"status" xorm:"not null default 1 comment('状态:1正常 2停用') TINYINT(1)"` + Sort int `json:"sort" xorm:"not null default 0 comment('排序') SMALLINT(3)"` + Note string `json:"note" xorm:"default 'NULL' comment('配置说明') VARCHAR(500)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"not null default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识:1正常 0删除') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *ConfigData) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *ConfigData) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *ConfigData) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *ConfigData) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&ConfigData{}) +} + +// 批量删除 +func (r *ConfigData) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&ConfigData{}) +} diff --git a/app/model/dept.go b/app/model/dept.go new file mode 100644 index 0000000..6485da1 --- /dev/null +++ b/app/model/dept.go @@ -0,0 +1,46 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Dept struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(11)"` + Name string `json:"name" xorm:"not null comment('部门名称') index VARCHAR(50)"` + Code string `json:"code" xorm:"default 'NULL' comment('部门编码') VARCHAR(150)"` + Fullname string `json:"fullname" xorm:"default 'NULL' comment('部门全称') VARCHAR(150)"` + Type int `json:"type" xorm:"not null default 0 comment('类型:1公司 2子公司 3部门 4小组') TINYINT(1)"` + Pid int `json:"pid" xorm:"not null default 0 comment('上级ID') index INT(11)"` + Sort int `json:"sort" xorm:"not null default 125 comment('排序') SMALLINT(5)"` + Note string `json:"note" xorm:"default 'NULL' comment('备注说明') VARCHAR(255)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('创建时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Dept) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Dept) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Dept) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Dept) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Dept{}) +} + +// 批量删除 +func (r *Dept) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Dept{}) +} diff --git a/app/model/dict.go b/app/model/dict.go new file mode 100644 index 0000000..c519575 --- /dev/null +++ b/app/model/dict.go @@ -0,0 +1,43 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Dict struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(11)"` + Name string `json:"name" xorm:"not null comment('字典名称') index VARCHAR(30)"` + Code string `json:"code" xorm:"not null comment('字典值') VARCHAR(50)"` + Sort int `json:"sort" xorm:"not null default 125 comment('显示顺序') SMALLINT(5)"` + Note string `json:"note" xorm:"default 'NULL' comment('字典备注') VARCHAR(255)"` + CreateUser int `json:"create_user" xorm:"default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Dict) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Dict) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Dict) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Dict) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Dict{}) +} + +// 批量删除 +func (r *Dict) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Dict{}) +} diff --git a/app/model/dict_data.go b/app/model/dict_data.go new file mode 100644 index 0000000..f42bdf9 --- /dev/null +++ b/app/model/dict_data.go @@ -0,0 +1,45 @@ +package model + +import ( + "easygoadmin/utils" +) + +type DictData struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(11)"` + Name string `json:"name" xorm:"not null comment('字典项名称') unique VARCHAR(50)"` + Code string `json:"code" xorm:"not null comment('字典项值') VARCHAR(50)"` + DictId int `json:"dictId" xorm:"not null default 0 comment('字典类型ID') INT(11)"` + Status int `json:"status" xorm:"not null default 1 comment('状态:1在用 2停用') TINYINT(1)"` + Note string `json:"note" xorm:"default 'NULL' comment('备注') VARCHAR(300)"` + Sort int `json:"sort" xorm:"not null default 125 comment('显示顺序') SMALLINT(5)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"not null default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标记') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *DictData) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *DictData) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *DictData) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *DictData) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&DictData{}) +} + +// 批量删除 +func (r *DictData) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&DictData{}) +} diff --git a/app/model/example.go b/app/model/example.go new file mode 100644 index 0000000..32a187b --- /dev/null +++ b/app/model/example.go @@ -0,0 +1,46 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Example struct { + Id int `json:"id" xorm:"not null pk autoincr comment('唯一性标识') INT(11)"` + Name string `json:"name" xorm:"default 'NULL' comment('测试名称') index VARCHAR(30)"` + Avatar string `json:"avatar" xorm:"default 'NULL' comment('头像') VARCHAR(255)"` + Content string `json:"content" xorm:"default 'NULL' comment('内容') VARCHAR(255)"` + Status int `json:"status" xorm:"default 1 comment('状态:1正常 2停用') TINYINT(1)"` + Type int `json:"type" xorm:"default 1 comment('类型:1京东 2淘宝 3拼多多 4唯品会') INT(11)"` + IsVip int `json:"isVip" xorm:"default 2 comment('是否VIP:1是 2否') TINYINT(1)"` + Sort int `json:"sort" xorm:"default 0 comment('排序号') INT(11)"` + CreateUser int `json:"create_user" xorm:"default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Example) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Example) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Example) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Example) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Example{}) +} + +// 批量删除 +func (r *Example) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Example{}) +} diff --git a/app/model/example2.go b/app/model/example2.go new file mode 100644 index 0000000..cda2b9b --- /dev/null +++ b/app/model/example2.go @@ -0,0 +1,42 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Example2 struct { + Id int `json:"id" xorm:"not null pk autoincr comment('唯一性标识') INT(11)"` + Name string `json:"name" xorm:"default 'NULL' comment('演示名称') index VARCHAR(30)"` + Status int `json:"status" xorm:"default 1 comment('状态:1正常 2停用') TINYINT(1)"` + Sort int `json:"sort" xorm:"default 0 comment('排序号') INT(11)"` + CreateUser int `json:"create_user" xorm:"default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Example2) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Example2) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Example2) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Example2) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Example2{}) +} + +// 批量删除 +func (r *Example2) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Example2{}) +} diff --git a/app/model/item.go b/app/model/item.go new file mode 100644 index 0000000..66fed9c --- /dev/null +++ b/app/model/item.go @@ -0,0 +1,46 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Item struct { + Id int `json:"id" xorm:"not null pk autoincr comment('唯一性标识') INT(10)"` + Name string `json:"name" xorm:"not null comment('站点名称') index VARCHAR(15)"` + Type int `json:"type" xorm:"not null default 1 comment('站点类型:1普通站点 2其他') TINYINT(3)"` + Url string `json:"url" xorm:"not null comment('站点地址') VARCHAR(60)"` + Image string `json:"image" xorm:"not null comment('站点图片') VARCHAR(100)"` + Status int `json:"status" xorm:"not null default 1 comment('状态:1在用 2停用') TINYINT(1)"` + Note string `json:"note" xorm:"not null comment('站点备注') VARCHAR(255)"` + Sort int `json:"sort" xorm:"not null default 125 comment('显示顺序') SMALLINT(5)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(10)"` + CreateTime int64 `json:"create_time" xorm:"not null comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(10)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识(1正常 0删除)') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Item) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Item) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Item) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Item) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Item{}) +} + +// 批量删除 +func (r *Item) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Item{}) +} diff --git a/app/model/item_cate.go b/app/model/item_cate.go new file mode 100644 index 0000000..832fb02 --- /dev/null +++ b/app/model/item_cate.go @@ -0,0 +1,49 @@ +package model + +import ( + "easygoadmin/utils" +) + +type ItemCate struct { + Id int `json:"id" xorm:"not null pk autoincr comment('ID') INT(11)"` + Name string `json:"name" xorm:"default 'NULL' comment('栏目名称') VARCHAR(30)"` + Pid int `json:"pid" xorm:"default 0 comment('父级ID') index INT(11)"` + ItemId int `json:"itemId" xorm:"default 0 comment('站点ID') index INT(11)"` + Pinyin string `json:"pinyin" xorm:"default 'NULL' comment('拼音(全)') VARCHAR(50)"` + Code string `json:"code" xorm:"default 'NULL' comment('拼音(简)') VARCHAR(10)"` + IsCover int `json:"isCover" xorm:"not null comment('是否有封面:1是 2否') TINYINT(1)"` + Cover string `json:"cover" xorm:"default 'NULL' comment('封面') VARCHAR(50)"` + Status int `json:"status" xorm:"default 1 comment('状态:1启用 2停用') TINYINT(1)"` + Note string `json:"note" xorm:"default 'NULL' comment('备注') VARCHAR(200)"` + Sort int `json:"sort" xorm:"default 125 comment('排序') INT(11)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(10)"` + CreateTime int64 `json:"create_time" xorm:"not null comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(10)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识(1正常 0删除)') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *ItemCate) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *ItemCate) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *ItemCate) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *ItemCate) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&ItemCate{}) +} + +// 批量删除 +func (r *ItemCate) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&ItemCate{}) +} diff --git a/app/model/layout.go b/app/model/layout.go new file mode 100644 index 0000000..9cdfe35 --- /dev/null +++ b/app/model/layout.go @@ -0,0 +1,44 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Layout struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(10)"` + LayoutDescId int `json:"layout_desc_id" xorm:"not null default 0 comment('布局描述ID') INT(10)"` + Type int `json:"type" xorm:"not null default 0 comment('类型:1资讯文章') TINYINT(1)"` + TypeId int `json:"type_id" xorm:"not null default 0 comment('对应的类型编号') INT(10)"` + Image string `json:"image" xorm:"not null comment('图片路径') VARCHAR(150)"` + Sort int `json:"sort" xorm:"not null default 125 comment('显示顺序') INT(11)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(10)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"not null default 0 comment('更新人') INT(10)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识(1正常 0删除)') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Layout) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Layout) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Layout) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Layout) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Layout{}) +} + +// 批量删除 +func (r *Layout) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Layout{}) +} diff --git a/app/model/layout_desc.go b/app/model/layout_desc.go new file mode 100644 index 0000000..1a6ba3e --- /dev/null +++ b/app/model/layout_desc.go @@ -0,0 +1,43 @@ +package model + +import ( + "easygoadmin/utils" +) + +type LayoutDesc struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(10)"` + LocDesc string `json:"loc_desc" xorm:"not null comment('页面位置描述') VARCHAR(255)"` + LocId int `json:"loc_id" xorm:"not null default 0 comment('位置编号') INT(11)"` + ItemId int `json:"item_id" xorm:"not null default 0 comment('站点ID') INT(10)"` + Sort int `json:"sort" xorm:"not null default 125 comment('排序号') INT(11)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(10)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"not null default 0 comment('更新人') INT(10)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识(1正常 0删除)') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *LayoutDesc) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *LayoutDesc) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *LayoutDesc) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *LayoutDesc) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&LayoutDesc{}) +} + +// 批量删除 +func (r *LayoutDesc) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&LayoutDesc{}) +} diff --git a/app/model/level.go b/app/model/level.go new file mode 100644 index 0000000..1570f98 --- /dev/null +++ b/app/model/level.go @@ -0,0 +1,40 @@ +package model + +import "easygoadmin/utils" + +type Level struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(11)"` + Name string `json:"name" xorm:"not null comment('职级名称') index VARCHAR(30)"` + Status int `json:"status" xorm:"not null default 1 comment('状态:1正常 2停用') TINYINT(1)"` + Sort int `json:"sort" xorm:"not null default 125 comment('显示顺序') INT(11)"` + CreateUser int `json:"create_user" xorm:"default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 0 comment('创建时间') INT(11)"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 0 comment('更新时间') INT(11)"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Level) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Level) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Level) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Level) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Level{}) +} + +// 批量删除 +func (r *Level) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Level{}) +} diff --git a/app/model/link.go b/app/model/link.go new file mode 100644 index 0000000..df46aa0 --- /dev/null +++ b/app/model/link.go @@ -0,0 +1,50 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Link struct { + Id int `json:"id" xorm:"not null pk autoincr comment('唯一性标识') INT(10)"` + Name string `json:"name" xorm:"default 'NULL' comment('友链名称') VARCHAR(50)"` + Type int `json:"type" xorm:"not null default 1 comment('类型:1友情链接 2合作伙伴') TINYINT(1)"` + Url string `json:"url" xorm:"default 'NULL' comment('友链地址') VARCHAR(150)"` + ItemId int `json:"itemId" xorm:"not null default 0 comment('站点ID') INT(10)"` + CateId int `json:"cateId" xorm:"not null default 0 comment('栏目ID') INT(10)"` + Platform int `json:"platform" xorm:"not null default 1 comment('平台:1PC站 2WAP站 3微信小程序 4APP应用') TINYINT(1)"` + Form int `json:"form" xorm:"not null default 1 comment('友链形式:1文字链接 2图片链接') TINYINT(1)"` + Image string `json:"image" xorm:"default 'NULL' comment('友链图片') VARCHAR(50)"` + Status int `json:"status" xorm:"not null default 1 comment('状态:1在用 2停用') TINYINT(1)"` + Sort int `json:"sort" xorm:"not null default 125 comment('显示顺序') SMALLINT(5)"` + Note string `json:"note" xorm:"default 'NULL' comment('备注') VARCHAR(255)"` + CreateUser int `json:"create_user" xorm:"default 0 comment('添加人') INT(10)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(10)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识(1正常 0删除)') index TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Link) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Link) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Link) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Link) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Link{}) +} + +// 批量删除 +func (r *Link) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Link{}) +} diff --git a/app/model/localtime.go b/app/model/localtime.go new file mode 100644 index 0000000..014c798 --- /dev/null +++ b/app/model/localtime.go @@ -0,0 +1,124 @@ +package model + +import ( + "database/sql/driver" + "fmt" + "time" +) + +type LocalTime time.Time + +func (l LocalTime) MarshalJSON() ([]byte, error) { + b := make([]byte, 0, len(localDateTimeFormat)+2) + b = append(b, '"') + b = time.Time(l).AppendFormat(b, localDateTimeFormat) + b = append(b, '"') + return b, nil +} + +func (l *LocalTime) UnmarshalJSON(b []byte) error { + now, err := time.ParseInLocation(`"`+localDateTimeFormat+`"`, string(b), time.Local) + *l = LocalTime(now) + return err +} + +func (l LocalTime) String() string { + return time.Time(l).Format(localDateTimeFormat) +} + +func (l LocalTime) Now() LocalTime { + return LocalTime(time.Now()) +} + +func (l LocalTime) ParseTime(t time.Time) LocalTime { + return LocalTime(t) +} + +func (j LocalTime) format() string { + return time.Time(j).Format(localDateTimeFormat) +} + +func (j LocalTime) MarshalText() ([]byte, error) { + return []byte(j.format()), nil +} + +func (l *LocalTime) FromDB(b []byte) error { + if nil == b || len(b) == 0 { + l = nil + return nil + } + var now time.Time + var err error + + now, err = time.ParseInLocation(localDateTimeFormat, string(b), time.Local) + if nil == err { + *l = LocalTime(now) + return nil + } + now, err = time.ParseInLocation("2006-01-02T15:04:05Z", string(b), time.Local) + if nil == err { + *l = LocalTime(now) + return nil + } + + return err +} + +//func (t *LocalTime) Scan(v interface{}) error { +// // Should be more strictly to check this type. +// vt, err := time.Parse("2006-01-02 15:04:05", string(v.([]byte))) +// if err != nil { +// return err +// } +// *t = LocalTime(vt) +// return nil +//} + +func (l *LocalTime) ToDB() ([]byte, error) { + if nil == l { + return nil, nil + } + return []byte(time.Time(*l).Format(localDateTimeFormat)), nil +} + +func (l *LocalTime) Value() (driver.Value, error) { + if nil == l { + return nil, nil + } + return time.Time(*l).Format(localDateTimeFormat), nil +} + +// XTime 1. 创建 time.Time 类型的副本 XTime; +type XTime struct { + time.Time +} + +// MarshalJSON 2. 为 Xtime 重写 MarshaJSON 方法,在此方法中实现自定义格式的转换; +func (t XTime) MarshalJSON() ([]byte, error) { + output := fmt.Sprintf("\"%s\"", t.Format("2006-01-02 15:04:05")) + return []byte(output), nil +} + +// Value 3. 为 Xtime 实现 Value 方法,写入数据库时会调用该方法将自定义时间类型转换并写入数据库; +func (t XTime) Value() (driver.Value, error) { + var zeroTime time.Time + if t.Time.UnixNano() == zeroTime.UnixNano() { + return nil, nil + } + return t.Time, nil +} + +// Scan 4. 为 Xtime 实现 Scan 方法,读取数据库时会调用该方法将时间数据转换成自定义时间类型; +func (t *XTime) Scan(v interface{}) error { + value, ok := v.(time.Time) + if ok { + *t = XTime{Time: value} + return nil + } + return fmt.Errorf("can not convert %v to timestamp", v) +} + +func TimeToXTime(expires string) *XTime { + var t, _ = time.ParseInLocation(localDateTimeFormat, expires, time.Local) + return &XTime{Time: t} +} diff --git a/app/model/login_log.go b/app/model/login_log.go new file mode 100644 index 0000000..a5e5e5d --- /dev/null +++ b/app/model/login_log.go @@ -0,0 +1,52 @@ +package model + +import ( + "easygoadmin/utils" +) + +type LoginLog struct { + Id int64 `json:"id" xorm:"pk autoincr comment('主键ID') BIGINT(20)"` + Username string `json:"username" xorm:"default 'NULL' comment('操作账号') VARCHAR(255)"` + Method string `json:"method" xorm:"default 'NULL' comment('操作方法') VARCHAR(30)"` + OperUrl string `json:"operUrl" xorm:"default 'NULL' comment('请求URL') VARCHAR(255)"` + OperIp string `json:"operIp" xorm:"default '''' comment('主机地址') VARCHAR(50)"` + OperLocation string `json:"operLocation" xorm:"default '''' comment('操作地点') VARCHAR(255)"` + Os string `json:"os" xorm:"default 'NULL' comment('操作系统') VARCHAR(255)"` + RequestParam string `json:"requestParam" xorm:"default '''' comment('请求参数') VARCHAR(2000)"` + Browser string `json:"browser" xorm:"default 'NULL' comment('浏览器') VARCHAR(255)"` + Result string `json:"result" xorm:"default '''' comment('返回参数') VARCHAR(2000)"` + Status int `json:"status" xorm:"default 1 comment('操作状态:0操作成功 1操作失败') TINYINT(1)"` + Type int `json:"type" xorm:"default 0 comment('操作类型:1登录成功 2登录失败 3注销成功 2注销失败') TINYINT(1)"` + UserAgent string `json:"user_agent" xorm:"default 'NULL' comment('代理信息') TEXT"` + Note string `json:"note" xorm:"default 'NULL' comment('备注') VARCHAR(2000)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('操作时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"not null default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *LoginLog) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *LoginLog) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *LoginLog) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *LoginLog) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&LoginLog{}) +} + +// 批量删除 +func (r *LoginLog) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&LoginLog{}) +} diff --git a/app/model/member.go b/app/model/member.go new file mode 100644 index 0000000..befc0dc --- /dev/null +++ b/app/model/member.go @@ -0,0 +1,65 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Member struct { + Id int `json:"id" xorm:"not null pk autoincr INT(11)"` + Openid string `json:"openid" xorm:"default 'NULL' comment('用户唯一标识') VARCHAR(50)"` + Username string `json:"username" xorm:"not null comment('用户名') index unique VARCHAR(30)"` + Password string `json:"password" xorm:"default 'NULL' comment('密码') CHAR(32)"` + MemberLevel int `json:"memberLevel" xorm:"not null default 0 comment('会员等级') SMALLINT(3)"` + Realname string `json:"realname" xorm:"default 'NULL' comment('真实姓名') VARCHAR(50)"` + Nickname string `json:"nickname" xorm:"default 'NULL' comment('用户昵称') VARCHAR(50)"` + Gender int `json:"gender" xorm:"not null default 3 comment('性别(1男 2女 3未知)') TINYINT(1)"` + Avatar string `json:"avatar" xorm:"default '''' comment('用户头像') VARCHAR(180)"` + Birthday int64 `json:"birthday" xorm:"default 'NULL' comment('出生日期') DATE"` + ProvinceCode string `json:"province_code" xorm:"default 'NULL' comment('户籍省份编号') VARCHAR(30)"` + CityCode string `json:"city_code" xorm:"default 'NULL' comment('户籍城市编号') VARCHAR(30)"` + DistrictCode string `json:"district_code" xorm:"default 'NULL' comment('户籍区/县编号') VARCHAR(30)"` + Address string `json:"address" xorm:"default 'NULL' comment('详细地址') VARCHAR(255)"` + Intro string `json:"intro" xorm:"default 'NULL' comment('个人简介') TEXT"` + Signature string `json:"signature" xorm:"default 'NULL' comment('个性签名') VARCHAR(30)"` + Device int `json:"device" xorm:"not null default 0 comment('设备类型:1苹果 2安卓 3WAP站 4PC站 5后台添加') TINYINT(1)"` + DeviceCode string `json:"device_code" xorm:"default 'NULL' comment('推送的别名') VARCHAR(40)"` + PushAlias string `json:"push_alias" xorm:"default '''' comment('推送的别名') VARCHAR(40)"` + Source int `json:"source" xorm:"not null default 1 comment('来源:1、APP注册;2、后台添加;') TINYINT(1)"` + Status int `json:"status" xorm:"not null default 1 comment('是否启用 1、启用 2、停用') TINYINT(1)"` + AppVersion string `json:"appVersion" xorm:"default '''' comment('客户端版本号') VARCHAR(30)"` + Code string `json:"code" xorm:"default 'NULL' comment('我的推广码') VARCHAR(10)"` + LoginIp string `json:"loginIp" xorm:"default 'NULL' comment('最近登录IP') VARCHAR(30)"` + LoginTime int64 `json:"loginTime" xorm:"default 'NULL' comment('登录时间') DATETIME"` + LoginRegion string `json:"loginRegion" xorm:"default 'NULL' comment('上次登录地点') VARCHAR(20)"` + LoginCount int `json:"loginCount" xorm:"not null default 0 comment('登录总次数') INT(10)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('创建时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"not null default 0 comment('修改人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识:1正常 0删除') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Member) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Member) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Member) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Member) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Member{}) +} + +// 批量删除 +func (r *Member) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Member{}) +} diff --git a/app/model/member_level.go b/app/model/member_level.go new file mode 100644 index 0000000..81b3ae5 --- /dev/null +++ b/app/model/member_level.go @@ -0,0 +1,41 @@ +package model + +import ( + "easygoadmin/utils" +) + +type MemberLevel struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(11)"` + Name string `json:"name" xorm:"not null comment('级别名称') index VARCHAR(30)"` + Sort int `json:"sort" xorm:"not null default 125 comment('排序号') INT(11)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('创建时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"not null default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *MemberLevel) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *MemberLevel) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *MemberLevel) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *MemberLevel) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&MemberLevel{}) +} + +// 批量删除 +func (r *MemberLevel) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&MemberLevel{}) +} diff --git a/app/model/menu.go b/app/model/menu.go new file mode 100644 index 0000000..aa9e948 --- /dev/null +++ b/app/model/menu.go @@ -0,0 +1,48 @@ +package model + +import "easygoadmin/utils" + +type Menu struct { + Id int `json:"id" xorm:"not null pk autoincr comment('唯一性标识') INT(10)"` + Name string `json:"name" xorm:"not null comment('菜单名称') index VARCHAR(30)"` + Icon string `json:"icon" xorm:"comment('图标') VARCHAR(50)"` + Url string `json:"url" xorm:"comment('URL地址') VARCHAR(150)"` + Param string `json:"param" xorm:"comment('参数') VARCHAR(150)"` + Pid int `json:"pid" xorm:"not null default 0 comment('上级ID') index INT(10)"` + Type int `json:"type" xorm:"not null default 0 comment('类型:1模块 2导航 3菜单 4节点') TINYINT(1)"` + Permission string `json:"permission" xorm:"comment('权限标识') VARCHAR(150)"` + Status int `json:"status" xorm:"not null default 1 comment('是否显示:1显示 2不显示') TINYINT(1)"` + Target int `json:"target" xorm:"not null default 1 comment('打开方式:1内部打开 2外部打开') TINYINT(1)"` + Note string `json:"note" xorm:"comment('菜单备注') VARCHAR(255)"` + Sort int `json:"sort" xorm:"default 125 comment('显示顺序') SMALLINT(5)"` + CreateUser int `json:"create_user" xorm:"default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 0 comment('创建时间') INT(11)"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 0 comment('更新时间') INT(11)"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Menu) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Menu) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Menu) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Menu) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Menu{}) +} + +// 批量删除 +func (r *Menu) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Menu{}) +} diff --git a/app/model/notice.go b/app/model/notice.go new file mode 100644 index 0000000..a7062ba --- /dev/null +++ b/app/model/notice.go @@ -0,0 +1,45 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Notice struct { + Id int `json:"id" xorm:"not null pk autoincr comment('通知ID') INT(11)"` + Title string `json:"title" xorm:"not null comment('通知标题') index VARCHAR(150)"` + Content string `json:"content" xorm:"not null comment('通知内容') TEXT"` + Source int `json:"source" xorm:"not null comment('来源:1内部通知 2外部通知') TINYINT(1)"` + IsTop int `json:"isTop" xorm:"not null default 2 comment('是否置顶:1是 2否') TINYINT(1)"` + Browse int `json:"browse" xorm:"not null default 0 comment('阅读量') INT(10)"` + Status int `json:"status" xorm:"not null default 2 comment('状态:1已发布 2待发布') TINYINT(1)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(10)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(10)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Notice) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Notice) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Notice) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Notice) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Notice{}) +} + +// 批量删除 +func (r *Notice) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Notice{}) +} diff --git a/app/model/oper_log.go b/app/model/oper_log.go new file mode 100644 index 0000000..05173e0 --- /dev/null +++ b/app/model/oper_log.go @@ -0,0 +1,52 @@ +package model + +import ( + "easygoadmin/utils" +) + +type OperLog struct { + Id int64 `json:"id" xorm:"pk autoincr comment('主键ID') BIGINT(20)"` + Model string `json:"model" xorm:"not null comment('操作模块') VARCHAR(150)"` + OperType int `json:"operType" xorm:"not null default 0 comment('操作类型:0其它 1新增 2修改 3删除 4查询 5设置状态 6导入 7导出 8设置权限 9设置密码') INT(2)"` + OperMethod string `json:"operMethod" xorm:"default 'NULL' comment('操作方法') VARCHAR(30)"` + Username string `json:"username" xorm:"default 'NULL' comment('操作账号') VARCHAR(255)"` + OperName string `json:"operName" xorm:"default 'NULL' comment('操作用户') VARCHAR(50)"` + OperUrl string `json:"operUrl" xorm:"default 'NULL' comment('请求URL') VARCHAR(255)"` + OperIp string `json:"operIp" xorm:"default '''' comment('主机地址') VARCHAR(50)"` + OperLocation string `json:"operLocation" xorm:"default '''' comment('操作地点') VARCHAR(255)"` + RequestParam string `json:"requestParam" xorm:"default '''' comment('请求参数') VARCHAR(2000)"` + Result string `json:"result" xorm:"default '''' comment('返回参数') VARCHAR(2000)"` + Status int `json:"status" xorm:"default 0 comment('日志状态:0正常日志 1错误日志') TINYINT(1)"` + UserAgent string `json:"user_agent" xorm:"default 'NULL' comment('代理信息') TEXT"` + Note string `json:"note" xorm:"default 'NULL' comment('备注') VARCHAR(2000)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('操作时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"not null default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *OperLog) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *OperLog) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *OperLog) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *OperLog) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&OperLog{}) +} + +// 批量删除 +func (r *OperLog) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&OperLog{}) +} diff --git a/app/model/position.go b/app/model/position.go new file mode 100644 index 0000000..6dd05f7 --- /dev/null +++ b/app/model/position.go @@ -0,0 +1,42 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Position struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(11)"` + Name string `json:"name" xorm:"default 'NULL' comment('岗位名称') index VARCHAR(30)"` + Status int `json:"status" xorm:"default 1 comment('状态:1正常 2停用') TINYINT(1)"` + Sort int `json:"sort" xorm:"default 125 comment('显示顺序') INT(11)"` + CreateUser int `json:"create_user" xorm:"default 0 comment('添加人') INT(11)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(11)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"default 1 comment('有效标识') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Position) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Position) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Position) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Position) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Position{}) +} + +// 批量删除 +func (r *Position) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Position{}) +} diff --git a/app/model/role.go b/app/model/role.go new file mode 100644 index 0000000..129d9f6 --- /dev/null +++ b/app/model/role.go @@ -0,0 +1,44 @@ +package model + +import ( + "easygoadmin/utils" +) + +type Role struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(10)"` + Name string `json:"name" xorm:"not null comment('角色名称') index VARCHAR(30)"` + Code string `json:"code" xorm:"not null comment('角色标签') VARCHAR(100)"` + Note string `json:"note" xorm:"default 'NULL' comment('备注') VARCHAR(255)"` + Sort int `json:"sort" xorm:"not null default 125 comment('排序') SMALLINT(5)"` + Status int `json:"status" xorm:"not null default 1 comment('状态:1正常 2停用') TINYINT(1)"` + CreateUser int `json:"create_user" xorm:"not null default 0 comment('添加人') INT(10)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('添加时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(10)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识(1正常 0删除)') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *Role) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *Role) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *Role) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *Role) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&Role{}) +} + +// 批量删除 +func (r *Role) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&Role{}) +} diff --git a/app/model/role_menu.go b/app/model/role_menu.go new file mode 100644 index 0000000..e9592d5 --- /dev/null +++ b/app/model/role_menu.go @@ -0,0 +1,23 @@ +package model + +import "easygoadmin/utils" + +type RoleMenu struct { + RoleId int `json:"role_id" xorm:"not null default 0 comment('角色ID') SMALLINT(5)"` + MenuId int `json:"menu_id" xorm:"not null default 0 comment('菜单ID') index SMALLINT(5)"` +} + +// 根据条件查询单条数据 +func (r *RoleMenu) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *RoleMenu) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 批量删除 +func (r *RoleMenu) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&RoleMenu{}) +} diff --git a/app/model/user.go b/app/model/user.go new file mode 100644 index 0000000..582dbfa --- /dev/null +++ b/app/model/user.go @@ -0,0 +1,64 @@ +package model + +import ( + "easygoadmin/utils" +) + +type User struct { + Id int `json:"id" xorm:"not null pk autoincr comment('主键ID') INT(11)"` + Realname string `json:"realname" xorm:"default 'NULL' comment('真实姓名') index VARCHAR(150)"` + Nickname string `json:"nickname" xorm:"default 'NULL' comment('昵称') VARCHAR(150)"` + Gender int `json:"gender" xorm:"default 3 comment('性别:1男 2女 3保密') TINYINT(1)"` + Avatar string `json:"avatar" xorm:"default 'NULL' comment('头像') VARCHAR(150)"` + Mobile string `json:"mobile" xorm:"default 'NULL' comment('手机号码') CHAR(11)"` + Email string `json:"email" xorm:"default 'NULL' comment('邮箱地址') VARCHAR(30)"` + Birthday int64 `json:"birthday" xorm:"default 'NULL' comment('出生日期') DATE"` + DeptId int `json:"deptId" xorm:"default 0 comment('部门ID') INT(11)"` + LevelId int `json:"levelId" xorm:"default 0 comment('职级ID') INT(11)"` + PositionId int `json:"positionId" xorm:"default 0 comment('岗位ID') SMALLINT(3)"` + ProvinceCode string `json:"province_code" xorm:"default 'NULL' comment('省份编号') VARCHAR(50)"` + CityCode string `json:"city_code" xorm:"default 'NULL' comment('市区编号') VARCHAR(50)"` + DistrictCode string `json:"district_code" xorm:"default 'NULL' comment('区县编号') VARCHAR(50)"` + Address string `json:"address" xorm:"default 'NULL' comment('详细地址') VARCHAR(255)"` + CityName string `json:"city_name" xorm:"default 'NULL' comment('所属城市') VARCHAR(150)"` + Username string `json:"username" xorm:"default 'NULL' comment('登录用户名') VARCHAR(50)"` + Password string `json:"password" xorm:"default 'NULL' comment('登录密码') VARCHAR(150)"` + Salt string `json:"salt" xorm:"default 'NULL' comment('盐加密') VARCHAR(30)"` + Intro string `json:"intro" xorm:"default 'NULL' comment('个人简介') VARCHAR(500)"` + Status int `json:"status" xorm:"default 1 comment('状态:1正常 2禁用') TINYINT(1)"` + Note string `json:"note" xorm:"default 'NULL' comment('备注') VARCHAR(500)"` + Sort int `json:"sort" xorm:"default 125 comment('排序号') INT(11)"` + LoginNum int `json:"login_num" xorm:"default 0 comment('登录次数') INT(11)"` + LoginIp string `json:"login_ip" xorm:"default 'NULL' comment('最近登录IP') VARCHAR(20)"` + LoginTime int64 `json:"login_time" xorm:"default 'NULL' comment('最近登录时间') DATETIME"` + CreateUser int `json:"create_user" xorm:"default 0 comment('添加人') INT(10)"` + CreateTime int64 `json:"create_time" xorm:"default 'NULL' comment('创建时间') DATETIME"` + UpdateUser int `json:"update_user" xorm:"default 0 comment('更新人') INT(10)"` + UpdateTime int64 `json:"update_time" xorm:"default 'NULL' comment('更新时间') DATETIME"` + Mark int `json:"mark" xorm:"not null default 1 comment('有效标识(1正常 0删除)') TINYINT(1)"` +} + +// 根据条件查询单条数据 +func (r *User) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *User) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 更新数据 +func (r *User) Update() (int64, error) { + return utils.XormDb.Id(r.Id).Update(r) +} + +// 删除 +func (r *User) Delete() (int64, error) { + return utils.XormDb.Id(r.Id).Delete(&User{}) +} + +// 批量删除 +func (r *User) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&User{}) +} diff --git a/app/model/user_role.go b/app/model/user_role.go new file mode 100644 index 0000000..b73c346 --- /dev/null +++ b/app/model/user_role.go @@ -0,0 +1,27 @@ +package model + +import "easygoadmin/utils" + +type UserRole struct { + UserId int `json:"user_id" xorm:"not null default 0 comment('人员ID') index INT(10)"` + RoleId int `json:"role_id" xorm:"not null default 0 comment('角色ID') INT(10)"` +} + +func (r *UserRole) TableName() string { + return "sys_user_role" +} + +// 根据条件查询单条数据 +func (r *UserRole) Get() (bool, error) { + return utils.XormDb.Get(r) +} + +// 插入数据 +func (r *UserRole) Insert() (int64, error) { + return utils.XormDb.Insert(r) +} + +// 批量删除 +func (r *UserRole) BatchDelete(ids ...int64) (int64, error) { + return utils.XormDb.In("id", ids).Delete(&UserRole{}) +} diff --git a/app/service/ad.go b/app/service/ad.go new file mode 100644 index 0000000..64aad7d --- /dev/null +++ b/app/service/ad.go @@ -0,0 +1,222 @@ +/** + * 广告-服务类 + * @author + * @since 2021/11/15 + * @File : ad + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var Ad = new(adService) + +type adService struct{} + +func (s *adService) GetList(req *dto.AdPageReq) ([]vo.AdInfoVo, int64, error) { + // 创建查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 广告标题 + if req.Title != "" { + query = query.Where("title like ?", "%"+req.Title+"%") + } + } + // 排序 + query = query.OrderBy("sort asc") + // 分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 对象转换 + var list []model.Ad + count, err := query.FindAndCount(&list) + if err != nil { + return nil, 0, err + } + + // 数据处理 + result := make([]vo.AdInfoVo, 0) + for _, v := range list { + item := vo.AdInfoVo{} + item.Ad = v + // 广告封面 + if v.Cover != "" { + item.Cover = utils.GetImageUrl(v.Cover) + } + // 广告类型 + if v.Type > 0 { + item.TypeName = common.AD_TYPE_LIST[v.Type] + } + // 所属广告位 + if v.AdSortId > 0 { + adSortInfo := &model.AdSort{Id: v.AdSortId} + has, err := adSortInfo.Get() + if err == nil && has { + item.AdSortDesc = adSortInfo.Description + " >> " + gconv.String(adSortInfo.LocId) + } + } + result = append(result, item) + } + + // 返回结果 + return result, count, err +} + +func (s *adService) Add(req *dto.AdAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + + // 富文本处理 + content := utils.SaveImageContent(req.Content, req.Title, "ad") + + // 实例化对象 + var entity model.Ad + entity.Title = req.Title + entity.AdSortId = gconv.Int(req.AdSortId) + entity.Type = gconv.Int(req.Type) + entity.Description = req.Description + entity.Content = content + entity.Url = req.Url + entity.Width = gconv.Int(req.Width) + entity.Height = gconv.Int(req.Height) + // 开始日期转换 + startTime, _ := time.Parse("2006-01-02 15:04:05", req.StartTime) + entity.StartTime = startTime.Unix() + // 结束日期转换 + endTime, _ := time.Parse("2006-01-02 15:04:05", req.EndTime) + entity.EndTime = endTime.Unix() + entity.Status = gconv.Int(req.Status) + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 广告封面 + if entity.Type == 1 { + // 图片 + cover, err := utils.SaveImage(req.Cover, "ad") + if err != nil { + return 0, err + } + entity.Cover = cover + } else { + entity.Cover = "" + } + + // 插入数据 + return entity.Insert() +} + +func (s *adService) Update(req *dto.AdUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Ad{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + + // 富文本处理 + content := utils.SaveImageContent(req.Content, req.Title, "ad") + + // 设置对象 + entity.Title = req.Title + entity.AdSortId = gconv.Int(req.AdSortId) + entity.Type = gconv.Int(req.Type) + entity.Description = req.Description + entity.Content = content + entity.Url = req.Url + entity.Width = gconv.Int(req.Width) + entity.Height = gconv.Int(req.Height) + // 开始日期转换 + startTime, _ := time.Parse("2006-01-02 15:04:05", req.StartTime) + entity.StartTime = startTime.Unix() + // 结束日期转换 + endTime, _ := time.Parse("2006-01-02 15:04:05", req.EndTime) + entity.EndTime = endTime.Unix() + entity.Status = gconv.Int(req.Status) + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 广告封面 + if entity.Type == 1 { + // 图片 + cover, err := utils.SaveImage(req.Cover, "ad") + if err != nil { + return 0, err + } + entity.Cover = cover + } else { + entity.Cover = "" + } + + // 更新信息 + return entity.Update() +} + +func (s *adService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.Ad{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Ad{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *adService) Status(req *dto.AdStatusReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录是否存在 + info := &model.Ad{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置状态 + entity := &model.Ad{} + entity.Id = info.Id + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/ad_sort.go b/app/service/ad_sort.go new file mode 100644 index 0000000..06c5cfc --- /dev/null +++ b/app/service/ad_sort.go @@ -0,0 +1,167 @@ +/** + * 广告位-服务类 + * @author + * @since 2021/11/15 + * @File : ad_sort + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var AdSort = new(adSortService) + +type adSortService struct{} + +func (s *adSortService) GetList(req *dto.AdSortPageReq) ([]vo.AdSortInfoVo, int64, error) { + // 创建查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 广告位名称 + if req.Description != "" { + query = query.Where("description like ?", "%"+req.Description+"%") + } + } + // 排序 + query = query.OrderBy("sort asc") + // 分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 对象转换 + var list []model.AdSort + count, err := query.FindAndCount(&list) + if err != nil { + return nil, 0, err + } + + // 数据处理 + var result = make([]vo.AdSortInfoVo, 0) + for _, v := range list { + platformName, ok := common.ADSORT_PLATFORM_LIST[v.Platform] + item := vo.AdSortInfoVo{} + item.AdSort = v + if ok { + item.PlatformName = platformName + } + // 站点名称 + if v.ItemId > 0 { + info := &model.Item{Id: v.ItemId} + has, err2 := info.Get() + if err2 == nil && has { + item.ItemName = info.Name + } + } + + // 栏目名称 + if v.CateId > 0 { + cateName := ItemCate.GetCateName(v.CateId, ">>") + item.CateName = cateName + } + + // 加入数组 + result = append(result, item) + } + + return result, count, nil +} + +func (s *adSortService) Add(req *dto.AdSortAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.AdSort + entity.Description = req.Description + entity.ItemId = gconv.Int(req.ItemId) + entity.CateId = gconv.Int(req.CateId) + entity.LocId = gconv.Int(req.LocId) + entity.Platform = gconv.Int(req.Platform) + entity.Sort = gconv.Int(req.Sort) + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入数据 + return entity.Insert() +} + +func (s *adSortService) Update(req *dto.AdSortUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.AdSort{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + + // 设置对象 + entity.Description = req.Description + entity.ItemId = gconv.Int(req.ItemId) + entity.CateId = gconv.Int(req.CateId) + entity.LocId = gconv.Int(req.LocId) + entity.Platform = gconv.Int(req.Platform) + entity.Sort = gconv.Int(req.Sort) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 更新记录 + return entity.Update() +} + +func (s *adSortService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.AdSort{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.AdSort{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *adSortService) GetAdSortList() []vo.AdSortInfoVo { + // 查询广告位列表 + var list []model.AdSort + utils.XormDb.Where("mark=1").OrderBy("sort asc").Find(&list) + // 数据处理 + result := make([]vo.AdSortInfoVo, 0) + for _, v := range list { + item := vo.AdSortInfoVo{} + item.AdSort = v + item.Description = v.Description + " >> " + gconv.String(v.LocId) + result = append(result, item) + } + return result +} diff --git a/app/service/city.go b/app/service/city.go new file mode 100644 index 0000000..f9bc7a8 --- /dev/null +++ b/app/service/city.go @@ -0,0 +1,189 @@ +/** + * 城市-服务类 + * @author + * @since 2021/11/13 + * @File : city + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var City = new(cityService) + +type cityService struct{} + +func (s *cityService) GetList(req *dto.CityQueryReq) []vo.CityInfoVo { + // 创建查询对象 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 上级ID + query = query.Where("pid=?", req.Pid) + // 城市名称 + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + } + // 排序 + query = query.OrderBy("sort asc") + // 对象转换 + var list []model.City + query.FindAndCount(&list) + + // 数据解析 + var result = make([]vo.CityInfoVo, 0) + // 遍历数据 + for _, v := range list { + item := vo.CityInfoVo{} + item.City = v + if v.Level < 3 { + item.HaveChild = true + } else { + item.HaveChild = false + } + result = append(result, item) + } + return result +} + +func (s *cityService) Add(req *dto.CityAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.City + entity.Name = req.Name + entity.Pid = gconv.Int(req.Pid) + entity.Level = gconv.Int(req.Level) + entity.Citycode = req.Citycode + entity.PAdcode = req.PAdcode + entity.Adcode = req.Adcode + entity.Lng = req.Lng + entity.Lat = req.Lat + entity.Sort = gconv.Int(req.Sort) + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入记录 + return entity.Insert() +} + +func (s *cityService) Update(req *dto.CityUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.City{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + + // 设置对象属性 + entity.Name = req.Name + entity.Pid = gconv.Int(req.Pid) + entity.Level = gconv.Int(req.Level) + entity.Citycode = req.Citycode + entity.PAdcode = req.PAdcode + entity.Adcode = req.Adcode + entity.Lng = req.Lng + entity.Lat = req.Lat + entity.Sort = gconv.Int(req.Sort) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 更新记录 + return entity.Update() +} + +func (s *cityService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.City{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.City{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *cityService) GetChilds(cityCode string) ([]model.City, error) { + var info model.City + has, err := utils.XormDb.Where("citycode=?", cityCode).Get(&info) + if err != nil || !has { + return nil, errors.New("城市不能存在") + } + list := make([]model.City, 0) + utils.XormDb.Where("pid=? and mark=1", info.Id).Find(&list) + if err != nil { + return nil, err + } + return list, nil +} + +func (s *cityService) GetCityName(cityCode string, delimiter string) string { + //info := &model.City{Citycode: cityCode} + var info model.City + has, err := utils.XormDb.Where("citycode=?", cityCode).Get(&info) + if err != nil || !has { + return "" + } + // 城市ID + cityId := info.Id + // 声明数组 + list := make([]string, 0) + for { + if cityId <= 0 { + // 退出 + break + } + // 业务处理 + info = model.City{} + has2, err2 := utils.XormDb.Id(cityId).Get(&info) + if err2 != nil || !has2 { + break + } + // 上级栏目ID + cityId = info.Pid + // 加入数组 + list = append(list, info.Name) + } + // 结果数据处理 + if len(list) > 0 { + // 数组反转 + utils.Reverse(&list) + // 拼接字符串 + return strings.Join(list, delimiter) + } + return "" +} diff --git a/app/service/config.go b/app/service/config.go new file mode 100644 index 0000000..ec74681 --- /dev/null +++ b/app/service/config.go @@ -0,0 +1,100 @@ +/** + * 配置-服务类 + * @author + * @since 2021/11/13 + * @File : config + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var Config = new(configService) + +type configService struct{} + +func (s *configService) GetList() []model.Config { + // 创建查询对象 + query := utils.XormDb. + Where("mark=1"). + OrderBy("sort asc") + // 对象转换 + var list []model.Config + query.FindAndCount(&list) + return list +} + +func (s *configService) Add(req *dto.ConfigAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.Config + entity.Name = req.Name + entity.Sort = req.Sort + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入记录 + return entity.Insert() +} + +func (s *configService) Update(req *dto.ConfigUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Config{Id: req.Id} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + + // 设置对象 + entity.Name = req.Name + entity.Sort = req.Sort + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 更新数据 + return entity.Update() +} + +func (s *configService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.Config{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Config{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} diff --git a/app/service/config_data.go b/app/service/config_data.go new file mode 100644 index 0000000..04dc457 --- /dev/null +++ b/app/service/config_data.go @@ -0,0 +1,159 @@ +/** + * 配置数据-服务类 + * @author + * @since 2021/11/13 + * @File : config_data + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var ConfigData = new(configDataService) + +type configDataService struct{} + +func (s *configDataService) GetList(req *dto.ConfigDataPageReq) ([]vo.ConfigDataVo, int64, error) { + // 创建查询对象 + query := utils.XormDb.Where("config_id=?", req.ConfigId).Where("mark=1") + // 查询条件 + if req != nil { + // 字典项名称 + if req.Title != "" { + query = query.Where("title like ?", "%"+req.Title+"%") + } + } + // 排序 + query = query.OrderBy("sort asc") + // 分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 对象转换 + var list []model.ConfigData + count, err := query.FindAndCount(&list) + if err != nil { + return nil, 0, err + } + + // 数据源处理 + var result = make([]vo.ConfigDataVo, 0) + for _, v := range list { + typeName, ok := common.CONFIG_DATA_TYPE_LIST[v.Type] + item := vo.ConfigDataVo{} + item.ConfigData = v + if ok { + item.TypeName = typeName + } + result = append(result, item) + } + return result, count, nil +} + +func (s *configDataService) Add(req *dto.ConfigDataAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.ConfigData + entity.Title = req.Title + entity.Code = req.Code + entity.Value = req.Value + entity.Options = req.Options + entity.ConfigId = gconv.Int(req.ConfigId) + entity.Type = req.Type + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入数据 + return entity.Insert() +} + +func (s *configDataService) Update(req *dto.ConfigDataUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.ConfigData{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + + // 设置对象 + entity.Title = req.Title + entity.Code = req.Code + entity.Value = req.Value + entity.Options = req.Options + entity.ConfigId = gconv.Int(req.ConfigId) + entity.Type = req.Type + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 更新记录 + return entity.Update() +} + +func (s *configDataService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.ConfigData{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.ConfigData{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *configDataService) Status(req *dto.ConfigDataStatusReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录是否存在 + info := &model.ConfigData{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置状态 + entity := &model.ConfigData{} + entity.Id = info.Id + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/customer.go b/app/service/customer.go new file mode 100644 index 0000000..f20167b --- /dev/null +++ b/app/service/customer.go @@ -0,0 +1,164 @@ +/** + * 用户-服务类 + * @author + * @since 2021/11/11 + * @File : user + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "fmt" + "strings" + "time" +) + +var Customer = new(customerService) + +type customerService struct{} + +// 搜索 +func (s *customerService) Search(req *dto.CustomerSearchReq) map[string]interface{} { + mobile := req.Mobile + outTradeNo := req.OutTradeNo + + reData := map[string]interface{}{} + + userList := make([]model.PbUser, 0) + couponList := make([]model.PbOrderCoupon, 0) + rechargeList := make([]model.PbOrderRecharge, 0) + reData["coupon_orders"] = couponList + reData["recharge_orders"] = rechargeList + if mobile == "" && outTradeNo == "" { + return reData + } + + userIdStr := "" + userIdArr := make([]string, 0) + + if mobile != "" { + userList = PbUser.GetListByMobile(mobile, "") + if len(userList) > 0 { + for _, item := range userList { + userIdArr = append(userIdArr, gconv.String(item.Id)) + } + userIdStr = fmt.Sprintf("user_id in (%s)", strings.Join(userIdArr, ",")) + } + } + queryCoupon := utils.XormDb.Where("status != 1") + queryRecharge := utils.XormDb.Where("status != 1") + if userIdStr != "" { + queryCoupon = queryCoupon.Where(userIdStr) + queryRecharge = utils.XormDb. + Where("re_mobile like ? AND status != 1", fmt.Sprintf("%s%s%s", "%", mobile, "%")). + Or(fmt.Sprintf("%s%s", userIdStr, " AND status != 1")) + } + if outTradeNo != "" { + if strings.Contains(outTradeNo, "coupon") { + queryCoupon = queryCoupon.Where("out_trade_no like ?", fmt.Sprintf("%s%s%s", "%", outTradeNo, "%")) + } + if strings.Contains(outTradeNo, "recharge") { + queryRecharge = queryRecharge.Where("out_trade_no like ?", fmt.Sprintf("%s%s%s", "%", outTradeNo, "%")) + } + } + queryCoupon.Desc("id"). + Limit(20). + Find(&couponList) + queryRecharge.Desc("id"). + Limit(20). + Find(&rechargeList) + + reData["coupon_orders"] = couponList + reData["recharge_orders"] = rechargeList + + return reData +} + +func (s *customerService) CouponRefund(req *dto.CustomerCouponRefundReq, workId int) (string, bool) { + msg := "" + orderInfo := &model.PbOrderCoupon{Id: gconv.Int(req.Ids)} + has, err := orderInfo.Get() + //状态:1=待支付,2=待使用,3=已使用,4=已退款,5=投诉中 + if err != nil || !has { + return "记录不存在", false + } + if orderInfo.Status == 1 { + return "订单未支付", false + } + if orderInfo.Status == 4 { + return "订单已退款", false + } + dom, ok := utils.Refund(orderInfo.PayId, orderInfo.OutTradeNo, orderInfo.TransactionId, orderInfo.WxComplaintId, orderInfo.PayAmount) + if !ok { + return "退款失败", false + } + if dom.Get("code").Int() == 1 { + update := new(model.PbOrderCoupon) + update.Status = 4 + update.RefundTime = model.XTime{Time: time.Now()} + update.Workid = int64(workId) + utils.XormDb.Id(orderInfo.Id).Cols("status, refund_time, work_id").Update(update) + + // 创建查询实例 + query := utils.XormDb.Where("user_id = ?", orderInfo.UserId) + + // 对象转换 + couponInfo := make([]model.PbUserCoupon, 0) + errCoupon := query.Find(&couponInfo) + if errCoupon == nil { + for _, item := range couponInfo { + if item.CouponAmount == 5 { + utils.XormDb.Exec("UPDATE pb_user_coupon SET left_num = left_num - 10, total_num = total_num - 10 where id = ? ", item.Id) + } else if item.CouponAmount == 10 { + utils.XormDb.Exec("UPDATE pb_user_coupon SET left_num = left_num - 5, total_num = total_num - 5 where id = ? ", item.Id) + } + } + } + + return "退款成功", true + } + msg = dom.Get("msg").String() + return msg, false +} + +func (s *customerService) RechargeRefund(req *dto.CustomerCouponRefundReq, workId int) (string, bool) { + + orderInfo := &model.PbOrderRecharge{Id: gconv.Int(req.Ids)} + has, err := orderInfo.Get() + //状态:1待支付 2未使用 3已使用 4补单中 5充值成功 6充值失败 7退款中 8已退款 + if err != nil || !has { + return "记录不存在", false + } + if orderInfo.Status == 1 { + return "订单未支付", false + } + if orderInfo.Status == 4 { + return "补单中 无法退款", false + } + if orderInfo.Status == 7 { + return "订单退款中", false + } + if orderInfo.Status == 8 { + return "订单已退款", false + } + str, ok := utils.RechargeRefund(orderInfo.RechargeType, orderInfo.RechargeNo, orderInfo.OutTradeNo) + if !ok { + return "退款失败", false + } + + update := new(model.PbOrderRecharge) + update.WorkId = int64(workId) + if ok { + update.Status = 7 + update.RefundTime = model.XTime{Time: time.Now()} + utils.XormDb.Id(orderInfo.Id).Cols("status, refund_time, work_id").Update(update) + return str, true + } else { + utils.XormDb.Id(orderInfo.Id).Cols("work_id").Update(update) + return str, false + } + +} diff --git a/app/service/dept.go b/app/service/dept.go new file mode 100644 index 0000000..61dfa59 --- /dev/null +++ b/app/service/dept.go @@ -0,0 +1,171 @@ +/** + * 部门-服务类 + * @author + * @since 2021/9/13 + * @File : dept + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "reflect" + "strconv" + "strings" + "time" +) + +var Dept = new(deptService) + +type deptService struct{} + +func (s *deptService) GetList(req *dto.DeptPageReq) ([]model.Dept, error) { + // 创建查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 部门名称 + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + } + // 排序 + query = query.OrderBy("sort") + // 查询数据 + var list []model.Dept + err := query.Find(&list) + if err != nil { + return nil, err + } + return list, nil +} + +func (s *deptService) Add(req *dto.DeptAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.Dept + entity.Name = req.Name + entity.Code = req.Code + entity.Fullname = req.Fullname + entity.Type = gconv.Int(req.Type) + entity.Pid = gconv.Int(req.Pid) + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + // 插入记录 + rows, err := entity.Insert() + if err != nil || rows == 0 { + return 0, errors.New("添加失败") + } + return rows, nil +} + +func (s *deptService) Update(req *dto.DeptUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Dept{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + // 设置参数 + entity.Name = req.Name + entity.Code = req.Code + entity.Fullname = req.Fullname + entity.Type = gconv.Int(req.Type) + entity.Pid = gconv.Int(req.Pid) + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + // 更新记录 + rows, err := entity.Update() + if err != nil || rows == 0 { + return 0, err + } + return rows, nil +} + +func (s *deptService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := model.Dept{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, err + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Dept{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +// 获取子级菜单 +func (s *deptService) GetDeptTreeList() ([]*vo.DeptTreeNode, error) { + var deptNode vo.DeptTreeNode + // 查询列表 + list := make([]model.Dept, 0) + utils.XormDb.Where("mark=1").Cols("id,name,pid").OrderBy("sort asc").Find(&list) + makeDeptTree(list, &deptNode) + return deptNode.Children, nil +} + +// 递归生成分类列表 +func makeDeptTree(cate []model.Dept, tn *vo.DeptTreeNode) { + for _, c := range cate { + if c.Pid == tn.Id { + child := &vo.DeptTreeNode{} + child.Dept = c + tn.Children = append(tn.Children, child) + makeDeptTree(cate, child) + } + } +} + +// 数据源转换 +func (s *deptService) MakeList(data []*vo.DeptTreeNode) map[int]string { + deptList := make(map[int]string, 0) + if reflect.ValueOf(data).Kind() == reflect.Slice { + // 一级栏目 + for _, val := range data { + deptList[val.Id] = val.Name + + // 二级栏目 + for _, v := range val.Children { + deptList[v.Id] = "|--" + v.Name + + // 三级栏目 + for _, vt := range v.Children { + deptList[vt.Id] = "|--|--" + vt.Name + } + } + } + } + return deptList +} diff --git a/app/service/dict.go b/app/service/dict.go new file mode 100644 index 0000000..390dc70 --- /dev/null +++ b/app/service/dict.go @@ -0,0 +1,106 @@ +/** + * 字典-服务类 + * @author + * @since 2021/11/13 + * @File : dict + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var Dict = new(dictService) + +type dictService struct{} + +func (s *dictService) GetList() []model.Dict { + // 创建查询对象 + query := utils.XormDb. + Where("mark=1"). + OrderBy("sort asc") + // 对象转换 + var list []model.Dict + query.FindAndCount(&list) + return list +} + +func (s *dictService) Add(req *dto.DictAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.Dict + entity.Name = req.Name + entity.Code = req.Code + entity.Sort = req.Sort + entity.Note = req.Note + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入记录 + return entity.Insert() +} + +func (s *dictService) Update(req *dto.DictUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Dict{Id: req.Id} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + if entity == nil { + return 0, errors.New("记录不存在") + } + + // 设置对象 + entity.Name = req.Name + entity.Code = req.Code + entity.Sort = req.Sort + entity.Note = req.Note + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + return entity.Update() +} + +func (s *dictService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.Dict{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Dict{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} diff --git a/app/service/dict_data.go b/app/service/dict_data.go new file mode 100644 index 0000000..c8fda44 --- /dev/null +++ b/app/service/dict_data.go @@ -0,0 +1,115 @@ +/** + * 字典数据-服务类 + * @author + * @since 2021/11/13 + * @File : dict_data + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var DictData = new(dictDataService) + +type dictDataService struct{} + +func (s *dictDataService) GetList(req *dto.DictDataPageReq) ([]model.DictData, int64, error) { + // 创建查询对象 + query := utils.XormDb.Where("dict_id=?", req.DictId).Where("mark=1") + // 查询条件 + if req != nil { + // 字典项名称 + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + } + // 排序 + query = query.OrderBy("sort asc") + // 分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 对象转换 + var list []model.DictData + count, err := query.FindAndCount(&list) + return list, count, err +} + +func (s *dictDataService) Add(req *dto.DictDataAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.DictData + entity.DictId = gconv.Int(req.DictId) + entity.Name = req.Name + entity.Code = req.Code + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入记录 + return entity.Insert() +} + +func (s *dictDataService) Update(req *dto.DictDataUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.DictData{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + // 设置对象 + entity.DictId = gconv.Int(req.DictId) + entity.Name = req.Name + entity.Code = req.Code + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 更新记录 + return entity.Update() +} + +func (s *dictDataService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.DictData{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.DictData{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} diff --git a/app/service/example.go b/app/service/example.go new file mode 100644 index 0000000..090be8a --- /dev/null +++ b/app/service/example.go @@ -0,0 +1,195 @@ +/** + * 演示一管理-服务类 + * @author + * @since 2022-04-19 + * @File : example + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strings" + "time" +) + +// 中间件管理服务 +var Example = new(exampleService) + +type exampleService struct{} + +func (s *exampleService) GetList(req *dto.ExamplePageReq) ([]vo.ExampleInfoVo, int64, error) { + // 初始化查询实例 + query := utils.XormDb.Where("mark=1") + if req != nil { + + // 测试名称 + + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + + // 状态:1正常 2停用 + + if req.Status > 0 { + query = query.Where("status = ?", req.Status) + } + + // 类型:1京东 2淘宝 3拼多多 4唯品会 + + if req.Type > 0 { + query = query.Where("type = ?", req.Type) + } + + // 是否VIP:1是 2否 + + if req.IsVip > 0 { + query = query.Where("is_vip = ?", req.IsVip) + } + + } + // 排序 + query = query.Asc("id") + // 分页设置 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 查询列表 + list := make([]model.Example, 0) + count, err := query.FindAndCount(&list) + + // 数据处理 + var result []vo.ExampleInfoVo + for _, v := range list { + item := vo.ExampleInfoVo{} + item.Example = v + + // 头像 + if v.Avatar != "" { + item.Avatar = utils.GetImageUrl(v.Avatar) + } + + result = append(result, item) + } + + // 返回结果 + return result, count, err +} + +func (s *exampleService) Add(req *dto.ExampleAddReq, userId int) (int64, error) { + // 实例化对象 + var entity model.Example + + entity.Name = req.Name + // 头像处理 + if req.Avatar != "" { + avatar, err := utils.SaveImage(req.Avatar, "example") + if err != nil { + return 0, err + } + entity.Avatar = avatar + } + entity.Content = req.Content + + entity.Status = gconv.Int(req.Status) + + entity.Type = gconv.Int(req.Type) + + entity.IsVip = gconv.Int(req.IsVip) + + entity.Sort = gconv.Int(req.Sort) + + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + // 插入数据 + return entity.Insert() +} + +func (s *exampleService) Update(req *dto.ExampleUpdateReq, userId int) (int64, error) { + // 查询记录 + entity := &model.Example{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + entity.Name = req.Name + // 头像处理 + if req.Avatar != "" { + avatar, err := utils.SaveImage(req.Avatar, "example") + if err != nil { + return 0, err + } + entity.Avatar = avatar + } + entity.Content = req.Content + + entity.Status = gconv.Int(req.Status) + + entity.Type = gconv.Int(req.Type) + + entity.IsVip = gconv.Int(req.IsVip) + + entity.Sort = gconv.Int(req.Sort) + + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + // 更新记录 + return entity.Update() +} + +// 删除 +func (s *exampleService) Delete(ids string) (int64, error) { + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.Example{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + return 0, nil + } +} + +func (s *exampleService) Status(req *dto.ExampleStatusReq, userId int) (int64, error) { + // 查询记录是否存在 + info := &model.Example{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置状态 + entity := &model.Example{} + entity.Id = info.Id + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} + +func (s *exampleService) IsVip(req *dto.ExampleIsVipReq, userId int) (int64, error) { + // 查询记录是否存在 + info := &model.Example{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置状态 + entity := &model.Example{} + entity.Id = info.Id + entity.IsVip = gconv.Int(req.IsVip) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/example2.go b/app/service/example2.go new file mode 100644 index 0000000..61c3595 --- /dev/null +++ b/app/service/example2.go @@ -0,0 +1,135 @@ +/** + * 演示二管理-服务类 + * @author + * @since 2022-04-19 + * @File : example2 + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strings" + "time" +) + +// 中间件管理服务 +var Example2 = new(example2Service) + +type example2Service struct{} + +func (s *example2Service) GetList(req *dto.Example2PageReq) ([]vo.Example2InfoVo, int64, error) { + // 初始化查询实例 + query := utils.XormDb.Where("mark=1") + if req != nil { + + // 演示名称 + + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + + // 状态:1正常 2停用 + + if req.Status > 0 { + query = query.Where("status = ?", req.Status) + } + + } + // 排序 + query = query.Asc("id") + // 分页设置 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 查询列表 + list := make([]model.Example2, 0) + count, err := query.FindAndCount(&list) + + // 数据处理 + var result []vo.Example2InfoVo + for _, v := range list { + item := vo.Example2InfoVo{} + item.Example2 = v + + result = append(result, item) + } + + // 返回结果 + return result, count, err +} + +func (s *example2Service) Add(req *dto.Example2AddReq, userId int) (int64, error) { + // 实例化对象 + var entity model.Example2 + + entity.Name = req.Name + + entity.Status = gconv.Int(req.Status) + + entity.Sort = gconv.Int(req.Sort) + + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + // 插入数据 + return entity.Insert() +} + +func (s *example2Service) Update(req *dto.Example2UpdateReq, userId int) (int64, error) { + // 查询记录 + entity := &model.Example2{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + entity.Name = req.Name + + entity.Status = gconv.Int(req.Status) + + entity.Sort = gconv.Int(req.Sort) + + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + // 更新记录 + return entity.Update() +} + +// 删除 +func (s *example2Service) Delete(ids string) (int64, error) { + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.Example2{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + return 0, nil + } +} + +func (s *example2Service) Status(req *dto.Example2StatusReq, userId int) (int64, error) { + // 查询记录是否存在 + info := &model.Example2{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置状态 + entity := &model.Example2{} + entity.Id = info.Id + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/generate.go b/app/service/generate.go new file mode 100644 index 0000000..7d870eb --- /dev/null +++ b/app/service/generate.go @@ -0,0 +1,1006 @@ +/** + * 代码生成器-服务类 + * @author + * @since 2021/11/15 + * @File : generate + */ +package service + +import ( + "bytes" + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "easygoadmin/utils/gfile" + "easygoadmin/utils/gstr" + "errors" + "github.com/gin-gonic/gin" + "html/template" + "io/ioutil" + "os" + "regexp" + "strings" + "time" +) + +// 中间件管理服务 +var Generate = new(generateService) + +type generateService struct{} + +func (s *generateService) GetList(req *dto.GeneratePageReq) ([]vo.GenerateInfo, error) { + // 查询SQL + sql := "SHOW TABLE STATUS" + // 查询条件 + if req != nil { + // 表名称 + if req.Name != "" { + sql += " WHERE Name like \"%" + req.Name + "%\"" + } + // 表描述 + if req.Comment != "" { + sql += " WHERE Comment like \"%" + req.Comment + "%\"" + } + } + // 对象转换 + var list []vo.GenerateInfo + err := utils.XormDb.SQL(sql).Find(&list) + if err != nil { + return nil, err + } + // 返回结果 + return list, nil +} + +func (s *generateService) Generate(req dto.GenerateFileReq, ctx *gin.Context) error { + if utils.AppDebug() { + return errors.New("演示环境,暂无权限操作") + } + // 数据表名 + tableName := req.Name + // 数据表描述 + moduleTitle := req.Comment + // 替换“表” + if gstr.Contains(moduleTitle, "表") { + moduleTitle = gstr.Replace(moduleTitle, "表", "") + } + // 替换“管理” + if gstr.Contains(moduleTitle, "管理") { + moduleTitle = gstr.Replace(moduleTitle, "管理", "") + } + // 模型名称 + moduleName := gstr.Replace(tableName, "sys_", "") + // 作者名称 + authorName := "" + + // 获取字段列表 + columnList, err := GetColumnList(tableName) + if err != nil { + return err + } + + // 生成控制器 + if err := GenerateController(columnList, authorName, moduleName, moduleTitle); err != nil { + return err + } + + // 生成控制器 + if err := GenerateDto(columnList, authorName, moduleName, moduleTitle); err != nil { + return err + } + + // 生成Vo + if err := GenerateInfoVo(columnList, authorName, moduleName, moduleTitle); err != nil { + return err + } + + // 生成服务类 + if err := GenerateService(columnList, authorName, moduleName, moduleTitle); err != nil { + return err + } + + // 生成模块index.html + if err := GenerateIndex(columnList, moduleName, moduleTitle); err != nil { + return err + } + + // 生成模块edit.html + if err := GenerateEdit(columnList, moduleName, moduleTitle); err != nil { + return err + } + + // 生成模块JS + if err := GenerateJs(columnList, authorName, moduleName, moduleTitle); err != nil { + return err + } + + // 生成菜单权限 + if err := GeneratePermission(moduleName, moduleTitle, utils.Uid(ctx)); err != nil { + return err + } + + // 生成路由 + if err := GenerateRouter(columnList, authorName, moduleName, moduleTitle); err != nil { + return err + } + + return nil +} + +// 生成控制器 +func GenerateController(dataList *common.ArrayList, authorName string, moduleName string, moduleTitle string) error { + // 初始化表单数组 + columnList := make([]map[string]interface{}, 0) + for i := 0; i < dataList.Size(); i++ { + // 当前元素 + data := dataList.Get(i) + // 类型转换 + item := data.(map[string]interface{}) + // 字段列名 + columnName := gconv.String(item["columnName"]) + // 移除部分非表单字段 + if columnName == "id" || + columnName == "create_user" || + columnName == "create_time" || + columnName == "update_user" || + columnName == "update_time" || + columnName == "mark" { + continue + } + // 加入数组 + columnList = append(columnList, item) + } + + // 加载自定义模板绑定数据并写入文件 + if tmp, err := LoadTemplate("controller.html", gin.H{ + "author": authorName, + "since": time.Now().Format("2006-01-02"), + "moduleName": moduleName, + "entityName": gstr.UcWords(moduleName), + "moduleTitle": moduleTitle, + "columnList": columnList, + }, false); err == nil { + // 获取项目根目录 + curDir, err := os.Getwd() + if err != nil { + return err + } + // 文件路径 + fileName := strings.Join([]string{curDir, "/app/controller/", moduleName, ".go"}, "") + // 删除现有文件 + if err := gfile.Remove(fileName); err != nil { + return err + } + // 写入文件 + if !gfile.Exists(fileName) { + f, err := gfile.Create(fileName) + if err == nil { + // 写入文件 + f.WriteString(tmp) + } + // 关闭 + f.Close() + } + } + return nil +} + +// 生成Dto +func GenerateDto(dataList *common.ArrayList, authorName string, moduleName string, moduleTitle string) error { + // 初始化查询条件 + queryList := make([]map[string]interface{}, 0) + // 初始化表单数组 + columnList := make([]map[string]interface{}, 0) + for i := 0; i < dataList.Size(); i++ { + // 当前元素 + data := dataList.Get(i) + // 类型转换 + item := data.(map[string]interface{}) + // 字段列名 + columnName := gconv.String(item["columnName"]) + // 移除部分非表单字段 + if columnName == "id" || + columnName == "create_user" || + columnName == "create_time" || + columnName == "update_user" || + columnName == "update_time" || + columnName == "mark" { + continue + } + // 常规字段查询条件 + if columnName == "name" || columnName == "title" { + // 加入查询条件数组 + queryList = append(queryList, item) + } + // 常规下拉选择查询条件 + if _, ok := item["columnValue"]; ok && item["columnValue"] != "" { + queryList = append(queryList, item) + } + // 加入数组 + columnList = append(columnList, item) + } + + // 加载自定义模板绑定数据并写入文件 + if tmp, err := LoadTemplate("dto.html", gin.H{ + "author": authorName, + "since": time.Now().Format("2006-01-02"), + "moduleName": moduleName, + "entityName": gstr.UcWords(moduleName), + "moduleTitle": moduleTitle, + "columnList": columnList, + "queryList": queryList, + }, false); err == nil { + // 获取项目根目录 + curDir, err := os.Getwd() + if err != nil { + return err + } + // 文件路径 + fileName := strings.Join([]string{curDir, "/app/dto/", moduleName, ".go"}, "") + // 删除现有文件 + if err := gfile.Remove(fileName); err != nil { + return err + } + // 写入文件 + if !gfile.Exists(fileName) { + f, err := gfile.Create(fileName) + if err == nil { + // 写入文件 + f.WriteString(tmp) + } + // 关闭 + f.Close() + } + } + return nil +} + +// 生成Vo +func GenerateInfoVo(dataList *common.ArrayList, authorName string, moduleName string, moduleTitle string) error { + // 初始化表单数组 + columnList := make([]map[string]interface{}, 0) + for i := 0; i < dataList.Size(); i++ { + // 当前元素 + data := dataList.Get(i) + // 类型转换 + item := data.(map[string]interface{}) + // 字段列名 + columnName := gconv.String(item["columnName"]) + // 移除部分非表单字段 + if columnName == "id" || + columnName == "create_user" || + columnName == "create_time" || + columnName == "update_user" || + columnName == "update_time" || + columnName == "mark" { + continue + } + // 加入数组 + columnList = append(columnList, item) + } + + // 加载自定义模板绑定数据并写入文件 + if tmp, err := LoadTemplate("vo.html", gin.H{ + "author": authorName, + "since": time.Now().Format("2006-01-02"), + "moduleName": moduleName, + "entityName": gstr.UcWords(moduleName), + "moduleTitle": moduleTitle, + "columnList": columnList, + }, false); err == nil { + // 获取项目根目录 + curDir, err := os.Getwd() + if err != nil { + return err + } + // 文件路径 + fileName := strings.Join([]string{curDir, "/app/vo/", moduleName, ".go"}, "") + // 删除现有文件 + if err := gfile.Remove(fileName); err != nil { + return err + } + // 写入文件 + if !gfile.Exists(fileName) { + f, err := gfile.Create(fileName) + if err == nil { + // 写入文件 + f.WriteString(tmp) + } + // 关闭 + f.Close() + } + } + return nil +} + +// 生成服务类 +func GenerateService(dataList *common.ArrayList, authorName string, moduleName string, moduleTitle string) error { + // 初始化查询条件 + queryList := make([]map[string]interface{}, 0) + // 初始化表单数组 + columnList := make([]map[string]interface{}, 0) + for i := 0; i < dataList.Size(); i++ { + // 当前元素 + data := dataList.Get(i) + // 类型转换 + item := data.(map[string]interface{}) + // 字段列名 + columnName := gconv.String(item["columnName"]) + // 移除部分非表单字段 + if columnName == "id" || + columnName == "create_user" || + columnName == "create_time" || + columnName == "update_user" || + columnName == "update_time" || + columnName == "mark" { + continue + } + // 常规字段查询条件 + if columnName == "name" || columnName == "title" { + // 加入查询条件数组 + queryList = append(queryList, item) + } + // 常规下拉选择查询条件 + if _, ok := item["columnValue"]; ok && item["columnValue"] != "" { + queryList = append(queryList, item) + } + // 加入数组 + columnList = append(columnList, item) + } + // 加载自定义模板绑定数据并写入文件 + if tmp, err := LoadTemplate("service.html", gin.H{ + "author": authorName, + "since": time.Now().Format("2006-01-02"), + "moduleName": moduleName, + "entityName": gstr.UcWords(moduleName), + "moduleTitle": moduleTitle, + "columnList": columnList, + "queryList": queryList, + }, false); err == nil { + // 获取项目根目录 + curDir, err := os.Getwd() + if err != nil { + return err + } + // 文件路径 + fileName := strings.Join([]string{curDir, "/app/service/", moduleName, ".go"}, "") + // 删除现有文件 + if err := gfile.Remove(fileName); err != nil { + return err + } + // 写入文件 + if !gfile.Exists(fileName) { + f, err := gfile.Create(fileName) + if err == nil { + // 写入文件 + f.WriteString(tmp) + } + // 关闭 + f.Close() + } + } + return nil +} + +// 生成列表页 +func GenerateIndex(dataList *common.ArrayList, moduleName string, moduleTitle string) error { + // 初始化查询条件 + queryList := make([]map[string]interface{}, 0) + for i := 0; i < dataList.Size(); i++ { + // 当前元素 + data := dataList.Get(i) + // 类型转换 + item := data.(map[string]interface{}) + // 字段列名 + columnName := item["columnName"] + if columnName == "name" || columnName == "title" { + // 加入查询条件数组 + queryList = append(queryList, item) + } + // 字段列表格式化,如isVip + columnName3 := gconv.String(item["columnName3"]) + // 判断是否有columnValue键值 + if _, ok := item["columnValue"]; ok && item["columnValue"] != "" { + // 加入查询条件数组 + item["columnWidget"] = `{{select "` + gconv.String(columnName3) + `|0|` + gconv.String(item["columnTitle"]) + `|name|id" "` + gconv.String(item["columnValue"]) + `" 0}}` + queryList = append(queryList, item) + } + } + + // 加载自定义模板绑定数据并写入文件 + if tmp, err := LoadTemplate("index.html", gin.H{ + "queryList": queryList, + "funcList1": `{{query "查询"}} + {{add "添加` + moduleTitle + `" "{}"}} + {{dall "批量删除"}}`, + "funcList2": `{{edit "编辑"}} + {{delete "删除"}}`, + "defineStart": "{{define \"content\"}}", + "defineEnd": "{{end}}", + }, true); err == nil { + // 获取项目根目录 + curDir, err := os.Getwd() + if err != nil { + return err + } + // 文件路径 + fileName := strings.Join([]string{curDir, "/views/includes/", moduleName, "/" + moduleName + "_index.html"}, "") + // 删除现有文件 + if err := gfile.Remove(fileName); err != nil { + return err + } + // 写入文件 + if !gfile.Exists(fileName) { + f, err := gfile.Create(fileName) + if err == nil { + // 写入文件 + f.WriteString(tmp) + } + // 关闭 + f.Close() + } + } + return nil +} + +// 生成编辑表单 +func GenerateEdit(dataList *common.ArrayList, moduleName string, moduleTitle string) error { + // 初始化表单数组 + formList := make([]map[string]interface{}, 0) + // 初始化图片数组 + imageList := make([]map[string]interface{}, 0) + // 初始化多行数组 + rowsList := make([]map[string]interface{}, 0) + for i := 0; i < dataList.Size(); i++ { + // 当前元素 + data := dataList.Get(i) + // 类型转换 + item := data.(map[string]interface{}) + // 字段类型 + dataType := gconv.String(item["dataType"]) + // 字段列名 + columnName := gconv.String(item["columnName"]) + // 字段列表格式化,如IsVip + columnName2 := gconv.String(item["columnName2"]) + // 字段列表格式化,如isVip + columnName3 := gconv.String(item["columnName3"]) + // 字段标题 + columnTitle := gconv.String(item["columnTitle"]) + // 移除部分非表单字段 + if columnName == "id" || + columnName == "create_user" || + columnName == "create_time" || + columnName == "update_user" || + columnName == "update_time" || + columnName == "mark" { + continue + } + // 图片上传 + if _, ok := item["columnImage"]; ok && item["columnImage"] == true { + item["columnWidget"] = `{{upload_image "` + columnName3 + `|` + columnTitle + `|90x90|建议上传尺寸450x450" .info.` + columnName2 + ` "" 0}}` + // 加入数组 + imageList = append(imageList, item) + continue + } + + // 多行文本输入 + if _, ok := item["columnText"]; ok && item["columnText"] == true { + if dataType == "text" { + item["columnWidget"] = `{{kindeditor "` + columnName3 + `" "default" "80%" 350}}` + } + // 加入数组 + rowsList = append(rowsList, item) + continue + } + // 判断是否有columnValue键值 + if _, ok := item["columnValue"]; ok && item["columnValue"] != "" { + if _, isOk := item["columnSwitch"]; isOk && item["columnSwitch"] == true { + // 开关组件 + item["columnWidget"] = `{{switch "` + columnName3 + `" "` + gconv.String(item["columnSwitchValue"]) + `" .info.` + columnName2 + `}}` + } else { + // 下拉单选组件 + item["columnWidget"] = `{{select "` + columnName3 + `|0|` + columnTitle + `|name|id" "` + gconv.String(item["columnValue"]) + `" .info.` + columnName2 + `}}` + } + // 加入数组 + formList = append(formList, item) + continue + } + // 日期组件 + if dataType == "date" || dataType == "datetime" { + item["columnWidget"] = `{{date "` + columnName + `|1|` + columnTitle + `|` + dataType + `" .info.` + columnName2 + `}}` + formList = append(formList, item) + continue + } + // 加入数组 + formList = append(formList, item) + } + + // 初始化数据列数组 + columnList := make([]map[string]interface{}, 0) + + // 根据控制的个数实行分列显示(一行两列) + if len(formList)+len(imageList)+len(rowsList) > 10 { + // 一行两列排列 + } else { + // 单行排列 + columnList = formList + // 图片 + if len(imageList) > 0 { + // 遍历 + for _, v := range imageList { + columnList = append(columnList, v) + } + } + // 多行文本 + if len(rowsList) > 0 { + // 遍历 + for _, v := range rowsList { + columnList = append(columnList, v) + } + } + } + + // 加载自定义模板绑定数据并写入文件 + if tmp, err := LoadTemplate("edit.html", gin.H{ + "columnList": columnList, + "submitWidget": `{{submit "submit|立即保存,close|关闭" 1 ""}}`, + "defineStart": "{{define \"form\"}}", + "defineEnd": "{{end}}", + }, true); err == nil { + // 获取项目根目录 + curDir, err := os.Getwd() + if err != nil { + return err + } + // 文件路径 + fileName := strings.Join([]string{curDir, "/views/includes/", moduleName, "/" + moduleName + "_edit.html"}, "") + // 删除现有文件 + if err := gfile.Remove(fileName); err != nil { + return err + } + // 写入文件 + if !gfile.Exists(fileName) { + f, err := gfile.Create(fileName) + if err == nil { + // 写入文件 + f.WriteString(tmp) + } + // 关闭 + f.Close() + } + } + return nil +} + +// 生成模块JS文件 +func GenerateJs(dataList *common.ArrayList, authorName string, moduleName string, moduleTitle string) error { + // 初始化表单数组 + columnList := make([]map[string]interface{}, 0) + for i := 0; i < dataList.Size(); i++ { + // 当前元素 + data := dataList.Get(i) + // 类型转换 + item := data.(map[string]interface{}) + // 字段列名 + columnName := gconv.String(item["columnName"]) + // 移除部分非表单字段 + if columnName == "id" || + columnName == "create_user" || + columnName == "create_time" || + columnName == "update_user" || + columnName == "update_time" || + columnName == "mark" { + continue + } + // 加入数组 + columnList = append(columnList, item) + } + + // 读取HTML模板并绑定数据 + // 加载自定义模板绑定数据并写入文件 + if tmp, err := LoadTemplate("js.html", gin.H{ + "author": authorName, + "since": time.Now().Format("2006-01-02"), + "moduleName": moduleName, + "entityName": gstr.UcWords(moduleName), + "moduleTitle": moduleTitle, + "columnList": columnList, + }, true); err == nil { + // 获取项目根目录 + curDir, err := os.Getwd() + if err != nil { + return err + } + // 文件路径 + fileName := strings.Join([]string{curDir, "/public/resource/module/easygoadmin_", moduleName, ".js"}, "") + // 删除现有文件 + if err := gfile.Remove(fileName); err != nil { + return err + } + // 写入文件 + if !gfile.Exists(fileName) { + f, err := gfile.Create(fileName) + if err == nil { + // 写入文件 + f.WriteString(tmp) + } + // 关闭 + f.Close() + } + } + return nil +} + +// 生成菜单和权限 +func GeneratePermission(modelName string, modelTitle string, userId int) error { + // 查询记录 + info := &model.Menu{Permission: "sys:" + modelName + ":index"} + has, err := info.Get() + if err != nil || !has { + return err + } + // 创建菜单 + var entity model.Menu + entity.Name = modelTitle + entity.Icon = "layui-icon-component" + entity.Url = "/" + modelName + "/index" + entity.Pid = 225 + entity.Type = 0 + entity.Permission = "sys:" + modelName + ":index" + entity.Status = 1 + entity.Target = 1 + entity.Sort = 10 + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + entity.Mark = 1 + // 记录ID + menuId := 0 + // 插入或更新记录 + if info == nil { + // 创建菜单 + _, err := utils.XormDb.Insert(entity) + if err != nil { + return err + } + // 菜单ID + menuId = entity.Id + } else { + // 更新菜单 + _, err := utils.XormDb.Id(info.Id).Update(entity) + if err != nil { + return err + } + // 菜单ID + menuId = info.Id + } + + // 删除现有节点 + menu := &model.Menu{Pid: menuId} + menu.Delete() + + // 创建节点 + funcList := []int{1, 5, 10, 15, 20, 25, 30} + for _, v := range funcList { + // 实例化对象 + var item model.Menu + item.Pid = menuId + item.Type = 1 + item.Status = 1 + item.Target = 1 + item.Sort = v + item.CreateUser = userId + item.CreateTime = time.Now().Unix() + item.Mark = 1 + + // 权限节点 + if v == 1 { + // 列表 + item.Name = "查询" + modelTitle + item.Url = "/" + modelName + "/list" + item.Permission = "sys:" + modelName + ":list" + } else if v == 5 { + // 添加 + item.Name = "添加" + modelTitle + item.Url = "/" + modelName + "/add" + item.Permission = "sys:" + modelName + ":add" + } else if v == 10 { + // 修改 + item.Name = "修改" + modelTitle + item.Url = "/" + modelName + "/update" + item.Permission = "sys:" + modelName + ":update" + } else if v == 15 { + // 删除 + item.Name = "删除" + modelTitle + item.Url = "/" + modelName + "/delete" + item.Permission = "sys:" + modelName + ":delete" + } else if v == 20 { + // 详情 + item.Name = modelTitle + "详情" + item.Url = "/" + modelName + "/detail" + item.Permission = "sys:" + modelName + ":detail" + } else if v == 25 { + // 状态 + item.Name = "设置状态" + item.Url = "/" + modelName + "/status" + item.Permission = "sys:" + modelName + ":status" + } else if v == 30 { + // 批量删除 + item.Name = "批量删除" + item.Url = "/" + modelName + "/dall" + item.Permission = "sys:" + modelName + ":dall" + } + + // 插入数据 + _, err := utils.XormDb.Insert(item) + if err != nil { + break + } + } + return nil +} + +// 生成路由文件 +func GenerateRouter(dataList *common.ArrayList, authorName string, moduleName string, moduleTitle string) error { + // 初始化表单数组 + columnList := make([]map[string]interface{}, 0) + for i := 0; i < dataList.Size(); i++ { + // 当前元素 + data := dataList.Get(i) + // 类型转换 + item := data.(map[string]interface{}) + // 字段列名 + columnName := gconv.String(item["columnName"]) + // 移除部分非表单字段 + if columnName == "id" || + columnName == "create_user" || + columnName == "create_time" || + columnName == "update_user" || + columnName == "update_time" || + columnName == "mark" { + continue + } + // 加入数组 + columnList = append(columnList, item) + } + + // 加载自定义模板绑定数据并写入文件 + if tmp, err := LoadTemplate("router.html", gin.H{ + "author": authorName, + "since": time.Now().Format("2006-01-02"), + "moduleName": moduleName, + "entityName": gstr.UcWords(moduleName), + "moduleTitle": moduleTitle, + "columnList": columnList, + }, false); err == nil { + // 获取项目根目录 + curDir, err := os.Getwd() + if err != nil { + return err + } + // 文件路径 + fileName := strings.Join([]string{curDir, "/router/", moduleName, ".go"}, "") + // 删除现有文件 + if err := gfile.Remove(fileName); err != nil { + return err + } + // 写入文件 + if !gfile.Exists(fileName) { + f, err := gfile.Create(fileName) + if err == nil { + // 写入文件 + f.WriteString(tmp) + } + // 关闭 + f.Close() + } + } + return nil +} + +// 获取表字段列表 +func GetColumnList(tableName string) (*common.ArrayList, error) { + // 获取数据库名 + DbName, err := utils.GetDatabase() + if err != nil { + return nil, err + } + + // 获取字段列表 + data, err := utils.XormDb.SQL("SELECT COLUMN_NAME,COLUMN_DEFAULT,DATA_TYPE,COLUMN_TYPE,COLUMN_COMMENT FROM information_schema.`COLUMNS` where TABLE_SCHEMA = ? AND TABLE_NAME = ?", DbName, tableName).Query() + if err != nil { + return nil, err + } + + // 初始化数组 + result := common.New() //garray.NewArray(true) + for _, v := range data { + // 初始化Map + item := make(map[string]interface{}) + // 字段列名 + columnName := gconv.String(v["COLUMN_NAME"]) + // 系统常规字段直接跳过 + if columnName == "create_user" || + columnName == "create_time" || + columnName == "update_user" || + columnName == "update_time" || + columnName == "mark" { + continue + } + item["columnName"] = columnName + // 字段名称驼峰格式一 + columnName2 := gstr.UcWords(columnName) + if gstr.Contains(columnName, "_") { + nameArr := gstr.Split(columnName, "_") + columnName2 = gstr.UcWords(nameArr[0]) + gstr.UcWords(nameArr[1]) + } + item["columnName2"] = columnName2 + + // 字段名称驼峰格式二 + columnName3 := columnName + if gstr.Contains(columnName, "_") { + nameArr := gstr.Split(columnName, "_") + columnName3 = nameArr[0] + gstr.UcWords(nameArr[1]) + } + item["columnName3"] = columnName3 + + // 字段默认值 + item["columnDefault"] = v["COLUMN_DEFAULT"] + // 字段数据类型 + dataType := gconv.String(v["DATA_TYPE"]) + item["dataType"] = dataType + if dataType == "int" || dataType == "tinyint" || dataType == "smallint" { + // 整形 + item["columnType"] = "int" + } else if dataType == "bigint" { + item["columnType"] = "int64" + } else if dataType == "datetime" { + item["columnType"] = "int" + } else { + // 字符串类型 + item["columnType"] = "string" + } + // 默认参数 + item["columnSwitch"] = false + item["columnImage"] = false + item["columnText"] = false + item["columnValue"] = "" + item["columnValueList"] = "" + + // 字段描述 + columnComment := gconv.String(v["COLUMN_COMMENT"]) + item["columnComment"] = columnComment + // 判断是否有规则描述 + if gstr.Contains(columnComment, ":") || gstr.Contains(columnComment, ":") || gstr.Contains(columnComment, ":") { + // 正则根据冒号分裂字符串 + re := regexp.MustCompile("[:;:]") + commentItem := gstr.Split(re.ReplaceAllString(columnComment, "|"), "|") + // 字段标题 + item["columnTitle"] = commentItem[0] + + // 字段描述数据处理 + commentStr := gstr.Replace(commentItem[1], " ", "|") + commentArr := gstr.Split(commentStr, "|") + + // 实例化字段描述参数数组 + columnValue := make([]string, 0) + // 参数值Map列表 + columnValueList := make(map[int]string) + // 实例化字段描述文字数组 + columnSwitchValue := make([]string, 0) + // 下拉选择列表解析参数 + columnSelectValue := make([]string, 0) + for _, v := range commentArr { + // 正则提取数字键 + regexp := regexp.MustCompile(`[0-9]+`) + vItem := regexp.FindStringSubmatch(v) + // 键 + key := vItem[0] + // 值 + value := gstr.Replace(v, vItem[0], "") + // 加入数组 + columnValue = append(columnValue, key+"="+value) + // 参数值Map + columnValueList[gconv.Int(key)] = value + // 开关专用参数值 + columnSwitchValue = append(columnSwitchValue, value) + // 下拉列表解析参数 + columnSelectValue = append(columnSelectValue, value) + } + // 字符串逗号拼接 + item["columnValue"] = gstr.Join(columnValue, ",") + item["columnValueList"] = columnValueList + item["columnSelectValue"] = gstr.Join(columnSelectValue, "','") + + // 开关判断 + if columnName == "status" || gstr.SubStr(columnName, 0, 3) == "is_" { + item["columnSwitch"] = true + item["columnSwitchValue"] = gstr.Join(columnSwitchValue, "|") + // 方法名处理 + columnSwitchName := "" + if gstr.Contains(columnName, "_") { + switchArr := gstr.Split(columnName, "_") + columnSwitchName = "set" + gstr.UcWords(switchArr[0]) + gstr.UcWords(switchArr[1]) + } else { + columnSwitchName = "set" + gstr.UcWords(columnName) + } + item["columnSwitchName"] = columnSwitchName + } + } else { + // 字段标题 + item["columnTitle"] = columnComment + } + + // 判断是否是图片 + if gstr.Contains(columnName, "cover") || + gstr.Contains(columnName, "avatar") || + gstr.Contains(columnName, "image") || + gstr.Contains(columnName, "logo") || + gstr.Contains(columnName, "pic") { + item["columnImage"] = true + } + + // 判断是否多行文本或富文本 + if gstr.Contains(columnName, "note") || + gstr.Contains(columnName, "remark") || + gstr.Contains(columnName, "content") || + gstr.Contains(columnName, "description") || + gstr.Contains(columnName, "intro") { + item["columnText"] = true + } + + // 加入数组 + result.Add(item) + } + return result, nil +} + +// 读取模板 +func LoadTemplate(templateName string, data interface{}, isReplace bool) (string, error) { + // 获取当前应用根目录 + curDir, err := os.Getwd() + if err != nil { + return "", err + } + // 读取模板文件及内容 + b, err := ioutil.ReadFile(curDir + "/templates/" + templateName) + if err != nil { + return "", err + } + // 创建一个模板 + //tmpl := template.New(templateName) + //tmpl = tmpl.Funcs(template.FuncMap{ + // "safe": func(str string) template.HTML { + // return template.HTML(str) + // }, + //}) + //tmpl, err = tmpl.Parse(string(b)) + tmpl, err := template.New(templateName).Funcs( + template.FuncMap{ + "safe": func(str string) template.HTML { + return template.HTML(str) + }, + }, + ).Parse(string(b)) + if err != nil { + return "", nil + } + buffer := bytes.NewBufferString("") + // 将string与模板合成,变量name的内容会替换掉{{.}} + err = tmpl.Execute(buffer, data) + if err != nil { + return "", nil + } + if isReplace { + // 替换script标签 + result := strings.Replace(buffer.String(), "checkedStart", "'+(d.", -1) + result = strings.Replace(result, "checkedEnd", "==1 ? 'checked' : '')+'", -1) + return result, nil + } else { + return buffer.String(), nil + } +} diff --git a/app/service/item.go b/app/service/item.go new file mode 100644 index 0000000..9a9b691 --- /dev/null +++ b/app/service/item.go @@ -0,0 +1,178 @@ +/** + * 站点-服务类 + * @author + * @since 2021/11/13 + * @File : item + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var Item = new(itemService) + +type itemService struct{} + +func (s *itemService) GetList(req *dto.ItemPageReq) ([]vo.ItemInfoVo, int64, error) { + // 创建查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 站点名称 + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + // 站点类型 + if req.Type > 0 { + query = query.Where("type=?", req.Type) + } + } + // 排序 + query = query.OrderBy("sort asc") + // 分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 对象转换 + var list []model.Item + count, err := query.FindAndCount(&list) + if err != nil { + return nil, 0, err + } + + // 数据处理 + var result = make([]vo.ItemInfoVo, 0) + for _, v := range list { + item := vo.ItemInfoVo{} + item.Item = v + // 站点类型 + typeName, ok := common.ITEM_TYPE_LIST[v.Type] + if ok { + item.TypeName = typeName + } + // 站点图片 + if v.Image != "" { + item.Image = utils.GetImageUrl(v.Image) + } + result = append(result, item) + } + return result, count, nil +} + +func (s *itemService) Add(req *dto.ItemAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.Item + entity.Name = req.Name + entity.Type = gconv.Int(req.Type) + entity.Url = req.Url + entity.Status = gconv.Int(req.Status) + entity.Note = req.Note + entity.Sort = gconv.Int(req.Status) + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 图片处理 + image, err := utils.SaveImage(req.Image, "item") + if err != nil { + return 0, err + } + entity.Image = image + + // 插入数据 + return entity.Insert() +} + +func (s *itemService) Update(req *dto.ItemUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Item{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + + // 设置对象 + entity.Name = req.Name + entity.Type = gconv.Int(req.Type) + entity.Url = req.Url + entity.Status = gconv.Int(req.Status) + entity.Note = req.Note + entity.Sort = gconv.Int(req.Status) + + // 图片处理 + image, err := utils.SaveImage(req.Image, "item") + if err != nil { + return 0, err + } + entity.Image = image + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 更新记录 + return entity.Update() +} + +func (s *itemService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.Item{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Item{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *itemService) Status(req *dto.ItemStatusReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录是否存在 + info := &model.Item{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置状态 + entity := &model.Item{} + entity.Id = info.Id + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/item_cate.go b/app/service/item_cate.go new file mode 100644 index 0000000..b7828c7 --- /dev/null +++ b/app/service/item_cate.go @@ -0,0 +1,263 @@ +/** + * 栏目-服务类 + * @author + * @since 2021/11/13 + * @File : item_cate + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "reflect" + "strconv" + "strings" + "time" +) + +var ItemCate = new(itemCateService) + +type itemCateService struct{} + +func (s *itemCateService) GetList(req *dto.ItemCateQueryReq) []vo.ItemCateInfoVo { + // 创建查询对象 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 栏目名称 + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + } + // 排序 + query = query.OrderBy("sort asc") + // 对象转换 + var list []model.ItemCate + query.Find(&list) + + // 数据处理 + var result []vo.ItemCateInfoVo + for _, v := range list { + item := vo.ItemCateInfoVo{} + item.ItemCate = v + // 站点封面 + if v.IsCover == 1 && v.Cover != "" { + item.Cover = utils.GetImageUrl(v.Cover) + } + // 获取栏目 + if v.ItemId > 0 { + var itemInfo model.Item + utils.XormDb.Id(item.Id).Get(&itemInfo) + item.ItemName = itemInfo.Name + } + // 加入数组 + result = append(result, item) + } + return result +} + +func (s *itemCateService) Add(req *dto.ItemCateAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.ItemCate + entity.Name = req.Name + entity.Pid = gconv.Int(req.Pid) + entity.ItemId = gconv.Int(req.ItemId) + entity.Pinyin = req.Pinyin + entity.Code = req.Code + entity.Status = gconv.Int(req.Status) + entity.Note = req.Note + entity.Sort = gconv.Int(req.Sort) + + // 封面 + entity.IsCover = gconv.Int(req.IsCover) + if entity.IsCover == 1 { + // 有封面 + cover, err := utils.SaveImage(req.Cover, "item_cate") + if err != nil { + return 0, err + } + entity.Cover = cover + } else { + // 没封面 + entity.Cover = "" + } + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入数据 + return entity.Insert() +} + +func (s *itemCateService) Update(req *dto.ItemCateUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.ItemCate{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + + // 设置对象 + entity.Name = req.Name + entity.Pid = gconv.Int(req.Pid) + entity.ItemId = gconv.Int(req.ItemId) + entity.Pinyin = req.Pinyin + entity.Code = req.Code + entity.Status = gconv.Int(req.Status) + entity.Note = req.Note + entity.Sort = gconv.Int(req.Sort) + + // 封面 + entity.IsCover = gconv.Int(req.IsCover) + if entity.IsCover == 1 { + // 有封面 + cover, err := utils.SaveImage(req.Cover, "item_cate") + if err != nil { + return 0, err + } + entity.Cover = cover + } else { + // 没封面 + entity.Cover = "" + } + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 更新记录 + return entity.Update() +} + +func (s *itemCateService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.ItemCate{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.ItemCate{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *itemCateService) GetCateName(cateId int, delimiter string) string { + // 声明数组 + list := make([]string, 0) + for { + if cateId <= 0 { + // 退出 + break + } + // 业务处理 + var info model.ItemCate + has, err := utils.XormDb.Id(cateId).Get(&info) + if err != nil || !has { + break + } + // 上级栏目ID + cateId = info.Pid + // 加入数组 + list = append(list, info.Name) + } + // 结果数据处理 + if len(list) > 0 { + // 数组反转 + utils.Reverse(&list) + // 拼接字符串 + return strings.Join(list, delimiter) + } + return "" +} + +// 获取子级菜单 +func (s *itemCateService) GetCateTreeList(itemId int, pid int) ([]*vo.CateTreeNode, error) { + var cateNote vo.CateTreeNode + // 创建查询实例 + query := utils.XormDb.Where("mark=1") + // 站点ID + if itemId > 0 { + query = query.Where("item_id=?", itemId) + } + // 返回字段 + query.Cols("id,name,pid") + // 排序 + query = query.OrderBy("sort asc") + // 查询所有 + data := make([]model.ItemCate, 0) + err := query.Find(&data) + if err != nil { + return nil, errors.New("系统错误") + } + makeCateTree(data, &cateNote) + return cateNote.Children, nil +} + +// 递归生成分类列表 +func makeCateTree(cate []model.ItemCate, tn *vo.CateTreeNode) { + for _, c := range cate { + if c.Pid == tn.Id { + child := &vo.CateTreeNode{} + child.ItemCate = c + tn.Children = append(tn.Children, child) + makeCateTree(cate, child) + } + } +} + +// 数据源转换 +func (s *itemCateService) MakeList(data []*vo.CateTreeNode) []map[string]string { + cateList := make([]map[string]string, 0) + if reflect.ValueOf(data).Kind() == reflect.Slice { + // 一级栏目 + for _, val := range data { + item := map[string]string{} + item["id"] = gconv.String(val.Id) + item["name"] = val.Name + cateList = append(cateList, item) + + // 二级栏目 + for _, v := range val.Children { + item2 := map[string]string{} + item2["id"] = gconv.String(v.Id) + item2["name"] = "|--" + v.Name + cateList = append(cateList, item2) + + // 三级栏目 + for _, vt := range v.Children { + item3 := map[string]string{} + item3["id"] = gconv.String(vt.Id) + item3["name"] = "|--|--" + vt.Name + cateList = append(cateList, item3) + } + } + } + } + return cateList +} diff --git a/app/service/level.go b/app/service/level.go new file mode 100644 index 0000000..720b717 --- /dev/null +++ b/app/service/level.go @@ -0,0 +1,133 @@ +/** + * 职级管理-服务类 + * @author + * @since 2021/8/20 + * @File : level + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "github.com/go-xorm/xorm" + "strconv" + "strings" + "time" +) + +var x *xorm.Engine + +// 中间件管理服务 +var Level = new(levelService) + +type levelService struct{} + +func (s *levelService) GetList(req *dto.LevelPageReq) ([]model.Level, int64, error) { + // 初始化查询实例 + query := utils.XormDb.Where("mark=1") + if req != nil { + // 职级名称查询 + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + } + // 排序 + query = query.Asc("sort") + // 分页设置 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 查询列表 + list := make([]model.Level, 0) + count, err := query.FindAndCount(&list) + // 返回结果 + return list, count, err +} + +func (s *levelService) Add(req *dto.LevelAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.Level + entity.Name = req.Name + entity.Status = gconv.Int(req.Status) + entity.Sort = gconv.Int(req.Sort) + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + // 插入数据 + return entity.Insert() +} + +func (s *levelService) Update(req *dto.LevelUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Level{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + entity.Name = req.Name + entity.Status = gconv.Int(req.Status) + entity.Sort = gconv.Int(req.Sort) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + // 更新记录 + return entity.Update() +} + +// 删除 +func (s *levelService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.Level{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Level{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *levelService) Status(req *dto.LevelStatusReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录是否存在 + info := &model.Level{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置状态 + entity := &model.Level{} + entity.Id = info.Id + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/link.go b/app/service/link.go new file mode 100644 index 0000000..39fcdcd --- /dev/null +++ b/app/service/link.go @@ -0,0 +1,204 @@ +/** + * 友链-服务类 + * @author + * @since 2021/11/13 + * @File : link + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var Link = new(linkService) + +type linkService struct{} + +func (s *linkService) GetList(req *dto.LinkPageReq) ([]vo.LinkInfoVo, int64, error) { + // 实例化对象 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 友链名称 + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + // 友链类型 + if req.Type > 0 { + query = query.Where("type=?", req.Type) + } + // 投放平台 + if req.Platform > 0 { + query = query.Where("platform=?", req.Platform) + } + } + // 排序 + query = query.OrderBy("sort asc") + // 分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 对象转换 + var list []model.Link + count, err := query.FindAndCount(&list) + if err != nil { + return nil, 0, err + } + + var result []vo.LinkInfoVo + for _, v := range list { + item := vo.LinkInfoVo{} + item.Link = v + // 友链图片 + if v.Image != "" { + item.Image = utils.GetImageUrl(v.Image) + } + // 友链类型 + typeName, ok := common.LINK_TYPE_LIST[v.Type] + if ok { + item.TypeName = typeName + } + // 友链形式 + formName, ok := common.LINK_FORM_LIST[v.Form] + if ok { + item.FormName = formName + } + // 投放平台 + platformName, ok := common.LINK_PLATFORM_LIST[v.Platform] + if ok { + item.PlatformName = platformName + } + result = append(result, item) + } + // 返回结果 + return result, count, nil +} + +func (s *linkService) Add(req *dto.LinkAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.Link + entity.Name = req.Name + entity.Type = gconv.Int(req.Type) + entity.Url = req.Url + entity.ItemId = gconv.Int(req.ItemId) + entity.CateId = gconv.Int(req.CateId) + entity.Platform = gconv.Int(req.Platform) + entity.Form = gconv.Int(req.Form) + entity.Status = gconv.Int(req.Status) + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 图片处理 + if req.Image != "" { + image, err := utils.SaveImage(req.Image, "link") + if err != nil { + return 0, err + } + entity.Image = image + } + + // 插入数据 + return entity.Insert() +} + +func (s *linkService) Update(req *dto.LinkUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Link{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + + // 设置对象 + entity.Name = req.Name + entity.Type = gconv.Int(req.Type) + entity.Url = req.Url + entity.ItemId = gconv.Int(req.ItemId) + entity.CateId = gconv.Int(req.CateId) + entity.Platform = gconv.Int(req.Platform) + entity.Form = gconv.Int(req.Form) + entity.Status = gconv.Int(req.Status) + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 图片处理 + if req.Image != "" { + image, err := utils.SaveImage(req.Image, "link") + if err != nil { + return 0, err + } + entity.Image = image + } + + // 更新记录 + return entity.Update() +} + +func (s *linkService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.Link{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Link{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *linkService) Status(req *dto.LinkStatusReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录是否存在 + info := &model.Link{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置状态 + entity := &model.Link{} + entity.Id = info.Id + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/login.go b/app/service/login.go new file mode 100644 index 0000000..6bd1cba --- /dev/null +++ b/app/service/login.go @@ -0,0 +1,67 @@ +/** + * 登录-服务类 + * @author + * @since 2021/9/7 + * @File : login + */ +package service + +import ( + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gstr" + "errors" + "github.com/gin-contrib/sessions" + "github.com/gin-gonic/gin" + "time" +) + +// 中间件管理服务 +var Login = new(loginService) + +type loginService struct{} + +// 系统登录 +func (s *loginService) UserLogin(username, password string, ctx *gin.Context) error { + // 查询用户 + var user model.User + has, err := utils.XormDb.Where("username=? and mark=1", username).Get(&user) + if err != nil && !has { + return errors.New("用户名或者密码不正确") + } + // 密码校验 + pwd, _ := utils.Md5(password + user.Username) + if user.Password != pwd { + return errors.New("密码不正确") + } + // 判断当前用户状态 + if user.Status != 1 { + return errors.New("您的账号已被禁用,请联系管理员") + } + + // 更新登录时间、登录IP + utils.XormDb.Id(user.Id).Update(&model.User{LoginTime: time.Now().Unix(), LoginIp: utils.GetClientIp(ctx), UpdateTime: time.Now().Unix()}) + + // 初始化session对象 + session := sessions.Default(ctx) + // 设置session数据 + session.Set("userId", user.Id) + // 保存session数据 + session.Save() + // 返回token + return nil +} + +// 获取个人信息 +func (s *loginService) GetProfile(ctx *gin.Context) (user *model.User) { + user = &model.User{Id: utils.Uid(ctx)} + has, err := user.Get() + if err != nil || !has { + return nil + } + // 头像 + if user.Avatar != "" && !gstr.Contains(user.Avatar, utils.ImageUrl()) { + user.Avatar = utils.GetImageUrl(user.Avatar) + } + return +} diff --git a/app/service/login_log.go b/app/service/login_log.go new file mode 100644 index 0000000..324cf6d --- /dev/null +++ b/app/service/login_log.go @@ -0,0 +1,61 @@ +/** + * 登录日志-服务类 + * @author + * @since 2021/11/12 + * @File : login_log + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strings" +) + +var LoginLog = new(loginLogService) + +type loginLogService struct{} + +func (s *loginLogService) GetList(req *dto.LoginLogPageReq) ([]model.LoginLog, int64, error) { + // 初始化查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 操作用户 + if req.Username != "" { + query = query.Where("username like ?", "%"+req.Username+"%") + } + } + // 排序 + query = query.OrderBy("id desc") + // 分页设置 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 实例化对象 + list := make([]model.LoginLog, 0) + count, err := query.FindAndCount(&list) + return list, count, err +} + +func (s *loginLogService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.LoginLog{Id: gconv.Int64(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + return 0, nil + } +} diff --git a/app/service/member.go b/app/service/member.go new file mode 100644 index 0000000..e0df680 --- /dev/null +++ b/app/service/member.go @@ -0,0 +1,235 @@ +/** + * 会员-服务类 + * @author + * @since 2021/11/13 + * @File : member + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var Member = new(memberService) + +type memberService struct{} + +func (s *memberService) GetList(req *dto.MemberPageReq) ([]vo.MemberInfoVo, int64, error) { + // 创建查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 用户名 + if req.Username != "" { + query = query.Where("username=?", req.Username) + } + // 性别 + if req.Gender > 0 { + query = query.Where("gender=?", req.Gender) + } + } + // 排序 + query = query.OrderBy("id desc") + // 分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 对象转换 + var list []model.Member + count, err := query.FindAndCount(&list) + if err != nil { + return nil, 0, err + } + + // 数据处理 + var result = make([]vo.MemberInfoVo, 0) + for _, v := range list { + item := vo.MemberInfoVo{} + item.Member = v + // 头像 + if v.Avatar != "" { + item.Avatar = utils.GetImageUrl(v.Avatar) + } + // 性别 + if v.Gender > 0 { + item.GenderName = utils.GENDER_LIST[v.Gender] + } + // 设备类型 + if v.Device > 0 { + item.DeviceName = common.MEMBER_DEVICE_LIST[v.Device] + } + // 会员来源 + if v.Source > 0 { + item.SourceName = common.MEMBER_SOURCE_LIST[v.Source] + } + // 所属城市 + if v.DistrictCode != "" { + item.CityName = City.GetCityName(v.DistrictCode, ">>") + } + // 省市区 + cityList := make([]string, 0) + // 省份编号 + cityList = append(cityList, item.ProvinceCode) + // 城市编号 + cityList = append(cityList, item.CityCode) + // 县区编号 + cityList = append(cityList, item.DistrictCode) + item.City = cityList + // 加入数组 + result = append(result, item) + } + return result, count, nil +} + +func (s *memberService) Add(req *dto.MemberAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.Member + entity.Username = req.Username + entity.MemberLevel = gconv.Int(req.MemberLevel) + entity.Realname = req.Realname + entity.Nickname = req.Nickname + entity.Gender = gconv.Int(req.Gender) + // 日期处理 + tm2, _ := time.Parse("01/02/2006", req.Birthday) + entity.Birthday = tm2.Unix() + entity.Address = req.Address + entity.Intro = req.Intro + entity.Signature = req.Signature + entity.Device = gconv.Int(req.Device) + entity.Source = gconv.Int(req.Source) + entity.Status = gconv.Int(req.Status) + entity.ProvinceCode = req.ProvinceCode + entity.CityCode = req.CityCode + entity.DistrictCode = req.DistrictCode + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 头像处理 + if req.Avatar != "" { + avatar, err := utils.SaveImage(req.Avatar, "member") + if err != nil { + return 0, err + } + entity.Avatar = avatar + } + + // 密码 + if req.Password != "" { + password, _ := utils.Md5(req.Password + req.Username) + entity.Password = password + } + + // 插入数据 + return entity.Insert() +} + +func (s *memberService) Update(req *dto.MemberUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Member{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + entity.Username = req.Username + entity.MemberLevel = gconv.Int(req.MemberLevel) + entity.Realname = req.Realname + entity.Nickname = req.Nickname + entity.Gender = gconv.Int(req.Gender) + // 日期处理 + tm2, _ := time.Parse("01/02/2006", req.Birthday) + entity.Birthday = tm2.Unix() + entity.Address = req.Address + entity.Intro = req.Intro + entity.Signature = req.Signature + entity.Device = gconv.Int(req.Device) + entity.Source = gconv.Int(req.Source) + entity.Status = gconv.Int(req.Status) + entity.ProvinceCode = req.ProvinceCode + entity.CityCode = req.CityCode + entity.DistrictCode = req.DistrictCode + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 头像处理 + if req.Avatar != "" { + avatar, err := utils.SaveImage(req.Avatar, "member") + if err != nil { + return 0, err + } + entity.Avatar = avatar + } + + // 密码 + if req.Password != "" { + password, _ := utils.Md5(req.Password + req.Username) + entity.Password = password + } + + // 调用更新方法 + return entity.Update() +} + +func (s *memberService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.Member{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Member{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *memberService) Status(req *dto.MemberStatusReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录是否存在 + info := &model.Member{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置状态 + entity := &model.Member{} + entity.Id = info.Id + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/member_level.go b/app/service/member_level.go new file mode 100644 index 0000000..6c57ccd --- /dev/null +++ b/app/service/member_level.go @@ -0,0 +1,110 @@ +/** + * 会员等级-服务类 + * @author + * @since 2021/11/13 + * @File : member_level + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var MemberLevel = new(memberLevelService) + +type memberLevelService struct{} + +func (s *memberLevelService) GetList(req *dto.MemberLevelPageReq) ([]model.MemberLevel, int64, error) { + // 创建查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 等级名称 + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + } + // 排序 + query = query.OrderBy("sort asc") + // 分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 对象转换 + var list []model.MemberLevel + count, err := query.FindAndCount(&list) + return list, count, err +} + +func (s *memberLevelService) Add(req *dto.MemberLevelAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.MemberLevel + entity.Name = req.Name + entity.Sort = gconv.Int(req.Sort) + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入数据 + return entity.Insert() +} + +func (s *memberLevelService) Update(req *dto.MemberLevelUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.MemberLevel{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + + // 设置参数 + entity.Name = req.Name + entity.Sort = gconv.Int(req.Sort) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 更新记录 + return entity.Update() +} + +func (s *memberLevelService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.MemberLevel{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.MemberLevel{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} diff --git a/app/service/menu.go b/app/service/menu.go new file mode 100644 index 0000000..27de3ee --- /dev/null +++ b/app/service/menu.go @@ -0,0 +1,356 @@ +/** + * 菜单-服务类 + * @author + * @since 2021/9/9 + * @File : menu + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "easygoadmin/utils/gstr" + "errors" + "reflect" + "strconv" + "strings" + "time" +) + +// 中间件管理服务 +var Menu = new(menuService) + +type menuService struct{} + +func (s *menuService) GetList(req *dto.MenuQueryReq) ([]model.Menu, error) { + // 创建查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 部门名称 + if req.Title != "" { + query = query.Where("title like ?", "%"+req.Title+"%") + } + } + // 排序 + query = query.OrderBy("sort") + // 查询列表 + var list []model.Menu + err := query.Find(&list) + if err != nil { + return nil, err + } + return list, nil +} + +func (s *menuService) Add(req *dto.MenuAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.Menu + entity.Pid = gconv.Int(req.Pid) + entity.Name = req.Name + entity.Icon = req.Icon + entity.Url = req.Url + entity.Target = gconv.Int(req.Target) + entity.Permission = req.Permission + entity.Type = gconv.Int(req.Type) + entity.Status = gconv.Int(req.Status) + entity.Note = req.Note + entity.Sort = gconv.Int(req.Sort) + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + // 插入数据 + rows, err := entity.Insert() + if err != nil || rows == 0 { + return 0, errors.New("添加失败") + } + // 添加节点 + setPermission(entity.Type, req.Func, req.Name, req.Url, gconv.Int(entity.Id), userId) + return rows, nil +} + +func (s *menuService) Update(req *dto.MenuUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Menu{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + entity.Pid = gconv.Int(req.Pid) + entity.Name = req.Name + entity.Icon = req.Icon + entity.Url = req.Url + entity.Target = gconv.Int(req.Target) + entity.Permission = req.Permission + entity.Type = gconv.Int(req.Type) + entity.Status = gconv.Int(req.Status) + entity.Note = req.Note + entity.Sort = gconv.Int(req.Sort) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + // 更新数据 + rows, err := entity.Update() + if err != nil || rows == 0 { + return 0, errors.New("更新失败") + } + + // 添加节点 + setPermission(entity.Type, req.Func, req.Name, req.Url, entity.Id, userId) + + return rows, nil +} + +func (s *menuService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := model.Menu{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, err + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Menu{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +// 添加节点 +func setPermission(menuType int, funcIds string, name string, url string, parentId int, userId int) { + if menuType != 0 || funcIds == "" || url == "" { + return + } + // 删除现有节点 + utils.XormDb.Where("pid=?", parentId).Delete(&model.Menu{}) + // 模块名称 + moduleTitle := gstr.Replace(name, "管理", "") + // 创建权限节点 + urlArr := strings.Split(url, "/") + + if len(urlArr) >= 3 { + // 模块名 + moduleName := urlArr[len(urlArr)-1] + // 节点处理 + checkedList := strings.Split(funcIds, ",") + for _, v := range checkedList { + // 实例化对象 + var entity model.Menu + // 节点索引 + value := gconv.Int(v) + if value == 1 { + entity.Name = "查询" + moduleTitle + entity.Url = "/" + moduleName + "/list" + entity.Permission = "sys:" + moduleName + ":list" + } else if value == 5 { + entity.Name = "添加" + moduleTitle + entity.Url = "/" + moduleName + "/add" + entity.Permission = "sys:" + moduleName + ":add" + } else if value == 10 { + entity.Name = "修改" + moduleTitle + entity.Url = "/" + moduleName + "/update" + entity.Permission = "sys:" + moduleName + ":update" + } else if value == 15 { + entity.Name = "删除" + moduleTitle + entity.Url = "/" + moduleName + "/delete" + entity.Permission = "sys:" + moduleName + ":delete" + } else if value == 20 { + entity.Name = moduleTitle + "详情" + entity.Url = "/" + moduleName + "/detail" + entity.Permission = "sys:" + moduleName + ":detail" + } else if value == 25 { + entity.Name = "设置状态" + entity.Url = "/" + moduleName + "/status" + entity.Permission = "sys:" + moduleName + ":status" + } else if value == 30 { + entity.Name = "批量删除" + entity.Url = "/" + moduleName + "/dall" + entity.Permission = "sys:" + moduleName + ":dall" + } else if value == 35 { + entity.Name = "添加子级" + entity.Url = "/" + moduleName + "/addz" + entity.Permission = "sys:" + moduleName + ":addz" + } else if value == 40 { + entity.Name = "全部展开" + entity.Url = "/" + moduleName + "/expand" + entity.Permission = "sys:" + moduleName + ":expand" + } else if value == 45 { + entity.Name = "全部折叠" + entity.Url = "/" + moduleName + "/collapse" + entity.Permission = "sys:" + moduleName + ":collapse" + } else if value == 50 { + entity.Name = "导出" + moduleTitle + entity.Url = "/" + moduleName + "/export" + entity.Permission = "sys:" + moduleName + ":export" + } else if value == 55 { + entity.Name = "导入" + moduleTitle + entity.Url = "/" + moduleName + "/import" + entity.Permission = "sys:" + moduleName + ":import" + } else if value == 60 { + entity.Name = "分配权限" + entity.Url = "/" + moduleName + "/permission" + entity.Permission = "sys:" + moduleName + ":permission" + } else if value == 65 { + entity.Name = "重置密码" + entity.Url = "/" + moduleName + "/resetPwd" + entity.Permission = "sys:" + moduleName + ":resetPwd" + } + entity.Pid = parentId + entity.Type = 1 + entity.Status = 1 + entity.Target = 1 + entity.Sort = value + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入节点 + entity.Insert() + } + } +} + +// 获取菜单权限列表 +func (s *menuService) GetPermissionList(userId int) interface{} { + if userId == 1 { + // 管理员(拥有全部权限) + menuList, _ := Menu.GetTreeList() + return menuList + } else { + // 非管理员 + + // 数据转换 + list := make([]model.Menu, 0) + // 查询数据 + utils.XormDb.Table("sys_menu").Alias("m"). + Join("INNER", []string{"sys_role_menu", "r"}, "m.id = r.menu_id"). + Join("INNER", []string{"sys_user_role", "ur"}, "ur.role_id=r.role_id"). + Where("ur.user_id=? AND m.type=0 AND m.`status`=1 AND m.mark=1", userId). + Cols("m.*"). + OrderBy("m.id asc"). + Find(&list) + + // 数据处理 + var menuNode vo.MenuTreeNode + makeTree(list, &menuNode) + return menuNode.Children + } +} + +// 获取子级菜单 +func (s *menuService) GetTreeList() ([]*vo.MenuTreeNode, error) { + var menuNode vo.MenuTreeNode + list := make([]model.Menu, 0) + err := utils.XormDb.Where("type=0 and mark=1").OrderBy("sort").Find(&list) + if err != nil { + return nil, err + } + makeTree(list, &menuNode) + return menuNode.Children, nil +} + +// 递归生成分类列表 +func makeTree(menu []model.Menu, tn *vo.MenuTreeNode) { + for _, c := range menu { + if c.Pid == tn.Id { + child := &vo.MenuTreeNode{} + child.Menu = c + tn.Children = append(tn.Children, child) + makeTree(menu, child) + } + } +} + +// 获取权限节点列表 +func (s *menuService) GetPermissionsList(userId int) []string { + if userId == 1 { + // 管理员,管理员拥有全部权限 + permissionList := make([]string, 0) + utils.XormDb.Table("sys_menu").Cols("permission").Where("type=1").Where("mark=1").Find(&permissionList) + return permissionList + } else { + // 非管理员 + permissionList := make([]string, 0) + utils.XormDb.Table("sys_menu").Alias("m"). + Join("INNER", []string{"sys_role_menu", "r"}, "m.id = r.menu_id"). + Join("INNER", []string{"sys_user_role", "ur"}, "ur.role_id=r.role_id"). + Where("ur.user_id=? AND m.type=1 AND m.`status`=1 AND m.mark=1", userId). + Cols("m.permission"). + Find(&permissionList) + return permissionList + } +} + +// 数据源转换 +func (s *menuService) MakeList(data []*vo.MenuTreeNode) map[int]string { + menuList := make(map[int]string, 0) + if reflect.ValueOf(data).Kind() == reflect.Slice { + // 一级栏目 + for _, val := range data { + menuList[val.Id] = val.Name + + // 二级栏目 + for _, v := range val.Children { + menuList[v.Id] = "|--" + v.Name + + // 三级栏目 + for _, vt := range v.Children { + menuList[vt.Id] = "|--|--" + vt.Name + } + } + } + } + return menuList +} + +// 获取菜单权限列表 +func (s *menuService) GetPermissionMenuList(userId int) interface{} { + if userId == 1 { + // 管理员(拥有全部权限) + menuList, _ := Menu.GetTreeList() + return menuList + } else { + // 非管理员 + + // 数据转换 + list := make([]model.Menu, 0) + // 查询数据 + utils.XormDb.Table("sys_menu").Alias("m"). + Join("INNER", []string{"sys_role_menu", "r"}, "m.id = r.menu_id"). + Join("INNER", []string{"sys_user_role", "ur"}, "ur.role_id=r.role_id"). + Where("ur.user_id=? AND m.type=0 AND m.`status`=1 AND m.mark=1", userId). + Cols("m.*"). + OrderBy("m.id asc"). + Find(&list) + + // 数据处理 + var menuNode vo.MenuTreeNode + makeTree(list, &menuNode) + return menuNode.Children + } +} diff --git a/app/service/notice.go b/app/service/notice.go new file mode 100644 index 0000000..d9f4cf5 --- /dev/null +++ b/app/service/notice.go @@ -0,0 +1,160 @@ +/** + * 通知公告-服务类 + * @author + * @since 2021/11/13 + * @File : notice + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/common" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var Notice = new(noticeService) + +type noticeService struct{} + +func (s *noticeService) GetList(req *dto.NoticePageReq) ([]vo.NoticeInfoVo, int64, error) { + // 创建查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 通知标题 + if req.Title != "" { + query = query.Where("title like ?", "%"+req.Title+"%") + } + // 通知来源 + if req.Source > 0 { + query = query.Where("source=?", req.Source) + } + } + // 排序 + query = query.OrderBy("id desc") + // 分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 对象转换 + var list []model.Notice + count, err := query.FindAndCount(&list) + if err != nil { + return nil, 0, err + } + + // 数据处理 + var result []vo.NoticeInfoVo + for _, v := range list { + item := vo.NoticeInfoVo{} + item.Notice = v + item.SourceName = common.NOTICE_SOURCE_LIST[v.Source] + result = append(result, item) + } + return result, count, nil +} + +func (s *noticeService) Add(req *dto.NoticeAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + + // 富文本处理 + content := utils.SaveImageContent(req.Content, req.Title, "notice") + // 实例化对象 + var entity model.Notice + entity.Title = req.Title + entity.Content = content + entity.IsTop = gconv.Int(req.IsTop) + entity.Source = gconv.Int(req.Source) + entity.Status = gconv.Int(req.Status) + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入数据 + return entity.Insert() +} + +func (s *noticeService) Update(req *dto.NoticeUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Notice{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, err + } + + // 富文本处理 + content := utils.SaveImageContent(req.Content, req.Title, "notice") + + // 设置参数 + entity.Title = req.Title + entity.Content = content + entity.IsTop = gconv.Int(req.IsTop) + entity.Source = gconv.Int(req.Source) + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + + // 更新记录 + return entity.Update() +} + +func (s *noticeService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.Notice{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Notice{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *noticeService) Status(req *dto.NoticeStatusReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录是否存在 + info := &model.Notice{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置状态 + entity := &model.Notice{} + entity.Id = info.Id + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/oper_log.go b/app/service/oper_log.go new file mode 100644 index 0000000..9fe2ac9 --- /dev/null +++ b/app/service/oper_log.go @@ -0,0 +1,42 @@ +/** + * 操作日志-服务类 + * @author + * @since 2021/11/12 + * @File : oper_log + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/utils" +) + +var OperLog = new(operLogService) + +type operLogService struct{} + +func (s *operLogService) GetList(req *dto.OperLogPageReq) ([]model.OperLog, int64, error) { + // 初始化查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 操作账号 + if req.Username != "" { + query = query.Where("username like ?", "%"+req.Username+"%") + } + // 操作模块 + if req.Model != "" { + query = query.Where("model like ?", "%"+req.Model+"%") + } + } + // 排序 + query = query.Desc("id") + // 分页设置 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 实例化对象 + list := make([]model.OperLog, 0) + count, err := query.FindAndCount(&list) + return list, count, err +} diff --git a/app/service/position.go b/app/service/position.go new file mode 100644 index 0000000..8ea8156 --- /dev/null +++ b/app/service/position.go @@ -0,0 +1,128 @@ +/** + * 岗位-服务类 + * @author + * @since 2021/9/10 + * @File : position + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var Position = new(positionService) + +type positionService struct{} + +func (s *positionService) GetList(req *dto.PositionPageReq) ([]model.Position, int64, error) { + // 初始化查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 岗位名称 + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + } + // 排序 + query = query.OrderBy("sort") + // 分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 查询数据 + var list []model.Position + count, err := query.FindAndCount(&list) + return list, count, err +} + +func (s *positionService) Add(req *dto.PositionAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化模型 + var entity model.Position + entity.Name = req.Name + entity.Status = gconv.Int(req.Status) + entity.Sort = gconv.Int(req.Sort) + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + // 插入数据 + return entity.Insert() +} + +func (s *positionService) Update(req *dto.PositionUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := &model.Position{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + entity.Name = req.Name + entity.Status = gconv.Int(req.Status) + entity.Sort = gconv.Int(req.Sort) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + // 更新数据 + return entity.Update() +} + +func (s *positionService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := model.Position{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Position{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *positionService) Status(req *dto.PositionStatusReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + info := &model.Position{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 更新状态 + entity := &model.Position{} + entity.Id = gconv.Int(req.Id) + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/role.go b/app/service/role.go new file mode 100644 index 0000000..d3ce1b1 --- /dev/null +++ b/app/service/role.go @@ -0,0 +1,140 @@ +/** + * 角色-服务类 + * @author + * @since 2021/9/13 + * @File : role + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var Role = new(roleService) + +type roleService struct{} + +func (s *roleService) GetList(req *dto.RolePageReq) ([]model.Role, int64, error) { + // 创建查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 角色名称 + if req.Name != "" { + query = query.Where("name like ?", "%"+req.Name+"%") + } + } + // 排序 + query = query.OrderBy("sort") + // 设置分页 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 查询数据 + var list []model.Role + count, err := query.FindAndCount(&list) + return list, count, err +} + +func (s *roleService) Add(req *dto.RoleAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 实例化对象 + var entity model.Role + entity.Name = req.Name + entity.Code = req.Code + entity.Status = gconv.Int(req.Status) + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + // 插入数据 + rows, err := entity.Insert() + if err != nil || rows == 0 { + return 0, errors.New("添加失败") + } + return rows, nil +} + +func (s *roleService) Update(req *dto.RoleUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + entity := model.Role{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + // 设置参数 + entity.Name = req.Name + entity.Code = req.Code + entity.Status = gconv.Int(req.Status) + entity.Sort = gconv.Int(req.Sort) + entity.Note = req.Note + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + // 更新数据 + rows, err := entity.Update() + if err != nil || rows == 0 { + return 0, err + } + return rows, nil +} + +func (s *roleService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := model.Role{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, err + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.Role{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *roleService) Status(req *dto.RoleStatusReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + info := model.Role{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + // 设置参数 + entity := &model.Role{} + entity.Id = gconv.Int(req.Id) + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} diff --git a/app/service/role_menu.go b/app/service/role_menu.go new file mode 100644 index 0000000..85553a6 --- /dev/null +++ b/app/service/role_menu.go @@ -0,0 +1,79 @@ +/** + * 角色菜单-服务类 + * @author + * @since 2021/9/14 + * @File : role_menu + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strings" +) + +var RoleMenu = new(roleMenuService) + +type roleMenuService struct{} + +func (s *roleMenuService) GetRoleMenuList(roleId int) ([]vo.RoleMenuInfo, error) { + // 获取全部菜单列表 + var menuList []model.Menu + utils.XormDb.Where("status=1").Where("mark=1").OrderBy("sort asc").Find(&menuList) + if len(menuList) == 0 { + return nil, errors.New("菜单列表不存在") + } + // 获取角色菜单权限列表 + var roleMenuList []model.RoleMenu + utils.XormDb.Where("role_id=?", roleId).Find(&roleMenuList) + idList := make([]interface{}, 0) + for _, v := range roleMenuList { + idList = append(idList, v.MenuId) + } + + // 对象处理 + var list []vo.RoleMenuInfo + if len(menuList) > 0 { + for _, m := range menuList { + var info vo.RoleMenuInfo + info.Id = m.Id + info.Name = m.Name + info.Open = true + info.Pid = m.Pid + // 节点选中值 + if utils.InArray(gconv.String(m.Id), idList) { + info.Checked = true + } + list = append(list, info) + } + } + return list, nil +} + +func (s *roleMenuService) Save(req *dto.RoleMenuSaveReq) error { + if utils.AppDebug() { + return errors.New("演示环境,暂无权限操作") + } + itemArr := strings.Split(req.MenuIds, ",") + if len(itemArr) == 0 { + return errors.New("请选择权限节点") + } + //itemArr := req.MenuIds + if len(itemArr) == 0 { + return errors.New("请选择权限节点") + } + // 删除现有的角色权限数据 + utils.XormDb.Where("role_id=?", req.RoleId).Delete(&model.RoleMenu{}) + // 遍历创建新角色权限数据 + for _, v := range itemArr { + var entity model.RoleMenu + entity.RoleId = req.RoleId + entity.MenuId = gconv.Int(v) + entity.Insert() + } + return nil +} diff --git a/app/service/upload.go b/app/service/upload.go new file mode 100644 index 0000000..24cf07d --- /dev/null +++ b/app/service/upload.go @@ -0,0 +1,141 @@ +/** + * 文件上传-服务类 + * @author + * @since 2021/11/18 + * @File : upload + */ +package service + +import ( + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "easygoadmin/utils/gregex" + "easygoadmin/utils/gstr" + "errors" + "fmt" + "github.com/gin-gonic/gin" + "path" + "path/filepath" + "strconv" + "time" +) + +// 中间件管理服务 +var Upload = new(uploadService) + +type uploadService struct{} + +// 上传得文件信息 +type FileInfo struct { + FileName string `json:"fileName"` + FileSize int64 `json:"fileSize"` + FileUrl string `json:"fileUrl"` + FileType string `json:"fileType"` +} + +func (s *uploadService) UploadImage(ctx *gin.Context) (FileInfo, error) { + if utils.AppDebug() { + return FileInfo{}, errors.New("演示环境,暂无权限操作") + } + // 获取文件(注意这个地方的file要和html模板中的name一致) + file, err := ctx.FormFile("file") + if err != nil { + return FileInfo{}, errors.New("上传文件不能为空") + } + //获取文件名称 + fmt.Println(file.Filename) + //文件大小 + fmt.Println(file.Size) + //获取文件的后缀名 + fileExt := path.Ext(file.Filename) + fmt.Println(fileExt) + + // 允许上传文件后缀 + allowExt := "jpg,gif,png,bmp,jpeg,JPG" + // 检查上传文件后缀 + if !checkFileExt(fileExt, allowExt) { + return FileInfo{}, errors.New("上传文件格式不正确,文件后缀只允许为:" + allowExt + "的文件") + } + // 允许文件上传最大值 + allowSize := "1M" + // 检查上传文件大小 + isvalid, err := checkFileSize(file.Size, allowSize) + if err != nil { + return FileInfo{}, err + } + if !isvalid { + return FileInfo{}, errors.New("上传文件大小不得超过:" + allowSize) + } + + // 临时存储目录 + savePath := utils.TempPath() + "/" + time.Now().Format("20060102") + + // 创建文件夹 + ok := utils.CreateDir(savePath) + if !ok { + return FileInfo{}, errors.New("存储路径创建失败") + } + + //根据当前时间鹾生成一个新的文件名 + fileNameInt := time.Now().Unix() + fileNameStr := strconv.FormatInt(fileNameInt, 10) + //新的文件名 + fileName := fileNameStr + fileExt + //保存上传文件 + filePath := filepath.Join(savePath, "/", fileName) + err2 := ctx.SaveUploadedFile(file, filePath) + if err2 != nil { + return FileInfo{}, err2 + } + + // 返回结果 + result := FileInfo{ + FileName: file.Filename, + FileSize: file.Size, + FileUrl: gstr.Replace(savePath, utils.UploadPath(), "") + "/" + fileName, + } + return result, nil +} + +// 检查文件格式是否合法 +func checkFileExt(fileExt string, typeString string) bool { + // 允许上传文件后缀 + exts := gstr.Split(typeString, ",") + // 是否验证通过 + isValid := false + for _, v := range exts { + // 对比文件后缀 + if gstr.Equal(fileExt, "."+v) { + isValid = true + break + } + } + return isValid +} + +// 检查上传文件大小 +func checkFileSize(fileSize int64, maxSize string) (bool, error) { + // 匹配上传文件最大值 + match, err := gregex.MatchString(`^([0-9]+)(?i:([a-z]*))$`, maxSize) + if err != nil { + return false, err + } + if len(match) == 0 { + err = errors.New("上传文件大小未设置,请在后台配置,格式为(30M,30k,30MB)") + return false, err + } + var cfSize int64 + switch gstr.ToUpper(match[2]) { + case "MB", "M": + cfSize = gconv.Int64(match[1]) * 1024 * 1024 + case "KB", "K": + cfSize = gconv.Int64(match[1]) * 1024 + case "": + cfSize = gconv.Int64(match[1]) + } + if cfSize == 0 { + err = errors.New("上传文件大小未设置,请在后台配置,格式为(30M,30k,30MB),最大单位为MB") + return false, err + } + return cfSize >= fileSize, nil +} diff --git a/app/service/user.go b/app/service/user.go new file mode 100644 index 0000000..9669271 --- /dev/null +++ b/app/service/user.go @@ -0,0 +1,421 @@ +/** + * 用户-服务类 + * @author + * @since 2021/11/11 + * @File : user + */ +package service + +import ( + "easygoadmin/app/dto" + "easygoadmin/app/model" + "easygoadmin/app/vo" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "errors" + "strconv" + "strings" + "time" +) + +var User = new(userService) + +type userService struct{} + +func (s *userService) GetList(req *dto.UserPageReq) ([]vo.UserInfoVo, int64, error) { + // 初始化查询实例 + query := utils.XormDb.Where("mark=1") + // 查询条件 + if req != nil { + // 用户名 + if req.Realname != "" { + query = query.Where("realname like ?", "%"+req.Realname+"%") + } + // 性别 + if req.Gender > 0 { + query = query.Where("gender=?", req.Gender) + } + } + // 排序 + query = query.Asc("id") + // 分页设置 + offset := (req.Page - 1) * req.Limit + query = query.Limit(req.Limit, offset) + // 查询列表 + list := make([]model.User, 0) + count, err := query.FindAndCount(&list) + if err != nil { + return nil, 0, err + } + //return list, count, nil + // 获取职级列表 + levelList := make([]model.Level, 0) + utils.XormDb.Where("mark=1").OrderBy("sort asc").Cols("id,name").Find(&levelList) + var levelMap = make(map[int]string) + for _, v := range levelList { + levelMap[v.Id] = v.Name + } + // 获取岗位列表 + positionList := make([]model.Position, 0) + utils.XormDb.Where("mark=1").Cols("id,name").Find(&positionList) + var positionMap = make(map[int]string) + for _, v := range positionList { + positionMap[v.Id] = v.Name + } + // 部门 + deptList := make([]model.Dept, 0) + utils.XormDb.Where("mark=1").Cols("id,name").Find(&deptList) + var deptMap = make(map[int]string) + for _, v := range deptList { + deptMap[v.Id] = v.Name + } + + // 数据处理 + var result []vo.UserInfoVo + for _, v := range list { + item := vo.UserInfoVo{} + item.User = v + // 头像 + if v.Avatar != "" { + item.Avatar = utils.GetImageUrl(v.Avatar) + } + // 性别 + if v.Gender > 0 { + item.GenderName = utils.GENDER_LIST[v.Gender] + } + // 职级 + if v.LevelId > 0 { + item.LevelName = levelMap[v.LevelId] + } + // 岗位 + if v.PositionId > 0 { + item.PositionName = positionMap[v.PositionId] + } + // 部门 + if v.DeptId > 0 { + item.DeptName = deptMap[v.DeptId] + } + // 角色列表 + roleList := UserRole.GetUserRoleList(v.Id) + if len(roleList) > 0 { + item.RoleList = roleList + } else { + item.RoleList = make([]model.Role, 0) + } + // 省市区 + cityList := make([]string, 0) + // 省份编号 + cityList = append(cityList, item.ProvinceCode) + // 城市编号 + cityList = append(cityList, item.CityCode) + // 县区编号 + cityList = append(cityList, item.DistrictCode) + item.City = cityList + // 加入数组 + result = append(result, item) + } + return result, count, nil +} + +func (s *userService) Add(req *dto.UserAddReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + var entity model.User + entity.Realname = req.Realname + entity.Nickname = req.Nickname + entity.Gender = gconv.Int(req.Gender) + entity.Avatar = req.Avatar + entity.Mobile = req.Mobile + entity.Email = req.Email + // 日期处理 + tm2, _ := time.Parse("2006-01-02", req.Birthday) + entity.Birthday = tm2.Unix() + entity.DeptId = gconv.Int(req.DeptId) + entity.LevelId = gconv.Int(req.LevelId) + entity.PositionId = gconv.Int(req.PositionId) + entity.ProvinceCode = req.ProvinceCode + entity.CityCode = req.CityCode + entity.DistrictCode = req.DistrictCode + entity.Address = req.Address + entity.Username = req.Username + entity.Intro = req.Intro + entity.Status = gconv.Int(req.Status) + entity.Note = req.Note + entity.Sort = gconv.Int(req.Sort) + + // 密码 + if req.Password != "" { + password, _ := utils.Md5(req.Password + req.Username) + entity.Password = password + } + + // 头像处理 + if req.Avatar != "" { + avatar, err := utils.SaveImage(req.Avatar, "user") + if err != nil { + return 0, err + } + entity.Avatar = avatar + } + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + + // 插入记录 + rows, err := entity.Insert() + if err != nil || rows == 0 { + return 0, err + } + + // 删除用户角色关系 + utils.XormDb.Where("user_id=?", entity.Id).Delete(&model.UserRole{}) + // 创建人员角色关系 + for _, v := range req.RoleIds { + if v <= 0 { + continue + } + var userRole model.UserRole + userRole.UserId = entity.Id + userRole.RoleId = gconv.Int(v) + userRole.Insert() + } + return rows, nil +} + +func (s *userService) Update(req *dto.UserUpdateReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + entity := &model.User{Id: gconv.Int(req.Id)} + has, err := entity.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + entity.Realname = req.Realname + entity.Nickname = req.Nickname + entity.Gender = gconv.Int(req.Gender) + entity.Avatar = req.Avatar + entity.Mobile = req.Mobile + entity.Email = req.Email + // 日期处理 + tm2, _ := time.Parse("2006-01-02", req.Birthday) + entity.Birthday = tm2.Unix() + entity.DeptId = gconv.Int(req.DeptId) + entity.LevelId = gconv.Int(req.LevelId) + entity.PositionId = gconv.Int(req.PositionId) + entity.ProvinceCode = req.ProvinceCode + entity.CityCode = req.CityCode + entity.DistrictCode = req.DistrictCode + entity.Address = req.Address + entity.Username = req.Username + entity.Intro = req.Intro + entity.Status = gconv.Int(req.Status) + entity.Note = req.Note + entity.Sort = gconv.Int(req.Sort) + + // 密码 + if req.Password != "" { + password, _ := utils.Md5(req.Password + req.Username) + entity.Password = password + } + + // 头像处理 + if req.Avatar != "" { + avatar, err := utils.SaveImage(req.Avatar, "user") + if err != nil { + return 0, err + } + entity.Avatar = avatar + } + entity.CreateUser = userId + entity.CreateTime = time.Now().Unix() + entity.Mark = 1 + // 更新记录 + rows, err := entity.Update() + if err != nil || rows == 0 { + return 0, err + } + + // 删除用户角色关系 + utils.XormDb.Where("user_id=?", entity.Id).Delete(&model.UserRole{}) + // 创建人员角色关系 + RoleIdsArr := strings.Split(req.RoleIds, ",") + for _, v := range RoleIdsArr { + var userRole model.UserRole + userRole.UserId = gconv.Int(req.Id) + userRole.RoleId = gconv.Int(v) + userRole.Insert() + } + return rows, nil +} + +func (s *userService) Delete(ids string) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 记录ID + idsArr := strings.Split(ids, ",") + if len(idsArr) == 1 { + // 单个删除 + entity := &model.User{Id: gconv.Int(ids)} + rows, err := entity.Delete() + if err != nil || rows == 0 { + return 0, errors.New("删除失败") + } + return rows, nil + } else { + // 批量删除 + count := 0 + for _, v := range idsArr { + id, _ := strconv.Atoi(v) + entity := &model.User{Id: id} + rows, err := entity.Delete() + if rows == 0 || err != nil { + continue + } + count++ + } + return int64(count), nil + } +} + +func (s *userService) Status(req *dto.UserStatusReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + info := &model.User{Id: gconv.Int(req.Id)} + has, err := info.Get() + if err != nil || !has { + return 0, errors.New("记录不存在") + } + + entity := &model.User{} + entity.Id = info.Id + entity.Status = gconv.Int(req.Status) + entity.UpdateUser = userId + entity.UpdateTime = time.Now().Unix() + return entity.Update() +} + +func (s *userService) ResetPwd(id int, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询记录 + info := &model.User{Id: id} + has, err := info.Get() + if err != nil || !has { + return 0, err + } + if info == nil { + return 0, errors.New("记录不存在") + } + // 设置初始密码 + password, err := utils.Md5("123456" + info.Username) + if err != nil { + return 0, err + } + + // 初始化密码 + rows, err := utils.XormDb.Id(id).Update(&model.User{ + Password: password, + UpdateUser: userId, + UpdateTime: time.Now().Unix(), + }) + if err != nil { + return 0, err + } + + // 获取受影响行数 + if err != nil { + return 0, err + } + return rows, nil +} + +func (s *userService) CheckUser(req *dto.CheckUserReq) (*model.User, error) { + user := &model.User{Username: req.Username, Mark: 1} + has, err := user.Get() + if err != nil || !has { + return nil, err + } + return user, nil +} + +func (s *userService) UpdateUserInfo(req *dto.UserInfoReq, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 头像处理 + avatar := "" + if req.Avatar != "" { + image, err := utils.SaveImage(req.Avatar, "user") + if err != nil { + return 0, err + } + avatar = image + } + + // 更新用户信息 + rows, err := utils.XormDb.Id(userId).Update(&model.User{ + Avatar: avatar, + Realname: req.Realname, + Nickname: req.Nickname, + Gender: gconv.Int(req.Gender), + Mobile: req.Mobile, + Email: req.Email, + Address: req.Address, + Intro: req.Intro, + UpdateUser: userId, + UpdateTime: time.Now().Unix(), + }) + if err != nil { + return 0, err + } + return rows, nil +} + +func (s *userService) UpdatePwd(req *dto.UpdatePwd, userId int) (int64, error) { + if utils.AppDebug() { + return 0, errors.New("演示环境,暂无权限操作") + } + // 查询信息 + info := &model.User{Id: userId} + has, err := info.Get() + if err != nil || !has { + return 0, err + } + if info == nil { + return 0, errors.New("记录不存在") + } + // 比对旧密码 + oldPwd, err := utils.Md5(req.OldPassword + info.Username) + if err != nil { + return 0, err + } + if oldPwd != info.Password { + return 0, errors.New("旧密码不正确") + } + + // 设置新密码 + if req.NewPassword != req.RePassword { + return 0, errors.New("两次输入的新密码不一致") + } + newPwd, err := utils.Md5(req.NewPassword + info.Username) + if err != nil { + return 0, err + } + + // 更新密码 + rows, err := utils.XormDb.Id(userId).Update(&model.User{ + Password: newPwd, + UpdateUser: userId, + UpdateTime: time.Now().Unix(), + }) + if err != nil { + return 0, err + } + return rows, nil +} diff --git a/app/service/user_role.go b/app/service/user_role.go new file mode 100644 index 0000000..7ce0724 --- /dev/null +++ b/app/service/user_role.go @@ -0,0 +1,29 @@ +/** + * 用户角色-服务类 + * @author + * @since 2021/11/12 + * @File : user_role + */ +package service + +import ( + "easygoadmin/app/model" + "easygoadmin/utils" +) + +var UserRole = new(userRoleService) + +type userRoleService struct{} + +// 获取用户角色列表 +func (s *userRoleService) GetUserRoleList(userId int) []model.Role { + // 实例化对象 + list := make([]model.Role, 0) + utils.XormDb.Table("sys_role").Alias("r"). + Join("INNER", []string{"sys_user_role", "ur"}, "r.id=ur.role_id"). + Where("ur.user_id=? AND r.mark=1", userId). + Cols("r.*"). + OrderBy("r.sort asc"). + Find(&list) + return list +} diff --git a/app/vo/ad.go b/app/vo/ad.go new file mode 100644 index 0000000..08b9283 --- /dev/null +++ b/app/vo/ad.go @@ -0,0 +1,16 @@ +/** + * 广告Vo + * @author + * @since 2021/11/15 + * @File : ad + */ +package vo + +import "easygoadmin/app/model" + +// 广告信息Vo +type AdInfoVo struct { + model.Ad + TypeName string `json:"typeName"` // 广告类型 + AdSortDesc string `json:"adSortDesc"` // 广告位描述 +} diff --git a/app/vo/ad_sort.go b/app/vo/ad_sort.go new file mode 100644 index 0000000..7bad442 --- /dev/null +++ b/app/vo/ad_sort.go @@ -0,0 +1,17 @@ +/** + * 广告位Vo + * @author + * @since 2021/11/15 + * @File : ad_sort + */ +package vo + +import "easygoadmin/app/model" + +// 广告位信息 +type AdSortInfoVo struct { + model.AdSort + ItemName string `json:"itemName"` // 站点名称 + CateName string `json:"cateName"` // 栏目名称 + PlatformName string `json:"platformName"` // 所属平台 +} diff --git a/app/vo/city.go b/app/vo/city.go new file mode 100644 index 0000000..40f5384 --- /dev/null +++ b/app/vo/city.go @@ -0,0 +1,14 @@ +/** + * 城市Vo + * @author + * @since 2021/11/15 + * @File : city + */ +package vo + +import "easygoadmin/app/model" + +type CityInfoVo struct { + model.City + HaveChild bool `json:"haveChild"` +} diff --git a/app/vo/config_data.go b/app/vo/config_data.go new file mode 100644 index 0000000..b22b2a2 --- /dev/null +++ b/app/vo/config_data.go @@ -0,0 +1,15 @@ +/** + * 配置数据Vo + * @author + * @since 2021/11/13 + * @File : config_data + */ +package vo + +import "easygoadmin/app/model" + +// 配置数据列表 +type ConfigDataVo struct { + model.ConfigData + TypeName string `json:"typeName"` +} diff --git a/app/vo/dept.go b/app/vo/dept.go new file mode 100644 index 0000000..96c1e70 --- /dev/null +++ b/app/vo/dept.go @@ -0,0 +1,9 @@ +package vo + +import "easygoadmin/app/model" + +// 部门树结构 +type DeptTreeNode struct { + model.Dept + Children []*DeptTreeNode `json:"children"` // 子栏目 +} diff --git a/app/vo/example.go b/app/vo/example.go new file mode 100644 index 0000000..cc3c130 --- /dev/null +++ b/app/vo/example.go @@ -0,0 +1,18 @@ +/** + * 演示一Vo + * @author + * @since 2022-04-19 + * @File : example + */ +package vo + +import "easygoadmin/app/model" + +// 演示一信息Vo +type ExampleInfoVo struct { + model.Example + + StatusName int `json:"statusName"` // 状态名称 + TypeName int `json:"typeName"` // 类型名称 + IsVipName int `json:"isVipName"` // 是否VIP名称 +} diff --git a/app/vo/example2.go b/app/vo/example2.go new file mode 100644 index 0000000..2d26107 --- /dev/null +++ b/app/vo/example2.go @@ -0,0 +1,16 @@ +/** + * 演示二Vo + * @author + * @since 2022-04-19 + * @File : example2 + */ +package vo + +import "easygoadmin/app/model" + +// 演示二信息Vo +type Example2InfoVo struct { + model.Example2 + + StatusName int `json:"statusName"` // 状态名称 +} diff --git a/app/vo/generate.go b/app/vo/generate.go new file mode 100644 index 0000000..2c5bf4b --- /dev/null +++ b/app/vo/generate.go @@ -0,0 +1,23 @@ +/** + * 代码生成器Vo + * @author + * @since 2021/11/15 + * @File : generate + */ +package vo + +import "time" + +// 数据库信息 +type GenerateInfo struct { + Name string `json:"name"` // 表名 + Engine string `json:"engine"` // 引擎 + Version string `json:"version"` // 版本 + Collation string `json:"collation"` // 编码 + Rows int `json:"rows"` // 记录数 + DataLength int `json:"data_length"` // 大小 + AutoIncrement int `json:"auto_increment"` // 自增索引 + Comment string `json:"comment"` // 表备注 + CreateTime time.Time `json:"createTime"` // 添加时间 + UpdateTime time.Time `json:"updateTime"` // 更新时间 +} diff --git a/app/vo/item.go b/app/vo/item.go new file mode 100644 index 0000000..c5ad424 --- /dev/null +++ b/app/vo/item.go @@ -0,0 +1,15 @@ +/** + * 站点Vo + * @author + * @since 2021/11/13 + * @File : item + */ +package vo + +import "easygoadmin/app/model" + +// 站点信息Vo +type ItemInfoVo struct { + model.Item + TypeName string `json:"typeName"` // 站点类型 +} diff --git a/app/vo/item_cate.go b/app/vo/item_cate.go new file mode 100644 index 0000000..66b1e41 --- /dev/null +++ b/app/vo/item_cate.go @@ -0,0 +1,21 @@ +/** + * 栏目Vo + * @author + * @since 2021/11/13 + * @File : item_cate + */ +package vo + +import "easygoadmin/app/model" + +// 栏目信息 +type ItemCateInfoVo struct { + model.ItemCate + ItemName string `json:"itemName"` // 栏目名称 +} + +// 栏目树结构 +type CateTreeNode struct { + model.ItemCate + Children []*CateTreeNode `json:"children"` // 子栏目 +} diff --git a/app/vo/link.go b/app/vo/link.go new file mode 100644 index 0000000..dd8e267 --- /dev/null +++ b/app/vo/link.go @@ -0,0 +1,17 @@ +/** + * 友链Vo + * @author + * @since 2021/11/13 + * @File : link + */ +package vo + +import "easygoadmin/app/model" + +// 友链信息 +type LinkInfoVo struct { + model.Link + TypeName string `json:"typeName"` // 友链类型 + FormName string `json:"formName"` // 友链形式 + PlatformName string `json:"platformName"` // 投放平台 +} diff --git a/app/vo/member.go b/app/vo/member.go new file mode 100644 index 0000000..23a4461 --- /dev/null +++ b/app/vo/member.go @@ -0,0 +1,19 @@ +/** + * 会员Vo + * @author + * @since 2021/11/13 + * @File : member + */ +package vo + +import "easygoadmin/app/model" + +// 会员信息Vo +type MemberInfoVo struct { + model.Member + GenderName string `json:"genderName"` // 性别 + DeviceName string `json:"deviceName"` // 设备类型 + SourceName string `json:"sourceName"` // 会员来源 + City interface{} `json:"city"` // 省市区 + CityName string `json:"cityName"` // 城市名称 +} diff --git a/app/vo/menu.go b/app/vo/menu.go new file mode 100644 index 0000000..422b28c --- /dev/null +++ b/app/vo/menu.go @@ -0,0 +1,15 @@ +/** + * 菜单Vo + * @author + * @since 2021/9/9 + * @File : menu + */ +package vo + +import "easygoadmin/app/model" + +// 菜单Vo +type MenuTreeNode struct { + model.Menu + Children []*MenuTreeNode `json:"children"` // 子菜单 +} diff --git a/app/vo/notice.go b/app/vo/notice.go new file mode 100644 index 0000000..322f310 --- /dev/null +++ b/app/vo/notice.go @@ -0,0 +1,15 @@ +/** + * 通知公告Vo + * @author + * @since 2021/11/13 + * @File : notice + */ +package vo + +import "easygoadmin/app/model" + +// 通知公告Vo +type NoticeInfoVo struct { + model.Notice + SourceName string `json:"sourceName"` // 通知来源 +} diff --git a/app/vo/role_menu.go b/app/vo/role_menu.go new file mode 100644 index 0000000..15804f7 --- /dev/null +++ b/app/vo/role_menu.go @@ -0,0 +1,16 @@ +/** + * 角色菜单Vo + * @author + * @since 2021/9/14 + * @File : role_menu + */ +package vo + +// 角色权限菜单列表 +type RoleMenuInfo struct { + Id int `json:"id"` + Name string `json:"name"` + Pid int `json:"pId"` + Checked bool `json:"checked"` + Open bool `json:"open"` +} diff --git a/app/vo/user.go b/app/vo/user.go new file mode 100644 index 0000000..ddde115 --- /dev/null +++ b/app/vo/user.go @@ -0,0 +1,37 @@ +/** + * 用户Vo + * @author + * @since 2021/11/12 + * @File : user + */ +package vo + +import "easygoadmin/app/model" + +// 用户信息Vo +type UserInfoVo struct { + model.User + GenderName string `json:"genderName"` // 性别 + LevelName string `json:"levelName"` // 职级 + PositionName string `json:"positionName"` // 岗位 + DeptName string `json:"deptName"` // 部门 + RoleIds interface{} `json:"roleIds"` // 角色ID + RoleList interface{} `json:"roleList"` // 角色列表 + City interface{} `json:"city"` // 省市区 +} + +// 个人信息Vo +type ProfileInfoVo struct { + Realname string `json:"realname"` // 真实姓名 + Nickname string `json:"nickname"` // 昵称 + Gender int `json:"gender"` // 性别:1男 2女 3保密 + Avatar string `json:"avatar"` // 头像 + Mobile string `json:"mobile"` // 手机号码 + Email string `json:"email"` // 邮箱地址 + City []string `json:"city"` // 省市区 + Address string `json:"address"` // 详细地址 + Intro string `json:"intro"` // 个人简介 + Roles []interface{} `json:"roles"` // 用户角色 + Authorities []interface{} `json:"authorities"` // 用户权限 + PermissionList []string `json:"permissionList"` // 权限列表 +} diff --git a/app/widget/checkbox.go b/app/widget/checkbox.go new file mode 100644 index 0000000..621800e --- /dev/null +++ b/app/widget/checkbox.go @@ -0,0 +1,110 @@ +/** + * 复选框组件 + * @author + * @since 2021/7/27 + * @File : checkbox + */ +package widget + +import ( + "easygoadmin/utils/gconv" + "easygoadmin/utils/gstr" + "html/template" + "reflect" +) + +func Checkbox(param string, data interface{}, checked interface{}) template.HTML { + // 参数解析 + item := gstr.Split(param, "|") + // 组件名称 + chkName := item[0] + //// 显示文字 + //showName := item[1] + //// 存储值 + //showValue := item[2] + + // 选中的数组 + checkedList := make([]string, 0) + if reflect.ValueOf(checked).Kind() == reflect.String { + checkedList = gstr.Split(gconv.String(checked), ",") + } else if reflect.ValueOf(checked).Kind() == reflect.Slice { + for _, v := range checked.([]interface{}) { + checkedList = append(checkedList, gconv.String(v)) + } + } + + // 拼接HTML + html := `` + + // 数据处理 + if reflect.ValueOf(data).Kind() == reflect.String { + if reflect.TypeOf(data).String() == "string" { + item := gstr.Split(data.(string), ",") + for _, val := range item { + subItem := gstr.Split(val, "=") + html += `` + } + } + } else if reflect.ValueOf(data).Kind() == reflect.Map { + if reflect.TypeOf(data).String() == "map[string]string" { + for k, v := range data.(map[string]string) { + html += `` + } + } else if reflect.TypeOf(data).String() == "map[int]string" { + for k, v := range data.(map[int]string) { + html += `` + } + } + } else if reflect.ValueOf(data).Kind() == reflect.Slice { + if reflect.TypeOf(data).String() == "map[string]string" { + for _, item := range data.([]map[string]string) { + for k, v := range item { + html += `` + } + } + } else if reflect.TypeOf(data).String() == "map[int]string" { + for _, item := range data.([]map[int]string) { + for k, v := range item { + html += `` + } + } + } + } + + return template.HTML(html) +} diff --git a/app/widget/city.go b/app/widget/city.go new file mode 100644 index 0000000..4f63c53 --- /dev/null +++ b/app/widget/city.go @@ -0,0 +1,199 @@ +/** + * 城市选择组件 + * @author + * @since 2021/7/27 + * @File : city + */ +package widget + +import ( + "easygoadmin/app/model" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "html/template" + "reflect" +) + +func City(cityCode interface{}, limit int, isRequire int) template.HTML { + // 初始化组件 + var cityList = make([]map[string]interface{}, 0) + + // 省份 + var provinceMap = make(map[string]interface{}, 0) + provinceMap["cname"] = "省" + provinceMap["code"] = "province" + provinceMap["selected"] = "" + cityList = append(cityList, provinceMap) + + // 城市 + var cityMap = make(map[string]interface{}, 0) + cityMap["cname"] = "市" + cityMap["code"] = "city" + cityMap["selected"] = "" + cityList = append(cityList, cityMap) + + // 县区 + var districtMap = make(map[string]interface{}, 0) + districtMap["cname"] = "县区" + districtMap["code"] = "district" + districtMap["selected"] = "" + cityList = append(cityList, districtMap) + + // 查询城市信息 + + var info model.City + has, err := utils.XormDb.Where("citycode=?", cityCode).Get(&info) + // 上级ID + pid := 0 + // 城市等级 + level := 0 + if err == nil && has { + pid = info.Pid + level = info.Level - 1 + } + + // 加载数据源 + for { + // 获取子级城市 + childList := make([]model.City, 0) + utils.XormDb.Where("pid=? and mark=1", pid).Find(&childList) + var dataList = make([]map[string]string, 0) + for _, v := range childList { + item := map[string]string{} + item["id"] = v.Citycode + item["name"] = v.Name + dataList = append(dataList, item) + } + // 设置数据源 + if err == nil && has { + cityList[level]["selected"] = info.Citycode + } + cityList[level]["list"] = dataList + + // 业务处理 + if pid > 0 { + info = model.City{} + has2, err2 := utils.XormDb.Id(pid).Get(&info) + if err2 != nil || !has2 { + // 直接赋值-1,跳出循环 + level = -1 + break + } + pid = info.Pid + } + // 计数器-1 + level-- + if level < 0 { + // 跳出循环 + break + } + } + + // 拼接HTML + html := `` + // 数组切片 + cityList = cityList[:limit] + // 遍历组件源 + for _, val := range cityList { + html += `
+ +
` + } + + // JS拼接 + html += `` + + return template.HTML(html) +} diff --git a/app/widget/date.go b/app/widget/date.go new file mode 100644 index 0000000..0ef73a4 --- /dev/null +++ b/app/widget/date.go @@ -0,0 +1,67 @@ +/** + * 日期选择组件 + * @author + * @since 2021/7/26 + * @File : date + */ +package widget + +import ( + "easygoadmin/utils/gconv" + "html/template" + "strings" + "time" +) + +func Date(param string, value interface{}) template.HTML { + // 组件参数分析 + arr := strings.Split(param, "|") + // 组件标识 + dateName := arr[0] + // 是否必填 + isRequire := arr[1] + // 下拉提示 + dateTips := arr[2] + // 日期类型 + dateType := arr[3] + // 非必填验证 + if isRequire != "1" { + dateType = "" + } + // 日期间隔 + dateSpan := "" + if len(arr) >= 5 { + dateSpan = arr[4] + + } + // 日期间隔符号 + dateStr := "" + if len(arr) >= 6 { + dateStr = arr[5] + } + + // 组件的值 + dateValue := "" + // 日期组件时间格式 + dateFormat := "2006-01-02 15:04:05" + if dateType == "date" { + dateFormat = "2006-01-02" + } + if value != nil { + dateValue = time.Unix(gconv.Int64(value), 0).Format(dateFormat) + } + + html := ` +` + return template.HTML(html) +} diff --git a/app/widget/editor.go b/app/widget/editor.go new file mode 100644 index 0000000..2c2892a --- /dev/null +++ b/app/widget/editor.go @@ -0,0 +1,133 @@ +/** + * 编辑器组件 + * @author + * @since 2021/7/26 + * @File : editor + */ +package widget + +import ( + "easygoadmin/utils/gconv" + "html/template" +) + +func Kindeditor(kindId string, kindType string, width string, height int) template.HTML { + + html := `` + + html += ` +` + + // 编辑器类型 + if kindType == "simple" { + html += `` + } + html += ` + +` + + return template.HTML(html) +} diff --git a/app/widget/icon.go b/app/widget/icon.go new file mode 100644 index 0000000..bfe6f25 --- /dev/null +++ b/app/widget/icon.go @@ -0,0 +1,73 @@ +/** + * 图标选择组件 + * @author + * @since 2021/7/19 + * @File : icon + */ +package widget + +import ( + "easygoadmin/utils/gconv" + "html/template" +) + +func Icon(iconName string, iconValue interface{}) template.HTML { + // 默认值 + if gconv.String(iconValue) == "" { + iconValue = "layui-icon-util" + } + + // 拼接HTML + html := `` + html += ` + +` + return template.HTML(html) +} diff --git a/app/widget/item.go b/app/widget/item.go new file mode 100644 index 0000000..2d397af --- /dev/null +++ b/app/widget/item.go @@ -0,0 +1,125 @@ +/** + * 站点选择组件 + * @author + * @since 2021/7/19 + * @File : icon + */ +package widget + +import ( + "easygoadmin/app/model" + "easygoadmin/app/service" + "easygoadmin/utils" + "easygoadmin/utils/gconv" + "html/template" + "reflect" +) + +func Item(itemId int, cateId int, limit int) template.HTML { + // 初始化组件 + var dataList = make([]map[string]interface{}, 0) + + // 站点 + var itemMap = make(map[string]interface{}, 0) + itemMap["tname"] = "站点" + itemMap["code"] = "item" + itemMap["selected"] = itemId + + var itemList = make([]map[string]string, 0) + // 站点数据源 + itemData := make([]model.Item, 0) + utils.XormDb.Where("status=1 and mark=1").Cols("id,name").Find(&itemData) + for _, v := range itemData { + item := map[string]string{} + item["id"] = gconv.String(v.Id) + item["name"] = v.Name + itemList = append(itemList, item) + } + itemMap["list"] = itemList + dataList = append(dataList, itemMap) + + // 栏目 + if limit >= 2 { + var cateMap = make(map[string]interface{}, 0) + cateMap["tname"] = "栏目" + cateMap["code"] = "cate" + cateMap["selected"] = cateId + // 获取栏目列表 + data, _ := service.ItemCate.GetCateTreeList(itemId, 0) + // 数据源转换 + cateList := service.ItemCate.MakeList(data) + cateMap["list"] = cateList + dataList = append(dataList, cateMap) + } + + // 拼接HTML + html := `` + + // 遍历组件源 + for _, val := range dataList { + html += `
+ +
` + } + + // JS脚本 + html += `` + + return template.HTML(html) +} diff --git a/app/widget/radio.go b/app/widget/radio.go new file mode 100644 index 0000000..23829ee --- /dev/null +++ b/app/widget/radio.go @@ -0,0 +1,85 @@ +/** + * 单选按钮组件 + * @author + * @since 2021/7/27 + * @File : radio + */ +package widget + +import ( + "easygoadmin/utils/gconv" + "easygoadmin/utils/gstr" + "html/template" + "reflect" +) + +func Radio(param string, data interface{}, checked interface{}) template.HTML { + // 参数解析 + item := gstr.Split(param, "|") + // 组件名称 + radioName := item[0] + //// 显示文字 + //showName := item[1] + //// 存储值 + //showValue := item[2] + + // 拼接HTML + html := `` + + // 数据处理 + if reflect.ValueOf(data).Kind() == reflect.String { + if reflect.TypeOf(data).String() == "string" { + item := gstr.Split(data.(string), ",") + for _, val := range item { + subItem := gstr.Split(val, "=") + html += `` + } + } + } else if reflect.ValueOf(data).Kind() == reflect.Map { + if reflect.TypeOf(data).String() == "map[string]string" { + for k, v := range data.(map[string]string) { + html += `` + } + } else if reflect.TypeOf(data).String() == "map[int]string" { + for k, v := range data.(map[int]string) { + html += `` + } + } + } else if reflect.ValueOf(data).Kind() == reflect.Slice { + if reflect.TypeOf(data).String() == "map[string]string" { + for _, item := range data.([]map[string]string) { + for k, v := range item { + html += `` + } + } + } else if reflect.TypeOf(data).String() == "map[int]string" { + for _, item := range data.([]map[int]string) { + for k, v := range item { + html += `` + } + } + } + } + + return template.HTML(html) +} diff --git a/app/widget/refund.go b/app/widget/refund.go new file mode 100644 index 0000000..ee5994a --- /dev/null +++ b/app/widget/refund.go @@ -0,0 +1,16 @@ +/** + * 提交按钮组件 + * @author + * @since 2021/7/26 + * @File : submit + */ +package widget + +import ( + "html/template" +) + +func Refund(funcName string) template.HTML { + html := `` + funcName + `` + return template.HTML(html) +} diff --git a/app/widget/select.go b/app/widget/select.go new file mode 100644 index 0000000..74d0ad6 --- /dev/null +++ b/app/widget/select.go @@ -0,0 +1,107 @@ +/** + * 下拉选择组件 + * @author + * @since 2021/7/26 + * @File : select + */ +package widget + +import ( + "easygoadmin/utils/gconv" + "easygoadmin/utils/gstr" + "html/template" + "reflect" + "strings" +) + +func Select(param string, data interface{}, checkedId interface{}) template.HTML { + // 组件参数分析 + arr := strings.Split(param, "|") + // 组件标识 + selName := arr[0] + // 是否必填 + isRequire := arr[1] + // 下拉提示 + selTips := arr[2] + //// 下拉标题 + //selTitle := "" + //if len(arr) >= 4 { + // selTitle = arr[3] + //} + //// 下拉值 + //selValue := "" + //if len(arr) >= 5 { + // selValue = arr[4] + //} + + // 开始 + html := `` + + return template.HTML(html) +} diff --git a/app/widget/submit.go b/app/widget/submit.go new file mode 100644 index 0000000..e6a9f6c --- /dev/null +++ b/app/widget/submit.go @@ -0,0 +1,46 @@ +/** + * 提交按钮组件 + * @author + * @since 2021/7/26 + * @File : submit + */ +package widget + +import ( + "html/template" + "strings" +) + +func Submit(submitName string, submitType int, layFilter string) template.HTML { + + html := `` + return template.HTML(html) +} diff --git a/app/widget/switch.go b/app/widget/switch.go new file mode 100644 index 0000000..d43d784 --- /dev/null +++ b/app/widget/switch.go @@ -0,0 +1,75 @@ +/** + * 开关组件 + * @author + * @since 2021/7/26 + * @File : switch + */ +package widget + +import ( + "easygoadmin/utils/gconv" + "html/template" + "strings" +) + +func Switch(switchName string, switchTitle string, switchValue interface{}, args ...interface{}) template.HTML { + // 标识 + switchFilter := strings.Replace(switchName, "_", "", -1) + // 隐藏域 + switchHidden := "" + if args != nil { + if len(args) > 0 { + switchHidden = gconv.String(args[0]) + } + } + // 选中值 + switchChecked := "" + if gconv.String(switchValue) == "1" { + switchChecked = "checked=\"\"" + } + html := `` + html += ` ` + return template.HTML(html) +} diff --git a/app/widget/transfer.go b/app/widget/transfer.go new file mode 100644 index 0000000..f03cb42 --- /dev/null +++ b/app/widget/transfer.go @@ -0,0 +1,108 @@ +/** + * 穿梭组件 + * @author + * @since 2021/7/19 + * @File : transfer + */ +package widget + +import ( + "easygoadmin/utils/gconv" + "encoding/json" + "html/template" + "reflect" + "strings" +) + +func Transfer(param string, data interface{}, value interface{}) template.HTML { + // 参数分析 + item := strings.Split(param, "|") + // 组件名称 + tsfName := item[0] + // 是否显示搜索 + tsfSearch := item[1] + // 组件标题 + tsfTitle := strings.Split(item[2], ",") + //// 组件显示名 + //tsfText := item[3] + //// 组件显示值 + //tsfValue := item[4] + // 组件宽度 + tsfWidth := 220 + // 组件高度 + tsfHeight := 350 + if len(item) >= 6 && item[5] != "" { + subItem := strings.Split(item[5], "x") + // 宽度 + tsfWidth = gconv.Int(subItem[0]) + tsfHeight = gconv.Int(subItem[1]) + } + + // 绑定值 + if reflect.ValueOf(value).Kind() == reflect.Slice { + // 数组为空时初始化对象 + if len(value.([]interface{})) == 0 { + value = make([]interface{}, 0) + } + } else if reflect.ValueOf(value).Kind() == reflect.String { + // 字符串为空时赋予空置 + if gconv.String(value) == "" { + value = []int{} + } + } + + // 数据处理 + list := make([]map[string]string, 0) + if reflect.ValueOf(data).Kind() == reflect.String { + // 字符串数据源处理 + dList := strings.Split(gconv.String(data), ",") + for _, val := range dList { + v := strings.Split(val, "=") + obj := make(map[string]string) + obj["value"] = v[0] + obj["title"] = v[1] + list = append(list, obj) + } + } else if reflect.ValueOf(data).Kind() == reflect.Map { + // Map + + } else if reflect.ValueOf(data).Kind() == reflect.Slice { + // 数组数据源 + for _, val := range data.([]map[string]string) { + for k, v := range val { + obj := make(map[string]string) + obj["value"] = k + obj["title"] = v + list = append(list, obj) + } + } + } + + // 数据源列表转字符串 + mjson, _ := json.Marshal(list) + + // 组件HTML + html := `` + html += `
+` + return template.HTML(html) +} diff --git a/app/widget/upload.go b/app/widget/upload.go new file mode 100644 index 0000000..48c3682 --- /dev/null +++ b/app/widget/upload.go @@ -0,0 +1,419 @@ +/** + * 文件上传组件 + * @author + * @since 2021/7/23 + * @File : upload + */ +package widget + +import ( + "easygoadmin/utils/gconv" + "html/template" + "reflect" + "strings" +) + +// 上传图片 +func UploadImage(param string, url interface{}, exts string, size int) template.HTML { + // 参数拆解 + item := strings.Split(param, "|") + // 组件名称 + name := item[0] + // 组件标题 + title := "图片" + if item[1] != "" { + title = item[1] + } + // 组件显示尺寸 + sizeStr := "90x90" + if item[2] != "" { + sizeStr = item[2] + } + sizeArr := strings.Split(sizeStr, "x") + // 组件提示语 + showTips := item[3] + // 裁剪尺寸 + cropSize := "" + isCrop := 2 + if len(item) >= 5 && item[4] != "" { + cropSize = item[4] + isCrop = 1 + } else { + cropSize = "300x300" + isCrop = 2 + } + // 计算长宽比例 + cropArr := strings.Split(cropSize, "x") + // 裁剪比例 + cropRate := gconv.Int(cropArr[0]) / gconv.Int(cropArr[1]) + + // 上传后缀 + if exts == "" { + exts = "jpg|png|gif|bmp|jpeg" + } + + // 上传大小 + if size <= 0 { + size = 10 * 1024 + } + + html := `` + html += ` +
+
` + // 图片展示 + html += `上传` + title + `` + // 隐藏域 + html += ` +
+
+ +
` + + // 提示语 + if showTips != "" { + html += `
建议尺寸:` + showTips + `
` + } + + html += `
` + // 组件JS代码 + html += `` + return template.HTML(html) +} + +func Album(param string, data interface{}, exts string, size int) template.HTML { + // 参数拆解 + item := strings.Split(param, "|") + // 组件名称 + albumName := item[0] + //// 组件标题 + //albumTitle := "图片" + //if item[1] != "" { + // albumTitle = item[1] + //} + // 组件显示尺寸 + sizeStr := "90x90" + if item[2] != "" { + sizeStr = item[2] + } + sizeArr := strings.Split(sizeStr, "x") + // 允许最大上传数 + albumNum := item[3] + // 组件提示语 + albumTips := item[4] + // 裁剪尺寸 + cropSize := "" + isCrop := 2 + if len(item) >= 6 && item[5] != "" { + cropSize = item[5] + isCrop = 1 + } else { + cropSize = "300x300" + isCrop = 2 + } + // 计算长宽比例 + cropArr := strings.Split(cropSize, "x") + // 裁剪比例 + cropRate := gconv.Int(cropArr[0]) / gconv.Int(cropArr[1]) + + // 上传后缀 + if exts == "" { + exts = "jpg|png|gif|bmp|jpeg" + } + + // 上传大小 + if size <= 0 { + size = 10 * 1024 + } + + // HTML拼接 + html := `` + + // CSS拼接 + html += `` + + // 上传控件拼接 + if reflect.ValueOf(data).Kind() == reflect.Slice { + for _, v := range data.([]string) { + html += `
+
+ +
+ + ` + albumTips + `(点击放大预览) + +
` + } + } + html += `
+ 上传` + albumTips + ` + +
` + + // JS拼接 + html += `` + + return template.HTML(html) +} diff --git a/app/widget/widget.go b/app/widget/widget.go new file mode 100644 index 0000000..0224675 --- /dev/null +++ b/app/widget/widget.go @@ -0,0 +1,80 @@ +/** + * 按钮组件 + * @author + * @since 2021/7/13 + * @File : widget + */ +package widget + +import "html/template" + +/* 查询组件 */ +func Query(funcName string) template.HTML { + if funcName == "" { + funcName = "查询" + } + html := `` + return template.HTML(html) +} + +/* 添加组件 */ +func Add(funcName string, param string) template.HTML { + return Widget("add", "layui-icon-add-1", funcName, "", 1, param) +} + +/* 编辑 */ +func Edit(funcName string) template.HTML { + html := `` + funcName + `` + return template.HTML(html) +} + +/* 删除 */ +func Delete(funcName string) template.HTML { + html := `` + funcName + `` + return template.HTML(html) +} + +///* 退款 */ +//func Refund(funcName string) template.HTML { +// html := `` + funcName + `` +// return template.HTML(html) +//} + +/* 批量删除 */ +func Dall(funcName string) template.HTML { + return Widget("dall", "layui-icon-delete", funcName, "layui-btn-danger", 1, "{}") +} + +/* 全部展开 */ +func Expand(funcName string) template.HTML { + return Widget("expand", "layui-icon-shrink-right", funcName, "layui-btn-normal", 1, "{}") +} + +/* 全部折叠 */ +func Collapse(funcName string) template.HTML { + return Widget("collapse", "layui-icon-spread-left", funcName, "layui-btn-warm", 1, "{}") +} + +/* 添加子级 */ +func Addz(funcName string) template.HTML { + return Widget("addz", "layui-icon-add-1", funcName, "layui-btn-normal", 2, "{}") +} + +/* 通用组件 */ +func Widget(funcAct string, funcIcon string, funcName string, funcColor string, funcType int, param string) template.HTML { + // 为空时初始化 + if param == "" { + param = "{}" + } + // 拼接HTML + html := `` + html = `` + html += ` ` + funcName + `` + return template.HTML(html) +} diff --git a/boot/boot.go b/boot/boot.go new file mode 100644 index 0000000..69f6aa5 --- /dev/null +++ b/boot/boot.go @@ -0,0 +1,16 @@ +/** + * 应用初始化 + * @author + * @since 2021/8/20 + * @File : boot + */ +package boot + +import ( + "fmt" +) + +// 用于应用初始化 +func init() { + fmt.Println("应用初始化") +} diff --git a/document/easygoadmin.gin.layui.sql b/document/easygoadmin.gin.layui.sql new file mode 100644 index 0000000..ed8fadb --- /dev/null +++ b/document/easygoadmin.gin.layui.sql @@ -0,0 +1,4878 @@ +/* + Navicat Premium Data Transfer + + Source Server : 本地数据库 + Source Server Type : MySQL + Source Server Version : 100137 + Source Host : localhost:3306 + Source Schema : easygoadmin.gin.layui + + Target Server Type : MySQL + Target Server Version : 100137 + File Encoding : 65001 + + Date: 15/05/2022 11:46:27 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for sys_ad +-- ---------------------------- +DROP TABLE IF EXISTS `sys_ad`; +CREATE TABLE `sys_ad` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `title` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '广告标题', + `ad_sort_id` int NOT NULL DEFAULT 0 COMMENT '广告位ID', + `cover` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '广告图片', + `type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '广告格式:1图片 2文字 3视频 4推荐', + `description` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '广告描述', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '广告内容', + `url` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '广告链接', + `width` int NOT NULL DEFAULT 0 COMMENT '广告宽度', + `height` int NOT NULL DEFAULT 0 COMMENT '广告高度', + `start_time` int NULL DEFAULT NULL COMMENT '开始时间', + `end_time` int NULL DEFAULT NULL COMMENT '结束时间', + `view_num` int NOT NULL DEFAULT 0 COMMENT '点击率', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:1在用 2停用', + `sort` smallint NOT NULL DEFAULT 125 COMMENT '排序', + `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识(1正常 0删除)', + PRIMARY KEY (`id`) USING BTREE, + INDEX `title`(`title`) USING BTREE, + INDEX `ad_sort_id`(`ad_sort_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 49 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '广告管理表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_ad +-- ---------------------------- +INSERT INTO `sys_ad` VALUES (1, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (2, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (3, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (4, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (5, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (6, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (7, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (8, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (9, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (10, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (11, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (12, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (13, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (14, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (15, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (16, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (17, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (18, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (19, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (20, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (21, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (22, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (23, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (24, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (25, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (26, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (27, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (28, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (29, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (30, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (31, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (32, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (33, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (34, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (35, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (36, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (37, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (38, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (39, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (40, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (41, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (42, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (43, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (44, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (45, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (46, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (47, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); +INSERT INTO `sys_ad` VALUES (48, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '/images/ad/20220512/b8140564-d39f-49b6-ab7d-0fca2026464b.png', 1, 'Go语言全栈技术框架Layui版本', '

\r\n      从我选择从事前端工作开始,有的人总是把这个职业想象的太美好,但当真正从事了这份职业后才发现,高薪的背后其实有太多的心酸和付出,有些是你想都想不到的。\r\n

\r\n

\r\n 程序员的工作和别的工作相比,看似是非常轻松的,而且薪资还偏高。但是作为程序员,加班是十分常见的情况:特别是在互联网公司,相信大家深有体会,除了典型的996外,项目赶进度得加班,项目上线得加班,项目突发情况得加班,疫情期间加班的程序员也不少。\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"\r\n

\r\n

\r\n      我在家办公,相对自由,但是朋友仍然调侃我说,“你说你现在的状态,跟程序员在互联网公司上班有啥区别?”“明明是自由身,还每天忙得就像在公司加班一样”。我回复他说,“这毕竟是在给我自己干活嘛!”\r\n

\r\n

\r\n \"Go语言Iris+Layui混编版发布上线\"
\r\n
\r\n

\r\n

\r\n 有时候临睡前遇到有咨询服务器或者模板的,我都会立马回复。有些着急需要装程序的,只要我还没休息,我都会到电脑前坐着,时刻准备着截图,指导安装。这种忙不会让我有累的感觉,因为我知道我为何而忙时,我会陶醉在当下所做的事情中,虽然这一天天看似平凡但是都很充实。\r\n

\r\n

\r\n 忙碌是自由活着的一种底气。\r\n

\r\n
', '#', 450, 750, 1635873008, 1637530149, 10000, 1, 1, '暂无', 1, 1637370608, 1, 1652327220, 1); + +-- ---------------------------- +-- Table structure for sys_ad_sort +-- ---------------------------- +DROP TABLE IF EXISTS `sys_ad_sort`; +CREATE TABLE `sys_ad_sort` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '广告位描述', + `item_id` int NOT NULL DEFAULT 0 COMMENT '站点ID', + `cate_id` smallint NOT NULL DEFAULT 0 COMMENT '栏目ID', + `loc_id` smallint NOT NULL DEFAULT 0 COMMENT '广告页面位置', + `platform` tinyint(1) NOT NULL DEFAULT 1 COMMENT '站点类型:1PC网站 2WAP手机站 3微信小程序 4APP移动端', + `sort` smallint NOT NULL DEFAULT 125 COMMENT '广告位排序', + `create_user` int NULL DEFAULT 0 COMMENT '添加人', + `create_time` int NULL DEFAULT NULL COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '广告位管理表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_ad_sort +-- ---------------------------- +INSERT INTO `sys_ad_sort` VALUES (1, '创作者社区', 1, 1, 1, 3, 10, 1, 1637370608, 1, 1652326868, 1); + +-- ---------------------------- +-- Table structure for sys_city +-- ---------------------------- +DROP TABLE IF EXISTS `sys_city`; +CREATE TABLE `sys_city` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '编号', + `pid` int NOT NULL DEFAULT 0 COMMENT '父级编号', + `level` tinyint(1) NOT NULL DEFAULT 0 COMMENT '城市级别:1省 2市 3区', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '城市名称', + `citycode` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '城市编号(区号)', + `p_adcode` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '父级地理编号', + `adcode` varchar(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地理编号', + `lng` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '城市坐标中心点经度(* 1e6):如果是中国,此值是 1e7', + `lat` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '城市坐标中心点纬度(* 1e6)', + `sort` tinyint NOT NULL DEFAULT 125 COMMENT '排序号', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NOT NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标记', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_name`(`name`) USING BTREE COMMENT '城市名称' +) ENGINE = InnoDB AUTO_INCREMENT = 3219 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '行政区划表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_city +-- ---------------------------- +INSERT INTO `sys_city` VALUES (1, 0, 1, '北京市', '110000', '11', '11', '1', '11', 1, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2, 1, 2, '北京市', '110100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3, 2, 3, '东城区', '110101', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (4, 2, 3, '西城区', '110102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (5, 2, 3, '朝阳区', '110105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (6, 2, 3, '丰台区', '110106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (7, 2, 3, '石景山区', '110107', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (8, 2, 3, '海淀区', '110108', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (9, 2, 3, '门头沟区', '110109', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (10, 2, 3, '房山区', '110111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (11, 2, 3, '通州区', '110112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (12, 2, 3, '顺义区', '110113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (13, 2, 3, '昌平区', '110114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (14, 2, 3, '大兴区', '110115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (15, 2, 3, '怀柔区', '110116', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (16, 2, 3, '平谷区', '110117', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (17, 2, 3, '密云区', '110118', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (18, 2, 3, '延庆区', '110119', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (19, 0, 1, '天津市', '120000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (20, 19, 2, '天津市', '120100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (21, 20, 3, '和平区', '120101', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (22, 20, 3, '河东区', '120102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (23, 20, 3, '河西区', '120103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (24, 20, 3, '南开区', '120104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (25, 20, 3, '河北区', '120105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (26, 20, 3, '红桥区', '120106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (27, 20, 3, '东丽区', '120110', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (28, 20, 3, '西青区', '120111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (29, 20, 3, '津南区', '120112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (30, 20, 3, '北辰区', '120113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (31, 20, 3, '武清区', '120114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (32, 20, 3, '宝坻区', '120115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (33, 20, 3, '滨海新区', '120116', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (34, 20, 3, '宁河区', '120117', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (35, 20, 3, '静海区', '120118', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (36, 20, 3, '蓟州区', '120119', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (37, 0, 1, '河北省', '130000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (38, 37, 2, '石家庄市', '130100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (39, 38, 3, '长安区', '130102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (40, 38, 3, '桥西区', '130104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (41, 38, 3, '新华区', '130105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (42, 38, 3, '井陉矿区', '130107', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (43, 38, 3, '裕华区', '130108', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (44, 38, 3, '藁城区', '130109', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (45, 38, 3, '鹿泉区', '130110', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (46, 38, 3, '栾城区', '130111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (47, 38, 3, '井陉县', '130121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (48, 38, 3, '正定县', '130123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (49, 38, 3, '行唐县', '130125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (50, 38, 3, '灵寿县', '130126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (51, 38, 3, '高邑县', '130127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (52, 38, 3, '深泽县', '130128', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (53, 38, 3, '赞皇县', '130129', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (54, 38, 3, '无极县', '130130', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (55, 38, 3, '平山县', '130131', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (56, 38, 3, '元氏县', '130132', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (57, 38, 3, '赵县', '130133', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (58, 38, 3, '辛集市', '130181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (59, 38, 3, '晋州市', '130183', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (60, 38, 3, '新乐市', '130184', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (61, 37, 2, '唐山市', '130200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (62, 61, 3, '路南区', '130202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (63, 61, 3, '路北区', '130203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (64, 61, 3, '古冶区', '130204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (65, 61, 3, '开平区', '130205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (66, 61, 3, '丰南区', '130207', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (67, 61, 3, '丰润区', '130208', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (68, 61, 3, '曹妃甸区', '130209', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (69, 61, 3, '滦南县', '130224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (70, 61, 3, '乐亭县', '130225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (71, 61, 3, '迁西县', '130227', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (72, 61, 3, '玉田县', '130229', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (73, 61, 3, '遵化市', '130281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (74, 61, 3, '迁安市', '130283', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (75, 61, 3, '滦州市', '130284', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (76, 37, 2, '秦皇岛市', '130300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (77, 76, 3, '海港区', '130302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (78, 76, 3, '山海关区', '130303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (79, 76, 3, '北戴河区', '130304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (80, 76, 3, '抚宁区', '130306', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (81, 76, 3, '青龙满族自治县', '130321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (82, 76, 3, '昌黎县', '130322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (83, 76, 3, '卢龙县', '130324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (84, 37, 2, '邯郸市', '130400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (85, 84, 3, '邯山区', '130402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (86, 84, 3, '丛台区', '130403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (87, 84, 3, '复兴区', '130404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (88, 84, 3, '峰峰矿区', '130406', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (89, 84, 3, '肥乡区', '130407', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (90, 84, 3, '永年区', '130408', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (91, 84, 3, '临漳县', '130423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (92, 84, 3, '成安县', '130424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (93, 84, 3, '大名县', '130425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (94, 84, 3, '涉县', '130426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (95, 84, 3, '磁县', '130427', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (96, 84, 3, '邱县', '130430', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (97, 84, 3, '鸡泽县', '130431', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (98, 84, 3, '广平县', '130432', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (99, 84, 3, '馆陶县', '130433', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (100, 84, 3, '魏县', '130434', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (101, 84, 3, '曲周县', '130435', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (102, 84, 3, '武安市', '130481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (103, 37, 2, '邢台市', '130500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (104, 103, 3, '襄都区', '130502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (105, 103, 3, '信都区', '130503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (106, 103, 3, '任泽区', '130505', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (107, 103, 3, '南和区', '130506', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (108, 103, 3, '临城县', '130522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (109, 103, 3, '内丘县', '130523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (110, 103, 3, '柏乡县', '130524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (111, 103, 3, '隆尧县', '130525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (112, 103, 3, '宁晋县', '130528', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (113, 103, 3, '巨鹿县', '130529', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (114, 103, 3, '新河县', '130530', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (115, 103, 3, '广宗县', '130531', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (116, 103, 3, '平乡县', '130532', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (117, 103, 3, '威县', '130533', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (118, 103, 3, '清河县', '130534', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (119, 103, 3, '临西县', '130535', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (120, 103, 3, '南宫市', '130581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (121, 103, 3, '沙河市', '130582', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (122, 37, 2, '保定市', '130600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (123, 122, 3, '竞秀区', '130602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (124, 122, 3, '莲池区', '130606', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (125, 122, 3, '满城区', '130607', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (126, 122, 3, '清苑区', '130608', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (127, 122, 3, '徐水区', '130609', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (128, 122, 3, '涞水县', '130623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (129, 122, 3, '阜平县', '130624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (130, 122, 3, '定兴县', '130626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (131, 122, 3, '唐县', '130627', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (132, 122, 3, '高阳县', '130628', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (133, 122, 3, '容城县', '130629', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (134, 122, 3, '涞源县', '130630', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (135, 122, 3, '望都县', '130631', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (136, 122, 3, '安新县', '130632', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (137, 122, 3, '易县', '130633', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (138, 122, 3, '曲阳县', '130634', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (139, 122, 3, '蠡县', '130635', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (140, 122, 3, '顺平县', '130636', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (141, 122, 3, '博野县', '130637', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (142, 122, 3, '雄县', '130638', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (143, 122, 3, '涿州市', '130681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (144, 122, 3, '定州市', '130682', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (145, 122, 3, '安国市', '130683', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (146, 122, 3, '高碑店市', '130684', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (147, 37, 2, '张家口市', '130700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (148, 147, 3, '桥东区', '130702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (149, 147, 3, '桥西区', '130703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (150, 147, 3, '宣化区', '130705', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (151, 147, 3, '下花园区', '130706', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (152, 147, 3, '万全区', '130708', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (153, 147, 3, '崇礼区', '130709', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (154, 147, 3, '张北县', '130722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (155, 147, 3, '康保县', '130723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (156, 147, 3, '沽源县', '130724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (157, 147, 3, '尚义县', '130725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (158, 147, 3, '蔚县', '130726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (159, 147, 3, '阳原县', '130727', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (160, 147, 3, '怀安县', '130728', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (161, 147, 3, '怀来县', '130730', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (162, 147, 3, '涿鹿县', '130731', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (163, 147, 3, '赤城县', '130732', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (164, 37, 2, '承德市', '130800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (165, 164, 3, '双桥区', '130802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (166, 164, 3, '双滦区', '130803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (167, 164, 3, '鹰手营子矿区', '130804', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (168, 164, 3, '承德县', '130821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (169, 164, 3, '兴隆县', '130822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (170, 164, 3, '滦平县', '130824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (171, 164, 3, '隆化县', '130825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (172, 164, 3, '丰宁满族自治县', '130826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (173, 164, 3, '宽城满族自治县', '130827', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (174, 164, 3, '围场满族蒙古族自治县', '130828', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (175, 164, 3, '平泉市', '130881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (176, 37, 2, '沧州市', '130900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (177, 176, 3, '新华区', '130902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (178, 176, 3, '运河区', '130903', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (179, 176, 3, '沧县', '130921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (180, 176, 3, '青县', '130922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (181, 176, 3, '东光县', '130923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (182, 176, 3, '海兴县', '130924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (183, 176, 3, '盐山县', '130925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (184, 176, 3, '肃宁县', '130926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (185, 176, 3, '南皮县', '130927', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (186, 176, 3, '吴桥县', '130928', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (187, 176, 3, '献县', '130929', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (188, 176, 3, '孟村回族自治县', '130930', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (189, 176, 3, '泊头市', '130981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (190, 176, 3, '任丘市', '130982', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (191, 176, 3, '黄骅市', '130983', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (192, 176, 3, '河间市', '130984', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (193, 37, 2, '廊坊市', '131000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (194, 193, 3, '安次区', '131002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (195, 193, 3, '广阳区', '131003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (196, 193, 3, '固安县', '131022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (197, 193, 3, '永清县', '131023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (198, 193, 3, '香河县', '131024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (199, 193, 3, '大城县', '131025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (200, 193, 3, '文安县', '131026', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (201, 193, 3, '大厂回族自治县', '131028', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (202, 193, 3, '霸州市', '131081', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (203, 193, 3, '三河市', '131082', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (204, 37, 2, '衡水市', '131100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (205, 204, 3, '桃城区', '131102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (206, 204, 3, '冀州区', '131103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (207, 204, 3, '枣强县', '131121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (208, 204, 3, '武邑县', '131122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (209, 204, 3, '武强县', '131123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (210, 204, 3, '饶阳县', '131124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (211, 204, 3, '安平县', '131125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (212, 204, 3, '故城县', '131126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (213, 204, 3, '景县', '131127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (214, 204, 3, '阜城县', '131128', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (215, 204, 3, '深州市', '131182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (216, 0, 1, '山西省', '140000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (217, 216, 2, '太原市', '140100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (218, 217, 3, '小店区', '140105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (219, 217, 3, '迎泽区', '140106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (220, 217, 3, '杏花岭区', '140107', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (221, 217, 3, '尖草坪区', '140108', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (222, 217, 3, '万柏林区', '140109', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (223, 217, 3, '晋源区', '140110', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (224, 217, 3, '清徐县', '140121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (225, 217, 3, '阳曲县', '140122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (226, 217, 3, '娄烦县', '140123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (227, 217, 3, '古交市', '140181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (228, 216, 2, '大同市', '140200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (229, 228, 3, '新荣区', '140212', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (230, 228, 3, '平城区', '140213', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (231, 228, 3, '云冈区', '140214', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (232, 228, 3, '云州区', '140215', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (233, 228, 3, '阳高县', '140221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (234, 228, 3, '天镇县', '140222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (235, 228, 3, '广灵县', '140223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (236, 228, 3, '灵丘县', '140224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (237, 228, 3, '浑源县', '140225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (238, 228, 3, '左云县', '140226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (239, 216, 2, '阳泉市', '140300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (240, 239, 3, '城区', '140302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (241, 239, 3, '矿区', '140303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (242, 239, 3, '郊区', '140311', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (243, 239, 3, '平定县', '140321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (244, 239, 3, '盂县', '140322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (245, 216, 2, '长治市', '140400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (246, 245, 3, '潞州区', '140403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (247, 245, 3, '上党区', '140404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (248, 245, 3, '屯留区', '140405', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (249, 245, 3, '潞城区', '140406', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (250, 245, 3, '襄垣县', '140423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (251, 245, 3, '平顺县', '140425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (252, 245, 3, '黎城县', '140426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (253, 245, 3, '壶关县', '140427', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (254, 245, 3, '长子县', '140428', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (255, 245, 3, '武乡县', '140429', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (256, 245, 3, '沁县', '140430', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (257, 245, 3, '沁源县', '140431', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (258, 216, 2, '晋城市', '140500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (259, 258, 3, '城区', '140502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (260, 258, 3, '沁水县', '140521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (261, 258, 3, '阳城县', '140522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (262, 258, 3, '陵川县', '140524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (263, 258, 3, '泽州县', '140525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (264, 258, 3, '高平市', '140581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (265, 216, 2, '朔州市', '140600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (266, 265, 3, '朔城区', '140602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (267, 265, 3, '平鲁区', '140603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (268, 265, 3, '山阴县', '140621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (269, 265, 3, '应县', '140622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (270, 265, 3, '右玉县', '140623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (271, 265, 3, '怀仁市', '140681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (272, 216, 2, '晋中市', '140700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (273, 272, 3, '榆次区', '140702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (274, 272, 3, '太谷区', '140703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (275, 272, 3, '榆社县', '140721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (276, 272, 3, '左权县', '140722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (277, 272, 3, '和顺县', '140723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (278, 272, 3, '昔阳县', '140724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (279, 272, 3, '寿阳县', '140725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (280, 272, 3, '祁县', '140727', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (281, 272, 3, '平遥县', '140728', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (282, 272, 3, '灵石县', '140729', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (283, 272, 3, '介休市', '140781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (284, 216, 2, '运城市', '140800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (285, 284, 3, '盐湖区', '140802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (286, 284, 3, '临猗县', '140821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (287, 284, 3, '万荣县', '140822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (288, 284, 3, '闻喜县', '140823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (289, 284, 3, '稷山县', '140824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (290, 284, 3, '新绛县', '140825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (291, 284, 3, '绛县', '140826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (292, 284, 3, '垣曲县', '140827', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (293, 284, 3, '夏县', '140828', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (294, 284, 3, '平陆县', '140829', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (295, 284, 3, '芮城县', '140830', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (296, 284, 3, '永济市', '140881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (297, 284, 3, '河津市', '140882', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (298, 216, 2, '忻州市', '140900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (299, 298, 3, '忻府区', '140902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (300, 298, 3, '定襄县', '140921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (301, 298, 3, '五台县', '140922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (302, 298, 3, '代县', '140923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (303, 298, 3, '繁峙县', '140924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (304, 298, 3, '宁武县', '140925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (305, 298, 3, '静乐县', '140926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (306, 298, 3, '神池县', '140927', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (307, 298, 3, '五寨县', '140928', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (308, 298, 3, '岢岚县', '140929', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (309, 298, 3, '河曲县', '140930', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (310, 298, 3, '保德县', '140931', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (311, 298, 3, '偏关县', '140932', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (312, 298, 3, '原平市', '140981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (313, 216, 2, '临汾市', '141000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (314, 313, 3, '尧都区', '141002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (315, 313, 3, '曲沃县', '141021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (316, 313, 3, '翼城县', '141022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (317, 313, 3, '襄汾县', '141023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (318, 313, 3, '洪洞县', '141024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (319, 313, 3, '古县', '141025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (320, 313, 3, '安泽县', '141026', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (321, 313, 3, '浮山县', '141027', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (322, 313, 3, '吉县', '141028', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (323, 313, 3, '乡宁县', '141029', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (324, 313, 3, '大宁县', '141030', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (325, 313, 3, '隰县', '141031', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (326, 313, 3, '永和县', '141032', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (327, 313, 3, '蒲县', '141033', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (328, 313, 3, '汾西县', '141034', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (329, 313, 3, '侯马市', '141081', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (330, 313, 3, '霍州市', '141082', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (331, 216, 2, '吕梁市', '141100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (332, 331, 3, '离石区', '141102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (333, 331, 3, '文水县', '141121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (334, 331, 3, '交城县', '141122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (335, 331, 3, '兴县', '141123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (336, 331, 3, '临县', '141124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (337, 331, 3, '柳林县', '141125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (338, 331, 3, '石楼县', '141126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (339, 331, 3, '岚县', '141127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (340, 331, 3, '方山县', '141128', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (341, 331, 3, '中阳县', '141129', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (342, 331, 3, '交口县', '141130', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (343, 331, 3, '孝义市', '141181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (344, 331, 3, '汾阳市', '141182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (345, 0, 1, '内蒙古自治区', '150000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (346, 345, 2, '呼和浩特市', '150100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (347, 346, 3, '新城区', '150102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (348, 346, 3, '回民区', '150103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (349, 346, 3, '玉泉区', '150104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (350, 346, 3, '赛罕区', '150105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (351, 346, 3, '土默特左旗', '150121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (352, 346, 3, '托克托县', '150122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (353, 346, 3, '和林格尔县', '150123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (354, 346, 3, '清水河县', '150124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (355, 346, 3, '武川县', '150125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (356, 345, 2, '包头市', '150200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (357, 356, 3, '东河区', '150202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (358, 356, 3, '昆都仑区', '150203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (359, 356, 3, '青山区', '150204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (360, 356, 3, '石拐区', '150205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (361, 356, 3, '白云鄂博矿区', '150206', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (362, 356, 3, '九原区', '150207', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (363, 356, 3, '土默特右旗', '150221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (364, 356, 3, '固阳县', '150222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (365, 356, 3, '达尔罕茂明安联合旗', '150223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (366, 345, 2, '乌海市', '150300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (367, 366, 3, '海勃湾区', '150302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (368, 366, 3, '海南区', '150303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (369, 366, 3, '乌达区', '150304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (370, 345, 2, '赤峰市', '150400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (371, 370, 3, '红山区', '150402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (372, 370, 3, '元宝山区', '150403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (373, 370, 3, '松山区', '150404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (374, 370, 3, '阿鲁科尔沁旗', '150421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (375, 370, 3, '巴林左旗', '150422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (376, 370, 3, '巴林右旗', '150423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (377, 370, 3, '林西县', '150424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (378, 370, 3, '克什克腾旗', '150425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (379, 370, 3, '翁牛特旗', '150426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (380, 370, 3, '喀喇沁旗', '150428', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (381, 370, 3, '宁城县', '150429', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (382, 370, 3, '敖汉旗', '150430', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (383, 345, 2, '通辽市', '150500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (384, 383, 3, '科尔沁区', '150502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (385, 383, 3, '科尔沁左翼中旗', '150521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (386, 383, 3, '科尔沁左翼后旗', '150522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (387, 383, 3, '开鲁县', '150523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (388, 383, 3, '库伦旗', '150524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (389, 383, 3, '奈曼旗', '150525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (390, 383, 3, '扎鲁特旗', '150526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (391, 383, 3, '霍林郭勒市', '150581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (392, 345, 2, '鄂尔多斯市', '150600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (393, 392, 3, '东胜区', '150602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (394, 392, 3, '康巴什区', '150603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (395, 392, 3, '达拉特旗', '150621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (396, 392, 3, '准格尔旗', '150622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (397, 392, 3, '鄂托克前旗', '150623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (398, 392, 3, '鄂托克旗', '150624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (399, 392, 3, '杭锦旗', '150625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (400, 392, 3, '乌审旗', '150626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (401, 392, 3, '伊金霍洛旗', '150627', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (402, 345, 2, '呼伦贝尔市', '150700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (403, 402, 3, '海拉尔区', '150702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (404, 402, 3, '扎赉诺尔区', '150703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (405, 402, 3, '阿荣旗', '150721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (406, 402, 3, '莫力达瓦达斡尔族自治旗', '150722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (407, 402, 3, '鄂伦春自治旗', '150723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (408, 402, 3, '鄂温克族自治旗', '150724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (409, 402, 3, '陈巴尔虎旗', '150725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (410, 402, 3, '新巴尔虎左旗', '150726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (411, 402, 3, '新巴尔虎右旗', '150727', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (412, 402, 3, '满洲里市', '150781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (413, 402, 3, '牙克石市', '150782', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (414, 402, 3, '扎兰屯市', '150783', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (415, 402, 3, '额尔古纳市', '150784', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (416, 402, 3, '根河市', '150785', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (417, 345, 2, '巴彦淖尔市', '150800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (418, 417, 3, '临河区', '150802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (419, 417, 3, '五原县', '150821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (420, 417, 3, '磴口县', '150822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (421, 417, 3, '乌拉特前旗', '150823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (422, 417, 3, '乌拉特中旗', '150824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (423, 417, 3, '乌拉特后旗', '150825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (424, 417, 3, '杭锦后旗', '150826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (425, 345, 2, '乌兰察布市', '150900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (426, 425, 3, '集宁区', '150902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (427, 425, 3, '卓资县', '150921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (428, 425, 3, '化德县', '150922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (429, 425, 3, '商都县', '150923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (430, 425, 3, '兴和县', '150924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (431, 425, 3, '凉城县', '150925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (432, 425, 3, '察哈尔右翼前旗', '150926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (433, 425, 3, '察哈尔右翼中旗', '150927', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (434, 425, 3, '察哈尔右翼后旗', '150928', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (435, 425, 3, '四子王旗', '150929', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (436, 425, 3, '丰镇市', '150981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (437, 345, 2, '兴安盟', '152200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (438, 437, 3, '乌兰浩特市', '152201', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (439, 437, 3, '阿尔山市', '152202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (440, 437, 3, '科尔沁右翼前旗', '152221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (441, 437, 3, '科尔沁右翼中旗', '152222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (442, 437, 3, '扎赉特旗', '152223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (443, 437, 3, '突泉县', '152224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (444, 345, 2, '锡林郭勒盟', '152500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (445, 444, 3, '二连浩特市', '152501', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (446, 444, 3, '锡林浩特市', '152502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (447, 444, 3, '阿巴嘎旗', '152522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (448, 444, 3, '苏尼特左旗', '152523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (449, 444, 3, '苏尼特右旗', '152524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (450, 444, 3, '东乌珠穆沁旗', '152525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (451, 444, 3, '西乌珠穆沁旗', '152526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (452, 444, 3, '太仆寺旗', '152527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (453, 444, 3, '镶黄旗', '152528', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (454, 444, 3, '正镶白旗', '152529', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (455, 444, 3, '正蓝旗', '152530', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (456, 444, 3, '多伦县', '152531', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (457, 345, 2, '阿拉善盟', '152900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (458, 457, 3, '阿拉善左旗', '152921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (459, 457, 3, '阿拉善右旗', '152922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (460, 457, 3, '额济纳旗', '152923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (461, 0, 1, '辽宁省', '210000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (462, 461, 2, '沈阳市', '210100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (463, 462, 3, '和平区', '210102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (464, 462, 3, '沈河区', '210103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (465, 462, 3, '大东区', '210104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (466, 462, 3, '皇姑区', '210105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (467, 462, 3, '铁西区', '210106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (468, 462, 3, '苏家屯区', '210111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (469, 462, 3, '浑南区', '210112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (470, 462, 3, '沈北新区', '210113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (471, 462, 3, '于洪区', '210114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (472, 462, 3, '辽中区', '210115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (473, 462, 3, '康平县', '210123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (474, 462, 3, '法库县', '210124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (475, 462, 3, '新民市', '210181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (476, 461, 2, '大连市', '210200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (477, 476, 3, '中山区', '210202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (478, 476, 3, '西岗区', '210203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (479, 476, 3, '沙河口区', '210204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (480, 476, 3, '甘井子区', '210211', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (481, 476, 3, '旅顺口区', '210212', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (482, 476, 3, '金州区', '210213', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (483, 476, 3, '普兰店区', '210214', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (484, 476, 3, '长海县', '210224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (485, 476, 3, '瓦房店市', '210281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (486, 476, 3, '庄河市', '210283', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (487, 461, 2, '鞍山市', '210300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (488, 487, 3, '铁东区', '210302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (489, 487, 3, '铁西区', '210303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (490, 487, 3, '立山区', '210304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (491, 487, 3, '千山区', '210311', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (492, 487, 3, '台安县', '210321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (493, 487, 3, '岫岩满族自治县', '210323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (494, 487, 3, '海城市', '210381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (495, 461, 2, '抚顺市', '210400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (496, 495, 3, '新抚区', '210402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (497, 495, 3, '东洲区', '210403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (498, 495, 3, '望花区', '210404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (499, 495, 3, '顺城区', '210411', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (500, 495, 3, '抚顺县', '210421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (501, 495, 3, '新宾满族自治县', '210422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (502, 495, 3, '清原满族自治县', '210423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (503, 461, 2, '本溪市', '210500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (504, 503, 3, '平山区', '210502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (505, 503, 3, '溪湖区', '210503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (506, 503, 3, '明山区', '210504', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (507, 503, 3, '南芬区', '210505', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (508, 503, 3, '本溪满族自治县', '210521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (509, 503, 3, '桓仁满族自治县', '210522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (510, 461, 2, '丹东市', '210600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (511, 510, 3, '元宝区', '210602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (512, 510, 3, '振兴区', '210603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (513, 510, 3, '振安区', '210604', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (514, 510, 3, '宽甸满族自治县', '210624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (515, 510, 3, '东港市', '210681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (516, 510, 3, '凤城市', '210682', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (517, 461, 2, '锦州市', '210700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (518, 517, 3, '古塔区', '210702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (519, 517, 3, '凌河区', '210703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (520, 517, 3, '太和区', '210711', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (521, 517, 3, '黑山县', '210726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (522, 517, 3, '义县', '210727', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (523, 517, 3, '凌海市', '210781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (524, 517, 3, '北镇市', '210782', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (525, 461, 2, '营口市', '210800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (526, 525, 3, '站前区', '210802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (527, 525, 3, '西市区', '210803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (528, 525, 3, '鲅鱼圈区', '210804', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (529, 525, 3, '老边区', '210811', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (530, 525, 3, '盖州市', '210881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (531, 525, 3, '大石桥市', '210882', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (532, 461, 2, '阜新市', '210900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (533, 532, 3, '海州区', '210902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (534, 532, 3, '新邱区', '210903', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (535, 532, 3, '太平区', '210904', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (536, 532, 3, '清河门区', '210905', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (537, 532, 3, '细河区', '210911', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (538, 532, 3, '阜新蒙古族自治县', '210921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (539, 532, 3, '彰武县', '210922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (540, 461, 2, '辽阳市', '211000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (541, 540, 3, '白塔区', '211002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (542, 540, 3, '文圣区', '211003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (543, 540, 3, '宏伟区', '211004', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (544, 540, 3, '弓长岭区', '211005', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (545, 540, 3, '太子河区', '211011', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (546, 540, 3, '辽阳县', '211021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (547, 540, 3, '灯塔市', '211081', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (548, 461, 2, '盘锦市', '211100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (549, 548, 3, '双台子区', '211102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (550, 548, 3, '兴隆台区', '211103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (551, 548, 3, '大洼区', '211104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (552, 548, 3, '盘山县', '211122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (553, 461, 2, '铁岭市', '211200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (554, 553, 3, '银州区', '211202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (555, 553, 3, '清河区', '211204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (556, 553, 3, '铁岭县', '211221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (557, 553, 3, '西丰县', '211223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (558, 553, 3, '昌图县', '211224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (559, 553, 3, '调兵山市', '211281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (560, 553, 3, '开原市', '211282', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (561, 461, 2, '朝阳市', '211300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (562, 561, 3, '双塔区', '211302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (563, 561, 3, '龙城区', '211303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (564, 561, 3, '朝阳县', '211321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (565, 561, 3, '建平县', '211322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (566, 561, 3, '喀喇沁左翼蒙古族自治县', '211324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (567, 561, 3, '北票市', '211381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (568, 561, 3, '凌源市', '211382', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (569, 461, 2, '葫芦岛市', '211400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (570, 569, 3, '连山区', '211402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (571, 569, 3, '龙港区', '211403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (572, 569, 3, '南票区', '211404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (573, 569, 3, '绥中县', '211421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (574, 569, 3, '建昌县', '211422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (575, 569, 3, '兴城市', '211481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (576, 0, 1, '吉林省', '220000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (577, 576, 2, '长春市', '220100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (578, 577, 3, '南关区', '220102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (579, 577, 3, '宽城区', '220103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (580, 577, 3, '朝阳区', '220104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (581, 577, 3, '二道区', '220105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (582, 577, 3, '绿园区', '220106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (583, 577, 3, '双阳区', '220112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (584, 577, 3, '九台区', '220113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (585, 577, 3, '农安县', '220122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (586, 577, 3, '榆树市', '220182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (587, 577, 3, '德惠市', '220183', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (588, 577, 3, '公主岭市', '220184', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (589, 576, 2, '吉林市', '220200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (590, 589, 3, '昌邑区', '220202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (591, 589, 3, '龙潭区', '220203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (592, 589, 3, '船营区', '220204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (593, 589, 3, '丰满区', '220211', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (594, 589, 3, '永吉县', '220221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (595, 589, 3, '蛟河市', '220281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (596, 589, 3, '桦甸市', '220282', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (597, 589, 3, '舒兰市', '220283', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (598, 589, 3, '磐石市', '220284', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (599, 576, 2, '四平市', '220300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (600, 599, 3, '铁西区', '220302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (601, 599, 3, '铁东区', '220303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (602, 599, 3, '梨树县', '220322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (603, 599, 3, '伊通满族自治县', '220323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (604, 599, 3, '双辽市', '220382', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (605, 576, 2, '辽源市', '220400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (606, 605, 3, '龙山区', '220402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (607, 605, 3, '西安区', '220403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (608, 605, 3, '东丰县', '220421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (609, 605, 3, '东辽县', '220422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (610, 576, 2, '通化市', '220500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (611, 610, 3, '东昌区', '220502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (612, 610, 3, '二道江区', '220503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (613, 610, 3, '通化县', '220521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (614, 610, 3, '辉南县', '220523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (615, 610, 3, '柳河县', '220524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (616, 610, 3, '梅河口市', '220581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (617, 610, 3, '集安市', '220582', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (618, 576, 2, '白山市', '220600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (619, 618, 3, '浑江区', '220602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (620, 618, 3, '江源区', '220605', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (621, 618, 3, '抚松县', '220621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (622, 618, 3, '靖宇县', '220622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (623, 618, 3, '长白朝鲜族自治县', '220623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (624, 618, 3, '临江市', '220681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (625, 576, 2, '松原市', '220700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (626, 625, 3, '宁江区', '220702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (627, 625, 3, '前郭尔罗斯蒙古族自治县', '220721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (628, 625, 3, '长岭县', '220722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (629, 625, 3, '乾安县', '220723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (630, 625, 3, '扶余市', '220781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (631, 576, 2, '白城市', '220800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (632, 631, 3, '洮北区', '220802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (633, 631, 3, '镇赉县', '220821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (634, 631, 3, '通榆县', '220822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (635, 631, 3, '洮南市', '220881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (636, 631, 3, '大安市', '220882', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (637, 576, 2, '延边朝鲜族自治州', '222400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (638, 637, 3, '延吉市', '222401', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (639, 637, 3, '图们市', '222402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (640, 637, 3, '敦化市', '222403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (641, 637, 3, '珲春市', '222404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (642, 637, 3, '龙井市', '222405', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (643, 637, 3, '和龙市', '222406', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (644, 637, 3, '汪清县', '222424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (645, 637, 3, '安图县', '222426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (646, 0, 1, '黑龙江省', '230000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (647, 646, 2, '哈尔滨市', '230100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (648, 647, 3, '道里区', '230102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (649, 647, 3, '南岗区', '230103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (650, 647, 3, '道外区', '230104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (651, 647, 3, '平房区', '230108', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (652, 647, 3, '松北区', '230109', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (653, 647, 3, '香坊区', '230110', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (654, 647, 3, '呼兰区', '230111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (655, 647, 3, '阿城区', '230112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (656, 647, 3, '双城区', '230113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (657, 647, 3, '依兰县', '230123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (658, 647, 3, '方正县', '230124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (659, 647, 3, '宾县', '230125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (660, 647, 3, '巴彦县', '230126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (661, 647, 3, '木兰县', '230127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (662, 647, 3, '通河县', '230128', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (663, 647, 3, '延寿县', '230129', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (664, 647, 3, '尚志市', '230183', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (665, 647, 3, '五常市', '230184', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (666, 646, 2, '齐齐哈尔市', '230200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (667, 666, 3, '龙沙区', '230202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (668, 666, 3, '建华区', '230203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (669, 666, 3, '铁锋区', '230204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (670, 666, 3, '昂昂溪区', '230205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (671, 666, 3, '富拉尔基区', '230206', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (672, 666, 3, '碾子山区', '230207', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (673, 666, 3, '梅里斯达斡尔族区', '230208', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (674, 666, 3, '龙江县', '230221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (675, 666, 3, '依安县', '230223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (676, 666, 3, '泰来县', '230224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (677, 666, 3, '甘南县', '230225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (678, 666, 3, '富裕县', '230227', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (679, 666, 3, '克山县', '230229', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (680, 666, 3, '克东县', '230230', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (681, 666, 3, '拜泉县', '230231', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (682, 666, 3, '讷河市', '230281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (683, 646, 2, '鸡西市', '230300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (684, 683, 3, '鸡冠区', '230302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (685, 683, 3, '恒山区', '230303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (686, 683, 3, '滴道区', '230304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (687, 683, 3, '梨树区', '230305', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (688, 683, 3, '城子河区', '230306', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (689, 683, 3, '麻山区', '230307', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (690, 683, 3, '鸡东县', '230321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (691, 683, 3, '虎林市', '230381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (692, 683, 3, '密山市', '230382', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (693, 646, 2, '鹤岗市', '230400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (694, 693, 3, '向阳区', '230402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (695, 693, 3, '工农区', '230403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (696, 693, 3, '南山区', '230404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (697, 693, 3, '兴安区', '230405', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (698, 693, 3, '东山区', '230406', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (699, 693, 3, '兴山区', '230407', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (700, 693, 3, '萝北县', '230421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (701, 693, 3, '绥滨县', '230422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (702, 646, 2, '双鸭山市', '230500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (703, 702, 3, '尖山区', '230502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (704, 702, 3, '岭东区', '230503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (705, 702, 3, '四方台区', '230505', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (706, 702, 3, '宝山区', '230506', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (707, 702, 3, '集贤县', '230521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (708, 702, 3, '友谊县', '230522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (709, 702, 3, '宝清县', '230523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (710, 702, 3, '饶河县', '230524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (711, 646, 2, '大庆市', '230600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (712, 711, 3, '萨尔图区', '230602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (713, 711, 3, '龙凤区', '230603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (714, 711, 3, '让胡路区', '230604', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (715, 711, 3, '红岗区', '230605', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (716, 711, 3, '大同区', '230606', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (717, 711, 3, '肇州县', '230621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (718, 711, 3, '肇源县', '230622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (719, 711, 3, '林甸县', '230623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (720, 711, 3, '杜尔伯特蒙古族自治县', '230624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (721, 646, 2, '伊春市', '230700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (722, 721, 3, '伊美区', '230717', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (723, 721, 3, '乌翠区', '230718', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (724, 721, 3, '友好区', '230719', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (725, 721, 3, '嘉荫县', '230722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (726, 721, 3, '汤旺县', '230723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (727, 721, 3, '丰林县', '230724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (728, 721, 3, '大箐山县', '230725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (729, 721, 3, '南岔县', '230726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (730, 721, 3, '金林区', '230751', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (731, 721, 3, '铁力市', '230781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (732, 646, 2, '佳木斯市', '230800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (733, 732, 3, '向阳区', '230803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (734, 732, 3, '前进区', '230804', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (735, 732, 3, '东风区', '230805', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (736, 732, 3, '郊区', '230811', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (737, 732, 3, '桦南县', '230822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (738, 732, 3, '桦川县', '230826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (739, 732, 3, '汤原县', '230828', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (740, 732, 3, '同江市', '230881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (741, 732, 3, '富锦市', '230882', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (742, 732, 3, '抚远市', '230883', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (743, 646, 2, '七台河市', '230900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (744, 743, 3, '新兴区', '230902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (745, 743, 3, '桃山区', '230903', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (746, 743, 3, '茄子河区', '230904', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (747, 743, 3, '勃利县', '230921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (748, 646, 2, '牡丹江市', '231000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (749, 748, 3, '东安区', '231002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (750, 748, 3, '阳明区', '231003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (751, 748, 3, '爱民区', '231004', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (752, 748, 3, '西安区', '231005', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (753, 748, 3, '林口县', '231025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (754, 748, 3, '绥芬河市', '231081', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (755, 748, 3, '海林市', '231083', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (756, 748, 3, '宁安市', '231084', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (757, 748, 3, '穆棱市', '231085', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (758, 748, 3, '东宁市', '231086', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (759, 646, 2, '黑河市', '231100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (760, 759, 3, '爱辉区', '231102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (761, 759, 3, '逊克县', '231123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (762, 759, 3, '孙吴县', '231124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (763, 759, 3, '北安市', '231181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (764, 759, 3, '五大连池市', '231182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (765, 759, 3, '嫩江市', '231183', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (766, 646, 2, '绥化市', '231200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (767, 766, 3, '北林区', '231202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (768, 766, 3, '望奎县', '231221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (769, 766, 3, '兰西县', '231222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (770, 766, 3, '青冈县', '231223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (771, 766, 3, '庆安县', '231224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (772, 766, 3, '明水县', '231225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (773, 766, 3, '绥棱县', '231226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (774, 766, 3, '安达市', '231281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (775, 766, 3, '肇东市', '231282', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (776, 766, 3, '海伦市', '231283', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (777, 646, 2, '大兴安岭地区', '232700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (778, 777, 3, '漠河市', '232701', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (779, 777, 3, '呼玛县', '232721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (780, 777, 3, '塔河县', '232722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (781, 0, 1, '上海市', '310000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (782, 781, 2, '上海市', '310100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (783, 782, 3, '黄浦区', '310101', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (784, 782, 3, '徐汇区', '310104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (785, 782, 3, '长宁区', '310105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (786, 782, 3, '静安区', '310106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (787, 782, 3, '普陀区', '310107', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (788, 782, 3, '虹口区', '310109', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (789, 782, 3, '杨浦区', '310110', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (790, 782, 3, '闵行区', '310112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (791, 782, 3, '宝山区', '310113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (792, 782, 3, '嘉定区', '310114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (793, 782, 3, '浦东新区', '310115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (794, 782, 3, '金山区', '310116', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (795, 782, 3, '松江区', '310117', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (796, 782, 3, '青浦区', '310118', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (797, 782, 3, '奉贤区', '310120', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (798, 782, 3, '崇明区', '310151', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (799, 0, 1, '江苏省', '320000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (800, 799, 2, '南京市', '320100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (801, 800, 3, '玄武区', '320102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (802, 800, 3, '秦淮区', '320104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (803, 800, 3, '建邺区', '320105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (804, 800, 3, '鼓楼区', '320106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (805, 800, 3, '浦口区', '320111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (806, 800, 3, '栖霞区', '320113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (807, 800, 3, '雨花台区', '320114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (808, 800, 3, '江宁区', '320115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (809, 800, 3, '六合区', '320116', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (810, 800, 3, '溧水区', '320117', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (811, 800, 3, '高淳区', '320118', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (812, 799, 2, '无锡市', '320200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (813, 812, 3, '锡山区', '320205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (814, 812, 3, '惠山区', '320206', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (815, 812, 3, '滨湖区', '320211', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (816, 812, 3, '梁溪区', '320213', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (817, 812, 3, '新吴区', '320214', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (818, 812, 3, '江阴市', '320281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (819, 812, 3, '宜兴市', '320282', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (820, 799, 2, '徐州市', '320300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (821, 820, 3, '鼓楼区', '320302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (822, 820, 3, '云龙区', '320303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (823, 820, 3, '贾汪区', '320305', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (824, 820, 3, '泉山区', '320311', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (825, 820, 3, '铜山区', '320312', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (826, 820, 3, '丰县', '320321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (827, 820, 3, '沛县', '320322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (828, 820, 3, '睢宁县', '320324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (829, 820, 3, '新沂市', '320381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (830, 820, 3, '邳州市', '320382', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (831, 799, 2, '常州市', '320400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (832, 831, 3, '天宁区', '320402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (833, 831, 3, '钟楼区', '320404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (834, 831, 3, '新北区', '320411', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (835, 831, 3, '武进区', '320412', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (836, 831, 3, '金坛区', '320413', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (837, 831, 3, '溧阳市', '320481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (838, 799, 2, '苏州市', '320500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (839, 838, 3, '虎丘区', '320505', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (840, 838, 3, '吴中区', '320506', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (841, 838, 3, '相城区', '320507', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (842, 838, 3, '姑苏区', '320508', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (843, 838, 3, '吴江区', '320509', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (844, 838, 3, '常熟市', '320581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (845, 838, 3, '张家港市', '320582', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (846, 838, 3, '昆山市', '320583', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (847, 838, 3, '太仓市', '320585', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (848, 799, 2, '南通市', '320600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (849, 848, 3, '崇川区', '320602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (850, 848, 3, '港闸区', '320611', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (851, 848, 3, '通州区', '320612', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (852, 848, 3, '如东县', '320623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (853, 848, 3, '启东市', '320681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (854, 848, 3, '如皋市', '320682', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (855, 848, 3, '海门市', '320684', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (856, 848, 3, '海安市', '320685', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (857, 799, 2, '连云港市', '320700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (858, 857, 3, '连云区', '320703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (859, 857, 3, '海州区', '320706', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (860, 857, 3, '赣榆区', '320707', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (861, 857, 3, '东海县', '320722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (862, 857, 3, '灌云县', '320723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (863, 857, 3, '灌南县', '320724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (864, 799, 2, '淮安市', '320800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (865, 864, 3, '淮安区', '320803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (866, 864, 3, '淮阴区', '320804', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (867, 864, 3, '清江浦区', '320812', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (868, 864, 3, '洪泽区', '320813', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (869, 864, 3, '涟水县', '320826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (870, 864, 3, '盱眙县', '320830', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (871, 864, 3, '金湖县', '320831', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (872, 799, 2, '盐城市', '320900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (873, 872, 3, '亭湖区', '320902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (874, 872, 3, '盐都区', '320903', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (875, 872, 3, '大丰区', '320904', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (876, 872, 3, '响水县', '320921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (877, 872, 3, '滨海县', '320922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (878, 872, 3, '阜宁县', '320923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (879, 872, 3, '射阳县', '320924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (880, 872, 3, '建湖县', '320925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (881, 872, 3, '东台市', '320981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (882, 799, 2, '扬州市', '321000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (883, 882, 3, '广陵区', '321002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (884, 882, 3, '邗江区', '321003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (885, 882, 3, '江都区', '321012', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (886, 882, 3, '宝应县', '321023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (887, 882, 3, '仪征市', '321081', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (888, 882, 3, '高邮市', '321084', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (889, 799, 2, '镇江市', '321100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (890, 889, 3, '京口区', '321102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (891, 889, 3, '润州区', '321111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (892, 889, 3, '丹徒区', '321112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (893, 889, 3, '丹阳市', '321181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (894, 889, 3, '扬中市', '321182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (895, 889, 3, '句容市', '321183', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (896, 799, 2, '泰州市', '321200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (897, 896, 3, '海陵区', '321202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (898, 896, 3, '高港区', '321203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (899, 896, 3, '姜堰区', '321204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (900, 896, 3, '兴化市', '321281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (901, 896, 3, '靖江市', '321282', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (902, 896, 3, '泰兴市', '321283', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (903, 799, 2, '宿迁市', '321300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (904, 903, 3, '宿城区', '321302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (905, 903, 3, '宿豫区', '321311', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (906, 903, 3, '沭阳县', '321322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (907, 903, 3, '泗阳县', '321323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (908, 903, 3, '泗洪县', '321324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (909, 0, 1, '浙江省', '330000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (910, 909, 2, '杭州市', '330100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (911, 910, 3, '上城区', '330102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (912, 910, 3, '下城区', '330103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (913, 910, 3, '江干区', '330104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (914, 910, 3, '拱墅区', '330105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (915, 910, 3, '西湖区', '330106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (916, 910, 3, '滨江区', '330108', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (917, 910, 3, '萧山区', '330109', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (918, 910, 3, '余杭区', '330110', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (919, 910, 3, '富阳区', '330111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (920, 910, 3, '临安区', '330112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (921, 910, 3, '桐庐县', '330122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (922, 910, 3, '淳安县', '330127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (923, 910, 3, '建德市', '330182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (924, 909, 2, '宁波市', '330200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (925, 924, 3, '海曙区', '330203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (926, 924, 3, '江北区', '330205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (927, 924, 3, '北仑区', '330206', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (928, 924, 3, '镇海区', '330211', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (929, 924, 3, '鄞州区', '330212', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (930, 924, 3, '奉化区', '330213', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (931, 924, 3, '象山县', '330225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (932, 924, 3, '宁海县', '330226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (933, 924, 3, '余姚市', '330281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (934, 924, 3, '慈溪市', '330282', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (935, 909, 2, '温州市', '330300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (936, 935, 3, '鹿城区', '330302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (937, 935, 3, '龙湾区', '330303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (938, 935, 3, '瓯海区', '330304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (939, 935, 3, '洞头区', '330305', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (940, 935, 3, '永嘉县', '330324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (941, 935, 3, '平阳县', '330326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (942, 935, 3, '苍南县', '330327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (943, 935, 3, '文成县', '330328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (944, 935, 3, '泰顺县', '330329', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (945, 935, 3, '瑞安市', '330381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (946, 935, 3, '乐清市', '330382', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (947, 935, 3, '龙港市', '330383', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (948, 909, 2, '嘉兴市', '330400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (949, 948, 3, '南湖区', '330402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (950, 948, 3, '秀洲区', '330411', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (951, 948, 3, '嘉善县', '330421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (952, 948, 3, '海盐县', '330424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (953, 948, 3, '海宁市', '330481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (954, 948, 3, '平湖市', '330482', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (955, 948, 3, '桐乡市', '330483', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (956, 909, 2, '湖州市', '330500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (957, 956, 3, '吴兴区', '330502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (958, 956, 3, '南浔区', '330503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (959, 956, 3, '德清县', '330521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (960, 956, 3, '长兴县', '330522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (961, 956, 3, '安吉县', '330523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (962, 909, 2, '绍兴市', '330600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (963, 962, 3, '越城区', '330602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (964, 962, 3, '柯桥区', '330603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (965, 962, 3, '上虞区', '330604', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (966, 962, 3, '新昌县', '330624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (967, 962, 3, '诸暨市', '330681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (968, 962, 3, '嵊州市', '330683', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (969, 909, 2, '金华市', '330700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (970, 969, 3, '婺城区', '330702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (971, 969, 3, '金东区', '330703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (972, 969, 3, '武义县', '330723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (973, 969, 3, '浦江县', '330726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (974, 969, 3, '磐安县', '330727', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (975, 969, 3, '兰溪市', '330781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (976, 969, 3, '义乌市', '330782', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (977, 969, 3, '东阳市', '330783', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (978, 969, 3, '永康市', '330784', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (979, 909, 2, '衢州市', '330800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (980, 979, 3, '柯城区', '330802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (981, 979, 3, '衢江区', '330803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (982, 979, 3, '常山县', '330822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (983, 979, 3, '开化县', '330824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (984, 979, 3, '龙游县', '330825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (985, 979, 3, '江山市', '330881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (986, 909, 2, '舟山市', '330900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (987, 986, 3, '定海区', '330902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (988, 986, 3, '普陀区', '330903', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (989, 986, 3, '岱山县', '330921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (990, 986, 3, '嵊泗县', '330922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (991, 909, 2, '台州市', '331000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (992, 991, 3, '椒江区', '331002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (993, 991, 3, '黄岩区', '331003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (994, 991, 3, '路桥区', '331004', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (995, 991, 3, '三门县', '331022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (996, 991, 3, '天台县', '331023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (997, 991, 3, '仙居县', '331024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (998, 991, 3, '温岭市', '331081', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (999, 991, 3, '临海市', '331082', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1000, 991, 3, '玉环市', '331083', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1001, 909, 2, '丽水市', '331100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1002, 1001, 3, '莲都区', '331102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1003, 1001, 3, '青田县', '331121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1004, 1001, 3, '缙云县', '331122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1005, 1001, 3, '遂昌县', '331123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1006, 1001, 3, '松阳县', '331124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1007, 1001, 3, '云和县', '331125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1008, 1001, 3, '庆元县', '331126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1009, 1001, 3, '景宁畲族自治县', '331127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1010, 1001, 3, '龙泉市', '331181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1011, 0, 1, '安徽省', '340000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1012, 1011, 2, '合肥市', '340100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1013, 1012, 3, '瑶海区', '340102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1014, 1012, 3, '庐阳区', '340103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1015, 1012, 3, '蜀山区', '340104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1016, 1012, 3, '包河区', '340111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1017, 1012, 3, '长丰县', '340121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1018, 1012, 3, '肥东县', '340122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1019, 1012, 3, '肥西县', '340123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1020, 1012, 3, '庐江县', '340124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1021, 1012, 3, '巢湖市', '340181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1022, 1011, 2, '芜湖市', '340200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1023, 1022, 3, '镜湖区', '340202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1024, 1022, 3, '鸠江区', '340207', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1025, 1022, 3, '弋江区', '340209', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1026, 1022, 3, '湾沚区', '340210', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1027, 1022, 3, '繁昌区', '340211', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1028, 1022, 3, '南陵县', '340223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1029, 1022, 3, '无为市', '340281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1030, 1011, 2, '蚌埠市', '340300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1031, 1030, 3, '龙子湖区', '340302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1032, 1030, 3, '蚌山区', '340303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1033, 1030, 3, '禹会区', '340304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1034, 1030, 3, '淮上区', '340311', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1035, 1030, 3, '怀远县', '340321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1036, 1030, 3, '五河县', '340322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1037, 1030, 3, '固镇县', '340323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1038, 1011, 2, '淮南市', '340400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1039, 1038, 3, '大通区', '340402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1040, 1038, 3, '田家庵区', '340403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1041, 1038, 3, '谢家集区', '340404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1042, 1038, 3, '八公山区', '340405', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1043, 1038, 3, '潘集区', '340406', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1044, 1038, 3, '凤台县', '340421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1045, 1038, 3, '寿县', '340422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1046, 1011, 2, '马鞍山市', '340500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1047, 1046, 3, '花山区', '340503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1048, 1046, 3, '雨山区', '340504', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1049, 1046, 3, '博望区', '340506', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1050, 1046, 3, '当涂县', '340521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1051, 1046, 3, '含山县', '340522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1052, 1046, 3, '和县', '340523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1053, 1011, 2, '淮北市', '340600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1054, 1053, 3, '杜集区', '340602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1055, 1053, 3, '相山区', '340603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1056, 1053, 3, '烈山区', '340604', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1057, 1053, 3, '濉溪县', '340621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1058, 1011, 2, '铜陵市', '340700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1059, 1058, 3, '铜官区', '340705', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1060, 1058, 3, '义安区', '340706', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1061, 1058, 3, '郊区', '340711', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1062, 1058, 3, '枞阳县', '340722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1063, 1011, 2, '安庆市', '340800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1064, 1063, 3, '迎江区', '340802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1065, 1063, 3, '大观区', '340803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1066, 1063, 3, '宜秀区', '340811', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1067, 1063, 3, '怀宁县', '340822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1068, 1063, 3, '太湖县', '340825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1069, 1063, 3, '宿松县', '340826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1070, 1063, 3, '望江县', '340827', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1071, 1063, 3, '岳西县', '340828', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1072, 1063, 3, '桐城市', '340881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1073, 1063, 3, '潜山市', '340882', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1074, 1011, 2, '黄山市', '341000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1075, 1074, 3, '屯溪区', '341002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1076, 1074, 3, '黄山区', '341003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1077, 1074, 3, '徽州区', '341004', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1078, 1074, 3, '歙县', '341021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1079, 1074, 3, '休宁县', '341022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1080, 1074, 3, '黟县', '341023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1081, 1074, 3, '祁门县', '341024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1082, 1011, 2, '滁州市', '341100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1083, 1082, 3, '琅琊区', '341102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1084, 1082, 3, '南谯区', '341103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1085, 1082, 3, '来安县', '341122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1086, 1082, 3, '全椒县', '341124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1087, 1082, 3, '定远县', '341125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1088, 1082, 3, '凤阳县', '341126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1089, 1082, 3, '天长市', '341181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1090, 1082, 3, '明光市', '341182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1091, 1011, 2, '阜阳市', '341200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1092, 1091, 3, '颍州区', '341202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1093, 1091, 3, '颍东区', '341203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1094, 1091, 3, '颍泉区', '341204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1095, 1091, 3, '临泉县', '341221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1096, 1091, 3, '太和县', '341222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1097, 1091, 3, '阜南县', '341225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1098, 1091, 3, '颍上县', '341226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1099, 1091, 3, '界首市', '341282', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1100, 1011, 2, '宿州市', '341300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1101, 1100, 3, '埇桥区', '341302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1102, 1100, 3, '砀山县', '341321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1103, 1100, 3, '萧县', '341322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1104, 1100, 3, '灵璧县', '341323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1105, 1100, 3, '泗县', '341324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1106, 1011, 2, '六安市', '341500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1107, 1106, 3, '金安区', '341502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1108, 1106, 3, '裕安区', '341503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1109, 1106, 3, '叶集区', '341504', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1110, 1106, 3, '霍邱县', '341522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1111, 1106, 3, '舒城县', '341523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1112, 1106, 3, '金寨县', '341524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1113, 1106, 3, '霍山县', '341525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1114, 1011, 2, '亳州市', '341600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1115, 1114, 3, '谯城区', '341602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1116, 1114, 3, '涡阳县', '341621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1117, 1114, 3, '蒙城县', '341622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1118, 1114, 3, '利辛县', '341623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1119, 1011, 2, '池州市', '341700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1120, 1119, 3, '贵池区', '341702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1121, 1119, 3, '东至县', '341721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1122, 1119, 3, '石台县', '341722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1123, 1119, 3, '青阳县', '341723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1124, 1011, 2, '宣城市', '341800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1125, 1124, 3, '宣州区', '341802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1126, 1124, 3, '郎溪县', '341821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1127, 1124, 3, '泾县', '341823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1128, 1124, 3, '绩溪县', '341824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1129, 1124, 3, '旌德县', '341825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1130, 1124, 3, '宁国市', '341881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1131, 1124, 3, '广德市', '341882', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1132, 0, 1, '福建省', '350000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1133, 1132, 2, '福州市', '350100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1134, 1133, 3, '鼓楼区', '350102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1135, 1133, 3, '台江区', '350103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1136, 1133, 3, '仓山区', '350104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1137, 1133, 3, '马尾区', '350105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1138, 1133, 3, '晋安区', '350111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1139, 1133, 3, '长乐区', '350112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1140, 1133, 3, '闽侯县', '350121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1141, 1133, 3, '连江县', '350122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1142, 1133, 3, '罗源县', '350123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1143, 1133, 3, '闽清县', '350124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1144, 1133, 3, '永泰县', '350125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1145, 1133, 3, '平潭县', '350128', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1146, 1133, 3, '福清市', '350181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1147, 1132, 2, '厦门市', '350200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1148, 1147, 3, '思明区', '350203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1149, 1147, 3, '海沧区', '350205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1150, 1147, 3, '湖里区', '350206', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1151, 1147, 3, '集美区', '350211', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1152, 1147, 3, '同安区', '350212', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1153, 1147, 3, '翔安区', '350213', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1154, 1132, 2, '莆田市', '350300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1155, 1154, 3, '城厢区', '350302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1156, 1154, 3, '涵江区', '350303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1157, 1154, 3, '荔城区', '350304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1158, 1154, 3, '秀屿区', '350305', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1159, 1154, 3, '仙游县', '350322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1160, 1132, 2, '三明市', '350400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1161, 1160, 3, '梅列区', '350402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1162, 1160, 3, '三元区', '350403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1163, 1160, 3, '明溪县', '350421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1164, 1160, 3, '清流县', '350423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1165, 1160, 3, '宁化县', '350424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1166, 1160, 3, '大田县', '350425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1167, 1160, 3, '尤溪县', '350426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1168, 1160, 3, '沙县', '350427', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1169, 1160, 3, '将乐县', '350428', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1170, 1160, 3, '泰宁县', '350429', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1171, 1160, 3, '建宁县', '350430', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1172, 1160, 3, '永安市', '350481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1173, 1132, 2, '泉州市', '350500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1174, 1173, 3, '鲤城区', '350502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1175, 1173, 3, '丰泽区', '350503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1176, 1173, 3, '洛江区', '350504', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1177, 1173, 3, '泉港区', '350505', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1178, 1173, 3, '惠安县', '350521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1179, 1173, 3, '安溪县', '350524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1180, 1173, 3, '永春县', '350525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1181, 1173, 3, '德化县', '350526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1182, 1173, 3, '金门县', '350527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1183, 1173, 3, '石狮市', '350581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1184, 1173, 3, '晋江市', '350582', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1185, 1173, 3, '南安市', '350583', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1186, 1132, 2, '漳州市', '350600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1187, 1186, 3, '芗城区', '350602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1188, 1186, 3, '龙文区', '350603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1189, 1186, 3, '云霄县', '350622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1190, 1186, 3, '漳浦县', '350623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1191, 1186, 3, '诏安县', '350624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1192, 1186, 3, '长泰县', '350625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1193, 1186, 3, '东山县', '350626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1194, 1186, 3, '南靖县', '350627', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1195, 1186, 3, '平和县', '350628', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1196, 1186, 3, '华安县', '350629', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1197, 1186, 3, '龙海市', '350681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1198, 1132, 2, '南平市', '350700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1199, 1198, 3, '延平区', '350702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1200, 1198, 3, '建阳区', '350703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1201, 1198, 3, '顺昌县', '350721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1202, 1198, 3, '浦城县', '350722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1203, 1198, 3, '光泽县', '350723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1204, 1198, 3, '松溪县', '350724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1205, 1198, 3, '政和县', '350725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1206, 1198, 3, '邵武市', '350781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1207, 1198, 3, '武夷山市', '350782', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1208, 1198, 3, '建瓯市', '350783', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1209, 1132, 2, '龙岩市', '350800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1210, 1209, 3, '新罗区', '350802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1211, 1209, 3, '永定区', '350803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1212, 1209, 3, '长汀县', '350821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1213, 1209, 3, '上杭县', '350823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1214, 1209, 3, '武平县', '350824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1215, 1209, 3, '连城县', '350825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1216, 1209, 3, '漳平市', '350881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1217, 1132, 2, '宁德市', '350900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1218, 1217, 3, '蕉城区', '350902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1219, 1217, 3, '霞浦县', '350921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1220, 1217, 3, '古田县', '350922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1221, 1217, 3, '屏南县', '350923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1222, 1217, 3, '寿宁县', '350924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1223, 1217, 3, '周宁县', '350925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1224, 1217, 3, '柘荣县', '350926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1225, 1217, 3, '福安市', '350981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1226, 1217, 3, '福鼎市', '350982', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1227, 0, 1, '江西省', '360000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1228, 1227, 2, '南昌市', '360100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1229, 1228, 3, '东湖区', '360102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1230, 1228, 3, '西湖区', '360103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1231, 1228, 3, '青云谱区', '360104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1232, 1228, 3, '青山湖区', '360111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1233, 1228, 3, '新建区', '360112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1234, 1228, 3, '红谷滩区', '360113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1235, 1228, 3, '南昌县', '360121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1236, 1228, 3, '安义县', '360123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1237, 1228, 3, '进贤县', '360124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1238, 1227, 2, '景德镇市', '360200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1239, 1238, 3, '昌江区', '360202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1240, 1238, 3, '珠山区', '360203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1241, 1238, 3, '浮梁县', '360222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1242, 1238, 3, '乐平市', '360281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1243, 1227, 2, '萍乡市', '360300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1244, 1243, 3, '安源区', '360302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1245, 1243, 3, '湘东区', '360313', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1246, 1243, 3, '莲花县', '360321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1247, 1243, 3, '上栗县', '360322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1248, 1243, 3, '芦溪县', '360323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1249, 1227, 2, '九江市', '360400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1250, 1249, 3, '濂溪区', '360402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1251, 1249, 3, '浔阳区', '360403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1252, 1249, 3, '柴桑区', '360404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1253, 1249, 3, '武宁县', '360423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1254, 1249, 3, '修水县', '360424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1255, 1249, 3, '永修县', '360425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1256, 1249, 3, '德安县', '360426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1257, 1249, 3, '都昌县', '360428', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1258, 1249, 3, '湖口县', '360429', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1259, 1249, 3, '彭泽县', '360430', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1260, 1249, 3, '瑞昌市', '360481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1261, 1249, 3, '共青城市', '360482', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1262, 1249, 3, '庐山市', '360483', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1263, 1227, 2, '新余市', '360500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1264, 1263, 3, '渝水区', '360502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1265, 1263, 3, '分宜县', '360521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1266, 1227, 2, '鹰潭市', '360600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1267, 1266, 3, '月湖区', '360602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1268, 1266, 3, '余江区', '360603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1269, 1266, 3, '贵溪市', '360681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1270, 1227, 2, '赣州市', '360700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1271, 1270, 3, '章贡区', '360702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1272, 1270, 3, '南康区', '360703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1273, 1270, 3, '赣县区', '360704', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1274, 1270, 3, '信丰县', '360722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1275, 1270, 3, '大余县', '360723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1276, 1270, 3, '上犹县', '360724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1277, 1270, 3, '崇义县', '360725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1278, 1270, 3, '安远县', '360726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1279, 1270, 3, '定南县', '360728', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1280, 1270, 3, '全南县', '360729', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1281, 1270, 3, '宁都县', '360730', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1282, 1270, 3, '于都县', '360731', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1283, 1270, 3, '兴国县', '360732', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1284, 1270, 3, '会昌县', '360733', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1285, 1270, 3, '寻乌县', '360734', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1286, 1270, 3, '石城县', '360735', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1287, 1270, 3, '瑞金市', '360781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1288, 1270, 3, '龙南市', '360783', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1289, 1227, 2, '吉安市', '360800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1290, 1289, 3, '吉州区', '360802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1291, 1289, 3, '青原区', '360803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1292, 1289, 3, '吉安县', '360821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1293, 1289, 3, '吉水县', '360822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1294, 1289, 3, '峡江县', '360823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1295, 1289, 3, '新干县', '360824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1296, 1289, 3, '永丰县', '360825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1297, 1289, 3, '泰和县', '360826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1298, 1289, 3, '遂川县', '360827', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1299, 1289, 3, '万安县', '360828', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1300, 1289, 3, '安福县', '360829', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1301, 1289, 3, '永新县', '360830', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1302, 1289, 3, '井冈山市', '360881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1303, 1227, 2, '宜春市', '360900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1304, 1303, 3, '袁州区', '360902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1305, 1303, 3, '奉新县', '360921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1306, 1303, 3, '万载县', '360922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1307, 1303, 3, '上高县', '360923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1308, 1303, 3, '宜丰县', '360924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1309, 1303, 3, '靖安县', '360925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1310, 1303, 3, '铜鼓县', '360926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1311, 1303, 3, '丰城市', '360981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1312, 1303, 3, '樟树市', '360982', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1313, 1303, 3, '高安市', '360983', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1314, 1227, 2, '抚州市', '361000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1315, 1314, 3, '临川区', '361002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1316, 1314, 3, '东乡区', '361003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1317, 1314, 3, '南城县', '361021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1318, 1314, 3, '黎川县', '361022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1319, 1314, 3, '南丰县', '361023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1320, 1314, 3, '崇仁县', '361024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1321, 1314, 3, '乐安县', '361025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1322, 1314, 3, '宜黄县', '361026', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1323, 1314, 3, '金溪县', '361027', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1324, 1314, 3, '资溪县', '361028', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1325, 1314, 3, '广昌县', '361030', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1326, 1227, 2, '上饶市', '361100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1327, 1326, 3, '信州区', '361102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1328, 1326, 3, '广丰区', '361103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1329, 1326, 3, '广信区', '361104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1330, 1326, 3, '玉山县', '361123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1331, 1326, 3, '铅山县', '361124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1332, 1326, 3, '横峰县', '361125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1333, 1326, 3, '弋阳县', '361126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1334, 1326, 3, '余干县', '361127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1335, 1326, 3, '鄱阳县', '361128', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1336, 1326, 3, '万年县', '361129', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1337, 1326, 3, '婺源县', '361130', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1338, 1326, 3, '德兴市', '361181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1339, 0, 1, '山东省', '370000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1340, 1339, 2, '济南市', '370100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1341, 1340, 3, '历下区', '370102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1342, 1340, 3, '市中区', '370103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1343, 1340, 3, '槐荫区', '370104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1344, 1340, 3, '天桥区', '370105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1345, 1340, 3, '历城区', '370112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1346, 1340, 3, '长清区', '370113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1347, 1340, 3, '章丘区', '370114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1348, 1340, 3, '济阳区', '370115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1349, 1340, 3, '莱芜区', '370116', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1350, 1340, 3, '钢城区', '370117', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1351, 1340, 3, '平阴县', '370124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1352, 1340, 3, '商河县', '370126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1353, 1339, 2, '青岛市', '370200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1354, 1353, 3, '市南区', '370202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1355, 1353, 3, '市北区', '370203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1356, 1353, 3, '黄岛区', '370211', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1357, 1353, 3, '崂山区', '370212', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1358, 1353, 3, '李沧区', '370213', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1359, 1353, 3, '城阳区', '370214', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1360, 1353, 3, '即墨区', '370215', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1361, 1353, 3, '胶州市', '370281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1362, 1353, 3, '平度市', '370283', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1363, 1353, 3, '莱西市', '370285', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1364, 1339, 2, '淄博市', '370300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1365, 1364, 3, '淄川区', '370302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1366, 1364, 3, '张店区', '370303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1367, 1364, 3, '博山区', '370304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1368, 1364, 3, '临淄区', '370305', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1369, 1364, 3, '周村区', '370306', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1370, 1364, 3, '桓台县', '370321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1371, 1364, 3, '高青县', '370322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1372, 1364, 3, '沂源县', '370323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1373, 1339, 2, '枣庄市', '370400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1374, 1373, 3, '市中区', '370402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1375, 1373, 3, '薛城区', '370403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1376, 1373, 3, '峄城区', '370404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1377, 1373, 3, '台儿庄区', '370405', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1378, 1373, 3, '山亭区', '370406', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1379, 1373, 3, '滕州市', '370481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1380, 1339, 2, '东营市', '370500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1381, 1380, 3, '东营区', '370502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1382, 1380, 3, '河口区', '370503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1383, 1380, 3, '垦利区', '370505', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1384, 1380, 3, '利津县', '370522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1385, 1380, 3, '广饶县', '370523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1386, 1339, 2, '烟台市', '370600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1387, 1386, 3, '芝罘区', '370602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1388, 1386, 3, '福山区', '370611', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1389, 1386, 3, '牟平区', '370612', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1390, 1386, 3, '莱山区', '370613', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1391, 1386, 3, '蓬莱区', '370614', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1392, 1386, 3, '龙口市', '370681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1393, 1386, 3, '莱阳市', '370682', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1394, 1386, 3, '莱州市', '370683', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1395, 1386, 3, '招远市', '370685', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1396, 1386, 3, '栖霞市', '370686', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1397, 1386, 3, '海阳市', '370687', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1398, 1339, 2, '潍坊市', '370700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1399, 1398, 3, '潍城区', '370702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1400, 1398, 3, '寒亭区', '370703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1401, 1398, 3, '坊子区', '370704', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1402, 1398, 3, '奎文区', '370705', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1403, 1398, 3, '临朐县', '370724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1404, 1398, 3, '昌乐县', '370725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1405, 1398, 3, '青州市', '370781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1406, 1398, 3, '诸城市', '370782', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1407, 1398, 3, '寿光市', '370783', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1408, 1398, 3, '安丘市', '370784', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1409, 1398, 3, '高密市', '370785', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1410, 1398, 3, '昌邑市', '370786', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1411, 1339, 2, '济宁市', '370800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1412, 1411, 3, '任城区', '370811', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1413, 1411, 3, '兖州区', '370812', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1414, 1411, 3, '微山县', '370826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1415, 1411, 3, '鱼台县', '370827', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1416, 1411, 3, '金乡县', '370828', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1417, 1411, 3, '嘉祥县', '370829', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1418, 1411, 3, '汶上县', '370830', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1419, 1411, 3, '泗水县', '370831', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1420, 1411, 3, '梁山县', '370832', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1421, 1411, 3, '曲阜市', '370881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1422, 1411, 3, '邹城市', '370883', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1423, 1339, 2, '泰安市', '370900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1424, 1423, 3, '泰山区', '370902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1425, 1423, 3, '岱岳区', '370911', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1426, 1423, 3, '宁阳县', '370921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1427, 1423, 3, '东平县', '370923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1428, 1423, 3, '新泰市', '370982', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1429, 1423, 3, '肥城市', '370983', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1430, 1339, 2, '威海市', '371000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1431, 1430, 3, '环翠区', '371002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1432, 1430, 3, '文登区', '371003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1433, 1430, 3, '荣成市', '371082', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1434, 1430, 3, '乳山市', '371083', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1435, 1339, 2, '日照市', '371100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1436, 1435, 3, '东港区', '371102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1437, 1435, 3, '岚山区', '371103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1438, 1435, 3, '五莲县', '371121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1439, 1435, 3, '莒县', '371122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1440, 1339, 2, '临沂市', '371300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1441, 1440, 3, '兰山区', '371302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1442, 1440, 3, '罗庄区', '371311', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1443, 1440, 3, '河东区', '371312', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1444, 1440, 3, '沂南县', '371321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1445, 1440, 3, '郯城县', '371322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1446, 1440, 3, '沂水县', '371323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1447, 1440, 3, '兰陵县', '371324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1448, 1440, 3, '费县', '371325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1449, 1440, 3, '平邑县', '371326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1450, 1440, 3, '莒南县', '371327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1451, 1440, 3, '蒙阴县', '371328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1452, 1440, 3, '临沭县', '371329', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1453, 1339, 2, '德州市', '371400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1454, 1453, 3, '德城区', '371402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1455, 1453, 3, '陵城区', '371403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1456, 1453, 3, '宁津县', '371422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1457, 1453, 3, '庆云县', '371423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1458, 1453, 3, '临邑县', '371424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1459, 1453, 3, '齐河县', '371425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1460, 1453, 3, '平原县', '371426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1461, 1453, 3, '夏津县', '371427', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1462, 1453, 3, '武城县', '371428', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1463, 1453, 3, '乐陵市', '371481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1464, 1453, 3, '禹城市', '371482', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1465, 1339, 2, '聊城市', '371500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1466, 1465, 3, '东昌府区', '371502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1467, 1465, 3, '茌平区', '371503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1468, 1465, 3, '阳谷县', '371521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1469, 1465, 3, '莘县', '371522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1470, 1465, 3, '东阿县', '371524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1471, 1465, 3, '冠县', '371525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1472, 1465, 3, '高唐县', '371526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1473, 1465, 3, '临清市', '371581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1474, 1339, 2, '滨州市', '371600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1475, 1474, 3, '滨城区', '371602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1476, 1474, 3, '沾化区', '371603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1477, 1474, 3, '惠民县', '371621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1478, 1474, 3, '阳信县', '371622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1479, 1474, 3, '无棣县', '371623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1480, 1474, 3, '博兴县', '371625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1481, 1474, 3, '邹平市', '371681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1482, 1339, 2, '菏泽市', '371700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1483, 1482, 3, '牡丹区', '371702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1484, 1482, 3, '定陶区', '371703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1485, 1482, 3, '曹县', '371721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1486, 1482, 3, '单县', '371722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1487, 1482, 3, '成武县', '371723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1488, 1482, 3, '巨野县', '371724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1489, 1482, 3, '郓城县', '371725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1490, 1482, 3, '鄄城县', '371726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1491, 1482, 3, '东明县', '371728', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1492, 0, 1, '河南省', '410000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1493, 1492, 2, '郑州市', '410100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1494, 1493, 3, '中原区', '410102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1495, 1493, 3, '二七区', '410103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1496, 1493, 3, '管城回族区', '410104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1497, 1493, 3, '金水区', '410105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1498, 1493, 3, '上街区', '410106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1499, 1493, 3, '惠济区', '410108', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1500, 1493, 3, '中牟县', '410122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1501, 1493, 3, '巩义市', '410181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1502, 1493, 3, '荥阳市', '410182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1503, 1493, 3, '新密市', '410183', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1504, 1493, 3, '新郑市', '410184', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1505, 1493, 3, '登封市', '410185', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1506, 1492, 2, '开封市', '410200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1507, 1506, 3, '龙亭区', '410202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1508, 1506, 3, '顺河回族区', '410203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1509, 1506, 3, '鼓楼区', '410204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1510, 1506, 3, '禹王台区', '410205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1511, 1506, 3, '祥符区', '410212', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1512, 1506, 3, '杞县', '410221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1513, 1506, 3, '通许县', '410222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1514, 1506, 3, '尉氏县', '410223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1515, 1506, 3, '兰考县', '410225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1516, 1492, 2, '洛阳市', '410300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1517, 1516, 3, '老城区', '410302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1518, 1516, 3, '西工区', '410303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1519, 1516, 3, '瀍河回族区', '410304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1520, 1516, 3, '涧西区', '410305', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1521, 1516, 3, '吉利区', '410306', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1522, 1516, 3, '洛龙区', '410311', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1523, 1516, 3, '孟津县', '410322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1524, 1516, 3, '新安县', '410323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1525, 1516, 3, '栾川县', '410324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1526, 1516, 3, '嵩县', '410325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1527, 1516, 3, '汝阳县', '410326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1528, 1516, 3, '宜阳县', '410327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1529, 1516, 3, '洛宁县', '410328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1530, 1516, 3, '伊川县', '410329', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1531, 1516, 3, '偃师市', '410381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1532, 1492, 2, '平顶山市', '410400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1533, 1532, 3, '新华区', '410402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1534, 1532, 3, '卫东区', '410403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1535, 1532, 3, '石龙区', '410404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1536, 1532, 3, '湛河区', '410411', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1537, 1532, 3, '宝丰县', '410421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1538, 1532, 3, '叶县', '410422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1539, 1532, 3, '鲁山县', '410423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1540, 1532, 3, '郏县', '410425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1541, 1532, 3, '舞钢市', '410481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1542, 1532, 3, '汝州市', '410482', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1543, 1492, 2, '安阳市', '410500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1544, 1543, 3, '文峰区', '410502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1545, 1543, 3, '北关区', '410503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1546, 1543, 3, '殷都区', '410505', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1547, 1543, 3, '龙安区', '410506', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1548, 1543, 3, '安阳县', '410522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1549, 1543, 3, '汤阴县', '410523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1550, 1543, 3, '滑县', '410526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1551, 1543, 3, '内黄县', '410527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1552, 1543, 3, '林州市', '410581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1553, 1492, 2, '鹤壁市', '410600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1554, 1553, 3, '鹤山区', '410602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1555, 1553, 3, '山城区', '410603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1556, 1553, 3, '淇滨区', '410611', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1557, 1553, 3, '浚县', '410621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1558, 1553, 3, '淇县', '410622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1559, 1492, 2, '新乡市', '410700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1560, 1559, 3, '红旗区', '410702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1561, 1559, 3, '卫滨区', '410703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1562, 1559, 3, '凤泉区', '410704', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1563, 1559, 3, '牧野区', '410711', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1564, 1559, 3, '新乡县', '410721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1565, 1559, 3, '获嘉县', '410724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1566, 1559, 3, '原阳县', '410725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1567, 1559, 3, '延津县', '410726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1568, 1559, 3, '封丘县', '410727', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1569, 1559, 3, '卫辉市', '410781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1570, 1559, 3, '辉县市', '410782', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1571, 1559, 3, '长垣市', '410783', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1572, 1492, 2, '焦作市', '410800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1573, 1572, 3, '解放区', '410802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1574, 1572, 3, '中站区', '410803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1575, 1572, 3, '马村区', '410804', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1576, 1572, 3, '山阳区', '410811', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1577, 1572, 3, '修武县', '410821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1578, 1572, 3, '博爱县', '410822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1579, 1572, 3, '武陟县', '410823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1580, 1572, 3, '温县', '410825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1581, 1572, 3, '沁阳市', '410882', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1582, 1572, 3, '孟州市', '410883', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1583, 1492, 2, '濮阳市', '410900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1584, 1583, 3, '华龙区', '410902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1585, 1583, 3, '清丰县', '410922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1586, 1583, 3, '南乐县', '410923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1587, 1583, 3, '范县', '410926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1588, 1583, 3, '台前县', '410927', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1589, 1583, 3, '濮阳县', '410928', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1590, 1492, 2, '许昌市', '411000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1591, 1590, 3, '魏都区', '411002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1592, 1590, 3, '建安区', '411003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1593, 1590, 3, '鄢陵县', '411024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1594, 1590, 3, '襄城县', '411025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1595, 1590, 3, '禹州市', '411081', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1596, 1590, 3, '长葛市', '411082', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1597, 1492, 2, '漯河市', '411100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1598, 1597, 3, '源汇区', '411102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1599, 1597, 3, '郾城区', '411103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1600, 1597, 3, '召陵区', '411104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1601, 1597, 3, '舞阳县', '411121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1602, 1597, 3, '临颍县', '411122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1603, 1492, 2, '三门峡市', '411200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1604, 1603, 3, '湖滨区', '411202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1605, 1603, 3, '陕州区', '411203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1606, 1603, 3, '渑池县', '411221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1607, 1603, 3, '卢氏县', '411224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1608, 1603, 3, '义马市', '411281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1609, 1603, 3, '灵宝市', '411282', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1610, 1492, 2, '南阳市', '411300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1611, 1610, 3, '宛城区', '411302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1612, 1610, 3, '卧龙区', '411303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1613, 1610, 3, '南召县', '411321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1614, 1610, 3, '方城县', '411322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1615, 1610, 3, '西峡县', '411323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1616, 1610, 3, '镇平县', '411324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1617, 1610, 3, '内乡县', '411325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1618, 1610, 3, '淅川县', '411326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1619, 1610, 3, '社旗县', '411327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1620, 1610, 3, '唐河县', '411328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1621, 1610, 3, '新野县', '411329', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1622, 1610, 3, '桐柏县', '411330', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1623, 1610, 3, '邓州市', '411381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1624, 1492, 2, '商丘市', '411400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1625, 1624, 3, '梁园区', '411402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1626, 1624, 3, '睢阳区', '411403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1627, 1624, 3, '民权县', '411421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1628, 1624, 3, '睢县', '411422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1629, 1624, 3, '宁陵县', '411423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1630, 1624, 3, '柘城县', '411424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1631, 1624, 3, '虞城县', '411425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1632, 1624, 3, '夏邑县', '411426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1633, 1624, 3, '永城市', '411481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1634, 1492, 2, '信阳市', '411500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1635, 1634, 3, '浉河区', '411502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1636, 1634, 3, '平桥区', '411503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1637, 1634, 3, '罗山县', '411521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1638, 1634, 3, '光山县', '411522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1639, 1634, 3, '新县', '411523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1640, 1634, 3, '商城县', '411524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1641, 1634, 3, '固始县', '411525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1642, 1634, 3, '潢川县', '411526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1643, 1634, 3, '淮滨县', '411527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1644, 1634, 3, '息县', '411528', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1645, 1492, 2, '周口市', '411600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1646, 1645, 3, '川汇区', '411602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1647, 1645, 3, '淮阳区', '411603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1648, 1645, 3, '扶沟县', '411621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1649, 1645, 3, '西华县', '411622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1650, 1645, 3, '商水县', '411623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1651, 1645, 3, '沈丘县', '411624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1652, 1645, 3, '郸城县', '411625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1653, 1645, 3, '太康县', '411627', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1654, 1645, 3, '鹿邑县', '411628', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1655, 1645, 3, '项城市', '411681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1656, 1492, 2, '驻马店市', '411700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1657, 1656, 3, '驿城区', '411702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1658, 1656, 3, '西平县', '411721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1659, 1656, 3, '上蔡县', '411722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1660, 1656, 3, '平舆县', '411723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1661, 1656, 3, '正阳县', '411724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1662, 1656, 3, '确山县', '411725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1663, 1656, 3, '泌阳县', '411726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1664, 1656, 3, '汝南县', '411727', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1665, 1656, 3, '遂平县', '411728', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1666, 1656, 3, '新蔡县', '411729', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1667, 1656, 3, '济源市', '419001', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1668, 0, 1, '湖北省', '420000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1669, 1668, 2, '武汉市', '420100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1670, 1669, 3, '江岸区', '420102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1671, 1669, 3, '江汉区', '420103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1672, 1669, 3, '硚口区', '420104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1673, 1669, 3, '汉阳区', '420105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1674, 1669, 3, '武昌区', '420106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1675, 1669, 3, '青山区', '420107', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1676, 1669, 3, '洪山区', '420111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1677, 1669, 3, '东西湖区', '420112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1678, 1669, 3, '汉南区', '420113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1679, 1669, 3, '蔡甸区', '420114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1680, 1669, 3, '江夏区', '420115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1681, 1669, 3, '黄陂区', '420116', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1682, 1669, 3, '新洲区', '420117', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1683, 1668, 2, '黄石市', '420200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1684, 1683, 3, '黄石港区', '420202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1685, 1683, 3, '西塞山区', '420203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1686, 1683, 3, '下陆区', '420204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1687, 1683, 3, '铁山区', '420205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1688, 1683, 3, '阳新县', '420222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1689, 1683, 3, '大冶市', '420281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1690, 1668, 2, '十堰市', '420300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1691, 1690, 3, '茅箭区', '420302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1692, 1690, 3, '张湾区', '420303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1693, 1690, 3, '郧阳区', '420304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1694, 1690, 3, '郧西县', '420322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1695, 1690, 3, '竹山县', '420323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1696, 1690, 3, '竹溪县', '420324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1697, 1690, 3, '房县', '420325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1698, 1690, 3, '丹江口市', '420381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1699, 1668, 2, '宜昌市', '420500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1700, 1699, 3, '西陵区', '420502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1701, 1699, 3, '伍家岗区', '420503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1702, 1699, 3, '点军区', '420504', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1703, 1699, 3, '猇亭区', '420505', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1704, 1699, 3, '夷陵区', '420506', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1705, 1699, 3, '远安县', '420525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1706, 1699, 3, '兴山县', '420526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1707, 1699, 3, '秭归县', '420527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1708, 1699, 3, '长阳土家族自治县', '420528', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1709, 1699, 3, '五峰土家族自治县', '420529', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1710, 1699, 3, '宜都市', '420581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1711, 1699, 3, '当阳市', '420582', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1712, 1699, 3, '枝江市', '420583', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1713, 1668, 2, '襄阳市', '420600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1714, 1713, 3, '襄城区', '420602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1715, 1713, 3, '樊城区', '420606', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1716, 1713, 3, '襄州区', '420607', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1717, 1713, 3, '南漳县', '420624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1718, 1713, 3, '谷城县', '420625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1719, 1713, 3, '保康县', '420626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1720, 1713, 3, '老河口市', '420682', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1721, 1713, 3, '枣阳市', '420683', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1722, 1713, 3, '宜城市', '420684', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1723, 1668, 2, '鄂州市', '420700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1724, 1723, 3, '梁子湖区', '420702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1725, 1723, 3, '华容区', '420703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1726, 1723, 3, '鄂城区', '420704', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1727, 1668, 2, '荆门市', '420800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1728, 1727, 3, '东宝区', '420802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1729, 1727, 3, '掇刀区', '420804', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1730, 1727, 3, '沙洋县', '420822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1731, 1727, 3, '钟祥市', '420881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1732, 1727, 3, '京山市', '420882', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1733, 1668, 2, '孝感市', '420900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1734, 1733, 3, '孝南区', '420902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1735, 1733, 3, '孝昌县', '420921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1736, 1733, 3, '大悟县', '420922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1737, 1733, 3, '云梦县', '420923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1738, 1733, 3, '应城市', '420981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1739, 1733, 3, '安陆市', '420982', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1740, 1733, 3, '汉川市', '420984', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1741, 1668, 2, '荆州市', '421000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1742, 1741, 3, '沙市区', '421002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1743, 1741, 3, '荆州区', '421003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1744, 1741, 3, '公安县', '421022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1745, 1741, 3, '监利县', '421023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1746, 1741, 3, '江陵县', '421024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1747, 1741, 3, '石首市', '421081', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1748, 1741, 3, '洪湖市', '421083', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1749, 1741, 3, '松滋市', '421087', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1750, 1668, 2, '黄冈市', '421100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1751, 1750, 3, '黄州区', '421102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1752, 1750, 3, '团风县', '421121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1753, 1750, 3, '红安县', '421122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1754, 1750, 3, '罗田县', '421123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1755, 1750, 3, '英山县', '421124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1756, 1750, 3, '浠水县', '421125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1757, 1750, 3, '蕲春县', '421126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1758, 1750, 3, '黄梅县', '421127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1759, 1750, 3, '麻城市', '421181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1760, 1750, 3, '武穴市', '421182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1761, 1668, 2, '咸宁市', '421200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1762, 1761, 3, '咸安区', '421202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1763, 1761, 3, '嘉鱼县', '421221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1764, 1761, 3, '通城县', '421222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1765, 1761, 3, '崇阳县', '421223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1766, 1761, 3, '通山县', '421224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1767, 1761, 3, '赤壁市', '421281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1768, 1668, 2, '随州市', '421300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1769, 1768, 3, '曾都区', '421303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1770, 1768, 3, '随县', '421321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1771, 1768, 3, '广水市', '421381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1772, 1668, 2, '恩施土家族苗族自治州', '422800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1773, 1772, 3, '恩施市', '422801', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1774, 1772, 3, '利川市', '422802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1775, 1772, 3, '建始县', '422822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1776, 1772, 3, '巴东县', '422823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1777, 1772, 3, '宣恩县', '422825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1778, 1772, 3, '咸丰县', '422826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1779, 1772, 3, '来凤县', '422827', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1780, 1772, 3, '鹤峰县', '422828', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1781, 1772, 3, '仙桃市', '429004', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1782, 1772, 3, '潜江市', '429005', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1783, 1772, 3, '天门市', '429006', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1784, 1772, 3, '神农架林区', '429021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1785, 0, 1, '湖南省', '430000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1786, 1785, 2, '长沙市', '430100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1787, 1786, 3, '芙蓉区', '430102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1788, 1786, 3, '天心区', '430103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1789, 1786, 3, '岳麓区', '430104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1790, 1786, 3, '开福区', '430105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1791, 1786, 3, '雨花区', '430111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1792, 1786, 3, '望城区', '430112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1793, 1786, 3, '长沙县', '430121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1794, 1786, 3, '浏阳市', '430181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1795, 1786, 3, '宁乡市', '430182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1796, 1785, 2, '株洲市', '430200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1797, 1796, 3, '荷塘区', '430202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1798, 1796, 3, '芦淞区', '430203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1799, 1796, 3, '石峰区', '430204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1800, 1796, 3, '天元区', '430211', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1801, 1796, 3, '渌口区', '430212', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1802, 1796, 3, '攸县', '430223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1803, 1796, 3, '茶陵县', '430224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1804, 1796, 3, '炎陵县', '430225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1805, 1796, 3, '醴陵市', '430281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1806, 1785, 2, '湘潭市', '430300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1807, 1806, 3, '雨湖区', '430302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1808, 1806, 3, '岳塘区', '430304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1809, 1806, 3, '湘潭县', '430321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1810, 1806, 3, '湘乡市', '430381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1811, 1806, 3, '韶山市', '430382', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1812, 1785, 2, '衡阳市', '430400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1813, 1812, 3, '珠晖区', '430405', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1814, 1812, 3, '雁峰区', '430406', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1815, 1812, 3, '石鼓区', '430407', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1816, 1812, 3, '蒸湘区', '430408', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1817, 1812, 3, '南岳区', '430412', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1818, 1812, 3, '衡阳县', '430421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1819, 1812, 3, '衡南县', '430422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1820, 1812, 3, '衡山县', '430423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1821, 1812, 3, '衡东县', '430424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1822, 1812, 3, '祁东县', '430426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1823, 1812, 3, '耒阳市', '430481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1824, 1812, 3, '常宁市', '430482', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1825, 1785, 2, '邵阳市', '430500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1826, 1825, 3, '双清区', '430502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1827, 1825, 3, '大祥区', '430503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1828, 1825, 3, '北塔区', '430511', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1829, 1825, 3, '新邵县', '430522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1830, 1825, 3, '邵阳县', '430523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1831, 1825, 3, '隆回县', '430524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1832, 1825, 3, '洞口县', '430525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1833, 1825, 3, '绥宁县', '430527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1834, 1825, 3, '新宁县', '430528', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1835, 1825, 3, '城步苗族自治县', '430529', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1836, 1825, 3, '武冈市', '430581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1837, 1825, 3, '邵东市', '430582', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1838, 1785, 2, '岳阳市', '430600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1839, 1838, 3, '岳阳楼区', '430602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1840, 1838, 3, '云溪区', '430603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1841, 1838, 3, '君山区', '430611', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1842, 1838, 3, '岳阳县', '430621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1843, 1838, 3, '华容县', '430623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1844, 1838, 3, '湘阴县', '430624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1845, 1838, 3, '平江县', '430626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1846, 1838, 3, '汨罗市', '430681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1847, 1838, 3, '临湘市', '430682', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1848, 1785, 2, '常德市', '430700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1849, 1848, 3, '武陵区', '430702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1850, 1848, 3, '鼎城区', '430703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1851, 1848, 3, '安乡县', '430721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1852, 1848, 3, '汉寿县', '430722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1853, 1848, 3, '澧县', '430723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1854, 1848, 3, '临澧县', '430724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1855, 1848, 3, '桃源县', '430725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1856, 1848, 3, '石门县', '430726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1857, 1848, 3, '津市市', '430781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1858, 1785, 2, '张家界市', '430800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1859, 1858, 3, '永定区', '430802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1860, 1858, 3, '武陵源区', '430811', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1861, 1858, 3, '慈利县', '430821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1862, 1858, 3, '桑植县', '430822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1863, 1785, 2, '益阳市', '430900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1864, 1863, 3, '资阳区', '430902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1865, 1863, 3, '赫山区', '430903', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1866, 1863, 3, '南县', '430921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1867, 1863, 3, '桃江县', '430922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1868, 1863, 3, '安化县', '430923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1869, 1863, 3, '沅江市', '430981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1870, 1785, 2, '郴州市', '431000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1871, 1870, 3, '北湖区', '431002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1872, 1870, 3, '苏仙区', '431003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1873, 1870, 3, '桂阳县', '431021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1874, 1870, 3, '宜章县', '431022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1875, 1870, 3, '永兴县', '431023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1876, 1870, 3, '嘉禾县', '431024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1877, 1870, 3, '临武县', '431025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1878, 1870, 3, '汝城县', '431026', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1879, 1870, 3, '桂东县', '431027', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1880, 1870, 3, '安仁县', '431028', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1881, 1870, 3, '资兴市', '431081', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1882, 1785, 2, '永州市', '431100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1883, 1882, 3, '零陵区', '431102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1884, 1882, 3, '冷水滩区', '431103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1885, 1882, 3, '祁阳县', '431121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1886, 1882, 3, '东安县', '431122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1887, 1882, 3, '双牌县', '431123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1888, 1882, 3, '道县', '431124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1889, 1882, 3, '江永县', '431125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1890, 1882, 3, '宁远县', '431126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1891, 1882, 3, '蓝山县', '431127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1892, 1882, 3, '新田县', '431128', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1893, 1882, 3, '江华瑶族自治县', '431129', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1894, 1785, 2, '怀化市', '431200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1895, 1894, 3, '鹤城区', '431202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1896, 1894, 3, '中方县', '431221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1897, 1894, 3, '沅陵县', '431222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1898, 1894, 3, '辰溪县', '431223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1899, 1894, 3, '溆浦县', '431224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1900, 1894, 3, '会同县', '431225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1901, 1894, 3, '麻阳苗族自治县', '431226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1902, 1894, 3, '新晃侗族自治县', '431227', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1903, 1894, 3, '芷江侗族自治县', '431228', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1904, 1894, 3, '靖州苗族侗族自治县', '431229', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1905, 1894, 3, '通道侗族自治县', '431230', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1906, 1894, 3, '洪江市', '431281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1907, 1785, 2, '娄底市', '431300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1908, 1907, 3, '娄星区', '431302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1909, 1907, 3, '双峰县', '431321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1910, 1907, 3, '新化县', '431322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1911, 1907, 3, '冷水江市', '431381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1912, 1907, 3, '涟源市', '431382', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1913, 1785, 2, '湘西土家族苗族自治州', '433100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1914, 1913, 3, '吉首市', '433101', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1915, 1913, 3, '泸溪县', '433122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1916, 1913, 3, '凤凰县', '433123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1917, 1913, 3, '花垣县', '433124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1918, 1913, 3, '保靖县', '433125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1919, 1913, 3, '古丈县', '433126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1920, 1913, 3, '永顺县', '433127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1921, 1913, 3, '龙山县', '433130', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1922, 0, 1, '广东省', '440000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1923, 1922, 2, '广州市', '440100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1924, 1923, 3, '荔湾区', '440103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1925, 1923, 3, '越秀区', '440104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1926, 1923, 3, '海珠区', '440105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1927, 1923, 3, '天河区', '440106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1928, 1923, 3, '白云区', '440111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1929, 1923, 3, '黄埔区', '440112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1930, 1923, 3, '番禺区', '440113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1931, 1923, 3, '花都区', '440114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1932, 1923, 3, '南沙区', '440115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1933, 1923, 3, '从化区', '440117', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1934, 1923, 3, '增城区', '440118', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1935, 1922, 2, '韶关市', '440200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1936, 1935, 3, '武江区', '440203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1937, 1935, 3, '浈江区', '440204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1938, 1935, 3, '曲江区', '440205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1939, 1935, 3, '始兴县', '440222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1940, 1935, 3, '仁化县', '440224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1941, 1935, 3, '翁源县', '440229', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1942, 1935, 3, '乳源瑶族自治县', '440232', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1943, 1935, 3, '新丰县', '440233', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1944, 1935, 3, '乐昌市', '440281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1945, 1935, 3, '南雄市', '440282', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1946, 1922, 2, '深圳市', '440300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1947, 1946, 3, '罗湖区', '440303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1948, 1946, 3, '福田区', '440304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1949, 1946, 3, '南山区', '440305', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1950, 1946, 3, '宝安区', '440306', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1951, 1946, 3, '龙岗区', '440307', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1952, 1946, 3, '盐田区', '440308', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1953, 1946, 3, '龙华区', '440309', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1954, 1946, 3, '坪山区', '440310', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1955, 1946, 3, '光明区', '440311', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1956, 1922, 2, '珠海市', '440400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1957, 1956, 3, '香洲区', '440402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1958, 1956, 3, '斗门区', '440403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1959, 1956, 3, '金湾区', '440404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1960, 1922, 2, '汕头市', '440500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1961, 1960, 3, '龙湖区', '440507', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1962, 1960, 3, '金平区', '440511', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1963, 1960, 3, '濠江区', '440512', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1964, 1960, 3, '潮阳区', '440513', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1965, 1960, 3, '潮南区', '440514', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1966, 1960, 3, '澄海区', '440515', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1967, 1960, 3, '南澳县', '440523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1968, 1922, 2, '佛山市', '440600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1969, 1968, 3, '禅城区', '440604', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1970, 1968, 3, '南海区', '440605', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1971, 1968, 3, '顺德区', '440606', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1972, 1968, 3, '三水区', '440607', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1973, 1968, 3, '高明区', '440608', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1974, 1922, 2, '江门市', '440700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1975, 1974, 3, '蓬江区', '440703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1976, 1974, 3, '江海区', '440704', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1977, 1974, 3, '新会区', '440705', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1978, 1974, 3, '台山市', '440781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1979, 1974, 3, '开平市', '440783', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1980, 1974, 3, '鹤山市', '440784', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1981, 1974, 3, '恩平市', '440785', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1982, 1922, 2, '湛江市', '440800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1983, 1982, 3, '赤坎区', '440802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1984, 1982, 3, '霞山区', '440803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1985, 1982, 3, '坡头区', '440804', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1986, 1982, 3, '麻章区', '440811', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1987, 1982, 3, '遂溪县', '440823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1988, 1982, 3, '徐闻县', '440825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1989, 1982, 3, '廉江市', '440881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1990, 1982, 3, '雷州市', '440882', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1991, 1982, 3, '吴川市', '440883', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1992, 1922, 2, '茂名市', '440900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1993, 1992, 3, '茂南区', '440902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1994, 1992, 3, '电白区', '440904', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1995, 1992, 3, '高州市', '440981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1996, 1992, 3, '化州市', '440982', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1997, 1992, 3, '信宜市', '440983', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1998, 1922, 2, '肇庆市', '441200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (1999, 1998, 3, '端州区', '441202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2000, 1998, 3, '鼎湖区', '441203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2001, 1998, 3, '高要区', '441204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2002, 1998, 3, '广宁县', '441223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2003, 1998, 3, '怀集县', '441224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2004, 1998, 3, '封开县', '441225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2005, 1998, 3, '德庆县', '441226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2006, 1998, 3, '四会市', '441284', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2007, 1922, 2, '惠州市', '441300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2008, 2007, 3, '惠城区', '441302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2009, 2007, 3, '惠阳区', '441303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2010, 2007, 3, '博罗县', '441322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2011, 2007, 3, '惠东县', '441323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2012, 2007, 3, '龙门县', '441324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2013, 1922, 2, '梅州市', '441400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2014, 2013, 3, '梅江区', '441402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2015, 2013, 3, '梅县区', '441403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2016, 2013, 3, '大埔县', '441422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2017, 2013, 3, '丰顺县', '441423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2018, 2013, 3, '五华县', '441424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2019, 2013, 3, '平远县', '441426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2020, 2013, 3, '蕉岭县', '441427', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2021, 2013, 3, '兴宁市', '441481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2022, 1922, 2, '汕尾市', '441500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2023, 2022, 3, '城区', '441502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2024, 2022, 3, '海丰县', '441521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2025, 2022, 3, '陆河县', '441523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2026, 2022, 3, '陆丰市', '441581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2027, 1922, 2, '河源市', '441600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2028, 2027, 3, '源城区', '441602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2029, 2027, 3, '紫金县', '441621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2030, 2027, 3, '龙川县', '441622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2031, 2027, 3, '连平县', '441623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2032, 2027, 3, '和平县', '441624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2033, 2027, 3, '东源县', '441625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2034, 1922, 2, '阳江市', '441700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2035, 2034, 3, '江城区', '441702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2036, 2034, 3, '阳东区', '441704', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2037, 2034, 3, '阳西县', '441721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2038, 2034, 3, '阳春市', '441781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2039, 1922, 2, '清远市', '441800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2040, 2039, 3, '清城区', '441802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2041, 2039, 3, '清新区', '441803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2042, 2039, 3, '佛冈县', '441821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2043, 2039, 3, '阳山县', '441823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2044, 2039, 3, '连山壮族瑶族自治县', '441825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2045, 2039, 3, '连南瑶族自治县', '441826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2046, 2039, 3, '英德市', '441881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2047, 2039, 3, '连州市', '441882', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2048, 1922, 2, '东莞市', '441900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2049, 1922, 2, '中山市', '442000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2050, 1922, 2, '潮州市', '445100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2051, 2050, 3, '湘桥区', '445102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2052, 2050, 3, '潮安区', '445103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2053, 2050, 3, '饶平县', '445122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2054, 1922, 2, '揭阳市', '445200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2055, 2054, 3, '榕城区', '445202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2056, 2054, 3, '揭东区', '445203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2057, 2054, 3, '揭西县', '445222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2058, 2054, 3, '惠来县', '445224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2059, 2054, 3, '普宁市', '445281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2060, 1922, 2, '云浮市', '445300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2061, 2060, 3, '云城区', '445302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2062, 2060, 3, '云安区', '445303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2063, 2060, 3, '新兴县', '445321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2064, 2060, 3, '郁南县', '445322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2065, 2060, 3, '罗定市', '445381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2066, 0, 1, '广西壮族自治区', '450000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2067, 2066, 2, '南宁市', '450100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2068, 2067, 3, '兴宁区', '450102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2069, 2067, 3, '青秀区', '450103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2070, 2067, 3, '江南区', '450105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2071, 2067, 3, '西乡塘区', '450107', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2072, 2067, 3, '良庆区', '450108', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2073, 2067, 3, '邕宁区', '450109', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2074, 2067, 3, '武鸣区', '450110', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2075, 2067, 3, '隆安县', '450123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2076, 2067, 3, '马山县', '450124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2077, 2067, 3, '上林县', '450125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2078, 2067, 3, '宾阳县', '450126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2079, 2067, 3, '横县', '450127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2080, 2066, 2, '柳州市', '450200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2081, 2080, 3, '城中区', '450202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2082, 2080, 3, '鱼峰区', '450203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2083, 2080, 3, '柳南区', '450204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2084, 2080, 3, '柳北区', '450205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2085, 2080, 3, '柳江区', '450206', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2086, 2080, 3, '柳城县', '450222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2087, 2080, 3, '鹿寨县', '450223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2088, 2080, 3, '融安县', '450224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2089, 2080, 3, '融水苗族自治县', '450225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2090, 2080, 3, '三江侗族自治县', '450226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2091, 2066, 2, '桂林市', '450300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2092, 2091, 3, '秀峰区', '450302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2093, 2091, 3, '叠彩区', '450303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2094, 2091, 3, '象山区', '450304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2095, 2091, 3, '七星区', '450305', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2096, 2091, 3, '雁山区', '450311', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2097, 2091, 3, '临桂区', '450312', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2098, 2091, 3, '阳朔县', '450321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2099, 2091, 3, '灵川县', '450323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2100, 2091, 3, '全州县', '450324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2101, 2091, 3, '兴安县', '450325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2102, 2091, 3, '永福县', '450326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2103, 2091, 3, '灌阳县', '450327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2104, 2091, 3, '龙胜各族自治县', '450328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2105, 2091, 3, '资源县', '450329', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2106, 2091, 3, '平乐县', '450330', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2107, 2091, 3, '荔浦市', '450381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2108, 2091, 3, '恭城瑶族自治县', '450332', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2109, 2066, 2, '梧州市', '450400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2110, 2109, 3, '万秀区', '450403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2111, 2109, 3, '长洲区', '450405', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2112, 2109, 3, '龙圩区', '450406', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2113, 2109, 3, '苍梧县', '450421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2114, 2109, 3, '藤县', '450422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2115, 2109, 3, '蒙山县', '450423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2116, 2109, 3, '岑溪市', '450481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2117, 2066, 2, '北海市', '450500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2118, 2117, 3, '海城区', '450502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2119, 2117, 3, '银海区', '450503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2120, 2117, 3, '铁山港区', '450512', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2121, 2117, 3, '合浦县', '450521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2122, 2066, 2, '防城港市', '450600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2123, 2122, 3, '港口区', '450602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2124, 2122, 3, '防城区', '450603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2125, 2122, 3, '上思县', '450621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2126, 2122, 3, '东兴市', '450681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2127, 2066, 2, '钦州市', '450700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2128, 2127, 3, '钦南区', '450702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2129, 2127, 3, '钦北区', '450703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2130, 2127, 3, '灵山县', '450721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2131, 2127, 3, '浦北县', '450722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2132, 2066, 2, '贵港市', '450800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2133, 2132, 3, '港北区', '450802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2134, 2132, 3, '港南区', '450803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2135, 2132, 3, '覃塘区', '450804', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2136, 2132, 3, '平南县', '450821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2137, 2132, 3, '桂平市', '450881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2138, 2066, 2, '玉林市', '450900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2139, 2138, 3, '玉州区', '450902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2140, 2138, 3, '福绵区', '450903', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2141, 2138, 3, '容县', '450921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2142, 2138, 3, '陆川县', '450922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2143, 2138, 3, '博白县', '450923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2144, 2138, 3, '兴业县', '450924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2145, 2138, 3, '北流市', '450981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2146, 2066, 2, '百色市', '451000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2147, 2146, 3, '右江区', '451002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2148, 2146, 3, '田阳区', '451003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2149, 2146, 3, '田东县', '451022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2150, 2146, 3, '德保县', '451024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2151, 2146, 3, '那坡县', '451026', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2152, 2146, 3, '凌云县', '451027', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2153, 2146, 3, '乐业县', '451028', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2154, 2146, 3, '田林县', '451029', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2155, 2146, 3, '西林县', '451030', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2156, 2146, 3, '隆林各族自治县', '451031', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2157, 2146, 3, '靖西市', '451081', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2158, 2146, 3, '平果市', '451082', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2159, 2066, 2, '贺州市', '451100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2160, 2159, 3, '八步区', '451102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2161, 2159, 3, '平桂区', '451103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2162, 2159, 3, '昭平县', '451121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2163, 2159, 3, '钟山县', '451122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2164, 2159, 3, '富川瑶族自治县', '451123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2165, 2066, 2, '河池市', '451200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2166, 2165, 3, '金城江区', '451202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2167, 2165, 3, '宜州区', '451203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2168, 2165, 3, '南丹县', '451221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2169, 2165, 3, '天峨县', '451222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2170, 2165, 3, '凤山县', '451223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2171, 2165, 3, '东兰县', '451224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2172, 2165, 3, '罗城仫佬族自治县', '451225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2173, 2165, 3, '环江毛南族自治县', '451226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2174, 2165, 3, '巴马瑶族自治县', '451227', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2175, 2165, 3, '都安瑶族自治县', '451228', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2176, 2165, 3, '大化瑶族自治县', '451229', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2177, 2066, 2, '来宾市', '451300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2178, 2177, 3, '兴宾区', '451302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2179, 2177, 3, '忻城县', '451321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2180, 2177, 3, '象州县', '451322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2181, 2177, 3, '武宣县', '451323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2182, 2177, 3, '金秀瑶族自治县', '451324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2183, 2177, 3, '合山市', '451381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2184, 2066, 2, '崇左市', '451400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2185, 2184, 3, '江州区', '451402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2186, 2184, 3, '扶绥县', '451421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2187, 2184, 3, '宁明县', '451422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2188, 2184, 3, '龙州县', '451423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2189, 2184, 3, '大新县', '451424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2190, 2184, 3, '天等县', '451425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2191, 2184, 3, '凭祥市', '451481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2192, 0, 1, '海南省', '460000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2193, 2192, 2, '海口市', '460100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2194, 2193, 3, '秀英区', '460105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2195, 2193, 3, '龙华区', '460106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2196, 2193, 3, '琼山区', '460107', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2197, 2193, 3, '美兰区', '460108', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2198, 2192, 2, '三亚市', '460200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2199, 2198, 3, '海棠区', '460202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2200, 2198, 3, '吉阳区', '460203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2201, 2198, 3, '天涯区', '460204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2202, 2198, 3, '崖州区', '460205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2203, 2198, 3, '三沙市', '460300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2204, 2192, 2, '儋州市', '460400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2205, 2204, 3, '五指山市', '469001', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2206, 2204, 3, '琼海市', '469002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2207, 2204, 3, '文昌市', '469005', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2208, 2204, 3, '万宁市', '469006', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2209, 2204, 3, '东方市', '469007', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2210, 2204, 3, '定安县', '469021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2211, 2204, 3, '屯昌县', '469022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2212, 2204, 3, '澄迈县', '469023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2213, 2204, 3, '临高县', '469024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2214, 2204, 3, '白沙黎族自治县', '469025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2215, 2204, 3, '昌江黎族自治县', '469026', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2216, 2204, 3, '乐东黎族自治县', '469027', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2217, 2204, 3, '陵水黎族自治县', '469028', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2218, 2204, 3, '保亭黎族苗族自治县', '469029', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2219, 2204, 3, '琼中黎族苗族自治县', '469030', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2220, 0, 1, '重庆市', '500000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2221, 2220, 2, '重庆市', '500100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2222, 2221, 3, '万州区', '500101', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2223, 2221, 3, '涪陵区', '500102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2224, 2221, 3, '渝中区', '500103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2225, 2221, 3, '大渡口区', '500104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2226, 2221, 3, '江北区', '500105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2227, 2221, 3, '沙坪坝区', '500106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2228, 2221, 3, '九龙坡区', '500107', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2229, 2221, 3, '南岸区', '500108', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2230, 2221, 3, '北碚区', '500109', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2231, 2221, 3, '綦江区', '500110', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2232, 2221, 3, '大足区', '500111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2233, 2221, 3, '渝北区', '500112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2234, 2221, 3, '巴南区', '500113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2235, 2221, 3, '黔江区', '500114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2236, 2221, 3, '长寿区', '500115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2237, 2221, 3, '江津区', '500116', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2238, 2221, 3, '合川区', '500117', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2239, 2221, 3, '永川区', '500118', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2240, 2221, 3, '南川区', '500119', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2241, 2221, 3, '璧山区', '500120', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2242, 2221, 3, '铜梁区', '500151', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2243, 2221, 3, '潼南区', '500152', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2244, 2221, 3, '荣昌区', '500153', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2245, 2221, 3, '开州区', '500154', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2246, 2221, 3, '梁平区', '500155', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2247, 2221, 3, '武隆区', '500156', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2248, 2221, 3, '城口县', '500229', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2249, 2221, 3, '丰都县', '500230', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2250, 2221, 3, '垫江县', '500231', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2251, 2221, 3, '忠县', '500233', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2252, 2221, 3, '云阳县', '500235', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2253, 2221, 3, '奉节县', '500236', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2254, 2221, 3, '巫山县', '500237', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2255, 2221, 3, '巫溪县', '500238', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2256, 2221, 3, '石柱土家族自治县', '500240', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2257, 2221, 3, '秀山土家族苗族自治县', '500241', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2258, 2221, 3, '酉阳土家族苗族自治县', '500242', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2259, 2221, 3, '彭水苗族土家族自治县', '500243', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2260, 0, 1, '四川省', '510000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2261, 2260, 2, '成都市', '510100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2262, 2261, 3, '锦江区', '510104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2263, 2261, 3, '青羊区', '510105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2264, 2261, 3, '金牛区', '510106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2265, 2261, 3, '武侯区', '510107', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2266, 2261, 3, '成华区', '510108', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2267, 2261, 3, '龙泉驿区', '510112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2268, 2261, 3, '青白江区', '510113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2269, 2261, 3, '新都区', '510114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2270, 2261, 3, '温江区', '510115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2271, 2261, 3, '双流区', '510116', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2272, 2261, 3, '郫都区', '510117', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2273, 2261, 3, '新津区', '510118', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2274, 2261, 3, '金堂县', '510121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2275, 2261, 3, '大邑县', '510129', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2276, 2261, 3, '蒲江县', '510131', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2277, 2261, 3, '都江堰市', '510181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2278, 2261, 3, '彭州市', '510182', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2279, 2261, 3, '邛崃市', '510183', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2280, 2261, 3, '崇州市', '510184', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2281, 2261, 3, '简阳市', '510185', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2282, 2260, 2, '自贡市', '510300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2283, 2282, 3, '自流井区', '510302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2284, 2282, 3, '贡井区', '510303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2285, 2282, 3, '大安区', '510304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2286, 2282, 3, '沿滩区', '510311', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2287, 2282, 3, '荣县', '510321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2288, 2282, 3, '富顺县', '510322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2289, 2260, 2, '攀枝花市', '510400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2290, 2289, 3, '东区', '510402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2291, 2289, 3, '西区', '510403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2292, 2289, 3, '仁和区', '510411', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2293, 2289, 3, '米易县', '510421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2294, 2289, 3, '盐边县', '510422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2295, 2260, 2, '泸州市', '510500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2296, 2295, 3, '江阳区', '510502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2297, 2295, 3, '纳溪区', '510503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2298, 2295, 3, '龙马潭区', '510504', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2299, 2295, 3, '泸县', '510521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2300, 2295, 3, '合江县', '510522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2301, 2295, 3, '叙永县', '510524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2302, 2295, 3, '古蔺县', '510525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2303, 2260, 2, '德阳市', '510600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2304, 2303, 3, '旌阳区', '510603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2305, 2303, 3, '罗江区', '510604', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2306, 2303, 3, '中江县', '510623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2307, 2303, 3, '广汉市', '510681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2308, 2303, 3, '什邡市', '510682', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2309, 2303, 3, '绵竹市', '510683', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2310, 2260, 2, '绵阳市', '510700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2311, 2310, 3, '涪城区', '510703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2312, 2310, 3, '游仙区', '510704', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2313, 2310, 3, '安州区', '510705', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2314, 2310, 3, '三台县', '510722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2315, 2310, 3, '盐亭县', '510723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2316, 2310, 3, '梓潼县', '510725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2317, 2310, 3, '北川羌族自治县', '510726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2318, 2310, 3, '平武县', '510727', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2319, 2310, 3, '江油市', '510781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2320, 2260, 2, '广元市', '510800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2321, 2320, 3, '利州区', '510802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2322, 2320, 3, '昭化区', '510811', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2323, 2320, 3, '朝天区', '510812', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2324, 2320, 3, '旺苍县', '510821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2325, 2320, 3, '青川县', '510822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2326, 2320, 3, '剑阁县', '510823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2327, 2320, 3, '苍溪县', '510824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2328, 2260, 2, '遂宁市', '510900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2329, 2328, 3, '船山区', '510903', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2330, 2328, 3, '安居区', '510904', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2331, 2328, 3, '蓬溪县', '510921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2332, 2328, 3, '大英县', '510923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2333, 2328, 3, '射洪市', '510981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2334, 2260, 2, '内江市', '511000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2335, 2334, 3, '市中区', '511002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2336, 2334, 3, '东兴区', '511011', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2337, 2334, 3, '威远县', '511024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2338, 2334, 3, '资中县', '511025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2339, 2334, 3, '隆昌市', '511083', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2340, 2260, 2, '乐山市', '511100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2341, 2340, 3, '市中区', '511102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2342, 2340, 3, '沙湾区', '511111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2343, 2340, 3, '五通桥区', '511112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2344, 2340, 3, '金口河区', '511113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2345, 2340, 3, '犍为县', '511123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2346, 2340, 3, '井研县', '511124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2347, 2340, 3, '夹江县', '511126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2348, 2340, 3, '沐川县', '511129', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2349, 2340, 3, '峨边彝族自治县', '511132', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2350, 2340, 3, '马边彝族自治县', '511133', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2351, 2340, 3, '峨眉山市', '511181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2352, 2260, 2, '南充市', '511300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2353, 2352, 3, '顺庆区', '511302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2354, 2352, 3, '高坪区', '511303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2355, 2352, 3, '嘉陵区', '511304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2356, 2352, 3, '南部县', '511321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2357, 2352, 3, '营山县', '511322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2358, 2352, 3, '蓬安县', '511323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2359, 2352, 3, '仪陇县', '511324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2360, 2352, 3, '西充县', '511325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2361, 2352, 3, '阆中市', '511381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2362, 2260, 2, '眉山市', '511400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2363, 2362, 3, '东坡区', '511402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2364, 2362, 3, '彭山区', '511403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2365, 2362, 3, '仁寿县', '511421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2366, 2362, 3, '洪雅县', '511423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2367, 2362, 3, '丹棱县', '511424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2368, 2362, 3, '青神县', '511425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2369, 2260, 2, '宜宾市', '511500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2370, 2369, 3, '翠屏区', '511502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2371, 2369, 3, '南溪区', '511503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2372, 2369, 3, '叙州区', '511504', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2373, 2369, 3, '江安县', '511523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2374, 2369, 3, '长宁县', '511524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2375, 2369, 3, '高县', '511525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2376, 2369, 3, '珙县', '511526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2377, 2369, 3, '筠连县', '511527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2378, 2369, 3, '兴文县', '511528', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2379, 2369, 3, '屏山县', '511529', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2380, 2260, 2, '广安市', '511600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2381, 2380, 3, '广安区', '511602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2382, 2380, 3, '前锋区', '511603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2383, 2380, 3, '岳池县', '511621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2384, 2380, 3, '武胜县', '511622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2385, 2380, 3, '邻水县', '511623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2386, 2380, 3, '华蓥市', '511681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2387, 2260, 2, '达州市', '511700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2388, 2387, 3, '通川区', '511702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2389, 2387, 3, '达川区', '511703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2390, 2387, 3, '宣汉县', '511722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2391, 2387, 3, '开江县', '511723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2392, 2387, 3, '大竹县', '511724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2393, 2387, 3, '渠县', '511725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2394, 2387, 3, '万源市', '511781', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2395, 2260, 2, '雅安市', '511800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2396, 2395, 3, '雨城区', '511802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2397, 2395, 3, '名山区', '511803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2398, 2395, 3, '荥经县', '511822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2399, 2395, 3, '汉源县', '511823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2400, 2395, 3, '石棉县', '511824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2401, 2395, 3, '天全县', '511825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2402, 2395, 3, '芦山县', '511826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2403, 2395, 3, '宝兴县', '511827', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2404, 2260, 2, '巴中市', '511900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2405, 2404, 3, '巴州区', '511902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2406, 2404, 3, '恩阳区', '511903', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2407, 2404, 3, '通江县', '511921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2408, 2404, 3, '南江县', '511922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2409, 2404, 3, '平昌县', '511923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2410, 2260, 2, '资阳市', '512000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2411, 2410, 3, '雁江区', '512002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2412, 2410, 3, '安岳县', '512021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2413, 2410, 3, '乐至县', '512022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2414, 2260, 2, '阿坝藏族羌族自治州', '513200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2415, 2414, 3, '马尔康市', '513201', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2416, 2414, 3, '汶川县', '513221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2417, 2414, 3, '理县', '513222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2418, 2414, 3, '茂县', '513223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2419, 2414, 3, '松潘县', '513224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2420, 2414, 3, '九寨沟县', '513225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2421, 2414, 3, '金川县', '513226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2422, 2414, 3, '小金县', '513227', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2423, 2414, 3, '黑水县', '513228', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2424, 2414, 3, '壤塘县', '513230', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2425, 2414, 3, '阿坝县', '513231', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2426, 2414, 3, '若尔盖县', '513232', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2427, 2414, 3, '红原县', '513233', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2428, 2260, 2, '甘孜藏族自治州', '513300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2429, 2428, 3, '康定市', '513301', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2430, 2428, 3, '泸定县', '513322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2431, 2428, 3, '丹巴县', '513323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2432, 2428, 3, '九龙县', '513324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2433, 2428, 3, '雅江县', '513325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2434, 2428, 3, '道孚县', '513326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2435, 2428, 3, '炉霍县', '513327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2436, 2428, 3, '甘孜县', '513328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2437, 2428, 3, '新龙县', '513329', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2438, 2428, 3, '德格县', '513330', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2439, 2428, 3, '白玉县', '513331', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2440, 2428, 3, '石渠县', '513332', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2441, 2428, 3, '色达县', '513333', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2442, 2428, 3, '理塘县', '513334', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2443, 2428, 3, '巴塘县', '513335', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2444, 2428, 3, '乡城县', '513336', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2445, 2428, 3, '稻城县', '513337', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2446, 2428, 3, '得荣县', '513338', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2447, 2260, 2, '凉山彝族自治州', '513400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2448, 2447, 3, '西昌市', '513401', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2449, 2447, 3, '木里藏族自治县', '513422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2450, 2447, 3, '盐源县', '513423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2451, 2447, 3, '德昌县', '513424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2452, 2447, 3, '会理县', '513425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2453, 2447, 3, '会东县', '513426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2454, 2447, 3, '宁南县', '513427', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2455, 2447, 3, '普格县', '513428', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2456, 2447, 3, '布拖县', '513429', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2457, 2447, 3, '金阳县', '513430', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2458, 2447, 3, '昭觉县', '513431', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2459, 2447, 3, '喜德县', '513432', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2460, 2447, 3, '冕宁县', '513433', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2461, 2447, 3, '越西县', '513434', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2462, 2447, 3, '甘洛县', '513435', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2463, 2447, 3, '美姑县', '513436', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2464, 2447, 3, '雷波县', '513437', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2465, 0, 1, '贵州省', '520000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2466, 2465, 2, '贵阳市', '520100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2467, 2466, 3, '南明区', '520102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2468, 2466, 3, '云岩区', '520103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2469, 2466, 3, '花溪区', '520111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2470, 2466, 3, '乌当区', '520112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2471, 2466, 3, '白云区', '520113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2472, 2466, 3, '观山湖区', '520115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2473, 2466, 3, '开阳县', '520121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2474, 2466, 3, '息烽县', '520122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2475, 2466, 3, '修文县', '520123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2476, 2466, 3, '清镇市', '520181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2477, 2465, 2, '六盘水市', '520200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2478, 2477, 3, '钟山区', '520201', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2479, 2477, 3, '六枝特区', '520203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2480, 2477, 3, '水城县', '520221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2481, 2477, 3, '盘州市', '520281', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2482, 2465, 2, '遵义市', '520300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2483, 2482, 3, '红花岗区', '520302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2484, 2482, 3, '汇川区', '520303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2485, 2482, 3, '播州区', '520304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2486, 2482, 3, '桐梓县', '520322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2487, 2482, 3, '绥阳县', '520323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2488, 2482, 3, '正安县', '520324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2489, 2482, 3, '道真仡佬族苗族自治县', '520325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2490, 2482, 3, '务川仡佬族苗族自治县', '520326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2491, 2482, 3, '凤冈县', '520327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2492, 2482, 3, '湄潭县', '520328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2493, 2482, 3, '余庆县', '520329', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2494, 2482, 3, '习水县', '520330', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2495, 2482, 3, '赤水市', '520381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2496, 2482, 3, '仁怀市', '520382', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2497, 2465, 2, '安顺市', '520400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2498, 2497, 3, '西秀区', '520402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2499, 2497, 3, '平坝区', '520403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2500, 2497, 3, '普定县', '520422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2501, 2497, 3, '镇宁布依族苗族自治县', '520423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2502, 2497, 3, '关岭布依族苗族自治县', '520424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2503, 2497, 3, '紫云苗族布依族自治县', '520425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2504, 2465, 2, '毕节市', '520500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2505, 2504, 3, '七星关区', '520502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2506, 2504, 3, '大方县', '520521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2507, 2504, 3, '黔西县', '520522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2508, 2504, 3, '金沙县', '520523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2509, 2504, 3, '织金县', '520524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2510, 2504, 3, '纳雍县', '520525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2511, 2504, 3, '威宁彝族回族苗族自治县', '520526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2512, 2504, 3, '赫章县', '520527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2513, 2465, 2, '铜仁市', '520600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2514, 2513, 3, '碧江区', '520602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2515, 2513, 3, '万山区', '520603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2516, 2513, 3, '江口县', '520621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2517, 2513, 3, '玉屏侗族自治县', '520622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2518, 2513, 3, '石阡县', '520623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2519, 2513, 3, '思南县', '520624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2520, 2513, 3, '印江土家族苗族自治县', '520625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2521, 2513, 3, '德江县', '520626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2522, 2513, 3, '沿河土家族自治县', '520627', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2523, 2513, 3, '松桃苗族自治县', '520628', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2524, 2465, 2, '黔西南布依族苗族自治州', '522300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2525, 2524, 3, '兴义市', '522301', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2526, 2524, 3, '兴仁市', '522302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2527, 2524, 3, '普安县', '522323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2528, 2524, 3, '晴隆县', '522324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2529, 2524, 3, '贞丰县', '522325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2530, 2524, 3, '望谟县', '522326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2531, 2524, 3, '册亨县', '522327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2532, 2524, 3, '安龙县', '522328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2533, 2465, 2, '黔东南苗族侗族自治州', '522600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2534, 2533, 3, '凯里市', '522601', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2535, 2533, 3, '黄平县', '522622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2536, 2533, 3, '施秉县', '522623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2537, 2533, 3, '三穗县', '522624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2538, 2533, 3, '镇远县', '522625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2539, 2533, 3, '岑巩县', '522626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2540, 2533, 3, '天柱县', '522627', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2541, 2533, 3, '锦屏县', '522628', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2542, 2533, 3, '剑河县', '522629', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2543, 2533, 3, '台江县', '522630', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2544, 2533, 3, '黎平县', '522631', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2545, 2533, 3, '榕江县', '522632', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2546, 2533, 3, '从江县', '522633', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2547, 2533, 3, '雷山县', '522634', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2548, 2533, 3, '麻江县', '522635', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2549, 2533, 3, '丹寨县', '522636', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2550, 2465, 2, '黔南布依族苗族自治州', '522700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2551, 2550, 3, '都匀市', '522701', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2552, 2550, 3, '福泉市', '522702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2553, 2550, 3, '荔波县', '522722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2554, 2550, 3, '贵定县', '522723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2555, 2550, 3, '瓮安县', '522725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2556, 2550, 3, '独山县', '522726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2557, 2550, 3, '平塘县', '522727', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2558, 2550, 3, '罗甸县', '522728', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2559, 2550, 3, '长顺县', '522729', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2560, 2550, 3, '龙里县', '522730', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2561, 2550, 3, '惠水县', '522731', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2562, 2550, 3, '三都水族自治县', '522732', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2563, 0, 1, '云南省', '530000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2564, 2563, 2, '昆明市', '530100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2565, 2564, 3, '五华区', '530102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2566, 2564, 3, '盘龙区', '530103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2567, 2564, 3, '官渡区', '530111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2568, 2564, 3, '西山区', '530112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2569, 2564, 3, '东川区', '530113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2570, 2564, 3, '呈贡区', '530114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2571, 2564, 3, '晋宁区', '530115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2572, 2564, 3, '富民县', '530124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2573, 2564, 3, '宜良县', '530125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2574, 2564, 3, '石林彝族自治县', '530126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2575, 2564, 3, '嵩明县', '530127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2576, 2564, 3, '禄劝彝族苗族自治县', '530128', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2577, 2564, 3, '寻甸回族彝族自治县', '530129', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2578, 2564, 3, '安宁市', '530181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2579, 2563, 2, '曲靖市', '530300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2580, 2579, 3, '麒麟区', '530302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2581, 2579, 3, '沾益区', '530303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2582, 2579, 3, '马龙区', '530304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2583, 2579, 3, '陆良县', '530322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2584, 2579, 3, '师宗县', '530323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2585, 2579, 3, '罗平县', '530324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2586, 2579, 3, '富源县', '530325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2587, 2579, 3, '会泽县', '530326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2588, 2579, 3, '宣威市', '530381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2589, 2563, 2, '玉溪市', '530400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2590, 2589, 3, '红塔区', '530402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2591, 2589, 3, '江川区', '530403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2592, 2589, 3, '通海县', '530423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2593, 2589, 3, '华宁县', '530424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2594, 2589, 3, '易门县', '530425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2595, 2589, 3, '峨山彝族自治县', '530426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2596, 2589, 3, '新平彝族傣族自治县', '530427', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2597, 2589, 3, '元江哈尼族彝族傣族自治县', '530428', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2598, 2589, 3, '澄江市', '530481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2599, 2563, 2, '保山市', '530500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2600, 2599, 3, '隆阳区', '530502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2601, 2599, 3, '施甸县', '530521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2602, 2599, 3, '龙陵县', '530523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2603, 2599, 3, '昌宁县', '530524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2604, 2599, 3, '腾冲市', '530581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2605, 2563, 2, '昭通市', '530600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2606, 2605, 3, '昭阳区', '530602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2607, 2605, 3, '鲁甸县', '530621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2608, 2605, 3, '巧家县', '530622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2609, 2605, 3, '盐津县', '530623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2610, 2605, 3, '大关县', '530624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2611, 2605, 3, '永善县', '530625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2612, 2605, 3, '绥江县', '530626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2613, 2605, 3, '镇雄县', '530627', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2614, 2605, 3, '彝良县', '530628', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2615, 2605, 3, '威信县', '530629', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2616, 2605, 3, '水富市', '530681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2617, 2563, 2, '丽江市', '530700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2618, 2617, 3, '古城区', '530702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2619, 2617, 3, '玉龙纳西族自治县', '530721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2620, 2617, 3, '永胜县', '530722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2621, 2617, 3, '华坪县', '530723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2622, 2617, 3, '宁蒗彝族自治县', '530724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2623, 2563, 2, '普洱市', '530800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2624, 2623, 3, '思茅区', '530802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2625, 2623, 3, '宁洱哈尼族彝族自治县', '530821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2626, 2623, 3, '墨江哈尼族自治县', '530822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2627, 2623, 3, '景东彝族自治县', '530823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2628, 2623, 3, '景谷傣族彝族自治县', '530824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2629, 2623, 3, '镇沅彝族哈尼族拉祜族自治县', '530825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2630, 2623, 3, '江城哈尼族彝族自治县', '530826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2631, 2623, 3, '孟连傣族拉祜族佤族自治县', '530827', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2632, 2623, 3, '澜沧拉祜族自治县', '530828', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2633, 2623, 3, '西盟佤族自治县', '530829', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2634, 2563, 2, '临沧市', '530900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2635, 2634, 3, '临翔区', '530902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2636, 2634, 3, '凤庆县', '530921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2637, 2634, 3, '云县', '530922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2638, 2634, 3, '永德县', '530923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2639, 2634, 3, '镇康县', '530924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2640, 2634, 3, '双江拉祜族佤族布朗族傣族自治县', '530925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2641, 2634, 3, '耿马傣族佤族自治县', '530926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2642, 2634, 3, '沧源佤族自治县', '530927', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2643, 2563, 2, '楚雄彝族自治州', '532300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2644, 2643, 3, '楚雄市', '532301', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2645, 2643, 3, '双柏县', '532322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2646, 2643, 3, '牟定县', '532323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2647, 2643, 3, '南华县', '532324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2648, 2643, 3, '姚安县', '532325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2649, 2643, 3, '大姚县', '532326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2650, 2643, 3, '永仁县', '532327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2651, 2643, 3, '元谋县', '532328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2652, 2643, 3, '武定县', '532329', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2653, 2643, 3, '禄丰县', '532331', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2654, 2563, 2, '红河哈尼族彝族自治州', '532500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2655, 2654, 3, '个旧市', '532501', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2656, 2654, 3, '开远市', '532502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2657, 2654, 3, '蒙自市', '532503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2658, 2654, 3, '弥勒市', '532504', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2659, 2654, 3, '屏边苗族自治县', '532523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2660, 2654, 3, '建水县', '532524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2661, 2654, 3, '石屏县', '532525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2662, 2654, 3, '泸西县', '532527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2663, 2654, 3, '元阳县', '532528', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2664, 2654, 3, '红河县', '532529', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2665, 2654, 3, '金平苗族瑶族傣族自治县', '532530', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2666, 2654, 3, '绿春县', '532531', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2667, 2654, 3, '河口瑶族自治县', '532532', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2668, 2563, 2, '文山壮族苗族自治州', '532600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2669, 2668, 3, '文山市', '532601', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2670, 2668, 3, '砚山县', '532622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2671, 2668, 3, '西畴县', '532623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2672, 2668, 3, '麻栗坡县', '532624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2673, 2668, 3, '马关县', '532625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2674, 2668, 3, '丘北县', '532626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2675, 2668, 3, '广南县', '532627', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2676, 2668, 3, '富宁县', '532628', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2677, 2563, 2, '西双版纳傣族自治州', '532800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2678, 2677, 3, '景洪市', '532801', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2679, 2677, 3, '勐海县', '532822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2680, 2677, 3, '勐腊县', '532823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2681, 2563, 2, '大理白族自治州', '532900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2682, 2681, 3, '大理市', '532901', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2683, 2681, 3, '漾濞彝族自治县', '532922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2684, 2681, 3, '祥云县', '532923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2685, 2681, 3, '宾川县', '532924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2686, 2681, 3, '弥渡县', '532925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2687, 2681, 3, '南涧彝族自治县', '532926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2688, 2681, 3, '巍山彝族回族自治县', '532927', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2689, 2681, 3, '永平县', '532928', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2690, 2681, 3, '云龙县', '532929', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2691, 2681, 3, '洱源县', '532930', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2692, 2681, 3, '剑川县', '532931', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2693, 2681, 3, '鹤庆县', '532932', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2694, 2563, 2, '德宏傣族景颇族自治州', '533100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2695, 2694, 3, '瑞丽市', '533102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2696, 2694, 3, '芒市', '533103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2697, 2694, 3, '梁河县', '533122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2698, 2694, 3, '盈江县', '533123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2699, 2694, 3, '陇川县', '533124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2700, 2563, 2, '怒江傈僳族自治州', '533300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2701, 2700, 3, '泸水市', '533301', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2702, 2700, 3, '福贡县', '533323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2703, 2700, 3, '贡山独龙族怒族自治县', '533324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2704, 2700, 3, '兰坪白族普米族自治县', '533325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2705, 2563, 2, '迪庆藏族自治州', '533400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2706, 2705, 3, '香格里拉市', '533401', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2707, 2705, 3, '德钦县', '533422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2708, 2705, 3, '维西傈僳族自治县', '533423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2709, 0, 1, '西藏自治区', '540000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2710, 2709, 2, '拉萨市', '540100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2711, 2710, 3, '城关区', '540102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2712, 2710, 3, '堆龙德庆区', '540103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2713, 2710, 3, '达孜区', '540104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2714, 2710, 3, '林周县', '540121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2715, 2710, 3, '当雄县', '540122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2716, 2710, 3, '尼木县', '540123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2717, 2710, 3, '曲水县', '540124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2718, 2710, 3, '墨竹工卡县', '540127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2719, 2709, 2, '日喀则市', '540200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2720, 2719, 3, '桑珠孜区', '540202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2721, 2719, 3, '南木林县', '540221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2722, 2719, 3, '江孜县', '540222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2723, 2719, 3, '定日县', '540223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2724, 2719, 3, '萨迦县', '540224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2725, 2719, 3, '拉孜县', '540225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2726, 2719, 3, '昂仁县', '540226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2727, 2719, 3, '谢通门县', '540227', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2728, 2719, 3, '白朗县', '540228', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2729, 2719, 3, '仁布县', '540229', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2730, 2719, 3, '康马县', '540230', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2731, 2719, 3, '定结县', '540231', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2732, 2719, 3, '仲巴县', '540232', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2733, 2719, 3, '亚东县', '540233', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2734, 2719, 3, '吉隆县', '540234', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2735, 2719, 3, '聂拉木县', '540235', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2736, 2719, 3, '萨嘎县', '540236', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2737, 2719, 3, '岗巴县', '540237', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2738, 2709, 2, '昌都市', '540300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2739, 2738, 3, '卡若区', '540302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2740, 2738, 3, '江达县', '540321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2741, 2738, 3, '贡觉县', '540322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2742, 2738, 3, '类乌齐县', '540323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2743, 2738, 3, '丁青县', '540324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2744, 2738, 3, '察雅县', '540325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2745, 2738, 3, '八宿县', '540326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2746, 2738, 3, '左贡县', '540327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2747, 2738, 3, '芒康县', '540328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2748, 2738, 3, '洛隆县', '540329', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2749, 2738, 3, '边坝县', '540330', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2750, 2709, 2, '林芝市', '540400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2751, 2750, 3, '巴宜区', '540402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2752, 2750, 3, '工布江达县', '540421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2753, 2750, 3, '米林县', '540422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2754, 2750, 3, '墨脱县', '540423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2755, 2750, 3, '波密县', '540424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2756, 2750, 3, '察隅县', '540425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2757, 2750, 3, '朗县', '540426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2758, 2709, 2, '山南市', '540500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2759, 2758, 3, '乃东区', '540502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2760, 2758, 3, '扎囊县', '540521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2761, 2758, 3, '贡嘎县', '540522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2762, 2758, 3, '桑日县', '540523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2763, 2758, 3, '琼结县', '540524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2764, 2758, 3, '曲松县', '540525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2765, 2758, 3, '措美县', '540526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2766, 2758, 3, '洛扎县', '540527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2767, 2758, 3, '加查县', '540528', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2768, 2758, 3, '隆子县', '540529', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2769, 2758, 3, '错那县', '540530', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2770, 2758, 3, '浪卡子县', '540531', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2771, 2709, 2, '那曲市', '540600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2772, 2771, 3, '色尼区', '540602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2773, 2771, 3, '嘉黎县', '540621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2774, 2771, 3, '比如县', '540622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2775, 2771, 3, '聂荣县', '540623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2776, 2771, 3, '安多县', '540624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2777, 2771, 3, '申扎县', '540625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2778, 2771, 3, '索县', '540626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2779, 2771, 3, '班戈县', '540627', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2780, 2771, 3, '巴青县', '540628', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2781, 2771, 3, '尼玛县', '540629', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2782, 2771, 3, '双湖县', '540630', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2783, 2709, 2, '阿里地区', '542500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2784, 2783, 3, '普兰县', '542521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2785, 2783, 3, '札达县', '542522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2786, 2783, 3, '噶尔县', '542523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2787, 2783, 3, '日土县', '542524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2788, 2783, 3, '革吉县', '542525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2789, 2783, 3, '改则县', '542526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2790, 2783, 3, '措勤县', '542527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2791, 0, 1, '陕西省', '610000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2792, 2791, 2, '西安市', '610100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2793, 2792, 3, '新城区', '610102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2794, 2792, 3, '碑林区', '610103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2795, 2792, 3, '莲湖区', '610104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2796, 2792, 3, '灞桥区', '610111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2797, 2792, 3, '未央区', '610112', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2798, 2792, 3, '雁塔区', '610113', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2799, 2792, 3, '阎良区', '610114', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2800, 2792, 3, '临潼区', '610115', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2801, 2792, 3, '长安区', '610116', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2802, 2792, 3, '高陵区', '610117', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2803, 2792, 3, '鄠邑区', '610118', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2804, 2792, 3, '蓝田县', '610122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2805, 2792, 3, '周至县', '610124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2806, 2791, 2, '铜川市', '610200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2807, 2806, 3, '王益区', '610202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2808, 2806, 3, '印台区', '610203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2809, 2806, 3, '耀州区', '610204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2810, 2806, 3, '宜君县', '610222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2811, 2791, 2, '宝鸡市', '610300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2812, 2811, 3, '渭滨区', '610302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2813, 2811, 3, '金台区', '610303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2814, 2811, 3, '陈仓区', '610304', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2815, 2811, 3, '凤翔县', '610322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2816, 2811, 3, '岐山县', '610323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2817, 2811, 3, '扶风县', '610324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2818, 2811, 3, '眉县', '610326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2819, 2811, 3, '陇县', '610327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2820, 2811, 3, '千阳县', '610328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2821, 2811, 3, '麟游县', '610329', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2822, 2811, 3, '凤县', '610330', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2823, 2811, 3, '太白县', '610331', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2824, 2791, 2, '咸阳市', '610400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2825, 2824, 3, '秦都区', '610402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2826, 2824, 3, '杨陵区', '610403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2827, 2824, 3, '渭城区', '610404', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2828, 2824, 3, '三原县', '610422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2829, 2824, 3, '泾阳县', '610423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2830, 2824, 3, '乾县', '610424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2831, 2824, 3, '礼泉县', '610425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2832, 2824, 3, '永寿县', '610426', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2833, 2824, 3, '长武县', '610428', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2834, 2824, 3, '旬邑县', '610429', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2835, 2824, 3, '淳化县', '610430', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2836, 2824, 3, '武功县', '610431', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2837, 2824, 3, '兴平市', '610481', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2838, 2824, 3, '彬州市', '610482', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2839, 2791, 2, '渭南市', '610500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2840, 2839, 3, '临渭区', '610502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2841, 2839, 3, '华州区', '610503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2842, 2839, 3, '潼关县', '610522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2843, 2839, 3, '大荔县', '610523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2844, 2839, 3, '合阳县', '610524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2845, 2839, 3, '澄城县', '610525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2846, 2839, 3, '蒲城县', '610526', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2847, 2839, 3, '白水县', '610527', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2848, 2839, 3, '富平县', '610528', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2849, 2839, 3, '韩城市', '610581', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2850, 2839, 3, '华阴市', '610582', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2851, 2791, 2, '延安市', '610600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2852, 2851, 3, '宝塔区', '610602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2853, 2851, 3, '安塞区', '610603', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2854, 2851, 3, '延长县', '610621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2855, 2851, 3, '延川县', '610622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2856, 2851, 3, '志丹县', '610625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2857, 2851, 3, '吴起县', '610626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2858, 2851, 3, '甘泉县', '610627', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2859, 2851, 3, '富县', '610628', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2860, 2851, 3, '洛川县', '610629', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2861, 2851, 3, '宜川县', '610630', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2862, 2851, 3, '黄龙县', '610631', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2863, 2851, 3, '黄陵县', '610632', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2864, 2851, 3, '子长市', '610681', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2865, 2791, 2, '汉中市', '610700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2866, 2865, 3, '汉台区', '610702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2867, 2865, 3, '南郑区', '610703', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2868, 2865, 3, '城固县', '610722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2869, 2865, 3, '洋县', '610723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2870, 2865, 3, '西乡县', '610724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2871, 2865, 3, '勉县', '610725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2872, 2865, 3, '宁强县', '610726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2873, 2865, 3, '略阳县', '610727', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2874, 2865, 3, '镇巴县', '610728', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2875, 2865, 3, '留坝县', '610729', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2876, 2865, 3, '佛坪县', '610730', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2877, 2791, 2, '榆林市', '610800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2878, 2877, 3, '榆阳区', '610802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2879, 2877, 3, '横山区', '610803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2880, 2877, 3, '府谷县', '610822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2881, 2877, 3, '靖边县', '610824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2882, 2877, 3, '定边县', '610825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2883, 2877, 3, '绥德县', '610826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2884, 2877, 3, '米脂县', '610827', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2885, 2877, 3, '佳县', '610828', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2886, 2877, 3, '吴堡县', '610829', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2887, 2877, 3, '清涧县', '610830', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2888, 2877, 3, '子洲县', '610831', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2889, 2877, 3, '神木市', '610881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2890, 2791, 2, '安康市', '610900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2891, 2890, 3, '汉滨区', '610902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2892, 2890, 3, '汉阴县', '610921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2893, 2890, 3, '石泉县', '610922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2894, 2890, 3, '宁陕县', '610923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2895, 2890, 3, '紫阳县', '610924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2896, 2890, 3, '岚皋县', '610925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2897, 2890, 3, '平利县', '610926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2898, 2890, 3, '镇坪县', '610927', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2899, 2890, 3, '旬阳县', '610928', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2900, 2890, 3, '白河县', '610929', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2901, 2791, 2, '商洛市', '611000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2902, 2901, 3, '商州区', '611002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2903, 2901, 3, '洛南县', '611021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2904, 2901, 3, '丹凤县', '611022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2905, 2901, 3, '商南县', '611023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2906, 2901, 3, '山阳县', '611024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2907, 2901, 3, '镇安县', '611025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2908, 2901, 3, '柞水县', '611026', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2909, 0, 1, '甘肃省', '620000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2910, 2909, 2, '兰州市', '620100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2911, 2910, 3, '城关区', '620102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2912, 2910, 3, '七里河区', '620103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2913, 2910, 3, '西固区', '620104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2914, 2910, 3, '安宁区', '620105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2915, 2910, 3, '红古区', '620111', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2916, 2910, 3, '永登县', '620121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2917, 2910, 3, '皋兰县', '620122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2918, 2910, 3, '榆中县', '620123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2919, 2909, 2, '嘉峪关市', '620200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2920, 2909, 2, '金昌市', '620300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2921, 2920, 3, '金川区', '620302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2922, 2920, 3, '永昌县', '620321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2923, 2909, 2, '白银市', '620400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2924, 2923, 3, '白银区', '620402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2925, 2923, 3, '平川区', '620403', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2926, 2923, 3, '靖远县', '620421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2927, 2923, 3, '会宁县', '620422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2928, 2923, 3, '景泰县', '620423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2929, 2909, 2, '天水市', '620500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2930, 2929, 3, '秦州区', '620502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2931, 2929, 3, '麦积区', '620503', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2932, 2929, 3, '清水县', '620521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2933, 2929, 3, '秦安县', '620522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2934, 2929, 3, '甘谷县', '620523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2935, 2929, 3, '武山县', '620524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2936, 2929, 3, '张家川回族自治县', '620525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2937, 2909, 2, '武威市', '620600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2938, 2937, 3, '凉州区', '620602', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2939, 2937, 3, '民勤县', '620621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2940, 2937, 3, '古浪县', '620622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2941, 2937, 3, '天祝藏族自治县', '620623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2942, 2909, 2, '张掖市', '620700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2943, 2942, 3, '甘州区', '620702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2944, 2942, 3, '肃南裕固族自治县', '620721', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2945, 2942, 3, '民乐县', '620722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2946, 2942, 3, '临泽县', '620723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2947, 2942, 3, '高台县', '620724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2948, 2942, 3, '山丹县', '620725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2949, 2942, 3, '平凉市', '620800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2950, 2942, 3, '崆峒区', '620802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2951, 2942, 3, '泾川县', '620821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2952, 2942, 3, '灵台县', '620822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2953, 2942, 3, '崇信县', '620823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2954, 2942, 3, '庄浪县', '620825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2955, 2942, 3, '静宁县', '620826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2956, 2942, 3, '华亭市', '620881', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2957, 2909, 2, '酒泉市', '620900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2958, 2957, 3, '肃州区', '620902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2959, 2957, 3, '金塔县', '620921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2960, 2957, 3, '瓜州县', '620922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2961, 2957, 3, '肃北蒙古族自治县', '620923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2962, 2957, 3, '阿克塞哈萨克族自治县', '620924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2963, 2957, 3, '玉门市', '620981', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2964, 2957, 3, '敦煌市', '620982', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2965, 2909, 2, '庆阳市', '621000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2966, 2965, 3, '西峰区', '621002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2967, 2965, 3, '庆城县', '621021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2968, 2965, 3, '环县', '621022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2969, 2965, 3, '华池县', '621023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2970, 2965, 3, '合水县', '621024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2971, 2965, 3, '正宁县', '621025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2972, 2965, 3, '宁县', '621026', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2973, 2965, 3, '镇原县', '621027', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2974, 2909, 2, '定西市', '621100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2975, 2974, 3, '安定区', '621102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2976, 2974, 3, '通渭县', '621121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2977, 2974, 3, '陇西县', '621122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2978, 2974, 3, '渭源县', '621123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2979, 2974, 3, '临洮县', '621124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2980, 2974, 3, '漳县', '621125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2981, 2974, 3, '岷县', '621126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2982, 2909, 2, '陇南市', '621200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2983, 2982, 3, '武都区', '621202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2984, 2982, 3, '成县', '621221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2985, 2982, 3, '文县', '621222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2986, 2982, 3, '宕昌县', '621223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2987, 2982, 3, '康县', '621224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2988, 2982, 3, '西和县', '621225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2989, 2982, 3, '礼县', '621226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2990, 2982, 3, '徽县', '621227', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2991, 2982, 3, '两当县', '621228', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2992, 2909, 2, '临夏回族自治州', '622900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2993, 2992, 3, '临夏市', '622901', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2994, 2992, 3, '临夏县', '622921', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2995, 2992, 3, '康乐县', '622922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2996, 2992, 3, '永靖县', '622923', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2997, 2992, 3, '广河县', '622924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2998, 2992, 3, '和政县', '622925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (2999, 2992, 3, '东乡族自治县', '622926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3000, 2992, 3, '积石山保安族东乡族撒拉族自治县', '622927', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3001, 2909, 2, '甘南藏族自治州', '623000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3002, 3001, 3, '合作市', '623001', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3003, 3001, 3, '临潭县', '623021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3004, 3001, 3, '卓尼县', '623022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3005, 3001, 3, '舟曲县', '623023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3006, 3001, 3, '迭部县', '623024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3007, 3001, 3, '玛曲县', '623025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3008, 3001, 3, '碌曲县', '623026', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3009, 3001, 3, '夏河县', '623027', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3010, 0, 1, '青海省', '630000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3011, 3010, 2, '西宁市', '630100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3012, 3011, 3, '城东区', '630102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3013, 3011, 3, '城中区', '630103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3014, 3011, 3, '城西区', '630104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3015, 3011, 3, '城北区', '630105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3016, 3011, 3, '湟中区', '630106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3017, 3011, 3, '大通回族土族自治县', '630121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3018, 3011, 3, '湟源县', '630123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3019, 3010, 2, '海东市', '630200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3020, 3019, 3, '乐都区', '630202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3021, 3019, 3, '平安区', '630203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3022, 3019, 3, '民和回族土族自治县', '630222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3023, 3019, 3, '互助土族自治县', '630223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3024, 3019, 3, '化隆回族自治县', '630224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3025, 3019, 3, '循化撒拉族自治县', '630225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3026, 3010, 2, '海北藏族自治州', '632200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3027, 3026, 3, '门源回族自治县', '632221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3028, 3026, 3, '祁连县', '632222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3029, 3026, 3, '海晏县', '632223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3030, 3026, 3, '刚察县', '632224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3031, 3010, 2, '黄南藏族自治州', '632300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3032, 3031, 3, '同仁市', '632301', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3033, 3031, 3, '尖扎县', '632322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3034, 3031, 3, '泽库县', '632323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3035, 3031, 3, '河南蒙古族自治县', '632324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3036, 3010, 2, '海南藏族自治州', '632500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3037, 3036, 3, '共和县', '632521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3038, 3036, 3, '同德县', '632522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3039, 3036, 3, '贵德县', '632523', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3040, 3036, 3, '兴海县', '632524', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3041, 3036, 3, '贵南县', '632525', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3042, 3010, 2, '果洛藏族自治州', '632600', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3043, 3042, 3, '玛沁县', '632621', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3044, 3042, 3, '班玛县', '632622', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3045, 3042, 3, '甘德县', '632623', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3046, 3042, 3, '达日县', '632624', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3047, 3042, 3, '久治县', '632625', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3048, 3042, 3, '玛多县', '632626', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3049, 3010, 2, '玉树藏族自治州', '632700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3050, 3049, 3, '玉树市', '632701', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3051, 3049, 3, '杂多县', '632722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3052, 3049, 3, '称多县', '632723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3053, 3049, 3, '治多县', '632724', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3054, 3049, 3, '囊谦县', '632725', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3055, 3049, 3, '曲麻莱县', '632726', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3056, 3010, 2, '海西蒙古族藏族自治州', '632800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3057, 3056, 3, '格尔木市', '632801', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3058, 3056, 3, '德令哈市', '632802', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3059, 3056, 3, '茫崖市', '632803', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3060, 3056, 3, '乌兰县', '632821', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3061, 3056, 3, '都兰县', '632822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3062, 3056, 3, '天峻县', '632823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3063, 0, 1, '宁夏回族自治区', '640000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3064, 3063, 2, '银川市', '640100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3065, 3064, 3, '兴庆区', '640104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3066, 3064, 3, '西夏区', '640105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3067, 3064, 3, '金凤区', '640106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3068, 3064, 3, '永宁县', '640121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3069, 3064, 3, '贺兰县', '640122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3070, 3064, 3, '灵武市', '640181', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3071, 3063, 2, '石嘴山市', '640200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3072, 3071, 3, '大武口区', '640202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3073, 3071, 3, '惠农区', '640205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3074, 3071, 3, '平罗县', '640221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3075, 3071, 3, '吴忠市', '640300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3076, 3071, 3, '利通区', '640302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3077, 3071, 3, '红寺堡区', '640303', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3078, 3071, 3, '盐池县', '640323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3079, 3071, 3, '同心县', '640324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3080, 3071, 3, '青铜峡市', '640381', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3081, 3063, 2, '固原市', '640400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3082, 3081, 3, '原州区', '640402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3083, 3081, 3, '西吉县', '640422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3084, 3081, 3, '隆德县', '640423', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3085, 3081, 3, '泾源县', '640424', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3086, 3081, 3, '彭阳县', '640425', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3087, 3063, 2, '中卫市', '640500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3088, 3087, 3, '沙坡头区', '640502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3089, 3087, 3, '中宁县', '640521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3090, 3087, 3, '海原县', '640522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3091, 0, 1, '新疆维吾尔自治区', '650000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3092, 3091, 2, '乌鲁木齐市', '650100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3093, 3092, 3, '天山区', '650102', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3094, 3092, 3, '沙依巴克区', '650103', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3095, 3092, 3, '新市区', '650104', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3096, 3092, 3, '水磨沟区', '650105', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3097, 3092, 3, '头屯河区', '650106', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3098, 3092, 3, '达坂城区', '650107', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3099, 3092, 3, '米东区', '650109', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3100, 3092, 3, '乌鲁木齐县', '650121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3101, 3091, 2, '克拉玛依市', '650200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3102, 3101, 3, '独山子区', '650202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3103, 3101, 3, '克拉玛依区', '650203', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3104, 3101, 3, '白碱滩区', '650204', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3105, 3101, 3, '乌尔禾区', '650205', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3106, 3091, 2, '吐鲁番市', '650400', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3107, 3106, 3, '高昌区', '650402', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3108, 3106, 3, '鄯善县', '650421', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3109, 3106, 3, '托克逊县', '650422', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3110, 3091, 2, '哈密市', '650500', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3111, 3110, 3, '伊州区', '650502', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3112, 3110, 3, '巴里坤哈萨克自治县', '650521', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3113, 3110, 3, '伊吾县', '650522', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3114, 3091, 2, '昌吉回族自治州', '652300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3115, 3114, 3, '昌吉市', '652301', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3116, 3114, 3, '阜康市', '652302', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3117, 3114, 3, '呼图壁县', '652323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3118, 3114, 3, '玛纳斯县', '652324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3119, 3114, 3, '奇台县', '652325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3120, 3114, 3, '吉木萨尔县', '652327', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3121, 3114, 3, '木垒哈萨克自治县', '652328', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3122, 3091, 2, '博尔塔拉蒙古自治州', '652700', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3123, 3122, 3, '博乐市', '652701', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3124, 3122, 3, '阿拉山口市', '652702', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3125, 3122, 3, '精河县', '652722', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3126, 3122, 3, '温泉县', '652723', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3127, 3091, 2, '巴音郭楞蒙古自治州', '652800', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3128, 3127, 3, '库尔勒市', '652801', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3129, 3127, 3, '轮台县', '652822', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3130, 3127, 3, '尉犁县', '652823', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3131, 3127, 3, '若羌县', '652824', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3132, 3127, 3, '且末县', '652825', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3133, 3127, 3, '焉耆回族自治县', '652826', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3134, 3127, 3, '和静县', '652827', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3135, 3127, 3, '和硕县', '652828', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3136, 3127, 3, '博湖县', '652829', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3137, 3091, 2, '阿克苏地区', '652900', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3138, 3137, 3, '阿克苏市', '652901', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3139, 3137, 3, '库车市', '652902', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3140, 3137, 3, '温宿县', '652922', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3141, 3137, 3, '沙雅县', '652924', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3142, 3137, 3, '新和县', '652925', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3143, 3137, 3, '拜城县', '652926', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3144, 3137, 3, '乌什县', '652927', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3145, 3137, 3, '阿瓦提县', '652928', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3146, 3137, 3, '柯坪县', '652929', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3147, 3091, 2, '克孜勒苏柯尔克孜自治州', '653000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3148, 3147, 3, '阿图什市', '653001', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3149, 3147, 3, '阿克陶县', '653022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3150, 3147, 3, '阿合奇县', '653023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3151, 3147, 3, '乌恰县', '653024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3152, 3091, 2, '喀什地区', '653100', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3153, 3152, 3, '喀什市', '653101', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3154, 3152, 3, '疏附县', '653121', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3155, 3152, 3, '疏勒县', '653122', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3156, 3152, 3, '英吉沙县', '653123', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3157, 3152, 3, '泽普县', '653124', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3158, 3152, 3, '莎车县', '653125', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3159, 3152, 3, '叶城县', '653126', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3160, 3152, 3, '麦盖提县', '653127', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3161, 3152, 3, '岳普湖县', '653128', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3162, 3152, 3, '伽师县', '653129', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3163, 3152, 3, '巴楚县', '653130', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3164, 3152, 3, '塔什库尔干塔吉克自治县', '653131', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3165, 3091, 2, '和田地区', '653200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3166, 3165, 3, '和田市', '653201', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3167, 3165, 3, '和田县', '653221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3168, 3165, 3, '墨玉县', '653222', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3169, 3165, 3, '皮山县', '653223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3170, 3165, 3, '洛浦县', '653224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3171, 3165, 3, '策勒县', '653225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3172, 3165, 3, '于田县', '653226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3173, 3165, 3, '民丰县', '653227', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3174, 3091, 2, '伊犁哈萨克自治州', '654000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3175, 3174, 3, '伊宁市', '654002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3176, 3174, 3, '奎屯市', '654003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3177, 3174, 3, '霍尔果斯市', '654004', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3178, 3174, 3, '伊宁县', '654021', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3179, 3174, 3, '察布查尔锡伯自治县', '654022', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3180, 3174, 3, '霍城县', '654023', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3181, 3174, 3, '巩留县', '654024', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3182, 3174, 3, '新源县', '654025', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3183, 3174, 3, '昭苏县', '654026', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3184, 3174, 3, '特克斯县', '654027', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3185, 3174, 3, '尼勒克县', '654028', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3186, 3091, 2, '塔城地区', '654200', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3187, 3186, 3, '塔城市', '654201', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3188, 3186, 3, '乌苏市', '654202', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3189, 3186, 3, '额敏县', '654221', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3190, 3186, 3, '沙湾县', '654223', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3191, 3186, 3, '托里县', '654224', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3192, 3186, 3, '裕民县', '654225', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3193, 3186, 3, '和布克赛尔蒙古自治县', '654226', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3194, 3091, 2, '阿勒泰地区', '654300', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3195, 3194, 3, '阿勒泰市', '654301', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3196, 3194, 3, '布尔津县', '654321', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3197, 3194, 3, '富蕴县', '654322', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3198, 3194, 3, '福海县', '654323', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3199, 3194, 3, '哈巴河县', '654324', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3200, 3194, 3, '青河县', '654325', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3201, 3194, 3, '吉木乃县', '654326', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3202, 3194, 3, '石河子市', '659001', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3203, 3194, 3, '阿拉尔市', '659002', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3204, 3194, 3, '图木舒克市', '659003', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3205, 3194, 3, '五家渠市', '659004', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3206, 3194, 3, '北屯市', '659005', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3207, 3194, 3, '铁门关市', '659006', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3208, 3194, 3, '双河市', '659007', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3209, 3194, 3, '可克达拉市', '659008', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3210, 3194, 3, '昆玉市', '659009', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3211, 3194, 3, '胡杨河市', '659010', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3212, 0, 1, '台湾省', '710000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3213, 0, 1, '香港特别行政区', '810000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3214, 0, 1, '澳门特别行政区', '820000', NULL, NULL, NULL, NULL, 0, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3215, 0, 1, '测试', '测试', '', '测试', '0', '0', 1, 1, 1637370608, 0, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3216, 0, 1, '测试123', '测试123', '222', '测试123', '11', '11', 1, 1, 1637370608, 1, 1638097597, 1); +INSERT INTO `sys_city` VALUES (3217, 1, 2, '测试111', '测试111', '', '测试111', '0', '0', 12, 1, 1637370608, 0, 1637370608, 1); +INSERT INTO `sys_city` VALUES (3218, 3216, 2, '11', '11', '', '11', '1111', '1111', 125, 1, 1637645771, 1, 1637645776, 1); + +-- ---------------------------- +-- Table structure for sys_config +-- ---------------------------- +DROP TABLE IF EXISTS `sys_config`; +CREATE TABLE `sys_config` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '分组名称', + `sort` tinyint NOT NULL COMMENT '排序', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NOT NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '配置分组表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_config +-- ---------------------------- +INSERT INTO `sys_config` VALUES (1, '网站配置', 1, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_config` VALUES (2, '微信公众号', 5, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_config` VALUES (3, '微信小程序', 7, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_config` VALUES (4, '阿里短信', 9, 1, 1637370608, 1, 1637370608, 1); + +-- ---------------------------- +-- Table structure for sys_config_data +-- ---------------------------- +DROP TABLE IF EXISTS `sys_config_data`; +CREATE TABLE `sys_config_data` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `title` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '配置标题', + `code` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '配置编码', + `value` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '配置值', + `options` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '配置项', + `config_id` int NOT NULL DEFAULT 0 COMMENT '配置ID', + `type` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '配置类型', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:1正常 2停用', + `sort` smallint NOT NULL DEFAULT 0 COMMENT '排序', + `note` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '配置说明', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NOT NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识:1正常 0删除', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_title`(`title`) USING BTREE, + INDEX `index_code`(`code`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 46 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '配置表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_config_data +-- ---------------------------- +INSERT INTO `sys_config_data` VALUES (1, '网站全称', 'site_name', '基于Gin+Layui敏捷后台开发框架', '', 1, 'text', 1, 1, '暂无', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (2, '网站LOGO', 'site_logo', '/images/config/20220512/b0e0f4cc-f5e7-4800-adff-f3e615197731.png', '', 1, 'image', 1, 5, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (3, '网站关键词', 'site_keywords', '基于Go语言Gin、Layui、MySQL敏捷开发框架', '', 1, 'text', 1, 15, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (4, '网站描述', 'site_desc', '基于Go语言Gin、Layui、MySQL等框架精心打造的组件式敏捷开发框架,简化开发,提升开发效率!!', '', 1, 'textarea', 1, 19, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (5, '网站简称', 'site_nickname', '基于Gin+Layui敏捷后台开发框架', '', 1, 'text', 1, 3, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (6, '网站网址', 'site_url', '网站网址', '', 1, 'text', 1, 17, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (7, '版权信息', 'site_copyright', '版权信息', '', 1, 'text', 1, 13, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (8, '备案号', 'site_record', '备案号', '', 1, 'text', 1, 15, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (9, '网站QQ', 'site_qq', '网站QQ', '', 1, 'text', 1, 20, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (10, '网站电话', 'site_phone', '网站电话', '', 1, 'text', 1, 25, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (11, '公司地址', 'site_address', '公司地址', '', 1, 'text', 1, 21, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (12, '网站邮箱', 'site_email', '网站邮箱', '', 1, 'text', 1, 23, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (13, '统计代码', 'site_tongji', '统计代码', '', 1, 'textarea', 1, 30, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (14, '网站宣传片', 'site_pic', '/images/config/20220512/89dc2fc2-696f-4320-b173-760c165b62fa.png,/images/config/20220512/970ecc5f-c46b-4c10-b81f-7072ae9046b7.png,/images/config/20220512/440bcd4f-7ddf-499d-8b71-8c11fd2ae9b7.png,/images/config/20220512/54bb037e-cfba-4002-ad1c-06bc0ed32190.png,/images/config/20220512/7c3ee413-361f-463c-8ef6-8e8effa12426.png,/images/config/20220512/816aab8c-f7d2-400d-a953-10d7f45ec8fc.png,/images/config/20220512/126b531a-f7aa-4a28-a0a1-6d776c89943f.png', '', 1, 'images', 1, 7, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (15, 'SEO标题', 'site_seo_title', '基于Go语言Gin、Layui、MySQL敏捷开发框架', '', 1, 'text', 1, 9, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (16, 'SEO描述', 'site_seo_desc', '基于Go语言Gin、Layui、MySQL等框架精心打造的组件式敏捷开发框架,简化开发,提升开发效率!!', '', 1, 'textarea', 1, 11, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (17, '传真', 'site_fax', '传真', '', 1, 'text', 1, 27, '', 1, 1637370608, 1, 1652576500, 1); +INSERT INTO `sys_config_data` VALUES (18, 'AppId', 'wx_appid', 'wxae802963eb8a96cd', '111', 2, 'text', 1, 1, '222', 1, 1637370608, 1, 1652576510, 1); +INSERT INTO `sys_config_data` VALUES (19, 'AppSecret', 'wx_appsecret', '57b8a986cae98659fhb4a3eeafgb567a', '', 2, 'text', 1, 5, '', 1, 1637370608, 1, 1652576510, 1); +INSERT INTO `sys_config_data` VALUES (20, '微信token', 'wx_token', '暂无', '', 2, 'text', 1, 7, '', 1, 1637370608, 1, 1652576510, 1); +INSERT INTO `sys_config_data` VALUES (21, 'EncodingAESKey', 'wx_aeskey', '暂无', '', 2, 'text', 1, 9, '', 1, 1637370608, 1, 1652576510, 1); +INSERT INTO `sys_config_data` VALUES (22, '消息加密方式', 'wx_encryption', '2', '1:测试一\n2:测试二\n3:测试三', 2, 'radio', 1, 11, '', 1, 1637370608, 1, 1652576510, 1); +INSERT INTO `sys_config_data` VALUES (23, '公众号LOGO', 'wx_logo', '/images/config/20220512/c2b7efb1-9c62-4842-9d43-7a2181b055cf.png', '', 2, 'image', 1, 13, '', 1, 1637370608, 1, 1652576510, 1); +INSERT INTO `sys_config_data` VALUES (24, '微信分享图片', 'wx_share_pic', '/images/config/20220512/fb6a74f3-d5b6-4131-9100-d4eb123d5e90.png', '', 2, 'image', 1, 15, '', 1, 1637370608, 1, 1652576510, 1); +INSERT INTO `sys_config_data` VALUES (25, '微信分享标题', 'wx_share_title', '基于Gin+Layui敏捷后台开发框架', '', 2, 'text', 1, 17, '', 1, 1637370608, 1, 1652576510, 1); +INSERT INTO `sys_config_data` VALUES (26, '微信分享描述', 'wx_share_desc', '基于Go语言Gin、Layui、MySQL等框架精心打造的组件式敏捷开发框架,简化开发,提升开发效率!!', '', 2, 'textarea', 1, 19, '', 1, 1637370608, 1, 1652576510, 1); +INSERT INTO `sys_config_data` VALUES (27, '小程序AppId', 'wechat_appid', 'wxae802963eb8a96cd', '', 3, 'text', 1, 1, '', 1, 1637370608, 1, 1652576515, 1); +INSERT INTO `sys_config_data` VALUES (28, '小程序AppSecret', 'wechat_appsecret', '57b8a986cae98659fhb4a3eeafgb567a', '', 3, 'text', 1, 5, '', 1, 1637370608, 1, 1652576515, 1); +INSERT INTO `sys_config_data` VALUES (29, '小程序名称', 'wechat_name', '微信小程序', '', 3, 'text', 1, 10, '', 1, 1637370608, 1, 1652576515, 1); +INSERT INTO `sys_config_data` VALUES (30, '小程序LOGO', 'wechat_logo', '/images/config/20220512/782cc280-161d-43c7-8866-899f291a7cec.png', '', 3, 'image', 1, 15, '', 1, 1637370608, 1, 1652576515, 1); +INSERT INTO `sys_config_data` VALUES (31, '小程序二维码', 'wechat_code', '/images/config/20220512/1ce04093-9b1d-498b-86a6-cd2c5ec1b9e9.png', '', 3, 'image', 1, 20, '', 1, 1637370608, 1, 1652576515, 1); +INSERT INTO `sys_config_data` VALUES (32, '小程序分享标题', 'wechat_share_title', '微信小程序', '', 3, 'text', 1, 25, '', 1, 1637370608, 1, 1652576515, 1); +INSERT INTO `sys_config_data` VALUES (33, '小程序分享描述', 'wechat_share_desc', '基于Go语言Gin、Layui、MySQL等框架精心打造的组件式敏捷开发框架,简化开发,提升开发效率!!', '', 3, 'textarea', 1, 30, '', 1, 1637370608, 1, 1652576515, 1); +INSERT INTO `sys_config_data` VALUES (34, 'accessKeyId', 'accessKeyId', 'wxae80296223eb8a96cd', '', 4, 'text', 1, 1, '', 1, 1637370608, 1, 1652172006, 1); +INSERT INTO `sys_config_data` VALUES (35, 'accessKeySecret', 'accessKeySecret', '57b8a986cae9865229fhb4a3eeafgb567a', '', 4, 'text', 1, 5, '', 1, 1637370608, 1, 1652172006, 1); +INSERT INTO `sys_config_data` VALUES (36, 'regionId', 'regionId', 'cn-hangzhou', '', 4, 'text', 1, 10, '', 1, 1637370608, 1, 1652172006, 1); +INSERT INTO `sys_config_data` VALUES (37, '短信签名', 'signName', '短信签名', '', 4, 'text', 1, 15, '', 1, 1637370608, 1, 1652172006, 1); +INSERT INTO `sys_config_data` VALUES (38, '模板Code', 'templateCode', '模板编码', '', 4, 'text', 1, 20, '', 1, 1637370608, 1, 1652172006, 1); +INSERT INTO `sys_config_data` VALUES (39, '短信模板', 'sms_tpl', '短信模板', '', 4, 'textarea', 1, 25, '', 1, 1637370608, 1, 1652172006, 1); +INSERT INTO `sys_config_data` VALUES (40, '网站标签', 'site_tags', '1,3', '1:复选框1\r\n2:复选框2\r\n3:复选框3\r\n4:复选框4', 1, 'checkbox', 1, 8, '', 1, 1637370608, 1, 1637647555, 1); +INSERT INTO `sys_config_data` VALUES (41, '投入平台', 'site_platform', '5', '1:淘宝商城\n2:天猫商城\n3:京东商城\n4:拼多多商城\n5:唯品会', 1, 'select', 1, 12, NULL, 1, 1637370608, 1, 1652576500, 1); + +-- ---------------------------- +-- Table structure for sys_dept +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dept`; +CREATE TABLE `sys_dept` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '部门名称', + `code` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门编码', + `fullname` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '部门全称', + `type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '类型:1公司 2子公司 3部门 4小组', + `pid` int NOT NULL DEFAULT 0 COMMENT '上级ID', + `sort` smallint NOT NULL DEFAULT 125 COMMENT '排序', + `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注说明', + `create_user` int NULL DEFAULT 0 COMMENT '添加人', + `create_time` int NULL DEFAULT NULL COMMENT '创建时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int NULL DEFAULT NULL COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_pid`(`pid`) USING BTREE, + INDEX `index_name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 23 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '部门表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_dept +-- ---------------------------- +INSERT INTO `sys_dept` VALUES (1, '深圳架构研发中心', 'YANFA', '深圳架构研发中心', 1, 0, 1, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (2, '南山区研发中心', 'NANSHAN', '南山区研发中心', 2, 1, 1, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (3, '罗湖区研发中心', 'LUOHU', '罗湖区研发中心', 2, 1, 5, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (4, '福田区研发中心', 'FUTIAN', '福田区研发中心', 2, 1, 10, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (5, '架构设计部门', 'JIAGOU', '架构设计部门', 3, 2, 1, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (6, '前端研发部门', 'QIANDUAN', '前端研发部门', 3, 2, 5, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (7, '后端研发部门', 'HOUDUAN', '后端研发部门', 3, 2, 10, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (8, '系统测试部门', 'TEST', '系统测试部门', 3, 2, 15, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (9, '视觉交互设计部', 'DESIGN', '视觉交互设计部', 3, 2, 20, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (10, '产品体验部门', 'TIYAN', '产品体验部门', 3, 2, 25, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (11, '架构设计部门', 'JIAGOU', '架构设计部门', 3, 3, 1, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (12, '前端研发部门', 'QIANDUAN', '前端研发部门', 3, 3, 5, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (13, '后端研发部门', 'HOUDUAN', '后端研发部门', 3, 3, 10, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (14, '系统测试部门', 'TEST', '系统测试部门', 3, 3, 15, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (15, '视觉交互设计部', 'DESIGN', '视觉交互设计部', 3, 3, 20, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (16, '产品体验部门', 'TIYAN', '产品体验部门', 3, 3, 25, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (17, '架构设计部门', 'JIAGOU', '架构设计部门', 3, 4, 1, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (18, '前端研发部门', 'QIANDUAN', '前端研发部门', 3, 4, 5, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (19, '后端研发部门', 'HOUDUAN', '后端研发部门', 3, 4, 10, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (20, '系统测试部门', 'TEST', '系统测试部门', 3, 4, 15, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (21, '视觉交互设计部', 'DESIGN', '视觉交互设计部', 3, 3, 20, '暂无', 1, 1652168184, 1, 1652168184, 1); +INSERT INTO `sys_dept` VALUES (22, '产品体验部门', 'TIYAN', '产品体验部门', 3, 4, 25, '暂无', 1, 1652168184, 1, 1652168184, 1); + +-- ---------------------------- +-- Table structure for sys_dict +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict`; +CREATE TABLE `sys_dict` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典名称', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典值', + `sort` smallint NOT NULL DEFAULT 125 COMMENT '显示顺序', + `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '字典备注', + `create_user` int NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典类型表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_dict +-- ---------------------------- +INSERT INTO `sys_dict` VALUES (1, '旅游景点等级', 'LYJDDJ', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (2, '旅游景点等级2', 'LYJDDJ2', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (3, '旅游景点等级3', 'LYJDDJ3', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (4, '旅游景点等级4', 'LYJDDJ4', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (5, '旅游景点等级5', 'LYJDDJ5', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (6, '旅游景点等级6', 'LYJDDJ6', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (7, '旅游景点等级7', 'LYJDDJ7', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (8, '旅游景点等级8', 'LYJDDJ8', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (9, '旅游景点等级9', 'LYJDDJ9', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (10, '旅游景点等级10', 'LYJDDJ10', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (11, '旅游景点等级11', 'LYJDDJ11', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (12, '旅游景点等级12', 'LYJDDJ12', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (13, '旅游景点等级13', 'LYJDDJ', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (14, '旅游景点等级14', 'LYJDDJ2', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (15, '旅游景点等级15', 'LYJDDJ3', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (16, '旅游景点等级16', 'LYJDDJ4', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (17, '旅游景点等级17', 'LYJDDJ5', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (18, '旅游景点等级18', 'LYJDDJ6', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (19, '旅游景点等级19', 'LYJDDJ7', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (20, '旅游景点等级20', 'LYJDDJ8', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (21, '旅游景点等级21', 'LYJDDJ9', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (22, '旅游景点等级22', 'LYJDDJ10', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (23, '旅游景点等级23', 'LYJDDJ11', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); +INSERT INTO `sys_dict` VALUES (24, '旅游景点等级24', 'LYJDDJ12', 1, '旅游景点等级', 1, 1652171469, 1, 1652171469, 1); + +-- ---------------------------- +-- Table structure for sys_dict_data +-- ---------------------------- +DROP TABLE IF EXISTS `sys_dict_data`; +CREATE TABLE `sys_dict_data` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典项名称', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '字典项值', + `dict_id` int NOT NULL DEFAULT 0 COMMENT '字典类型ID', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:1在用 2停用', + `note` varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `sort` smallint NOT NULL DEFAULT 125 COMMENT '显示顺序', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NOT NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标记', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `title`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '字典项管理表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_dict_data +-- ---------------------------- +INSERT INTO `sys_dict_data` VALUES (1, '1A级', '1A', 1, 0, '1A级', 1, 1, 1652171492, 1, 1652171492, 1); +INSERT INTO `sys_dict_data` VALUES (2, '2A级', '2A', 1, 0, '1A级', 5, 1, 1652171501, 1, 1652171501, 1); +INSERT INTO `sys_dict_data` VALUES (3, '3A级', '3A', 1, 0, '3A级', 10, 1, 1652171514, 1, 1652171514, 1); +INSERT INTO `sys_dict_data` VALUES (4, '4A级', '4A', 1, 0, '4A级', 15, 1, 1652171524, 1, 1652171524, 1); +INSERT INTO `sys_dict_data` VALUES (5, '5A级', '5A', 1, 0, '5A级', 20, 1, 1652171533, 1, 1652171533, 1); + +-- ---------------------------- +-- Table structure for sys_example +-- ---------------------------- +DROP TABLE IF EXISTS `sys_example`; +CREATE TABLE `sys_example` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '唯一性标识', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '测试名称', + `avatar` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像', + `content` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '内容', + `status` tinyint(1) NULL DEFAULT 1 COMMENT '状态:1正常 2停用', + `type` int UNSIGNED NULL DEFAULT 1 COMMENT '类型:1京东 2淘宝 3拼多多 4唯品会', + `is_vip` tinyint(1) NULL DEFAULT 2 COMMENT '是否VIP:1是 2否', + `sort` int NULL DEFAULT 0 COMMENT '排序号', + `create_user` int NULL DEFAULT 0 COMMENT '添加人', + `create_time` int NULL DEFAULT NULL COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int NULL DEFAULT NULL COMMENT '更新时间', + `mark` tinyint(1) NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '演示一' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_example +-- ---------------------------- +INSERT INTO `sys_example` VALUES (1, '总经理', '/images/example/20220512/74765043-ec58-4576-82a4-d72a7c2dd6fa.png', '总经理', 1, 1, 1, 125, 1, 1645943553, 1, 1652325537, 1); +INSERT INTO `sys_example` VALUES (2, '副总经理', '/images/example/20220512/74765043-ec58-4576-82a4-d72a7c2dd6fa.png', '副总经理', 1, 2, 1, 125, 1, 1645943553, 1, 1645943553, 1); +INSERT INTO `sys_example` VALUES (3, '总监', '/images/example/20220512/74765043-ec58-4576-82a4-d72a7c2dd6fa.png', '总监', 1, 3, 1, 125, 1, 1645943553, 1, 1645943553, 1); +INSERT INTO `sys_example` VALUES (4, '经理', '/images/example/20220512/74765043-ec58-4576-82a4-d72a7c2dd6fa.png', '经理', 1, 4, 1, 125, 1, 1645943553, 1, 1645943553, 1); +INSERT INTO `sys_example` VALUES (5, '主管', '/images/example/20220512/74765043-ec58-4576-82a4-d72a7c2dd6fa.png', '主管', 1, 4, 1, 125, 1, 1645943553, 1, 1645943553, 1); + +-- ---------------------------- +-- Table structure for sys_example2 +-- ---------------------------- +DROP TABLE IF EXISTS `sys_example2`; +CREATE TABLE `sys_example2` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '唯一性标识', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '演示名称', + `status` tinyint(1) NULL DEFAULT 1 COMMENT '状态:1正常 2停用', + `sort` int NULL DEFAULT 0 COMMENT '排序号', + `create_user` int NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NULL DEFAULT NULL COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT NULL COMMENT '更新时间', + `mark` tinyint(1) NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '演示二' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_example2 +-- ---------------------------- +INSERT INTO `sys_example2` VALUES (1, '总经理', 1, 125, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_example2` VALUES (2, '副总经理', 1, 125, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_example2` VALUES (3, '总监', 1, 125, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_example2` VALUES (4, '经理', 1, 125, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_example2` VALUES (5, '主管', 1, 125, 1, 1637370608, 1, 1637370608, 1); + +-- ---------------------------- +-- Table structure for sys_item +-- ---------------------------- +DROP TABLE IF EXISTS `sys_item`; +CREATE TABLE `sys_item` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '唯一性标识', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '站点名称', + `type` tinyint NOT NULL DEFAULT 1 COMMENT '站点类型:1普通站点 2其他', + `url` varchar(60) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '站点地址', + `image` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '站点图片', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:1在用 2停用', + `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '站点备注', + `sort` smallint NOT NULL DEFAULT 125 COMMENT '显示顺序', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识(1正常 0删除)', + PRIMARY KEY (`id`) USING BTREE, + INDEX `name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '站点配置表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_item +-- ---------------------------- +INSERT INTO `sys_item` VALUES (1, '创作者社区', 1, '#', '/images/item/20220512/a9b00b16-1760-4123-9667-bf37c232bf9c.png', 1, '品牌专区', 1, 1, 1637370608, 1, 1652326829, 1); +INSERT INTO `sys_item` VALUES (2, '综合资讯', 1, '#', '/images/item/20220512/a9b00b16-1760-4123-9667-bf37c232bf9c.png', 1, '综合资讯', 1, 1, 1637370608, 1, 1652325732, 1); +INSERT INTO `sys_item` VALUES (3, '推荐专区', 3, '#', '/images/item/20220512/a9b00b16-1760-4123-9667-bf37c232bf9c.png', 1, '推荐专区', 1, 1, 1652172258, 1, 1652172258, 1); +INSERT INTO `sys_item` VALUES (4, '技术专区', 2, '#', '/images/item/20220512/a9b00b16-1760-4123-9667-bf37c232bf9c.png', 1, '技术专区', 1, 1, 1652172279, 1, 1652172279, 1); +INSERT INTO `sys_item` VALUES (5, '大前端专区', 3, '#', '/images/item/20220512/a9b00b16-1760-4123-9667-bf37c232bf9c.png', 1, '大前端专区', 1, 1, 1652172297, 1, 1652172338, 1); + +-- ---------------------------- +-- Table structure for sys_item_cate +-- ---------------------------- +DROP TABLE IF EXISTS `sys_item_cate`; +CREATE TABLE `sys_item_cate` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT 'ID', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '栏目名称', + `pid` int NULL DEFAULT 0 COMMENT '父级ID', + `item_id` int UNSIGNED NULL DEFAULT 0 COMMENT '站点ID', + `pinyin` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '拼音(全)', + `code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '拼音(简)', + `is_cover` tinyint(1) NOT NULL COMMENT '是否有封面:1是 2否', + `cover` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '封面', + `status` tinyint(1) NULL DEFAULT 1 COMMENT '状态:1启用 2停用', + `note` varchar(200) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `sort` int UNSIGNED NULL DEFAULT 125 COMMENT '排序', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识(1正常 0删除)', + PRIMARY KEY (`id`) USING BTREE, + INDEX `item_id`(`item_id`) USING BTREE, + INDEX `pid`(`pid`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 27 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '栏目管理表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_item_cate +-- ---------------------------- +INSERT INTO `sys_item_cate` VALUES (1, '创作者社区', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 1, 1, 1652174018, 1, 1652326846, 1); +INSERT INTO `sys_item_cate` VALUES (2, '开发者专区', 1, 1, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 1, 1, 1652174058, 1, 1652174122, 1); +INSERT INTO `sys_item_cate` VALUES (3, '大前端', 0, 4, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 5, 1, 1652174158, 1, 1652174158, 1); +INSERT INTO `sys_item_cate` VALUES (4, '软件架构', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (5, '个人博客搭建', 0, 1, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (6, '程序人生', 0, 1, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652326343, 1); +INSERT INTO `sys_item_cate` VALUES (7, '推荐工具', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (8, '心得笔记', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (9, '特别推荐', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (10, '最新博文', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (11, '博客日记', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (12, '站长推荐', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (13, '个人网站', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (14, '今夕何夕', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (15, '企业网站', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (16, '今日头条', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (17, '编程语言', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (18, '人工智能', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (19, '大数据算法', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (20, '云生态建设', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (21, '操作系统', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (22, '软件架构', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (23, '软件架构', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (24, '软件架构', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (25, '软件架构', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); +INSERT INTO `sys_item_cate` VALUES (26, '软件架构', 0, 3, 'easygoadmin', 'easygoadmin', 1, '/images/item_cate/20220512/0cc51040-50bd-49af-b146-5ec72ef55836.png', 1, '暂无', 10, 1, 1652174404, 1, 1652174422, 1); + +-- ---------------------------- +-- Table structure for sys_level +-- ---------------------------- +DROP TABLE IF EXISTS `sys_level`; +CREATE TABLE `sys_level` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '职级名称', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:1正常 2停用', + `sort` int NOT NULL DEFAULT 125 COMMENT '显示顺序', + `create_user` int NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NULL DEFAULT 0 COMMENT '创建时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 25 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '职级表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_level +-- ---------------------------- +INSERT INTO `sys_level` VALUES (1, '董事长', 1, 1, 1, 1637370608, 1, 1638021991, 1); +INSERT INTO `sys_level` VALUES (2, '总经理', 1, 3, 1, 1637370608, 1, 1637821407, 1); +INSERT INTO `sys_level` VALUES (3, '副总经理', 1, 5, 1, 1637370608, 1, 1637744164, 1); +INSERT INTO `sys_level` VALUES (4, '总经理助理', 1, 7, 1, 1637370608, 1, 1637744159, 1); +INSERT INTO `sys_level` VALUES (5, '分公司总经理', 1, 9, 1, 1637370608, 1, 1637744155, 1); +INSERT INTO `sys_level` VALUES (6, '办事处主任', 1, 11, 1, 1637370608, 1, 1637733390, 1); +INSERT INTO `sys_level` VALUES (7, '行政总监', 1, 13, 1, 1637370608, 1, 1637816909, 1); +INSERT INTO `sys_level` VALUES (8, '部门经理', 1, 15, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (9, '部门副经理', 1, 17, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (10, '行政主管', 1, 19, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (11, '采购主管', 1, 21, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (12, '财务总监', 1, 23, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (13, '财务经理', 1, 25, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (14, '项目经理', 1, 27, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (15, '项目主管', 1, 29, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (16, '测试经理', 1, 31, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (17, '首席架构师', 1, 33, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (18, '资深架构师', 1, 35, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (19, '销售总监', 1, 37, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (20, '区域销售总监', 1, 37, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (21, '销售总监', 1, 39, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (22, '销售经理', 1, 41, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (23, '销售代表', 1, 43, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_level` VALUES (24, '客户代表', 1, 45, 1, 1637370608, 1, 1637370608, 1); + +-- ---------------------------- +-- Table structure for sys_link +-- ---------------------------- +DROP TABLE IF EXISTS `sys_link`; +CREATE TABLE `sys_link` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '唯一性标识', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '友链名称', + `type` tinyint(1) NOT NULL DEFAULT 1 COMMENT '类型:1友情链接 2合作伙伴', + `url` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '友链地址', + `item_id` int NOT NULL DEFAULT 0 COMMENT '站点ID', + `cate_id` int NOT NULL DEFAULT 0 COMMENT '栏目ID', + `platform` tinyint(1) NOT NULL DEFAULT 1 COMMENT '平台:1PC站 2WAP站 3微信小程序 4APP应用', + `form` tinyint(1) NOT NULL DEFAULT 1 COMMENT '友链形式:1文字链接 2图片链接', + `image` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '友链图片', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:1在用 2停用', + `sort` smallint NOT NULL DEFAULT 125 COMMENT '显示顺序', + `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `create_user` int NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识(1正常 0删除)', + PRIMARY KEY (`id`) USING BTREE, + INDEX `mark`(`mark`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '友链管理表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_link +-- ---------------------------- +INSERT INTO `sys_link` VALUES (1, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 2, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, '暂无', 1, 1637370608, 1, 1652325413, 1); +INSERT INTO `sys_link` VALUES (2, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 4, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (3, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, '暂无', 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (4, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (5, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (6, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (7, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (8, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (9, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (10, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (11, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (12, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (13, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (14, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (15, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (16, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (17, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (18, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (19, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (20, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (21, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 0, 0, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (22, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (23, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (24, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (25, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (26, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (27, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (28, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (29, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (30, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (31, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (32, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (33, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (34, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (35, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (36, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (37, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (38, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (39, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (40, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (41, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (42, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (43, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (44, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (45, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (46, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (47, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (48, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (49, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (50, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (51, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (52, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_link` VALUES (53, 'EasyGoAdmin敏捷开发框架Gin+Layui版本', 1, '#', 1, 2, 1, 2, '/images/link/20220512/28ce13e0-9c55-47ba-ada3-7aa6eae1b2ce.png', 1, 1, NULL, 1, 1637370608, 1, 1637370608, 1); + +-- ---------------------------- +-- Table structure for sys_login_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_login_log`; +CREATE TABLE `sys_login_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作账号', + `method` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作方法', + `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求URL', + `oper_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '主机地址', + `oper_location` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作地点', + `os` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作系统', + `request_param` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求参数', + `browser` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '浏览器', + `result` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '返回参数', + `status` tinyint(1) UNSIGNED NULL DEFAULT 1 COMMENT '操作状态:0操作成功 1操作失败', + `type` tinyint(1) UNSIGNED NULL DEFAULT 0 COMMENT '操作类型:1登录成功 2登录失败 3注销成功 2注销失败', + `user_agent` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '代理信息', + `note` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志记录' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_login_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_member +-- ---------------------------- +DROP TABLE IF EXISTS `sys_member`; +CREATE TABLE `sys_member` ( + `id` int NOT NULL AUTO_INCREMENT, + `openid` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户唯一标识', + `username` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '用户名', + `password` char(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '密码', + `member_level` smallint NOT NULL DEFAULT 0 COMMENT '会员等级', + `realname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名', + `nickname` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '用户昵称', + `gender` tinyint(1) NOT NULL DEFAULT 3 COMMENT '性别(1男 2女 3未知)', + `avatar` varchar(180) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '用户头像', + `birthday` int UNSIGNED NULL DEFAULT 0 COMMENT '出生日期', + `province_code` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '户籍省份编号', + `city_code` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '户籍城市编号', + `district_code` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '户籍区/县编号', + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址', + `intro` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '个人简介', + `signature` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '个性签名', + `device` tinyint(1) NOT NULL DEFAULT 0 COMMENT '设备类型:1苹果 2安卓 3WAP站 4PC站 5后台添加', + `device_code` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '推送的别名', + `push_alias` varchar(40) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '推送的别名', + `source` tinyint(1) NOT NULL DEFAULT 1 COMMENT '来源:1、APP注册;2、后台添加;', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否启用 1、启用 2、停用', + `app_version` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT '' COMMENT '客户端版本号', + `code` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '我的推广码', + `login_ip` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '最近登录IP', + `login_time` int UNSIGNED NULL DEFAULT 0 COMMENT '登录时间', + `login_region` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '上次登录地点', + `login_count` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '登录总次数', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_user` int NULL DEFAULT 0 COMMENT '修改人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识:1正常 0删除', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `mobile`(`username`) USING BTREE, + INDEX `index_mobile`(`username`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 31 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '用户表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_member +-- ---------------------------- +INSERT INTO `sys_member` VALUES (1, '', '18000000001', '9db06bcff9248837f86d1a6bcf41c9e7', 1, '测试会员1', '测试会员1', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 0, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, '0000000023805dbeffffffffdbac4418', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1652332999, 1); +INSERT INTO `sys_member` VALUES (2, '', '18000000002', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员2', '测试会员2', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'ffffffff84a7ad88000000006ccd9bc2', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (3, '', '18000000003', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员3', '测试会员3', 2, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, '0000000072d9a634ffffffffbc02591a', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (4, '', '18000000004', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员4', '测试会员4', 2, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, '00000000061e9740000000005597f1f4', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (5, '', '18000000005', 'b900afac6b173100b1e55432e9d58c88', 1, '测试会员5', '测试会员5', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, '000000002bec5fb7ffffffffc184ee98', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (6, '', '18000000006', '2a0e1a6f31099ea0dde7a5d815280a48', 1, '测试会员6', '测试会员6', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, '000000006da85c70000000003cac6a26', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (7, '', '18000000007', '1bca4aa4fec4ad02bc09fec4d4b6bcf5', 1, '测试会员7', '测试会员7', 2, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'fffffffffdecb5140000000069b54cbf', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (8, '', '18000000008', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员8', '测试会员8', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, '0000000034cda8840000000069b4d860', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 0); +INSERT INTO `sys_member` VALUES (9, '', '18000000009', '9ead679bd4beb2ead337c549b34160e2', 1, '测试会员9', '测试会员9', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, 'C82D05A0C7E0495F86E1D50B8083C258', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (10, '', '18000000010', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员10', '测试会员10', 2, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, '000000002c382ab8ffffffffe788fab3', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (11, '', '18000000011', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员11', '测试会员11', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '00000000000000000000000000000000', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (12, '', '18000000012', 'd9b1d7db4cd6e70935368a1efb10e377', 1, '测试会员12', '测试会员12', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'ffffffffedc1e4480000000069b4d860', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (13, '', '18000000013', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员13', '测试会员13', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '9C17E0E30B434C219DD080BB1B7DF958', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (14, '', '18000000014', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员14', '测试会员14', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, 'DB8D8CDA4DB54ACFB5A645AECFBF0D05', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (15, '', '18000000015', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员15', '测试会员15', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '9C17E0E30B434C219DD080BB1B7DF958', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (16, '', '18000000016', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员16', '测试会员16', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '00000000000000000000000000000000', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (17, '', '18000000017', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员17', '测试会员17', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, '0000000012d5e325ffffffffe331514d', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (18, '', '18000000018', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员18', '测试会员18', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'ffffffffe50b4d1e00000000053b7c57', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (19, '', '18000000019', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员19', '测试会员19', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'ffffffffe643e74bffffffffc6b8b8df', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (20, '', '18000000020', 'd5291d3c5ecab6c1d746be274d93c58e', 1, '测试会员20', '测试会员20', 2, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, 'C82D05A0C7E0495F86E1D50B8083C258', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (21, '', '18000000021', '9db06bcff9248837f86d1a6bcf41c9e7', 1, '测试会员21', '测试会员21', 2, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, '000000002ba4d437ffffffffdb8fa0b7', '', 1, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (22, '', '18000000022', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员22', '测试会员22', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'ffffffff84a7ad88000000006ccd9bc2', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (23, '', '18000000023', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员23', '测试会员23', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'ffffffffa8e7ca680000000035755e59', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (24, '', '18000000024', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员24', '测试会员24', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 3, '', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (25, '', '18000000025', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员25', '测试会员25', 2, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'ffffffff84a7ad88000000006ccd9bc2', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (26, '', '18000000026', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员26', '测试会员26', 2, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, '000000002c382ab8ffffffffe788fab3', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (27, '', '18000000027', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员27', '测试会员27', 2, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'ffffffffe50b4d1e00000000053b7c57', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (28, '', '18000000028', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员28', '测试会员28', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'ffffffffd3f242b1ffffffffcb72f370', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (29, '', '18000000029', '14e1b600b1fd579f47433b88e8d85291', 1, '测试会员29', '测试会员29', 2, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 1637647152, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 2, 'ffffffffa8e7ca680000000035755e59', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member` VALUES (30, '', '18000000030', '31682120dc9f0f6d7ee188f257a4ed71', 1, '测试会员30', '测试会员30', 1, '/images/member/20220512/9e03312a-6308-4e9d-888b-126ec81a919f.jpg', 0, '440000', '440300', '440305', '深圳市南山区XXXX园区', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, 'ffffffffa8e7ca680000000035755e59', '', 2, 1, '1.0.0', '', '', 1652175260, '', 100, 1, 1637370608, 1, 1652175193, 1); + +-- ---------------------------- +-- Table structure for sys_member_level +-- ---------------------------- +DROP TABLE IF EXISTS `sys_member_level`; +CREATE TABLE `sys_member_level` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '级别名称', + `sort` int NOT NULL DEFAULT 125 COMMENT '排序号', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '会员级别表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_member_level +-- ---------------------------- +INSERT INTO `sys_member_level` VALUES (1, '青铜', 1, 1, 1637370608, 1, 1637646837, 1); +INSERT INTO `sys_member_level` VALUES (2, '钻石', 125, 1, 1637370608, 1, 1637646839, 1); +INSERT INTO `sys_member_level` VALUES (3, '白银', 125, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member_level` VALUES (4, '黄金', 125, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_member_level` VALUES (5, '黑金会员', 125, 1, 1637370608, 1, 1637370608, 1); + +-- ---------------------------- +-- Table structure for sys_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_menu`; +CREATE TABLE `sys_menu` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '唯一性标识', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '菜单名称', + `icon` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '图标', + `url` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT 'URL地址', + `param` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '参数', + `pid` int NOT NULL DEFAULT 0 COMMENT '上级ID', + `type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '类型:1模块 2导航 3菜单 4节点', + `permission` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '权限标识', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '是否显示:1显示 2不显示', + `target` tinyint(1) NOT NULL DEFAULT 1 COMMENT '打开方式:1内部打开 2外部打开', + `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '菜单备注', + `sort` smallint NULL DEFAULT 125 COMMENT '显示顺序', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `parent_id`(`pid`) USING BTREE, + INDEX `name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 851 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '菜单管理表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_menu +-- ---------------------------- +INSERT INTO `sys_menu` VALUES (1, '系统管理', 'layui-icon-component', '#', '', 0, 0, '', 1, 1, '', 1, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (2, '权限管理', 'layui-icon-component', '#', '', 1, 0, '', 1, 1, '', 1, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (3, '用户管理', 'layui-icon-component', '/user/index', '', 2, 0, 'sys:user:index', 1, 1, '', 1, 1, 1638075923, 1, 1651213754, 1); +INSERT INTO `sys_menu` VALUES (12, '角色管理', 'layui-icon-component', '/role/index', '', 2, 0, 'sys:role:index', 1, 1, '', 5, 1, 1638075923, 1, 1651213771, 1); +INSERT INTO `sys_menu` VALUES (20, '职级管理', 'layui-icon-component', '/level/index', '', 2, 0, 'sys:level:index', 1, 1, '', 10, 1, 1638075923, 1, 1651213837, 1); +INSERT INTO `sys_menu` VALUES (27, '岗位管理', 'layui-icon-component', '/position/index', '', 2, 0, 'sys:position:index', 1, 1, '', 20, 1, 1638075923, 1, 1651213853, 1); +INSERT INTO `sys_menu` VALUES (34, '部门管理', 'layui-icon-component', '/dept/index', '', 2, 0, 'sys:dept:index', 1, 1, '', 25, 1, 1638075923, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (44, '菜单管理', 'layui-icon-component', '/menu/index', '', 2, 0, 'sys:menu:index', 1, 1, '', 7, 1, 1638075923, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (54, '操作日志', 'layui-icon-component', '/operlog/index', '', 2, 0, 'sys:operlog:index', 1, 1, '', 35, 1, 1638075923, 1, 1638075923, 0); +INSERT INTO `sys_menu` VALUES (58, '登录日志', 'layui-icon-component', '/loginlog/index', '', 2, 0, 'sys:loginlog:index', 1, 1, '', 40, 1, 1638075923, 1, 1638075923, 0); +INSERT INTO `sys_menu` VALUES (70, '配置管理', 'layui-icon-component', '/config/index', '', 92, 0, 'sys:config:index', 1, 1, '', 5, 1, 1638075923, 1, 1651213911, 1); +INSERT INTO `sys_menu` VALUES (85, '字典管理', 'layui-icon-component', '/dict/index', '', 92, 0, 'sys:dict:index', 1, 1, '', 1, 1, 1638075923, 1, 1651213894, 1); +INSERT INTO `sys_menu` VALUES (92, '数据管理', 'layui-icon-component', '#', '', 1, 0, '', 1, 1, '', 5, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (93, '友链管理', 'layui-icon-component', '/link/index', '', 92, 0, 'sys:link:index', 1, 1, '', 10, 1, 1638075923, 1, 1651213926, 1); +INSERT INTO `sys_menu` VALUES (100, '行政区域', 'layui-icon-component', '/city/index', '', 92, 0, 'sys:city:index', 1, 1, '', 15, 1, 1638075923, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (109, '网站设置', 'layui-icon-component', '/configweb/index', '', 116, 0, 'sys:configweb:index', 1, 1, '', 20, 1, 1638075923, 1, 1651213956, 1); +INSERT INTO `sys_menu` VALUES (110, '系统工具', 'layui-icon-component', '#', '', 1, 0, '', 1, 1, '', 15, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (111, '代码生成器', 'layui-icon-component', '/generate/index', '', 110, 0, 'sys:generate:index', 1, 1, '', 1, 1, 1638075923, 1, 1651213973, 1); +INSERT INTO `sys_menu` VALUES (116, '系统管理', 'layui-icon-component', '#', '', 1, 0, '', 1, 1, '', 10, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (128, '官方网站', 'layui-icon-component', 'http://www.easygoadmin.vip', '', 1, 0, '', 1, 2, '', 45, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (129, '开发文档', 'layui-icon-component', 'http://docs.gin.layui.easygoadmin.vip', '', 1, 0, '', 1, 2, '', 50, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (130, '运营管理', 'layui-icon-component', '#', '', 0, 0, '', 1, 1, '', 2, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (131, '幻灯片管理', 'layui-icon-component', '#', '', 130, 0, '', 1, 1, '', 1, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (132, '幻灯片位置管理', 'layui-icon-component', '/adsort/index', '', 131, 0, 'sys:adsort:index', 1, 1, '', 1, 1, 1638075923, 1, 1651214025, 1); +INSERT INTO `sys_menu` VALUES (139, '幻灯片管理', 'layui-icon-component', '/ad/index', '', 131, 0, 'sys:ad:index', 1, 1, '', 5, 1, 1638075923, 1, 1651214038, 1); +INSERT INTO `sys_menu` VALUES (161, '站内信管理', 'layui-icon-component', '#', '', 130, 0, '', 1, 1, '', 10, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (162, '通知公告', 'layui-icon-component', '/notice/index', '', 161, 0, 'sys:notice:index', 1, 1, '', 10, 1, 1638075923, 1, 1651214051, 1); +INSERT INTO `sys_menu` VALUES (170, '站点管理', 'layui-icon-component', '#', '', 130, 0, '', 1, 1, '', 0, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (171, '站点管理', 'layui-icon-component', '/item/index', '', 170, 0, 'sys:item:index', 1, 1, '', 1, 1, 1638075923, 1, 1651213993, 1); +INSERT INTO `sys_menu` VALUES (178, '栏目管理', 'layui-icon-component', '/itemcate/index', '', 170, 0, 'sys:itemcate:index', 1, 1, '', 5, 1, 1638075923, 1, 1651214012, 1); +INSERT INTO `sys_menu` VALUES (196, '会员中心', 'layui-icon-component', '#', '', 0, 0, '', 1, 1, '', 10, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (197, '会员管理', 'layui-icon-component', '#', '', 196, 0, '', 1, 1, '', 1, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (198, '会员等级', 'layui-icon-component', '/memberlevel/index', '', 197, 0, 'sys:memberlevel:index', 1, 1, '', 1, 1, 1638075923, 1, 1651214068, 1); +INSERT INTO `sys_menu` VALUES (205, '会员管理', 'layui-icon-component', '/member/index', '', 197, 0, 'sys:member:index', 1, 1, '', 5, 1, 1638075923, 1, 1651214082, 1); +INSERT INTO `sys_menu` VALUES (212, '统计报表', 'layui-icon-component', '#', '', 0, 0, '', 1, 1, '', 15, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (213, '数据统计', 'layui-icon-component', '#', '', 212, 0, '', 1, 1, '', 1, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (214, '统计报表', 'layui-icon-component', '/analysis/index', '', 213, 0, 'sys:analysis:index', 1, 1, '', 1, 1, 1638075923, 1, 1651214092, 1); +INSERT INTO `sys_menu` VALUES (216, '演示一', 'layui-icon-component', '/example/index', '', 225, 0, 'sys:example:index', 1, 1, '', 10, 1, 1651214186, 1, 1651214186, 1); +INSERT INTO `sys_menu` VALUES (225, '演示案例', 'layui-icon-login-qq', '#', '', 110, 0, '', 1, 1, '', 5, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (227, '获取授权', 'layui-icon-util', 'http://www.easygoadmin.vip/goods/detail/1', '', 1, 0, '', 1, 2, '', 46, 1, 1638075923, 1, 1638075923, 1); +INSERT INTO `sys_menu` VALUES (236, '演示二', 'layui-icon-component', '/example2/index', '', 225, 0, 'sys:example2:index', 1, 1, '', 10, 1, 1651214186, 1, 1651214186, 1); +INSERT INTO `sys_menu` VALUES (696, '查询用户', '', '/user/list', '', 3, 1, 'sys:user:list', 1, 1, '', 1, 1, 1651213754, 1, 1651213754, 1); +INSERT INTO `sys_menu` VALUES (697, '添加用户', '', '/user/add', '', 3, 1, 'sys:user:add', 1, 1, '', 5, 1, 1651213754, 1, 1651213754, 1); +INSERT INTO `sys_menu` VALUES (698, '修改用户', '', '/user/update', '', 3, 1, 'sys:user:update', 1, 1, '', 10, 1, 1651213754, 1, 1651213754, 1); +INSERT INTO `sys_menu` VALUES (699, '删除用户', '', '/user/delete', '', 3, 1, 'sys:user:delete', 1, 1, '', 15, 1, 1651213754, 1, 1651213754, 1); +INSERT INTO `sys_menu` VALUES (700, '用户详情', '', '/user/detail', '', 3, 1, 'sys:user:detail', 1, 1, '', 20, 1, 1651213754, 1, 1651213754, 1); +INSERT INTO `sys_menu` VALUES (701, '设置状态', '', '/user/status', '', 3, 1, 'sys:user:status', 1, 1, '', 25, 1, 1651213754, 1, 1651213754, 1); +INSERT INTO `sys_menu` VALUES (702, '批量删除', '', '/user/dall', '', 3, 1, 'sys:user:dall', 1, 1, '', 30, 1, 1651213754, 1, 1651213754, 1); +INSERT INTO `sys_menu` VALUES (703, '重置密码', '', '/user/resetPwd', '', 3, 1, 'sys:user:resetPwd', 1, 1, '', 65, 1, 1651213754, 1, 1651213754, 1); +INSERT INTO `sys_menu` VALUES (704, '查询角色', '', '/role/list', '', 12, 1, 'sys:role:list', 1, 1, '', 1, 1, 1651213771, 1, 1651213771, 1); +INSERT INTO `sys_menu` VALUES (705, '添加角色', '', '/role/add', '', 12, 1, 'sys:role:add', 1, 1, '', 5, 1, 1651213771, 1, 1651213771, 1); +INSERT INTO `sys_menu` VALUES (706, '修改角色', '', '/role/update', '', 12, 1, 'sys:role:update', 1, 1, '', 10, 1, 1651213771, 1, 1651213771, 1); +INSERT INTO `sys_menu` VALUES (707, '删除角色', '', '/role/delete', '', 12, 1, 'sys:role:delete', 1, 1, '', 15, 1, 1651213771, 1, 1651213771, 1); +INSERT INTO `sys_menu` VALUES (708, '角色详情', '', '/role/detail', '', 12, 1, 'sys:role:detail', 1, 1, '', 20, 1, 1651213771, 1, 1651213771, 1); +INSERT INTO `sys_menu` VALUES (709, '设置状态', '', '/role/status', '', 12, 1, 'sys:role:status', 1, 1, '', 25, 1, 1651213771, 1, 1651213771, 1); +INSERT INTO `sys_menu` VALUES (710, '批量删除', '', '/role/dall', '', 12, 1, 'sys:role:dall', 1, 1, '', 30, 1, 1651213771, 1, 1651213771, 1); +INSERT INTO `sys_menu` VALUES (711, '分配权限', '', '/role/permission', '', 12, 1, 'sys:role:permission', 1, 1, '', 60, 1, 1651213771, 1, 1651213771, 1); +INSERT INTO `sys_menu` VALUES (712, '查询菜单', '', '/menu/list', '', 44, 1, 'sys:menu:list', 1, 1, '', 1, 1, 1651213806, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (713, '添加菜单', '', '/menu/add', '', 44, 1, 'sys:menu:add', 1, 1, '', 5, 1, 1651213806, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (714, '修改菜单', '', '/menu/update', '', 44, 1, 'sys:menu:update', 1, 1, '', 10, 1, 1651213806, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (715, '删除菜单', '', '/menu/delete', '', 44, 1, 'sys:menu:delete', 1, 1, '', 15, 1, 1651213806, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (716, '菜单详情', '', '/menu/detail', '', 44, 1, 'sys:menu:detail', 1, 1, '', 20, 1, 1651213806, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (717, '设置状态', '', '/menu/status', '', 44, 1, 'sys:menu:status', 1, 1, '', 25, 1, 1651213806, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (718, '批量删除', '', '/menu/dall', '', 44, 1, 'sys:menu:dall', 1, 1, '', 30, 1, 1651213806, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (719, '添加子级', '', '/menu/addz', '', 44, 1, 'sys:menu:addz', 1, 1, '', 35, 1, 1651213806, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (720, '全部展开', '', '/menu/expand', '', 44, 1, 'sys:menu:expand', 1, 1, '', 40, 1, 1651213806, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (721, '全部折叠', '', '/menu/collapse', '', 44, 1, 'sys:menu:collapse', 1, 1, '', 45, 1, 1651213806, 1, 1651213806, 1); +INSERT INTO `sys_menu` VALUES (722, '查询职级', '', '/level/list', '', 20, 1, 'sys:level:list', 1, 1, '', 1, 1, 1651213837, 1, 1651213837, 1); +INSERT INTO `sys_menu` VALUES (723, '添加职级', '', '/level/add', '', 20, 1, 'sys:level:add', 1, 1, '', 5, 1, 1651213837, 1, 1651213837, 1); +INSERT INTO `sys_menu` VALUES (724, '修改职级', '', '/level/update', '', 20, 1, 'sys:level:update', 1, 1, '', 10, 1, 1651213837, 1, 1651213837, 1); +INSERT INTO `sys_menu` VALUES (725, '删除职级', '', '/level/delete', '', 20, 1, 'sys:level:delete', 1, 1, '', 15, 1, 1651213837, 1, 1651213837, 1); +INSERT INTO `sys_menu` VALUES (726, '职级详情', '', '/level/detail', '', 20, 1, 'sys:level:detail', 1, 1, '', 20, 1, 1651213837, 1, 1651213837, 1); +INSERT INTO `sys_menu` VALUES (727, '设置状态', '', '/level/status', '', 20, 1, 'sys:level:status', 1, 1, '', 25, 1, 1651213837, 1, 1651213837, 1); +INSERT INTO `sys_menu` VALUES (728, '批量删除', '', '/level/dall', '', 20, 1, 'sys:level:dall', 1, 1, '', 30, 1, 1651213837, 1, 1651213837, 1); +INSERT INTO `sys_menu` VALUES (729, '导出职级', '', '/level/export', '', 20, 1, 'sys:level:export', 1, 1, '', 50, 1, 1651213837, 1, 1651213837, 1); +INSERT INTO `sys_menu` VALUES (730, '导入职级', '', '/level/import', '', 20, 1, 'sys:level:import', 1, 1, '', 55, 1, 1651213837, 1, 1651213837, 1); +INSERT INTO `sys_menu` VALUES (731, '查询岗位', '', '/position/list', '', 27, 1, 'sys:position:list', 1, 1, '', 1, 1, 1651213853, 1, 1651213853, 1); +INSERT INTO `sys_menu` VALUES (732, '添加岗位', '', '/position/add', '', 27, 1, 'sys:position:add', 1, 1, '', 5, 1, 1651213853, 1, 1651213853, 1); +INSERT INTO `sys_menu` VALUES (733, '修改岗位', '', '/position/update', '', 27, 1, 'sys:position:update', 1, 1, '', 10, 1, 1651213853, 1, 1651213853, 1); +INSERT INTO `sys_menu` VALUES (734, '删除岗位', '', '/position/delete', '', 27, 1, 'sys:position:delete', 1, 1, '', 15, 1, 1651213853, 1, 1651213853, 1); +INSERT INTO `sys_menu` VALUES (735, '岗位详情', '', '/position/detail', '', 27, 1, 'sys:position:detail', 1, 1, '', 20, 1, 1651213853, 1, 1651213853, 1); +INSERT INTO `sys_menu` VALUES (736, '设置状态', '', '/position/status', '', 27, 1, 'sys:position:status', 1, 1, '', 25, 1, 1651213853, 1, 1651213853, 1); +INSERT INTO `sys_menu` VALUES (737, '批量删除', '', '/position/dall', '', 27, 1, 'sys:position:dall', 1, 1, '', 30, 1, 1651213853, 1, 1651213853, 1); +INSERT INTO `sys_menu` VALUES (738, '导出岗位', '', '/position/export', '', 27, 1, 'sys:position:export', 1, 1, '', 50, 1, 1651213853, 1, 1651213853, 1); +INSERT INTO `sys_menu` VALUES (739, '导入岗位', '', '/position/import', '', 27, 1, 'sys:position:import', 1, 1, '', 55, 1, 1651213853, 1, 1651213853, 1); +INSERT INTO `sys_menu` VALUES (740, '查询部门', '', '/dept/list', '', 34, 1, 'sys:dept:list', 1, 1, '', 1, 1, 1651213876, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (741, '添加部门', '', '/dept/add', '', 34, 1, 'sys:dept:add', 1, 1, '', 5, 1, 1651213876, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (742, '修改部门', '', '/dept/update', '', 34, 1, 'sys:dept:update', 1, 1, '', 10, 1, 1651213876, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (743, '删除部门', '', '/dept/delete', '', 34, 1, 'sys:dept:delete', 1, 1, '', 15, 1, 1651213876, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (744, '部门详情', '', '/dept/detail', '', 34, 1, 'sys:dept:detail', 1, 1, '', 20, 1, 1651213876, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (745, '设置状态', '', '/dept/status', '', 34, 1, 'sys:dept:status', 1, 1, '', 25, 1, 1651213876, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (746, '批量删除', '', '/dept/dall', '', 34, 1, 'sys:dept:dall', 1, 1, '', 30, 1, 1651213876, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (747, '添加子级', '', '/dept/addz', '', 34, 1, 'sys:dept:addz', 1, 1, '', 35, 1, 1651213876, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (748, '全部展开', '', '/dept/expand', '', 34, 1, 'sys:dept:expand', 1, 1, '', 40, 1, 1651213876, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (749, '全部折叠', '', '/dept/collapse', '', 34, 1, 'sys:dept:collapse', 1, 1, '', 45, 1, 1651213876, 1, 1651213876, 1); +INSERT INTO `sys_menu` VALUES (750, '查询字典', '', '/dict/list', '', 85, 1, 'sys:dict:list', 1, 1, '', 1, 1, 1651213894, 1, 1651213894, 1); +INSERT INTO `sys_menu` VALUES (751, '添加字典', '', '/dict/add', '', 85, 1, 'sys:dict:add', 1, 1, '', 5, 1, 1651213894, 1, 1651213894, 1); +INSERT INTO `sys_menu` VALUES (752, '修改字典', '', '/dict/update', '', 85, 1, 'sys:dict:update', 1, 1, '', 10, 1, 1651213894, 1, 1651213894, 1); +INSERT INTO `sys_menu` VALUES (753, '删除字典', '', '/dict/delete', '', 85, 1, 'sys:dict:delete', 1, 1, '', 15, 1, 1651213894, 1, 1651213894, 1); +INSERT INTO `sys_menu` VALUES (754, '字典详情', '', '/dict/detail', '', 85, 1, 'sys:dict:detail', 1, 1, '', 20, 1, 1651213894, 1, 1651213894, 1); +INSERT INTO `sys_menu` VALUES (755, '设置状态', '', '/dict/status', '', 85, 1, 'sys:dict:status', 1, 1, '', 25, 1, 1651213894, 1, 1651213894, 1); +INSERT INTO `sys_menu` VALUES (756, '批量删除', '', '/dict/dall', '', 85, 1, 'sys:dict:dall', 1, 1, '', 30, 1, 1651213894, 1, 1651213894, 1); +INSERT INTO `sys_menu` VALUES (757, '查询配置', '', '/config/list', '', 70, 1, 'sys:config:list', 1, 1, '', 1, 1, 1651213911, 1, 1651213911, 1); +INSERT INTO `sys_menu` VALUES (758, '添加配置', '', '/config/add', '', 70, 1, 'sys:config:add', 1, 1, '', 5, 1, 1651213911, 1, 1651213911, 1); +INSERT INTO `sys_menu` VALUES (759, '修改配置', '', '/config/update', '', 70, 1, 'sys:config:update', 1, 1, '', 10, 1, 1651213911, 1, 1651213911, 1); +INSERT INTO `sys_menu` VALUES (760, '删除配置', '', '/config/delete', '', 70, 1, 'sys:config:delete', 1, 1, '', 15, 1, 1651213911, 1, 1651213911, 1); +INSERT INTO `sys_menu` VALUES (761, '配置详情', '', '/config/detail', '', 70, 1, 'sys:config:detail', 1, 1, '', 20, 1, 1651213911, 1, 1651213911, 1); +INSERT INTO `sys_menu` VALUES (762, '设置状态', '', '/config/status', '', 70, 1, 'sys:config:status', 1, 1, '', 25, 1, 1651213911, 1, 1651213911, 1); +INSERT INTO `sys_menu` VALUES (763, '批量删除', '', '/config/dall', '', 70, 1, 'sys:config:dall', 1, 1, '', 30, 1, 1651213911, 1, 1651213911, 1); +INSERT INTO `sys_menu` VALUES (764, '查询友链', '', '/link/list', '', 93, 1, 'sys:link:list', 1, 1, '', 1, 1, 1651213926, 1, 1651213926, 1); +INSERT INTO `sys_menu` VALUES (765, '添加友链', '', '/link/add', '', 93, 1, 'sys:link:add', 1, 1, '', 5, 1, 1651213926, 1, 1651213926, 1); +INSERT INTO `sys_menu` VALUES (766, '修改友链', '', '/link/update', '', 93, 1, 'sys:link:update', 1, 1, '', 10, 1, 1651213926, 1, 1651213926, 1); +INSERT INTO `sys_menu` VALUES (767, '删除友链', '', '/link/delete', '', 93, 1, 'sys:link:delete', 1, 1, '', 15, 1, 1651213926, 1, 1651213926, 1); +INSERT INTO `sys_menu` VALUES (768, '友链详情', '', '/link/detail', '', 93, 1, 'sys:link:detail', 1, 1, '', 20, 1, 1651213926, 1, 1651213926, 1); +INSERT INTO `sys_menu` VALUES (769, '设置状态', '', '/link/status', '', 93, 1, 'sys:link:status', 1, 1, '', 25, 1, 1651213926, 1, 1651213926, 1); +INSERT INTO `sys_menu` VALUES (770, '批量删除', '', '/link/dall', '', 93, 1, 'sys:link:dall', 1, 1, '', 30, 1, 1651213926, 1, 1651213926, 1); +INSERT INTO `sys_menu` VALUES (771, '查询行政区域', '', '/city/list', '', 100, 1, 'sys:city:list', 1, 1, '', 1, 1, 1651213941, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (772, '添加行政区域', '', '/city/add', '', 100, 1, 'sys:city:add', 1, 1, '', 5, 1, 1651213941, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (773, '修改行政区域', '', '/city/update', '', 100, 1, 'sys:city:update', 1, 1, '', 10, 1, 1651213941, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (774, '删除行政区域', '', '/city/delete', '', 100, 1, 'sys:city:delete', 1, 1, '', 15, 1, 1651213941, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (775, '行政区域详情', '', '/city/detail', '', 100, 1, 'sys:city:detail', 1, 1, '', 20, 1, 1651213941, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (776, '设置状态', '', '/city/status', '', 100, 1, 'sys:city:status', 1, 1, '', 25, 1, 1651213941, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (777, '批量删除', '', '/city/dall', '', 100, 1, 'sys:city:dall', 1, 1, '', 30, 1, 1651213941, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (778, '添加子级', '', '/city/addz', '', 100, 1, 'sys:city:addz', 1, 1, '', 35, 1, 1651213941, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (779, '全部展开', '', '/city/expand', '', 100, 1, 'sys:city:expand', 1, 1, '', 40, 1, 1651213941, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (780, '全部折叠', '', '/city/collapse', '', 100, 1, 'sys:city:collapse', 1, 1, '', 45, 1, 1651213941, 1, 1651213941, 1); +INSERT INTO `sys_menu` VALUES (781, '查询网站设置', '', '/configweb/list', '', 109, 1, 'sys:configweb:list', 1, 1, '', 1, 1, 1651213956, 1, 1651213956, 1); +INSERT INTO `sys_menu` VALUES (782, '修改网站设置', '', '/configweb/update', '', 109, 1, 'sys:configweb:update', 1, 1, '', 10, 1, 1651213956, 1, 1651213956, 1); +INSERT INTO `sys_menu` VALUES (783, '网站设置详情', '', '/configweb/detail', '', 109, 1, 'sys:configweb:detail', 1, 1, '', 20, 1, 1651213956, 1, 1651213956, 1); +INSERT INTO `sys_menu` VALUES (784, '查询代码生成器', '', '/generate/list', '', 111, 1, 'sys:generate:list', 1, 1, '', 1, 1, 1651213973, 1, 1651213973, 1); +INSERT INTO `sys_menu` VALUES (785, '一键生成', 'layui-icon-util', '/generate/generate', '', 111, 1, 'sys:generate:generate', 1, 1, '', 15, 1, 1651213973, 1, 1651214145, 1); +INSERT INTO `sys_menu` VALUES (786, '批量生成', 'layui-icon-util', '/generate/batchGenerate', '', 111, 1, 'sys:generate:batchGenerate', 1, 1, '', 30, 1, 1651213973, 1, 1651214163, 1); +INSERT INTO `sys_menu` VALUES (787, '查询站点', '', '/item/list', '', 171, 1, 'sys:item:list', 1, 1, '', 1, 1, 1651213993, 1, 1651213993, 1); +INSERT INTO `sys_menu` VALUES (788, '添加站点', '', '/item/add', '', 171, 1, 'sys:item:add', 1, 1, '', 5, 1, 1651213993, 1, 1651213993, 1); +INSERT INTO `sys_menu` VALUES (789, '修改站点', '', '/item/update', '', 171, 1, 'sys:item:update', 1, 1, '', 10, 1, 1651213993, 1, 1651213993, 1); +INSERT INTO `sys_menu` VALUES (790, '删除站点', '', '/item/delete', '', 171, 1, 'sys:item:delete', 1, 1, '', 15, 1, 1651213993, 1, 1651213993, 1); +INSERT INTO `sys_menu` VALUES (791, '站点详情', '', '/item/detail', '', 171, 1, 'sys:item:detail', 1, 1, '', 20, 1, 1651213993, 1, 1651213993, 1); +INSERT INTO `sys_menu` VALUES (792, '设置状态', '', '/item/status', '', 171, 1, 'sys:item:status', 1, 1, '', 25, 1, 1651213993, 1, 1651213993, 1); +INSERT INTO `sys_menu` VALUES (793, '批量删除', '', '/item/dall', '', 171, 1, 'sys:item:dall', 1, 1, '', 30, 1, 1651213993, 1, 1651213993, 1); +INSERT INTO `sys_menu` VALUES (794, '查询栏目', '', '/itemcate/list', '', 178, 1, 'sys:itemcate:list', 1, 1, '', 1, 1, 1651214012, 1, 1651214012, 1); +INSERT INTO `sys_menu` VALUES (795, '添加栏目', '', '/itemcate/add', '', 178, 1, 'sys:itemcate:add', 1, 1, '', 5, 1, 1651214012, 1, 1651214012, 1); +INSERT INTO `sys_menu` VALUES (796, '修改栏目', '', '/itemcate/update', '', 178, 1, 'sys:itemcate:update', 1, 1, '', 10, 1, 1651214012, 1, 1651214012, 1); +INSERT INTO `sys_menu` VALUES (797, '删除栏目', '', '/itemcate/delete', '', 178, 1, 'sys:itemcate:delete', 1, 1, '', 15, 1, 1651214012, 1, 1651214012, 1); +INSERT INTO `sys_menu` VALUES (798, '栏目详情', '', '/itemcate/detail', '', 178, 1, 'sys:itemcate:detail', 1, 1, '', 20, 1, 1651214012, 1, 1651214012, 1); +INSERT INTO `sys_menu` VALUES (799, '设置状态', '', '/itemcate/status', '', 178, 1, 'sys:itemcate:status', 1, 1, '', 25, 1, 1651214012, 1, 1651214012, 1); +INSERT INTO `sys_menu` VALUES (800, '批量删除', '', '/itemcate/dall', '', 178, 1, 'sys:itemcate:dall', 1, 1, '', 30, 1, 1651214012, 1, 1651214012, 1); +INSERT INTO `sys_menu` VALUES (801, '查询幻灯片位置', '', '/adsort/list', '', 132, 1, 'sys:adsort:list', 1, 1, '', 1, 1, 1651214025, 1, 1651214025, 1); +INSERT INTO `sys_menu` VALUES (802, '添加幻灯片位置', '', '/adsort/add', '', 132, 1, 'sys:adsort:add', 1, 1, '', 5, 1, 1651214025, 1, 1651214025, 1); +INSERT INTO `sys_menu` VALUES (803, '修改幻灯片位置', '', '/adsort/update', '', 132, 1, 'sys:adsort:update', 1, 1, '', 10, 1, 1651214025, 1, 1651214025, 1); +INSERT INTO `sys_menu` VALUES (804, '删除幻灯片位置', '', '/adsort/delete', '', 132, 1, 'sys:adsort:delete', 1, 1, '', 15, 1, 1651214025, 1, 1651214025, 1); +INSERT INTO `sys_menu` VALUES (805, '幻灯片位置详情', '', '/adsort/detail', '', 132, 1, 'sys:adsort:detail', 1, 1, '', 20, 1, 1651214025, 1, 1651214025, 1); +INSERT INTO `sys_menu` VALUES (806, '设置状态', '', '/adsort/status', '', 132, 1, 'sys:adsort:status', 1, 1, '', 25, 1, 1651214025, 1, 1651214025, 1); +INSERT INTO `sys_menu` VALUES (807, '批量删除', '', '/adsort/dall', '', 132, 1, 'sys:adsort:dall', 1, 1, '', 30, 1, 1651214025, 1, 1651214025, 1); +INSERT INTO `sys_menu` VALUES (808, '查询幻灯片', '', '/ad/list', '', 139, 1, 'sys:ad:list', 1, 1, '', 1, 1, 1651214038, 1, 1651214038, 1); +INSERT INTO `sys_menu` VALUES (809, '添加幻灯片', '', '/ad/add', '', 139, 1, 'sys:ad:add', 1, 1, '', 5, 1, 1651214038, 1, 1651214038, 1); +INSERT INTO `sys_menu` VALUES (810, '修改幻灯片', '', '/ad/update', '', 139, 1, 'sys:ad:update', 1, 1, '', 10, 1, 1651214038, 1, 1651214038, 1); +INSERT INTO `sys_menu` VALUES (811, '删除幻灯片', '', '/ad/delete', '', 139, 1, 'sys:ad:delete', 1, 1, '', 15, 1, 1651214038, 1, 1651214038, 1); +INSERT INTO `sys_menu` VALUES (812, '幻灯片详情', '', '/ad/detail', '', 139, 1, 'sys:ad:detail', 1, 1, '', 20, 1, 1651214038, 1, 1651214038, 1); +INSERT INTO `sys_menu` VALUES (813, '设置状态', '', '/ad/status', '', 139, 1, 'sys:ad:status', 1, 1, '', 25, 1, 1651214038, 1, 1651214038, 1); +INSERT INTO `sys_menu` VALUES (814, '批量删除', '', '/ad/dall', '', 139, 1, 'sys:ad:dall', 1, 1, '', 30, 1, 1651214038, 1, 1651214038, 1); +INSERT INTO `sys_menu` VALUES (815, '查询通知公告', '', '/notice/list', '', 162, 1, 'sys:notice:list', 1, 1, '', 1, 1, 1651214051, 1, 1651214051, 1); +INSERT INTO `sys_menu` VALUES (816, '添加通知公告', '', '/notice/add', '', 162, 1, 'sys:notice:add', 1, 1, '', 5, 1, 1651214051, 1, 1651214051, 1); +INSERT INTO `sys_menu` VALUES (817, '修改通知公告', '', '/notice/update', '', 162, 1, 'sys:notice:update', 1, 1, '', 10, 1, 1651214051, 1, 1651214051, 1); +INSERT INTO `sys_menu` VALUES (818, '删除通知公告', '', '/notice/delete', '', 162, 1, 'sys:notice:delete', 1, 1, '', 15, 1, 1651214051, 1, 1651214051, 1); +INSERT INTO `sys_menu` VALUES (819, '通知公告详情', '', '/notice/detail', '', 162, 1, 'sys:notice:detail', 1, 1, '', 20, 1, 1651214051, 1, 1651214051, 1); +INSERT INTO `sys_menu` VALUES (820, '设置状态', '', '/notice/status', '', 162, 1, 'sys:notice:status', 1, 1, '', 25, 1, 1651214051, 1, 1651214051, 1); +INSERT INTO `sys_menu` VALUES (821, '批量删除', '', '/notice/dall', '', 162, 1, 'sys:notice:dall', 1, 1, '', 30, 1, 1651214051, 1, 1651214051, 1); +INSERT INTO `sys_menu` VALUES (822, '查询会员等级', '', '/memberlevel/list', '', 198, 1, 'sys:memberlevel:list', 1, 1, '', 1, 1, 1651214068, 1, 1651214068, 1); +INSERT INTO `sys_menu` VALUES (823, '添加会员等级', '', '/memberlevel/add', '', 198, 1, 'sys:memberlevel:add', 1, 1, '', 5, 1, 1651214068, 1, 1651214068, 1); +INSERT INTO `sys_menu` VALUES (824, '修改会员等级', '', '/memberlevel/update', '', 198, 1, 'sys:memberlevel:update', 1, 1, '', 10, 1, 1651214068, 1, 1651214068, 1); +INSERT INTO `sys_menu` VALUES (825, '删除会员等级', '', '/memberlevel/delete', '', 198, 1, 'sys:memberlevel:delete', 1, 1, '', 15, 1, 1651214068, 1, 1651214068, 1); +INSERT INTO `sys_menu` VALUES (826, '会员等级详情', '', '/memberlevel/detail', '', 198, 1, 'sys:memberlevel:detail', 1, 1, '', 20, 1, 1651214068, 1, 1651214068, 1); +INSERT INTO `sys_menu` VALUES (827, '设置状态', '', '/memberlevel/status', '', 198, 1, 'sys:memberlevel:status', 1, 1, '', 25, 1, 1651214068, 1, 1651214068, 1); +INSERT INTO `sys_menu` VALUES (828, '批量删除', '', '/memberlevel/dall', '', 198, 1, 'sys:memberlevel:dall', 1, 1, '', 30, 1, 1651214068, 1, 1651214068, 1); +INSERT INTO `sys_menu` VALUES (829, '查询会员', '', '/member/list', '', 205, 1, 'sys:member:list', 1, 1, '', 1, 1, 1651214082, 1, 1651214082, 1); +INSERT INTO `sys_menu` VALUES (830, '添加会员', '', '/member/add', '', 205, 1, 'sys:member:add', 1, 1, '', 5, 1, 1651214082, 1, 1651214082, 1); +INSERT INTO `sys_menu` VALUES (831, '修改会员', '', '/member/update', '', 205, 1, 'sys:member:update', 1, 1, '', 10, 1, 1651214082, 1, 1651214082, 1); +INSERT INTO `sys_menu` VALUES (832, '删除会员', '', '/member/delete', '', 205, 1, 'sys:member:delete', 1, 1, '', 15, 1, 1651214082, 1, 1651214082, 1); +INSERT INTO `sys_menu` VALUES (833, '会员详情', '', '/member/detail', '', 205, 1, 'sys:member:detail', 1, 1, '', 20, 1, 1651214082, 1, 1651214082, 1); +INSERT INTO `sys_menu` VALUES (834, '设置状态', '', '/member/status', '', 205, 1, 'sys:member:status', 1, 1, '', 25, 1, 1651214082, 1, 1651214082, 1); +INSERT INTO `sys_menu` VALUES (835, '批量删除', '', '/member/dall', '', 205, 1, 'sys:member:dall', 1, 1, '', 30, 1, 1651214082, 1, 1651214082, 1); +INSERT INTO `sys_menu` VALUES (836, '查询统计报表', '', '/analysis/list', '', 214, 1, 'sys:analysis:list', 1, 1, '', 1, 1, 1651214092, 1, 1651214092, 1); +INSERT INTO `sys_menu` VALUES (837, '查询演示一', '', '/example/list', '', 216, 1, 'sys:example:list', 1, 1, '', 1, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (838, '添加演示一', '', '/example/add', '', 216, 1, 'sys:example:add', 1, 1, '', 5, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (839, '修改演示一', '', '/example/update', '', 216, 1, 'sys:example:update', 1, 1, '', 10, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (840, '删除演示一', '', '/example/delete', '', 216, 1, 'sys:example:delete', 1, 1, '', 15, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (841, '演示一详情', '', '/example/detail', '', 216, 1, 'sys:example:detail', 1, 1, '', 20, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (842, '设置状态', '', '/example/status', '', 216, 1, 'sys:example:status', 1, 1, '', 25, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (843, '批量删除', '', '/example/dall', '', 216, 1, 'sys:example:dall', 1, 1, '', 30, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (844, '查询演示二', '', '/example2/list', '', 236, 1, 'sys:example2:list', 1, 1, '', 1, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (845, '添加演示二', '', '/example2/add', '', 236, 1, 'sys:example2:add', 1, 1, '', 5, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (846, '修改演示二', '', '/example2/update', '', 236, 1, 'sys:example2:update', 1, 1, '', 10, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (847, '删除演示二', '', '/example2/delete', '', 236, 1, 'sys:example2:delete', 1, 1, '', 15, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (848, '演示二详情', '', '/example2/detail', '', 236, 1, 'sys:example2:detail', 1, 1, '', 20, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (849, '设置状态', '', '/example2/status', '', 236, 1, 'sys:example2:status', 1, 1, '', 25, 1, 1651214186, 0, 0, 1); +INSERT INTO `sys_menu` VALUES (850, '批量删除', '', '/example2/dall', '', 236, 1, 'sys:example2:dall', 1, 1, '', 30, 1, 1651214186, 0, 0, 1); + +-- ---------------------------- +-- Table structure for sys_notice +-- ---------------------------- +DROP TABLE IF EXISTS `sys_notice`; +CREATE TABLE `sys_notice` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '通知ID', + `title` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通知标题', + `content` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '通知内容', + `source` tinyint(1) NOT NULL COMMENT '来源:1内部通知 2外部通知', + `is_top` tinyint(1) NOT NULL DEFAULT 2 COMMENT '是否置顶:1是 2否', + `browse` int NOT NULL DEFAULT 0 COMMENT '阅读量', + `status` tinyint(1) NOT NULL DEFAULT 2 COMMENT '状态:1已发布 2待发布', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `index_title`(`title`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 32 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '通知公告表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_notice +-- ---------------------------- +INSERT INTO `sys_notice` VALUES (1, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (2, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (3, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (4, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (5, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (6, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (7, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (8, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (9, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (10, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (11, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (12, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (13, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (14, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (15, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (16, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (17, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (18, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (19, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (20, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (21, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (22, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (23, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (24, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (25, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (26, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (27, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (28, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (29, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (30, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652332864, 1); +INSERT INTO `sys_notice` VALUES (31, '基于Go语言Gin+Layui敏捷开发框架', '

\r\n      一款 Go \r\n语言基于Gin、Layui、MySQL等框架精心打造的一款模块化、高性能、企业级的敏捷开发框架,本着简化开发、提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了可插拔的组件式开发方式:单图上传、多图上传、下拉选择、开关按钮、单选按钮、多选按钮、图片裁剪等等一系列个性化、轻量级的组件,是一款真正意义上实现组件化开发的敏捷开发框架。 \r\n

\r\n

\r\n \"EasyGoAdmin新版本发布通知\" \r\n

\r\n

\r\n
\r\n

\r\n

\r\n       商业版使用需授权,未授权禁止恶意传播和用于商业用途,任何个人、单位、组织授权所获取的框架源码禁止分享、转售、恶意传播、开源(包括框架源码及二次开发后的产品)、禁止简单更改包装声称是自己的产品,否则将追究相关人的法律责任。 \r\n

\r\n

\r\n       本软件框架禁止任何单位和个人用于任何违法、侵害他人合法利益等恶意的行为,禁止用于任何违反我国法律法规的一切平台研发,任何单位和个人使用本软件框架用于产品研发而产生的任何意外、疏忽、合约毁坏、诽谤、版权或知识产权侵犯及其造成的损失\r\n(包括但不限于直接、间接、附带或衍生的损失等),本团队不承担任何法律责任。本软件框架只能用于公司和个人内部的法律所允许的合法合规的软件产品研发,详细声明内容请阅读《框架免责声明》附件; \r\n

\r\n

\r\n
\r\n

', 1, 1, 0, 1, 1, 1637370608, 1, 1652585999, 1); + +-- ---------------------------- +-- Table structure for sys_oper_log +-- ---------------------------- +DROP TABLE IF EXISTS `sys_oper_log`; +CREATE TABLE `sys_oper_log` ( + `id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `model` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '操作模块', + `oper_type` int NOT NULL DEFAULT 0 COMMENT '操作类型:0其它 1新增 2修改 3删除 4查询 5设置状态 6导入 7导出 8设置权限 9设置密码', + `oper_method` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作方法', + `username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作账号', + `oper_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '操作用户', + `oper_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '请求URL', + `oper_ip` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '主机地址', + `oper_location` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作地点', + `request_param` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '请求参数', + `result` varchar(2000) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '返回参数', + `status` tinyint(1) NULL DEFAULT 0 COMMENT '日志状态:0正常日志 1错误日志', + `user_agent` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL COMMENT '代理信息', + `note` varchar(2000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '操作时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '操作日志记录' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_oper_log +-- ---------------------------- + +-- ---------------------------- +-- Table structure for sys_position +-- ---------------------------- +DROP TABLE IF EXISTS `sys_position`; +CREATE TABLE `sys_position` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '岗位名称', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:1正常 2停用', + `sort` int NOT NULL DEFAULT 125 COMMENT '显示顺序', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 10 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '岗位表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_position +-- ---------------------------- +INSERT INTO `sys_position` VALUES (1, '网络工程师', 1, 1, 1, 1637370608, 1, 1638062074, 1); +INSERT INTO `sys_position` VALUES (2, '算法工程师', 1, 3, 1, 1637370608, 1, 1637742045, 1); +INSERT INTO `sys_position` VALUES (3, '商业智能分析师', 1, 5, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_position` VALUES (4, '数据挖掘工程师', 1, 7, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_position` VALUES (5, '咨询顾问', 1, 9, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_position` VALUES (6, '移动应用开发工程师', 1, 11, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_position` VALUES (7, '软件工程设计师', 1, 13, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_position` VALUES (8, '数据库开发和管理', 1, 15, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_position` VALUES (9, 'UI设计师', 1, 15, 1, 1637370608, 1, 1637370608, 1); + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT '角色名称', + `code` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '角色标签', + `note` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `sort` smallint NOT NULL DEFAULT 125 COMMENT '排序', + `status` tinyint(1) NOT NULL DEFAULT 1 COMMENT '状态:1正常 2停用', + `create_user` int NOT NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NOT NULL DEFAULT 0 COMMENT '添加时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识', + PRIMARY KEY (`id`) USING BTREE, + INDEX `name`(`name`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 6 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '系统角色表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- +INSERT INTO `sys_role` VALUES (1, '超级管理员', 'super', '超级管理员拥有绝对权限', 1, 1, 1, 1637370608, 1, 1638063102, 1); +INSERT INTO `sys_role` VALUES (2, '管理员', 'admin', '暂无', 5, 1, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_role` VALUES (3, '运营', 'yunying', '暂无', 10, 1, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_role` VALUES (4, '客服', 'kefu', '', 15, 1, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_role` VALUES (5, '12', '2', '2', 125, 1, 1, 1637370608, 1, 1637370608, 0); + +-- ---------------------------- +-- Table structure for sys_role_menu +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_menu`; +CREATE TABLE `sys_role_menu` ( + `role_id` smallint NOT NULL DEFAULT 0 COMMENT '角色ID', + `menu_id` smallint NOT NULL DEFAULT 0 COMMENT '菜单ID', + INDEX `role_id`(`menu_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '角色菜单关联表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_role_menu +-- ---------------------------- +INSERT INTO `sys_role_menu` VALUES (2, 1); +INSERT INTO `sys_role_menu` VALUES (2, 2); +INSERT INTO `sys_role_menu` VALUES (2, 3); +INSERT INTO `sys_role_menu` VALUES (2, 696); +INSERT INTO `sys_role_menu` VALUES (2, 697); +INSERT INTO `sys_role_menu` VALUES (2, 698); +INSERT INTO `sys_role_menu` VALUES (2, 699); +INSERT INTO `sys_role_menu` VALUES (2, 700); +INSERT INTO `sys_role_menu` VALUES (2, 701); +INSERT INTO `sys_role_menu` VALUES (2, 702); +INSERT INTO `sys_role_menu` VALUES (2, 703); +INSERT INTO `sys_role_menu` VALUES (2, 12); +INSERT INTO `sys_role_menu` VALUES (2, 704); +INSERT INTO `sys_role_menu` VALUES (2, 705); +INSERT INTO `sys_role_menu` VALUES (2, 706); +INSERT INTO `sys_role_menu` VALUES (2, 707); +INSERT INTO `sys_role_menu` VALUES (2, 708); +INSERT INTO `sys_role_menu` VALUES (2, 709); +INSERT INTO `sys_role_menu` VALUES (2, 710); +INSERT INTO `sys_role_menu` VALUES (2, 711); +INSERT INTO `sys_role_menu` VALUES (2, 44); +INSERT INTO `sys_role_menu` VALUES (2, 712); +INSERT INTO `sys_role_menu` VALUES (2, 713); +INSERT INTO `sys_role_menu` VALUES (2, 714); +INSERT INTO `sys_role_menu` VALUES (2, 715); +INSERT INTO `sys_role_menu` VALUES (2, 716); +INSERT INTO `sys_role_menu` VALUES (2, 717); +INSERT INTO `sys_role_menu` VALUES (2, 718); +INSERT INTO `sys_role_menu` VALUES (2, 719); +INSERT INTO `sys_role_menu` VALUES (2, 720); +INSERT INTO `sys_role_menu` VALUES (2, 721); +INSERT INTO `sys_role_menu` VALUES (2, 20); +INSERT INTO `sys_role_menu` VALUES (2, 722); +INSERT INTO `sys_role_menu` VALUES (2, 723); +INSERT INTO `sys_role_menu` VALUES (2, 724); +INSERT INTO `sys_role_menu` VALUES (2, 725); +INSERT INTO `sys_role_menu` VALUES (2, 726); +INSERT INTO `sys_role_menu` VALUES (2, 727); +INSERT INTO `sys_role_menu` VALUES (2, 728); +INSERT INTO `sys_role_menu` VALUES (2, 729); +INSERT INTO `sys_role_menu` VALUES (2, 730); +INSERT INTO `sys_role_menu` VALUES (2, 27); +INSERT INTO `sys_role_menu` VALUES (2, 731); +INSERT INTO `sys_role_menu` VALUES (2, 732); +INSERT INTO `sys_role_menu` VALUES (2, 733); +INSERT INTO `sys_role_menu` VALUES (2, 734); +INSERT INTO `sys_role_menu` VALUES (2, 735); +INSERT INTO `sys_role_menu` VALUES (2, 736); +INSERT INTO `sys_role_menu` VALUES (2, 737); +INSERT INTO `sys_role_menu` VALUES (2, 738); +INSERT INTO `sys_role_menu` VALUES (2, 739); +INSERT INTO `sys_role_menu` VALUES (2, 34); +INSERT INTO `sys_role_menu` VALUES (2, 740); +INSERT INTO `sys_role_menu` VALUES (2, 741); +INSERT INTO `sys_role_menu` VALUES (2, 742); +INSERT INTO `sys_role_menu` VALUES (2, 743); +INSERT INTO `sys_role_menu` VALUES (2, 744); +INSERT INTO `sys_role_menu` VALUES (2, 745); +INSERT INTO `sys_role_menu` VALUES (2, 746); +INSERT INTO `sys_role_menu` VALUES (2, 747); +INSERT INTO `sys_role_menu` VALUES (2, 748); +INSERT INTO `sys_role_menu` VALUES (2, 749); +INSERT INTO `sys_role_menu` VALUES (2, 92); +INSERT INTO `sys_role_menu` VALUES (2, 85); +INSERT INTO `sys_role_menu` VALUES (2, 750); +INSERT INTO `sys_role_menu` VALUES (2, 751); +INSERT INTO `sys_role_menu` VALUES (2, 752); +INSERT INTO `sys_role_menu` VALUES (2, 753); +INSERT INTO `sys_role_menu` VALUES (2, 754); +INSERT INTO `sys_role_menu` VALUES (2, 755); +INSERT INTO `sys_role_menu` VALUES (2, 756); +INSERT INTO `sys_role_menu` VALUES (2, 70); +INSERT INTO `sys_role_menu` VALUES (2, 757); +INSERT INTO `sys_role_menu` VALUES (2, 758); +INSERT INTO `sys_role_menu` VALUES (2, 759); +INSERT INTO `sys_role_menu` VALUES (2, 760); +INSERT INTO `sys_role_menu` VALUES (2, 761); +INSERT INTO `sys_role_menu` VALUES (2, 762); +INSERT INTO `sys_role_menu` VALUES (2, 763); +INSERT INTO `sys_role_menu` VALUES (2, 93); +INSERT INTO `sys_role_menu` VALUES (2, 764); +INSERT INTO `sys_role_menu` VALUES (2, 765); +INSERT INTO `sys_role_menu` VALUES (2, 766); +INSERT INTO `sys_role_menu` VALUES (2, 767); +INSERT INTO `sys_role_menu` VALUES (2, 768); +INSERT INTO `sys_role_menu` VALUES (2, 769); +INSERT INTO `sys_role_menu` VALUES (2, 770); +INSERT INTO `sys_role_menu` VALUES (2, 100); +INSERT INTO `sys_role_menu` VALUES (2, 771); +INSERT INTO `sys_role_menu` VALUES (2, 772); +INSERT INTO `sys_role_menu` VALUES (2, 773); +INSERT INTO `sys_role_menu` VALUES (2, 774); +INSERT INTO `sys_role_menu` VALUES (2, 775); +INSERT INTO `sys_role_menu` VALUES (2, 776); +INSERT INTO `sys_role_menu` VALUES (2, 777); +INSERT INTO `sys_role_menu` VALUES (2, 778); +INSERT INTO `sys_role_menu` VALUES (2, 779); +INSERT INTO `sys_role_menu` VALUES (2, 780); +INSERT INTO `sys_role_menu` VALUES (2, 116); +INSERT INTO `sys_role_menu` VALUES (2, 109); +INSERT INTO `sys_role_menu` VALUES (2, 781); +INSERT INTO `sys_role_menu` VALUES (2, 782); +INSERT INTO `sys_role_menu` VALUES (2, 783); +INSERT INTO `sys_role_menu` VALUES (2, 110); +INSERT INTO `sys_role_menu` VALUES (2, 111); +INSERT INTO `sys_role_menu` VALUES (2, 784); +INSERT INTO `sys_role_menu` VALUES (2, 785); +INSERT INTO `sys_role_menu` VALUES (2, 786); +INSERT INTO `sys_role_menu` VALUES (2, 225); +INSERT INTO `sys_role_menu` VALUES (2, 216); +INSERT INTO `sys_role_menu` VALUES (2, 837); +INSERT INTO `sys_role_menu` VALUES (2, 838); +INSERT INTO `sys_role_menu` VALUES (2, 839); +INSERT INTO `sys_role_menu` VALUES (2, 840); +INSERT INTO `sys_role_menu` VALUES (2, 841); +INSERT INTO `sys_role_menu` VALUES (2, 842); +INSERT INTO `sys_role_menu` VALUES (2, 843); +INSERT INTO `sys_role_menu` VALUES (2, 236); +INSERT INTO `sys_role_menu` VALUES (2, 844); +INSERT INTO `sys_role_menu` VALUES (2, 845); +INSERT INTO `sys_role_menu` VALUES (2, 846); +INSERT INTO `sys_role_menu` VALUES (2, 847); +INSERT INTO `sys_role_menu` VALUES (2, 848); +INSERT INTO `sys_role_menu` VALUES (2, 849); +INSERT INTO `sys_role_menu` VALUES (2, 850); +INSERT INTO `sys_role_menu` VALUES (2, 128); +INSERT INTO `sys_role_menu` VALUES (2, 227); +INSERT INTO `sys_role_menu` VALUES (2, 129); +INSERT INTO `sys_role_menu` VALUES (2, 130); +INSERT INTO `sys_role_menu` VALUES (2, 170); +INSERT INTO `sys_role_menu` VALUES (2, 171); +INSERT INTO `sys_role_menu` VALUES (2, 787); +INSERT INTO `sys_role_menu` VALUES (2, 788); +INSERT INTO `sys_role_menu` VALUES (2, 789); +INSERT INTO `sys_role_menu` VALUES (2, 790); +INSERT INTO `sys_role_menu` VALUES (2, 791); +INSERT INTO `sys_role_menu` VALUES (2, 792); +INSERT INTO `sys_role_menu` VALUES (2, 793); +INSERT INTO `sys_role_menu` VALUES (2, 178); +INSERT INTO `sys_role_menu` VALUES (2, 794); +INSERT INTO `sys_role_menu` VALUES (2, 795); +INSERT INTO `sys_role_menu` VALUES (2, 796); +INSERT INTO `sys_role_menu` VALUES (2, 797); +INSERT INTO `sys_role_menu` VALUES (2, 798); +INSERT INTO `sys_role_menu` VALUES (2, 799); +INSERT INTO `sys_role_menu` VALUES (2, 800); +INSERT INTO `sys_role_menu` VALUES (2, 131); +INSERT INTO `sys_role_menu` VALUES (2, 132); +INSERT INTO `sys_role_menu` VALUES (2, 801); +INSERT INTO `sys_role_menu` VALUES (2, 802); +INSERT INTO `sys_role_menu` VALUES (2, 803); +INSERT INTO `sys_role_menu` VALUES (2, 804); +INSERT INTO `sys_role_menu` VALUES (2, 805); +INSERT INTO `sys_role_menu` VALUES (2, 806); +INSERT INTO `sys_role_menu` VALUES (2, 807); +INSERT INTO `sys_role_menu` VALUES (2, 139); +INSERT INTO `sys_role_menu` VALUES (2, 808); +INSERT INTO `sys_role_menu` VALUES (2, 809); +INSERT INTO `sys_role_menu` VALUES (2, 810); +INSERT INTO `sys_role_menu` VALUES (2, 811); +INSERT INTO `sys_role_menu` VALUES (2, 812); +INSERT INTO `sys_role_menu` VALUES (2, 813); +INSERT INTO `sys_role_menu` VALUES (2, 814); +INSERT INTO `sys_role_menu` VALUES (2, 161); +INSERT INTO `sys_role_menu` VALUES (2, 162); +INSERT INTO `sys_role_menu` VALUES (2, 815); +INSERT INTO `sys_role_menu` VALUES (2, 816); +INSERT INTO `sys_role_menu` VALUES (2, 817); +INSERT INTO `sys_role_menu` VALUES (2, 818); +INSERT INTO `sys_role_menu` VALUES (2, 819); +INSERT INTO `sys_role_menu` VALUES (2, 820); +INSERT INTO `sys_role_menu` VALUES (2, 821); +INSERT INTO `sys_role_menu` VALUES (2, 196); +INSERT INTO `sys_role_menu` VALUES (2, 197); +INSERT INTO `sys_role_menu` VALUES (2, 198); +INSERT INTO `sys_role_menu` VALUES (2, 822); +INSERT INTO `sys_role_menu` VALUES (2, 823); +INSERT INTO `sys_role_menu` VALUES (2, 824); +INSERT INTO `sys_role_menu` VALUES (2, 825); +INSERT INTO `sys_role_menu` VALUES (2, 826); +INSERT INTO `sys_role_menu` VALUES (2, 827); +INSERT INTO `sys_role_menu` VALUES (2, 828); +INSERT INTO `sys_role_menu` VALUES (2, 205); +INSERT INTO `sys_role_menu` VALUES (2, 829); +INSERT INTO `sys_role_menu` VALUES (2, 830); +INSERT INTO `sys_role_menu` VALUES (2, 831); +INSERT INTO `sys_role_menu` VALUES (2, 832); +INSERT INTO `sys_role_menu` VALUES (2, 833); +INSERT INTO `sys_role_menu` VALUES (2, 834); +INSERT INTO `sys_role_menu` VALUES (2, 835); +INSERT INTO `sys_role_menu` VALUES (2, 212); +INSERT INTO `sys_role_menu` VALUES (2, 213); +INSERT INTO `sys_role_menu` VALUES (2, 214); +INSERT INTO `sys_role_menu` VALUES (2, 836); +INSERT INTO `sys_role_menu` VALUES (4, 1); +INSERT INTO `sys_role_menu` VALUES (4, 2); +INSERT INTO `sys_role_menu` VALUES (4, 3); +INSERT INTO `sys_role_menu` VALUES (4, 696); +INSERT INTO `sys_role_menu` VALUES (4, 697); +INSERT INTO `sys_role_menu` VALUES (4, 698); +INSERT INTO `sys_role_menu` VALUES (4, 699); +INSERT INTO `sys_role_menu` VALUES (4, 700); +INSERT INTO `sys_role_menu` VALUES (4, 701); +INSERT INTO `sys_role_menu` VALUES (4, 702); +INSERT INTO `sys_role_menu` VALUES (4, 703); +INSERT INTO `sys_role_menu` VALUES (4, 12); +INSERT INTO `sys_role_menu` VALUES (4, 704); +INSERT INTO `sys_role_menu` VALUES (4, 705); +INSERT INTO `sys_role_menu` VALUES (4, 706); +INSERT INTO `sys_role_menu` VALUES (4, 707); +INSERT INTO `sys_role_menu` VALUES (4, 708); +INSERT INTO `sys_role_menu` VALUES (4, 709); +INSERT INTO `sys_role_menu` VALUES (4, 710); +INSERT INTO `sys_role_menu` VALUES (4, 711); +INSERT INTO `sys_role_menu` VALUES (4, 44); +INSERT INTO `sys_role_menu` VALUES (4, 712); +INSERT INTO `sys_role_menu` VALUES (4, 713); +INSERT INTO `sys_role_menu` VALUES (4, 714); +INSERT INTO `sys_role_menu` VALUES (4, 715); +INSERT INTO `sys_role_menu` VALUES (4, 716); +INSERT INTO `sys_role_menu` VALUES (4, 717); +INSERT INTO `sys_role_menu` VALUES (4, 718); +INSERT INTO `sys_role_menu` VALUES (4, 719); +INSERT INTO `sys_role_menu` VALUES (4, 720); +INSERT INTO `sys_role_menu` VALUES (4, 721); +INSERT INTO `sys_role_menu` VALUES (4, 20); +INSERT INTO `sys_role_menu` VALUES (4, 722); +INSERT INTO `sys_role_menu` VALUES (4, 723); +INSERT INTO `sys_role_menu` VALUES (4, 724); +INSERT INTO `sys_role_menu` VALUES (4, 725); +INSERT INTO `sys_role_menu` VALUES (4, 726); +INSERT INTO `sys_role_menu` VALUES (4, 727); +INSERT INTO `sys_role_menu` VALUES (4, 728); +INSERT INTO `sys_role_menu` VALUES (4, 729); +INSERT INTO `sys_role_menu` VALUES (4, 730); +INSERT INTO `sys_role_menu` VALUES (4, 27); +INSERT INTO `sys_role_menu` VALUES (4, 731); +INSERT INTO `sys_role_menu` VALUES (4, 732); +INSERT INTO `sys_role_menu` VALUES (4, 733); +INSERT INTO `sys_role_menu` VALUES (4, 734); +INSERT INTO `sys_role_menu` VALUES (4, 735); +INSERT INTO `sys_role_menu` VALUES (4, 736); +INSERT INTO `sys_role_menu` VALUES (4, 737); +INSERT INTO `sys_role_menu` VALUES (4, 738); +INSERT INTO `sys_role_menu` VALUES (4, 739); +INSERT INTO `sys_role_menu` VALUES (4, 34); +INSERT INTO `sys_role_menu` VALUES (4, 740); +INSERT INTO `sys_role_menu` VALUES (4, 741); +INSERT INTO `sys_role_menu` VALUES (4, 742); +INSERT INTO `sys_role_menu` VALUES (4, 743); +INSERT INTO `sys_role_menu` VALUES (4, 744); +INSERT INTO `sys_role_menu` VALUES (4, 745); +INSERT INTO `sys_role_menu` VALUES (4, 746); +INSERT INTO `sys_role_menu` VALUES (4, 747); +INSERT INTO `sys_role_menu` VALUES (4, 748); +INSERT INTO `sys_role_menu` VALUES (4, 749); +INSERT INTO `sys_role_menu` VALUES (4, 92); +INSERT INTO `sys_role_menu` VALUES (4, 85); +INSERT INTO `sys_role_menu` VALUES (4, 750); +INSERT INTO `sys_role_menu` VALUES (4, 751); +INSERT INTO `sys_role_menu` VALUES (4, 752); +INSERT INTO `sys_role_menu` VALUES (4, 753); +INSERT INTO `sys_role_menu` VALUES (4, 754); +INSERT INTO `sys_role_menu` VALUES (4, 755); +INSERT INTO `sys_role_menu` VALUES (4, 756); +INSERT INTO `sys_role_menu` VALUES (4, 70); +INSERT INTO `sys_role_menu` VALUES (4, 757); +INSERT INTO `sys_role_menu` VALUES (4, 758); +INSERT INTO `sys_role_menu` VALUES (4, 759); +INSERT INTO `sys_role_menu` VALUES (4, 760); +INSERT INTO `sys_role_menu` VALUES (4, 761); +INSERT INTO `sys_role_menu` VALUES (4, 762); +INSERT INTO `sys_role_menu` VALUES (4, 763); +INSERT INTO `sys_role_menu` VALUES (4, 93); +INSERT INTO `sys_role_menu` VALUES (4, 764); +INSERT INTO `sys_role_menu` VALUES (4, 765); +INSERT INTO `sys_role_menu` VALUES (4, 766); +INSERT INTO `sys_role_menu` VALUES (4, 767); +INSERT INTO `sys_role_menu` VALUES (4, 768); +INSERT INTO `sys_role_menu` VALUES (4, 769); +INSERT INTO `sys_role_menu` VALUES (4, 770); +INSERT INTO `sys_role_menu` VALUES (4, 100); +INSERT INTO `sys_role_menu` VALUES (4, 771); +INSERT INTO `sys_role_menu` VALUES (4, 772); +INSERT INTO `sys_role_menu` VALUES (4, 773); +INSERT INTO `sys_role_menu` VALUES (4, 774); +INSERT INTO `sys_role_menu` VALUES (4, 775); +INSERT INTO `sys_role_menu` VALUES (4, 776); +INSERT INTO `sys_role_menu` VALUES (4, 777); +INSERT INTO `sys_role_menu` VALUES (4, 778); +INSERT INTO `sys_role_menu` VALUES (4, 779); +INSERT INTO `sys_role_menu` VALUES (4, 780); +INSERT INTO `sys_role_menu` VALUES (4, 116); +INSERT INTO `sys_role_menu` VALUES (4, 109); +INSERT INTO `sys_role_menu` VALUES (4, 781); +INSERT INTO `sys_role_menu` VALUES (4, 782); +INSERT INTO `sys_role_menu` VALUES (4, 783); +INSERT INTO `sys_role_menu` VALUES (4, 110); +INSERT INTO `sys_role_menu` VALUES (4, 111); +INSERT INTO `sys_role_menu` VALUES (4, 784); +INSERT INTO `sys_role_menu` VALUES (4, 785); +INSERT INTO `sys_role_menu` VALUES (4, 786); +INSERT INTO `sys_role_menu` VALUES (4, 225); +INSERT INTO `sys_role_menu` VALUES (4, 216); +INSERT INTO `sys_role_menu` VALUES (4, 837); +INSERT INTO `sys_role_menu` VALUES (4, 838); +INSERT INTO `sys_role_menu` VALUES (4, 839); +INSERT INTO `sys_role_menu` VALUES (4, 840); +INSERT INTO `sys_role_menu` VALUES (4, 841); +INSERT INTO `sys_role_menu` VALUES (4, 842); +INSERT INTO `sys_role_menu` VALUES (4, 843); +INSERT INTO `sys_role_menu` VALUES (4, 236); +INSERT INTO `sys_role_menu` VALUES (4, 844); +INSERT INTO `sys_role_menu` VALUES (4, 845); +INSERT INTO `sys_role_menu` VALUES (4, 846); +INSERT INTO `sys_role_menu` VALUES (4, 847); +INSERT INTO `sys_role_menu` VALUES (4, 848); +INSERT INTO `sys_role_menu` VALUES (4, 849); +INSERT INTO `sys_role_menu` VALUES (4, 850); +INSERT INTO `sys_role_menu` VALUES (4, 128); +INSERT INTO `sys_role_menu` VALUES (4, 227); +INSERT INTO `sys_role_menu` VALUES (4, 129); +INSERT INTO `sys_role_menu` VALUES (3, 1); +INSERT INTO `sys_role_menu` VALUES (3, 116); +INSERT INTO `sys_role_menu` VALUES (3, 109); +INSERT INTO `sys_role_menu` VALUES (3, 781); +INSERT INTO `sys_role_menu` VALUES (3, 782); +INSERT INTO `sys_role_menu` VALUES (3, 783); +INSERT INTO `sys_role_menu` VALUES (3, 130); +INSERT INTO `sys_role_menu` VALUES (3, 170); +INSERT INTO `sys_role_menu` VALUES (3, 171); +INSERT INTO `sys_role_menu` VALUES (3, 787); +INSERT INTO `sys_role_menu` VALUES (3, 788); +INSERT INTO `sys_role_menu` VALUES (3, 789); +INSERT INTO `sys_role_menu` VALUES (3, 790); +INSERT INTO `sys_role_menu` VALUES (3, 791); +INSERT INTO `sys_role_menu` VALUES (3, 792); +INSERT INTO `sys_role_menu` VALUES (3, 793); +INSERT INTO `sys_role_menu` VALUES (3, 178); +INSERT INTO `sys_role_menu` VALUES (3, 794); +INSERT INTO `sys_role_menu` VALUES (3, 795); +INSERT INTO `sys_role_menu` VALUES (3, 796); +INSERT INTO `sys_role_menu` VALUES (3, 797); +INSERT INTO `sys_role_menu` VALUES (3, 798); +INSERT INTO `sys_role_menu` VALUES (3, 799); +INSERT INTO `sys_role_menu` VALUES (3, 800); +INSERT INTO `sys_role_menu` VALUES (3, 131); +INSERT INTO `sys_role_menu` VALUES (3, 132); +INSERT INTO `sys_role_menu` VALUES (3, 801); +INSERT INTO `sys_role_menu` VALUES (3, 802); +INSERT INTO `sys_role_menu` VALUES (3, 803); +INSERT INTO `sys_role_menu` VALUES (3, 804); +INSERT INTO `sys_role_menu` VALUES (3, 805); +INSERT INTO `sys_role_menu` VALUES (3, 806); +INSERT INTO `sys_role_menu` VALUES (3, 807); +INSERT INTO `sys_role_menu` VALUES (3, 139); +INSERT INTO `sys_role_menu` VALUES (3, 808); +INSERT INTO `sys_role_menu` VALUES (3, 809); +INSERT INTO `sys_role_menu` VALUES (3, 810); +INSERT INTO `sys_role_menu` VALUES (3, 811); +INSERT INTO `sys_role_menu` VALUES (3, 812); +INSERT INTO `sys_role_menu` VALUES (3, 813); +INSERT INTO `sys_role_menu` VALUES (3, 814); +INSERT INTO `sys_role_menu` VALUES (3, 161); +INSERT INTO `sys_role_menu` VALUES (3, 162); +INSERT INTO `sys_role_menu` VALUES (3, 815); +INSERT INTO `sys_role_menu` VALUES (3, 816); +INSERT INTO `sys_role_menu` VALUES (3, 817); +INSERT INTO `sys_role_menu` VALUES (3, 818); +INSERT INTO `sys_role_menu` VALUES (3, 819); +INSERT INTO `sys_role_menu` VALUES (3, 820); +INSERT INTO `sys_role_menu` VALUES (3, 821); +INSERT INTO `sys_role_menu` VALUES (3, 212); +INSERT INTO `sys_role_menu` VALUES (3, 213); +INSERT INTO `sys_role_menu` VALUES (3, 214); +INSERT INTO `sys_role_menu` VALUES (3, 836); + +-- ---------------------------- +-- Table structure for sys_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user`; +CREATE TABLE `sys_user` ( + `id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `realname` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '真实姓名', + `nickname` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '昵称', + `gender` tinyint(1) NULL DEFAULT 3 COMMENT '性别:1男 2女 3保密', + `avatar` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '头像', + `mobile` char(11) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '手机号码', + `email` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '邮箱地址', + `birthday` int UNSIGNED NULL DEFAULT 0 COMMENT '出生日期', + `dept_id` int NULL DEFAULT 0 COMMENT '部门ID', + `level_id` int NULL DEFAULT 0 COMMENT '职级ID', + `position_id` smallint NULL DEFAULT 0 COMMENT '岗位ID', + `province_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '省份编号', + `city_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '市区编号', + `district_code` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '区县编号', + `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '详细地址', + `city_name` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '所属城市', + `username` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录用户名', + `password` varchar(150) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '登录密码', + `salt` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '盐加密', + `intro` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '个人简介', + `status` tinyint(1) NULL DEFAULT 1 COMMENT '状态:1正常 2禁用', + `note` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '备注', + `sort` int NULL DEFAULT 125 COMMENT '排序号', + `login_num` int NULL DEFAULT 0 COMMENT '登录次数', + `login_ip` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '最近登录IP', + `login_time` int UNSIGNED NULL DEFAULT 0 COMMENT '最近登录时间', + `create_user` int NULL DEFAULT 0 COMMENT '添加人', + `create_time` int UNSIGNED NULL DEFAULT 0 COMMENT '创建时间', + `update_user` int NULL DEFAULT 0 COMMENT '更新人', + `update_time` int UNSIGNED NULL DEFAULT 0 COMMENT '更新时间', + `mark` tinyint(1) NOT NULL DEFAULT 1 COMMENT '有效标识(1正常 0删除)', + PRIMARY KEY (`id`) USING BTREE, + INDEX `realname`(`realname`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 51 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '后台用户管理表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_user +-- ---------------------------- +INSERT INTO `sys_user` VALUES (1, '管理员', '管理员', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637366400, 2, 8, 2, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin', '43286a86708820e38c333cdd4c496355', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无', 1, 0, '127.0.0.1', 1652576415, 1, 1652325134, 1, 1652576415, 1); +INSERT INTO `sys_user` VALUES (2, '管理员2', '管理员2', 2, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637366400, 3, 4, 7, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin2', '39d1cde95c174577252ab3a629d232a7', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '127.0.0.1', 1651221019, 1, 1651220955, 1, 1651221019, 1); +INSERT INTO `sys_user` VALUES (3, '管理员3', '管理员3', 3, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637366400, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin3', '19d0a2819700ac425d36c6a810a62895', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '127.0.0.1', 1651221080, 1, 1651220967, 1, 1651221080, 1); +INSERT INTO `sys_user` VALUES (4, '管理员4', '管理员4', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637366400, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin4', 'c38e2f63daab75fb5beacec4487fbc91', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '127.0.0.1', 1651221221, 1, 1651220998, 1, 1651221221, 1); +INSERT INTO `sys_user` VALUES (5, '管理员5', '管理员5', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin5', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (6, '管理员6', '管理员6', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin6', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (7, '管理员7', '管理员7', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin7', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (8, '管理员8', '管理员8', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin8', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (9, '管理员9', '管理员9', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin9', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (10, '管理员10', '管理员10', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin10', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (11, '管理员11', '管理员11', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin11', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (12, '管理员12', '管理员12', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin12', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (13, '管理员13', '管理员13', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin13', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (14, '管理员14', '管理员14', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 3, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin14', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (15, '管理员15', '管理员15', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin15', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (16, '管理员16', '管理员16', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin16', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (17, '管理员17', '管理员17', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin17', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (18, '管理员18', '管理员18', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin18', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (19, '管理员19', '管理员19', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin19', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (20, '管理员20', '管理员20', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin20', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (21, '管理员21', '管理员21', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin21', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (22, '管理员22', '管理员22', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin22', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (23, '管理员23', '管理员23', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin23', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (24, '管理员24', '管理员24', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin24', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (25, '管理员25', '管理员25', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin25', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (26, '管理员26', '管理员26', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin26', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (27, '管理员27', '管理员27', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin27', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (28, '管理员28', '管理员28', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin28', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (29, '管理员29', '管理员29', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin29', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (30, '管理员30', '管理员30', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin30', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (31, '管理员31', '管理员31', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin31', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (32, '管理员32', '管理员32', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin32', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (33, '管理员33', '管理员33', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin33', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (34, '管理员34', '管理员34', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin34', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (35, '管理员35', '管理员35', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin35', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (36, '管理员36', '管理员36', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin36', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (37, '管理员37', '管理员37', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin37', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (38, '管理员38', '管理员38', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin38', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (39, '管理员39', '管理员39', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin39', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (40, '管理员40', '管理员40', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin40', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (41, '管理员41', '管理员41', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin41', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (42, '管理员42', '管理员42', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin42', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (43, '管理员43', '管理员43', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin43', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (44, '管理员44', '管理员44', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin44', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (45, '管理员45', '管理员45', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin45', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (46, '管理员46', '管理员46', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin46', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (47, '管理员47', '管理员47', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin47', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (48, '管理员48', '管理员48', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin48', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (49, '管理员49', '管理员49', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637337600, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin49', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1637370608, 1, 1637370608, 1); +INSERT INTO `sys_user` VALUES (50, '管理员50', '管理员50', 1, '/images/user/20220512/e888c9f7-3e3a-4532-ba8e-d27a18a92ad8.jpg', '18000000001', '12345678@qq.com', 1637366400, 2, 2, 1, '440000', '440300', '440305', '深圳市南山区XXXX园区', '', 'admin50', 'ddd056e3116ef3c8972a11c62a770a31', '', '真正重要的不是生命里的岁月,而是岁月中的生活。人远比自己想象的要坚强,特别是当你回头看看的时候,你会发现自己走了一段自己都没想到的路。只要内心不乱,外界就很难改变你什么。不要艳羡他人,不要输掉自己。', 1, '暂无备注', 124, 0, '', NULL, 1, 1651222366, 1, 1637370608, 1); + +-- ---------------------------- +-- Table structure for sys_user_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_user_role`; +CREATE TABLE `sys_user_role` ( + `user_id` int NOT NULL DEFAULT 0 COMMENT '人员ID', + `role_id` int NOT NULL DEFAULT 0 COMMENT '角色ID', + INDEX `admin_id`(`user_id`) USING BTREE +) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci COMMENT = '人员角色表' ROW_FORMAT = COMPACT; + +-- ---------------------------- +-- Records of sys_user_role +-- ---------------------------- +INSERT INTO `sys_user_role` VALUES (2, 2); +INSERT INTO `sys_user_role` VALUES (3, 4); +INSERT INTO `sys_user_role` VALUES (4, 3); +INSERT INTO `sys_user_role` VALUES (1, 1); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/document/xorm.exe b/document/xorm.exe new file mode 100644 index 0000000..f717e6b Binary files /dev/null and b/document/xorm.exe differ diff --git a/document/技术文档.txt b/document/技术文档.txt new file mode 100644 index 0000000..abb8635 --- /dev/null +++ b/document/技术文档.txt @@ -0,0 +1,14 @@ +1、初始化mod文件:go mod init easygoadmin +2、下载依赖:go mod tidy +3、去cmd/xorm的安装目录执行go build 直接生成xorm.exe放入Go的bin目录下,后续即可使用xorm命令了 +4、生成模型命令: +xorm reverse mysql root:@(127.0.0.1:3306)/easygoadmin.gin.layui?charset=utf8 templates/goxorm app/model + +xorm reverse mysql 数据库账号:数据库密码@/数据库名?charset=utf8mb4 templates/goxorm app/model + +记录: +sqlite: xorm reverse sqite3 test.db templates/goxorm +mysql: xorm reverse mysql root:root@/xorm_test?charset=utf8 templates/goxorm +mymysql: xorm reverse mymysql xorm_test2/root/ templates/goxorm +postgres: xorm reverse postgres "dbname=xorm_test sslmode=disable" templates/goxorm +mssql: xorm reverse mssql "server=test;user id=testid;password=testpwd;database=testdb" templates/goxorm \ No newline at end of file diff --git a/gin.log b/gin.log new file mode 100644 index 0000000..e69de29 diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..a2f1188 --- /dev/null +++ b/go.mod @@ -0,0 +1,40 @@ +module easygoadmin + +go 1.16 + +require ( + github.com/BurntSushi/toml v0.4.1 + github.com/denisenkom/go-mssqldb v0.10.0 // indirect + github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect + github.com/gin-contrib/multitemplate v0.0.0-20211002122701-e9e3201b87a0 + github.com/gin-contrib/sessions v0.0.4 + github.com/gin-gonic/gin v1.8.1 + github.com/go-redis/redis/v8 v8.11.5 + github.com/go-sql-driver/mysql v1.6.0 + github.com/go-xorm/xorm v0.7.9 + github.com/gogf/gf v1.16.9 + github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect + github.com/jonboulle/clockwork v0.1.0 // indirect + github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 // indirect + github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f + github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 // indirect + github.com/lib/pq v1.10.5 // indirect + github.com/mattn/go-sqlite3 v1.14.8 // indirect + github.com/mgutz/ansi v0.0.0-20200706080929-d51e80ef957d // indirect + github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect + github.com/mojocn/base64Captcha v1.2.2 + github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 + github.com/sirupsen/logrus v1.6.0 + github.com/spf13/afero v1.9.2 + github.com/stretchr/testify v1.8.0 // indirect + github.com/tebeka/strftime v0.1.5 // indirect + github.com/toolkits/file v0.0.0-20160325033739-a5b3c5147e07 + github.com/x-cray/logrus-prefixed-formatter v0.5.2 + go.opentelemetry.io/otel v1.8.0 // indirect + golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect + golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect + golang.org/x/text v0.3.7 // indirect + xorm.io/builder v0.3.9 // indirect + xorm.io/core v0.7.3 +) diff --git a/library/cfg/cfg.go b/library/cfg/cfg.go new file mode 100644 index 0000000..40aaab6 --- /dev/null +++ b/library/cfg/cfg.go @@ -0,0 +1,67 @@ +/** + * 配置工具 + * @author + * @since 2021/11/15 + * @File : cfg + */ +package cfg + +import ( + "github.com/BurntSushi/toml" + "os" + "sync" +) + +var ( + instance *config + once sync.Once +) + +// 获取配置文档实例 +func Instance() *config { + once.Do(func() { + var conf config + path, _ := os.Getwd() + filePath := path + "/config/config.toml" + if _, err := toml.DecodeFile(filePath, &conf); err != nil { + return + } + instance = &conf + }) + + return instance +} + +type config struct { + Database database + Logger logger + EasyGoAdmin easygoadmin + RedisCfg redisCfg +} + +type database struct { + Master string + Slave string + Debug bool + Log string +} + +type redisCfg struct { + Addr string + Port int64 + Db int64 +} + +type logger struct { + Path string + Level uint32 + Stdout bool +} + +// 自定义配置 +type easygoadmin struct { + Version string + Debug bool + Image string + Uploads string +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..ebfe61e --- /dev/null +++ b/main.go @@ -0,0 +1,104 @@ +package main + +import ( + widget2 "easygoadmin/app/widget" + _ "easygoadmin/boot" + cfg "easygoadmin/library/cfg" + _ "easygoadmin/router" + "fmt" + "github.com/gin-contrib/multitemplate" + "github.com/gin-gonic/gin" + "html/template" + "path/filepath" + "strings" + "time" +) + +func main() { + + // 开始调试模式 + gin.SetMode(gin.ReleaseMode) + + // 实例化配置 + config := cfg.Instance() + if config == nil { + fmt.Printf("参数错误") + return + } + + //router := gin.Default() + // + //// 设置静态资源路由 + //router.Static("/resource", "./public/resource") + //router.StaticFile("/favicon.ico", "./public/resource/images/favicon.ico") + //router.HTMLRender = LoadTemplates("views") + //router.GET("level/index", controller.Level.Index) + //router.GET("position/index", controller.Position.Index) + //router.Run(":8080") // 监听并在 0.0.0.0:8080 上启动服务 +} + +func LoadTemplates(templatesDir string) multitemplate.Renderer { + r := multitemplate.NewRenderer() + + //// 非模板嵌套 + //htmls, err := filepath.Glob(templatesDir + "/*.html") + //if err != nil { + // panic(err.Error()) + //} + //for _, html := range htmls { + // r.AddFromGlob(filepath.Base(html), html) + //} + + // 布局模板 + layouts, err := filepath.Glob(templatesDir + "/public/*.html") + if err != nil { + panic(err.Error()) + } + + // 嵌套的内容模板 + includes, err := filepath.Glob(templatesDir + "/**/*.html") + if err != nil { + panic(err.Error()) + } + + // template自定义函数 + funcMap := template.FuncMap{ + "StringToLower": func(str string) string { + return strings.ToLower(str) + }, + "date": func() string { + return time.Now().Format("2006-01-02 15:04:05.00000") + }, + "widget": widget2.Widget, + "query": widget2.Query, + "add": widget2.Add, + "edit": widget2.Edit, + "delete": widget2.Delete, + "dall": widget2.Dall, + "expand": widget2.Expand, + "collapse": widget2.Collapse, + "addz": widget2.Addz, + "switch": widget2.Switch, + "select": widget2.Select, + "submit": widget2.Submit, + "icon": widget2.Icon, + "transfer": widget2.Transfer, + "upload_image": widget2.UploadImage, + "album": widget2.Album, + "item": widget2.Item, + "kindeditor": widget2.Kindeditor, + //"date": widget.Date, + "checkbox": widget2.Checkbox, + "radio": widget2.Radio, + "city": widget2.City, + } + + // 将主模板,include页面,layout子模板组合成一个完整的html页面 + for _, include := range includes { + files := []string{} + files = append(files, templatesDir+"/public/base.html", include) + files = append(files, layouts...) + r.AddFromFilesFuncs(filepath.Base(include), funcMap, files...) + } + return r +} diff --git a/public/resource/assets/css/theme-all.css b/public/resource/assets/css/theme-all.css new file mode 100644 index 0000000..f790f73 --- /dev/null +++ b/public/resource/assets/css/theme-all.css @@ -0,0 +1,879 @@ +/** ---------------------------theme-orange主题start----------------------------------- */ +/* logo */ +.theme-orange .layui-layout-admin .layui-header .layui-logo { + color: #ffffff; + background-color: #ff7800; + +} + +/* header */ +.theme-orange .layui-layout-admin .layui-header { + background-color: #ff7800; +} + +.theme-orange .layui-layout-admin .layui-header a { + color: #ffffff; +} + +.theme-orange .layui-layout-admin .layui-header a:hover { + color: #ffffff; +} + +.theme-orange .layui-layout-admin .layui-header .layui-nav-child a { + color: #595959; +} + +.theme-orange .layui-layout-admin .layui-header .layui-nav .layui-nav-more { + border-color: #ffffff transparent transparent; +} + +.theme-orange .layui-layout-admin .layui-header .layui-nav .layui-nav-mored { + border-color: transparent transparent #ffffff; +} + +.theme-orange .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-orange .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #191a23; +} + +/* side */ +.theme-orange .layui-layout-admin .layui-side { + background-color: #191a23; + +} + +.theme-orange .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-orange .layui-nav-tree .layui-this > a, +.theme-orange .layui-nav-tree .layui-this > a:hover { + background-color: #ff7800; +} + +.theme-orange .layui-nav-tree > .layui-nav-item > a:before { + background-color: #ff7800; +} + +.theme-orange .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #191a23 !important; +} + +/* body tab */ +.theme-orange .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + background-color: #191a23; + top: 38px; +} + +/* body title */ +.theme-orange .layui-body-header-title { + border-left-color: #ff7800; +} + +/* admin dialog */ +.theme-orange .layui-layer.layui-layer-admin .layui-layer-title { + color: #ffffff; + background-color: #191a23; +} + +.theme-orange .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #ff7800; + background-color: #ff7800; +} + +/* other */ +.theme-orange .more-theme-item:hover, +.theme-orange .more-theme-item.active { + border-color: #ff7800; +} + +.theme-orange .btn-circle { + background: #ff7800; +} + +.theme-orange .ball-loader > span, +.theme-orange .signal-loader > span { + background-color: #ff7800; +} + +.theme-orange .text-primary, +.theme-orange .layui-link { + color: #ff7800 !important;; +} + +/* button */ +.theme-orange .layui-btn { + background-color: #ff7800; +} + +/* switch */ +.theme-orange .layui-form-onswitch { + border-color: #ff7800; + background-color: #ff7800; +} + +/* radio */ +.theme-orange .layui-form-radio > i:hover, +.theme-orange .layui-form-radioed > i, +.theme-orange .layui-form-checked i, +.theme-orange .layui-form-checked:hover i { + color: #ff7800; +} + +/* checkbox */ +.theme-orange .layui-form-checked[lay-skin=primary] i, +.theme-orange .layui-form-checked span, +.theme-orange .layui-form-checked:hover span { + border-color: #ff7800 !important; + background-color: #ff7800; +} + +.theme-orange .layui-form-checkbox[lay-skin=primary] i:hover, +.theme-orange .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #ff7800; +} + +/* select */ +.theme-orange .layui-form-select dl dd.layui-this { + background-color: #ff7800; +} + +/* laypage */ +.theme-orange .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #ff7800; +} + +.theme-orange .layui-laypage input:focus, +.theme-orange select:focus { + border-color: #ff7800 !important; +} + +.theme-orange .layui-laypage a:hover { + color: #ff7800; +} + +/* tab */ +.theme-orange .layui-tab-brief > .layui-tab-title .layui-this { + color: #ff7800; +} + +.theme-orange .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-orange .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #ff7800 !important; +} + +.theme-orange .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #ff7800; + color: #ff7800; +} + +/* breadcrumb */ +.theme-orange .layui-breadcrumb a:hover { + color: #ff7800 !important; +} + +/* laydate */ +.theme-orange .layui-laydate-footer span:hover, +.theme-orange .layui-laydate-header i:hover, +.theme-orange .layui-laydate-header span:hover { + color: #ff7800; +} + +.theme-orange .layui-laydate .layui-this { + background-color: #ff7800 !important; +} + +.theme-orange .layui-laydate-content td.laydate-selected { + background-color: rgba(255,120,0,.1); +} + +.theme-orange .laydate-selected:hover { + background-color: rgba(255,120,0,.1) !important; +} + +/* timeline */ +.theme-orange .layui-timeline-axis { + color: #ff7800; +} + +/* transfer */ +.theme-orange .layui-transfer-active .layui-btn { + background-color: #ff7800 !important; + border-color: #ff7800 !important; +} + +/* progress-bar */ +.theme-orange .layui-progress-bar { + background-color: #ff7800; +} + +/* slider */ +.theme-orange .layui-slider-bar { + background-color: #ff7800 !important; +} + +.theme-colorful .layui-slider-wrap-btn { + border-color: #ff7800 !important; +} + +/* steps */ +.theme-orange .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #ff7800; +} + +.theme-orange .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-orange .layui-elem-quote { + border-color: #ff7800; +} + +.theme-orange .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-orange .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #ff7800; +} + +.theme-orange .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: rgba(255,120,0,.5); +} + +.theme-orange .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #ff7800; +} + +.theme-orange .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: rgba(255,120,0,.5) !important; +} + +.theme-orange .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #ff7800 !important; +} + +/* xmSelect */ +.theme-orange xm-select .xm-body .xm-option .xm-option-icon { + border-color: #ff7800 !important; +} + +.theme-orange xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-orange xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-orange .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #ff7800 !important; +} + +.theme-orange xm-select .xm-label .xm-label-block, +.theme-orange xm-select > .xm-body .xm-option.hide-icon.selected { + background-color: #ff7800 !important; +} + +/* tagsinput */ +.theme-orange div.tagsinput span.tag { + background: #ff7800; +} + +/* cascader */ +.theme-orange .ew-cascader-dropdown-list-item.active, +.theme-orange .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #ff7800; +} + +/* city-select */ +.theme-orange .city-select a.active { + color: #fff !important; + background-color: #ff7800 !important; +} + +.theme-orange .city-select a:hover, +.theme-orange .city-select a:focus { + background-color: rgba(255,120,0,.07); + color: #ff7800; +} + +.theme-orange .city-picker-span > .title > span:hover { + background-color: rgba(255,120,0,.07); +} + +.theme-orange .city-select-tab > a.active { + color: #ff7800; +} +/** ---------------------------theme-orange主题end----------------------------------- */ + +/** ---------------------------theme-light-green主题start----------------------------------- */ +/* logo */ +.theme-light-green .layui-layout-admin .layui-header .layui-logo { + color: #ffffff; + background-color: #00ced1; +} + +/* header */ +.theme-light-green .layui-layout-admin .layui-header { + background-color: #00ced1; +} + +.theme-light-green .layui-layout-admin .layui-header a { + color: #ffffff; +} + +.theme-light-green .layui-layout-admin .layui-header a:hover { + color: #ffffff; +} + +.theme-light-green .layui-layout-admin .layui-header .layui-nav-child a { + color: #595959; +} + +.theme-light-green .layui-layout-admin .layui-header .layui-nav .layui-nav-more { + border-color: #ffffff transparent transparent; +} + +.theme-light-green .layui-layout-admin .layui-header .layui-nav .layui-nav-mored { + border-color: transparent transparent #ffffff; +} + +.theme-light-green .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-light-green .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #191a23; +} + +/* side */ +.theme-light-green .layui-layout-admin .layui-side { + background-color: #191a23; +} + +.theme-light-green .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-light-green .layui-nav-tree .layui-this > a, +.theme-light-green .layui-nav-tree .layui-this > a:hover { + background-color: #00ced1; +} + +.theme-light-green .layui-nav-tree > .layui-nav-item > a:before { + background-color: #00ced1; +} + +.theme-light-green .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #191a23 !important; +} + +/* body tab */ +.theme-light-green .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + background-color: #191a23; + top: 38px; +} + +/* body title */ +.theme-light-green .layui-body-header-title { + border-left-color: #00ced1; +} + +/* admin dialog */ +.theme-light-green .layui-layer.layui-layer-admin .layui-layer-title { + color: #ffffff; + background-color: #191a23; +} + +.theme-light-green .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #00ced1; + background-color: #00ced1; +} + +/* other */ +.theme-light-green .more-theme-item:hover, +.theme-light-green .more-theme-item.active { + border-color: #00ced1; +} + +.theme-light-green .btn-circle { + background: #00ced1; +} + +.theme-light-green .ball-loader > span, +.theme-light-green .signal-loader > span { + background-color: #00ced1; +} + +.theme-light-green .text-primary, +.theme-light-green .layui-link { + color: #00ced1 !important;; +} + +/* button */ +.theme-light-green .layui-btn { + background-color: #00ced1; +} + +/* switch */ +.theme-light-green .layui-form-onswitch { + border-color: #00ced1; + background-color: #00ced1; +} + +/* radio */ +.theme-light-green .layui-form-radio > i:hover, +.theme-light-green .layui-form-radioed > i, +.theme-light-green .layui-form-checked i, +.theme-light-green .layui-form-checked:hover i { + color: #00ced1; +} + +/* checkbox */ +.theme-light-green .layui-form-checked[lay-skin=primary] i, +.theme-light-green .layui-form-checked span, +.theme-light-green .layui-form-checked:hover span { + border-color: #00ced1 !important; + background-color: #00ced1; +} + +.theme-light-green .layui-form-checkbox[lay-skin=primary] i:hover, +.theme-light-green .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #00ced1; +} + +/* select */ +.theme-light-green .layui-form-select dl dd.layui-this { + background-color: #00ced1; +} + +/* laypage */ +.theme-light-green .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #00ced1; +} + +.theme-light-green .layui-laypage input:focus, +.theme-light-green select:focus { + border-color: #00ced1 !important; +} + +.theme-light-green .layui-laypage a:hover { + color: #00ced1; +} + +/* tab */ +.theme-light-green .layui-tab-brief > .layui-tab-title .layui-this { + color: #00ced1; +} + +.theme-light-green .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-light-green .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #00ced1 !important; +} + +.theme-light-green .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #00ced1; + color: #00ced1; +} + +/* breadcrumb */ +.theme-light-green .layui-breadcrumb a:hover { + color: #00ced1 !important; +} + +/* laydate */ +.theme-light-green .layui-laydate-footer span:hover, +.theme-light-green .layui-laydate-header i:hover, +.theme-light-green .layui-laydate-header span:hover { + color: #00ced1; +} + +.theme-light-green .layui-laydate .layui-this { + background-color: #00ced1 !important; +} + +.theme-light-green .layui-laydate-content td.laydate-selected { + background-color: rgba(0,206,209,.1); +} + +.theme-light-green .laydate-selected:hover { + background-color: rgba(0,206,209,.1) !important; +} + +/* timeline */ +.theme-light-green .layui-timeline-axis { + color: #00ced1; +} + +/* transfer */ +.theme-light-green .layui-transfer-active .layui-btn { + background-color: #00ced1 !important; + border-color: #00ced1 !important; +} + +/* progress-bar */ +.theme-light-green .layui-progress-bar { + background-color: #00ced1; +} + +/* slider */ +.theme-light-green .layui-slider-bar { + background-color: #00ced1 !important; +} + +.theme-colorful .layui-slider-wrap-btn { + border-color: #00ced1 !important; +} + +/* steps */ +.theme-light-green .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #00ced1; +} + +.theme-light-green .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-light-green .layui-elem-quote { + border-color: #00ced1; +} + +.theme-light-green .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-light-green .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #00ced1; +} + +.theme-light-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: rgba(0,206,209,.5); +} + +.theme-light-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #00ced1; +} + +.theme-light-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: rgba(0,206,209,.5) !important; +} + +.theme-light-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #00ced1 !important; +} + +/* xmSelect */ +.theme-light-green xm-select .xm-body .xm-option .xm-option-icon { + border-color: #00ced1 !important; +} + +.theme-light-green xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-light-green xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-light-green .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #00ced1 !important; +} + +.theme-light-green xm-select .xm-label .xm-label-block, +.theme-light-green xm-select > .xm-body .xm-option.hide-icon.selected { + background-color: #00ced1 !important; +} + +/* tagsinput */ +.theme-light-green div.tagsinput span.tag { + background: #00ced1; +} + +/* cascader */ +.theme-light-green .ew-cascader-dropdown-list-item.active, +.theme-light-green .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #00ced1; +} + +/* city-select */ +.theme-light-green .city-select a.active { + color: #fff !important; + background-color: #00ced1 !important; +} + +.theme-light-green .city-select a:hover, +.theme-light-green .city-select a:focus { + background-color: rgba(0,206,209,.07); + color: #00ced1; +} + +.theme-light-green .city-picker-span > .title > span:hover { + background-color: rgba(0,206,209,.07); +} + +.theme-light-green .city-select-tab > a.active { + color: #00ced1; +} +/** ---------------------------theme-light-green主题end----------------------------------- */ + +/** ---------------------------theme-dark-green主题start----------------------------------- */ +/* logo */ +.theme-dark-green .layui-layout-admin .layui-header .layui-logo { + color: #ffffff; + background-color: #009688; +} + +/* header */ +.theme-dark-green .layui-layout-admin .layui-header { + background-color: #009688; +} + +.theme-dark-green .layui-layout-admin .layui-header a { + color: #ffffff; +} + +.theme-dark-green .layui-layout-admin .layui-header a:hover { + color: #ffffff; +} + +.theme-dark-green .layui-layout-admin .layui-header .layui-nav-child a { + color: #595959; +} + +.theme-dark-green .layui-layout-admin .layui-header .layui-nav .layui-nav-more { + border-color: #ffffff transparent transparent; +} + +.theme-dark-green .layui-layout-admin .layui-header .layui-nav .layui-nav-mored { + border-color: transparent transparent #ffffff; +} + +.theme-dark-green .layui-layout-admin .layui-header .layui-nav .layui-this:after, +.theme-dark-green .layui-layout-admin .layui-header .layui-nav-bar { + background-color: #191a23; +} + +/* side */ +.theme-dark-green .layui-layout-admin .layui-side { + background-color: #191a23; +} + +.theme-dark-green .layui-nav-tree .layui-nav-child dd.layui-this a, +.theme-dark-green .layui-nav-tree .layui-this > a, +.theme-dark-green .layui-nav-tree .layui-this > a:hover { + background-color: #009688; +} + +.theme-dark-green .layui-nav-tree > .layui-nav-item > a:before { + background-color: #009688; +} + +.theme-dark-green .layui-layout-admin.admin-nav-mini .layui-side .layui-nav .admin-nav-hover > .layui-nav-child:before { + background: #191a23 !important; +} + +/* body tab */ +.theme-dark-green .layui-layout-admin .layui-body > .layui-tab > .layui-tab-title li.layui-this:after { + background-color: #191a23; + top: 38px; +} + +/* body title */ +.theme-dark-green .layui-body-header-title { + border-left-color: #009688; +} + +/* admin dialog */ +.theme-dark-green .layui-layer.layui-layer-admin .layui-layer-title { + color: #ffffff; + background-color: #191a23; +} + +.theme-dark-green .layui-layer.layui-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #009688; + background-color: #009688; +} + +/* other */ +.theme-dark-green .more-theme-item:hover, +.theme-dark-green .more-theme-item.active { + border-color: #009688; +} + +.theme-dark-green .btn-circle { + background: #009688; +} + +.theme-dark-green .ball-loader > span, +.theme-dark-green .signal-loader > span { + background-color: #009688; +} + +.theme-dark-green .text-primary, +.theme-dark-green .layui-link { + color: #009688 !important;; +} + +/* button */ +.theme-dark-green .layui-btn { + background-color: #009688; +} + +/* switch */ +.theme-dark-green .layui-form-onswitch { + border-color: #009688; + background-color: #009688; +} + +/* radio */ +.theme-dark-green .layui-form-radio > i:hover, +.theme-dark-green .layui-form-radioed > i, +.theme-dark-green .layui-form-checked i, +.theme-dark-green .layui-form-checked:hover i { + color: #009688; +} + +/* checkbox */ +.theme-dark-green .layui-form-checked[lay-skin=primary] i, +.theme-dark-green .layui-form-checked span, +.theme-dark-green .layui-form-checked:hover span { + border-color: #009688 !important; + background-color: #009688; +} + +.theme-dark-green .layui-form-checkbox[lay-skin=primary] i:hover, +.theme-dark-green .layui-form-checkbox[lay-skin=primary]:hover i { + border-color: #009688; +} + +/* select */ +.theme-dark-green .layui-form-select dl dd.layui-this { + background-color: #009688; +} + +/* laypage */ +.theme-dark-green .layui-laypage .layui-laypage-curr .layui-laypage-em { + background-color: #009688; +} + +.theme-dark-green .layui-laypage input:focus, +.theme-dark-green select:focus { + border-color: #009688 !important; +} + +.theme-dark-green .layui-laypage a:hover { + color: #009688; +} + +/* tab */ +.theme-dark-green .layui-tab-brief > .layui-tab-title .layui-this { + color: #009688; +} + +.theme-dark-green .layui-tab-brief > .layui-tab-more li.layui-this:after, +.theme-dark-green .layui-tab-brief > .layui-tab-title .layui-this:after { + border-color: #009688 !important; +} + +.theme-dark-green .layui-tab.layui-tab-vertical > .layui-tab-title > li.layui-this { + border-color: #009688; + color: #009688; +} + +/* breadcrumb */ +.theme-dark-green .layui-breadcrumb a:hover { + color: #009688 !important; +} + +/* laydate */ +.theme-dark-green .layui-laydate-footer span:hover, +.theme-dark-green .layui-laydate-header i:hover, +.theme-dark-green .layui-laydate-header span:hover { + color: #009688; +} + +.theme-dark-green .layui-laydate .layui-this { + background-color: #009688 !important; +} + +.theme-dark-green .layui-laydate-content td.laydate-selected { + background-color: rgba(0,150,136,.1); +} + +.theme-dark-green .laydate-selected:hover { + background-color: rgba(0,150,136,.1) !important; +} + +/* timeline */ +.theme-dark-green .layui-timeline-axis { + color: #009688; +} + +/* transfer */ +.theme-dark-green .layui-transfer-active .layui-btn { + background-color: #009688 !important; + border-color: #009688 !important; +} + +/* progress-bar */ +.theme-dark-green .layui-progress-bar { + background-color: #009688; +} + +/* slider */ +.theme-dark-green .layui-slider-bar { + background-color: #009688 !important; +} + +.theme-colorful .layui-slider-wrap-btn { + border-color: #009688 !important; +} + +/* steps */ +.theme-dark-green .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon { + color: #009688; +} + +.theme-dark-green .layui-tab.layui-steps > .layui-tab-title > li > .layui-icon.layui-icon-ok, +.theme-dark-green .layui-elem-quote { + border-color: #009688; +} + +.theme-dark-green .layui-tab.layui-steps > .layui-tab-title > li:before, +.theme-dark-green .layui-tab.layui-steps > .layui-tab-title > li.layui-this > .layui-icon.layui-icon-ok { + background-color: #009688; +} + +.theme-dark-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li { + background-color: rgba(0,150,136,.5); +} + +.theme-dark-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this { + background-color: #009688; +} + +.theme-dark-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li:after { + border-left-color: rgba(0,150,136,.5) !important; +} + +.theme-dark-green .layui-tab.layui-steps.layui-steps-simple > .layui-tab-title > li.layui-this + li:after { + border-left-color: #009688 !important; +} + +/* xmSelect */ +.theme-dark-green xm-select .xm-body .xm-option .xm-option-icon { + border-color: #009688 !important; +} + +.theme-dark-green xm-select .xm-body .xm-option.selected .xm-option-icon, +.theme-dark-green xm-select > .xm-body .xm-toolbar .toolbar-tag:hover, +.theme-dark-green .ew-xmselect-tree xm-select .xm-body .xm-option.selected .xm-option-content { + color: #009688 !important; +} + +.theme-dark-green xm-select .xm-label .xm-label-block, +.theme-dark-green xm-select > .xm-body .xm-option.hide-icon.selected { + background-color: #009688 !important; +} + +/* tagsinput */ +.theme-dark-green div.tagsinput span.tag { + background: #009688; +} + +/* cascader */ +.theme-dark-green .ew-cascader-dropdown-list-item.active, +.theme-dark-green .ew-cascader-dropdown-list-item.active .ew-icon-right { + color: #009688; +} + +/* city-select */ +.theme-dark-green .city-select a.active { + color: #fff !important; + background-color: #009688 !important; +} + +.theme-dark-green .city-select a:hover, +.theme-dark-green .city-select a:focus { + background-color: rgba(0,150,136,.07); + color: #009688; +} + +.theme-dark-green .city-picker-span > .title > span:hover { + background-color: rgba(0,150,136,.07); +} + +.theme-dark-green .city-select-tab > a.active { + color: #009688; +} +/** ---------------------------theme-dark-green主题end----------------------------------- */ + + diff --git a/public/resource/assets/images/bg-login.png b/public/resource/assets/images/bg-login.png new file mode 100644 index 0000000..187fdf2 Binary files /dev/null and b/public/resource/assets/images/bg-login.png differ diff --git a/public/resource/assets/images/bg-screen.png b/public/resource/assets/images/bg-screen.png new file mode 100644 index 0000000..187fdf2 Binary files /dev/null and b/public/resource/assets/images/bg-screen.png differ diff --git a/public/resource/assets/images/default_upload.png b/public/resource/assets/images/default_upload.png new file mode 100644 index 0000000..29de75b Binary files /dev/null and b/public/resource/assets/images/default_upload.png differ diff --git a/public/resource/assets/images/delete.png b/public/resource/assets/images/delete.png new file mode 100644 index 0000000..689c97c Binary files /dev/null and b/public/resource/assets/images/delete.png differ diff --git a/public/resource/assets/images/favicon.ico b/public/resource/assets/images/favicon.ico new file mode 100644 index 0000000..d248932 Binary files /dev/null and b/public/resource/assets/images/favicon.ico differ diff --git a/public/resource/assets/images/ic_403.png b/public/resource/assets/images/ic_403.png new file mode 100644 index 0000000..72221be Binary files /dev/null and b/public/resource/assets/images/ic_403.png differ diff --git a/public/resource/assets/images/ic_404.png b/public/resource/assets/images/ic_404.png new file mode 100644 index 0000000..e2eb683 Binary files /dev/null and b/public/resource/assets/images/ic_404.png differ diff --git a/public/resource/assets/images/ic_500.png b/public/resource/assets/images/ic_500.png new file mode 100644 index 0000000..b937e94 Binary files /dev/null and b/public/resource/assets/images/ic_500.png differ diff --git a/public/resource/assets/images/logo.png b/public/resource/assets/images/logo.png new file mode 100644 index 0000000..692e254 Binary files /dev/null and b/public/resource/assets/images/logo.png differ diff --git a/public/resource/assets/images/upload_mini.png b/public/resource/assets/images/upload_mini.png new file mode 100644 index 0000000..018adab Binary files /dev/null and b/public/resource/assets/images/upload_mini.png differ diff --git a/public/resource/assets/js/common.js b/public/resource/assets/js/common.js new file mode 100644 index 0000000..3fe070f --- /dev/null +++ b/public/resource/assets/js/common.js @@ -0,0 +1,45 @@ +layui.config({ // common.js是配置layui扩展模块的目录,每个页面都需要引入 + version: '318', // 更新组件缓存,设为true不缓存,也可以设一个固定值 + base: getProjectUrl() + 'assets/module/', + // defaultTheme: 'theme-colorful', // 默认主题 +}).extend({ + steps: 'steps/steps', + notice: 'notice/notice', + cascader: 'cascader/cascader', + dropdown: 'dropdown/dropdown', + fileChoose: 'fileChoose/fileChoose', + Split: 'Split/Split', + Cropper: 'Cropper/Cropper', + tagsInput: 'tagsInput/tagsInput', + citypicker: 'city-picker/city-picker', + introJs: 'introJs/introJs', + zTree: 'zTree/zTree', + croppers: 'croppers/croppers', + iconPicker: 'iconPicker/iconPicker' +}).use(['layer', 'admin', 'base', 'common', 'func'], function () { + var $ = layui.jquery; + var layer = layui.layer; + var admin = layui.admin; + var base = layui.base; + var common = layui.common; + var func = layui.func; + + +}); + +/** 获取当前项目的根路径,通过获取layui.js全路径截取assets之前的地址 */ +function getProjectUrl() { + var layuiDir = layui.cache.dir; + if (!layuiDir) { + var js = document.scripts, last = js.length - 1, src; + for (var i = last; i > 0; i--) { + if (js[i].readyState === 'interactive') { + src = js[i].src; + break; + } + } + var jsPath = src || js[last].src; + layuiDir = jsPath.substring(0, jsPath.lastIndexOf('/') + 1); + } + return layuiDir.substring(0, layuiDir.indexOf('assets')); +} diff --git a/public/resource/assets/libs/echarts/china.js b/public/resource/assets/libs/echarts/china.js new file mode 100644 index 0000000..7fc1bad --- /dev/null +++ b/public/resource/assets/libs/echarts/china.js @@ -0,0 +1 @@ +(function(root,factory){if(typeof define==='function'&&define.amd){define(['exports','echarts'],factory);}else if(typeof exports === 'object' && typeof exports.nodeName !== 'string') {factory(exports, require('echarts'));} else {factory({}, root.echarts);}}(this, function (exports, echarts) {var log = function (msg) {if (typeof console !== 'undefined') {console && console.error && console.error(msg);}};if (!echarts) {log('ECharts is not Loaded');return;}if (!echarts.registerMap) {log('ECharts Map is not loaded');return;}echarts.registerMap('china', {"type":"FeatureCollection","features":[{"type":"Feature","id":"710000","properties":{"id":"710000","cp":[121.509062,24.044332],"name":"台湾","childNum":6},"geometry":{"type":"MultiPolygon","coordinates":[["@@°Ü¯Û"],["@@ƛĴÕƊÉɼģºðʀ\\ƎsÆNŌÔĚäœnÜƤɊĂǀĆĴžĤNJŨxĚĮǂƺòƌ‚–âÔ®ĮXŦţƸZûЋƕƑGđ¨ĭMó·ęcëƝɉlÝƯֹÅŃ^Ó·śŃNjƏďíåɛGɉ™¿@ăƑŽ¥ĘWǬÏĶŁâ"],["@@\\p|WoYG¿¥I†j@¢"],["@@…¡‰@ˆV^RqˆBbAŒnTXeRz¤Lž«³I"],["@@ÆEE—„kWqë @œ"],["@@fced"],["@@„¯ɜÄèaì¯ØǓIġĽ"],["@@çûĖ롖hòř "]],"encodeOffsets":[[[122886,24033]],[[123335,22980]],[[122375,24193]],[[122518,24117]],[[124427,22618]],[[124862,26043]],[[126259,26318]],[[127671,26683]]]}},{"type":"Feature","id":"130000","properties":{"id":"130000","cp":[114.502461,38.045474],"name":"河北","childNum":3},"geometry":{"type":"MultiPolygon","coordinates":[["@@o~†Z]‚ªr‰ºc_ħ²G¼s`jΟnüsœłNX_“M`ǽÓnUK…Ĝēs¤­©yrý§uģŒc†JŠ›e"],["@@U`Ts¿m‚"],["@@oºƋÄd–eVŽDJj£€J|Ådz•Ft~žKŨ¸IÆv|”‡¢r}膎onb˜}`RÎÄn°ÒdÞ²„^®’lnÐèĄlðӜ×]ªÆ}LiĂ±Ö`^°Ç¶p®đDcœŋ`–ZÔ’¶êqvFƚ†N®ĆTH®¦O’¾ŠIbÐã´BĐɢŴÆíȦp–ĐÞXR€·nndOž¤’OÀĈƒ­Qg˜µFo|gȒęSWb©osx|hYh•gŃfmÖĩnº€T̒Sp›¢dYĤ¶UĈjl’ǐpäìë|³kÛfw²Xjz~ÂqbTŠÑ„ěŨ@|oM‡’zv¢ZrÃVw¬ŧˏfŒ°ÐT€ªqŽs{Sž¯r æÝlNd®²Ğ džiGʂJ™¼lr}~K¨ŸƐÌWö€™ÆŠzRš¤lêmĞL΄’@¡|q]SvK€ÑcwpÏρ†ĿćènĪWlĄkT}ˆJ”¤~ƒÈT„d„™pddʾĬŠ”ŽBVt„EÀ¢ôPĎƗè@~‚k–ü\\rÊĔÖæW_§¼F˜†´©òDòj’ˆYÈrbĞāøŀG{ƀ|¦ðrb|ÀH`pʞkv‚GpuARhÞÆǶgƊTǼƹS£¨¡ù³ŘÍ]¿Ây™ôEP xX¶¹܇O¡“gÚ¡IwÃ鑦ÅB‡Ï|ǰ…N«úmH¯‹âŸDùŽyŜžŲIÄuШDž•¸dɂ‡‚FŸƒ•›Oh‡đ©OŸ›iÃ`ww^ƒÌkŸ‘ÑH«ƇǤŗĺtFu…{Z}Ö@U‡´…ʚLg®¯Oı°ÃwŸ ^˜—€VbÉs‡ˆmA…ê]]w„§›RRl£‡ȭµu¯b{ÍDěïÿȧŽuT£ġƒěŗƃĝ“Q¨fV†Ƌ•ƅn­a@‘³@šď„yýIĹÊKšŭfċŰóŒxV@tˆƯŒJ”]eƒR¾fe|rHA˜|h~Ėƍl§ÏŠlTíb ØoˆÅbbx³^zÃ͚¶Sj®A”yÂhðk`š«P€”ˈµEF†Û¬Y¨Ļrõqi¼‰Wi°§’б´°^[ˆÀ|ĠO@ÆxO\\tŽa\\tĕtû{ġŒȧXýĪÓjùÎRb›š^ΛfK[ݏděYfíÙTyŽuUSyŌŏů@Oi½’éŅ­aVcř§ax¹XŻác‡žWU£ôãºQ¨÷Ñws¥qEH‰Ù|‰›šYQoŕÇyáĂ£MðoťÊ‰P¡mšWO¡€v†{ôvîēÜISpÌhp¨ ‘j†deŔQÖj˜X³à™Ĉ[n`Yp@Už–cM`’RKhŒEbœ”pŞlNut®Etq‚nsÁŠgA‹iú‹oH‡qCX‡”hfgu“~ϋWP½¢G^}¯ÅīGCŸÑ^ãziMáļMTÃƘrMc|O_ž¯Ŏ´|‡morDkO\\mĆJfl@c̬¢aĦtRıҙ¾ùƀ^juųœK­ƒUFy™—Ɲ…›īÛ÷ąV×qƥV¿aȉd³B›qPBm›aËđŻģm“Å®Vйd^K‡KoŸnYg“¯Xhqa”Ldu¥•ÍpDž¡KąÅƒkĝęěhq‡}HyÓ]¹ǧ£…Í÷¿qáµ§š™g‘¤o^á¾ZE‡¤i`ij{n•ƒOl»ŸWÝĔįhg›F[¿¡—ßkOüš_‰€ū‹i„DZàUtėGylƒ}ŒÓM}€jpEC~¡FtoQi‘šHkk{Ãmï‚"]],"encodeOffsets":[[[119712,40641]],[[121616,39981]],[[116462,37237]]]}},{"type":"Feature","id":"140000","properties":{"id":"140000","cp":[111.849248,36.857014],"name":"山西","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@Þĩ҃S‰ra}Á€yWix±Üe´lè“ßÓǏok‘ćiµVZģ¡coœ‘TS˹ĪmnÕńe–hZg{gtwªpXaĚThȑp{¶Eh—®RćƑP¿£‘Pmc¸mQÝW•ďȥoÅîɡųAďä³aωJ‘½¥PG­ąSM­™…EÅruµé€‘Yӎ•Ō_d›ĒCo­Èµ]¯_²ÕjāŽK~©ÅØ^ԛkïçămϑk]­±ƒcݯÑÃmQÍ~_a—pm…~ç¡q“ˆu{JÅŧ·Ls}–EyÁÆcI{¤IiCfUc•ƌÃp§]웫vD@¡SÀ‘µM‚ÅwuŽYY‡¡DbÑc¡hƒ×]nkoQdaMç~eD•ÛtT‰©±@¥ù@É¡‰ZcW|WqOJmĩl«ħşvOÓ«IqăV—¥ŸD[mI~Ó¢cehiÍ]Ɠ~ĥqXŠ·eƷœn±“}v•[ěďŽŕ]_‘œ•`‰¹ƒ§ÕōI™o©b­s^}Ét±ū«³p£ÿ·Wµ|¡¥ăFÏs׌¥ŅxŸÊdÒ{ºvĴÎêÌɊ²¶€ü¨|ÞƸµȲ‘LLúÉƎ¤ϊęĔV`„_bª‹S^|ŸdŠzY|dz¥p†ZbÆ£¶ÒK}tĦÔņƠ‚PYzn€ÍvX¶Ěn ĠÔ„zý¦ª˜÷žÑĸَUȌ¸‚dòÜJð´’ìúNM¬ŒXZ´‘¤ŊǸ_tldIš{¦ƀðĠȤ¥NehXnYG‚‡R° ƬDj¬¸|CĞ„Kq‚ºfƐiĺ©ª~ĆOQª ¤@ìǦɌ²æBŒÊ”TœŸ˜ʂōĖ’šĴŞ–ȀœÆÿȄlŤĒö„t”νî¼ĨXhŒ‘˜|ªM¤Ðz"],"encodeOffsets":[[116874,41716]]}},{"type":"Feature","id":"150000","properties":{"id":"150000","cp":[111.670801,41.818311],"name":"内蒙古","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@¯PqƒFB…‰|S•³C|kñ•H‹d‘iÄ¥sˆʼnő…PóÑÑE^‘ÅPpy_YtS™hQ·aHwsOnʼnÚs©iqj›‰€USiº]ïWš‰«gW¡A–Rë¥_ŽsgÁnUI«m‰…„‹]j‡vV¼euhwqA„aW˜ƒ_µj…»çjioQR¹ēÃßt@r³[ÛlćË^ÍÉáG“›OUۗOB±•XŸkŇ¹£k|e]ol™ŸkVͼÕqtaÏõjgÁ£§U^Œ”RLˆËnX°Ç’Bz†^~wfvˆypV ¯„ƫĉ˭ȫƗŷɿÿĿƑ˃ĝÿÃǃßËőó©ǐȍŒĖM×ÍEyx‹þp]Évïè‘vƀnÂĴÖ@‚‰†V~Ĉv¦wĖt—ējyÄDXÄxGQuv_›i¦aBçw‘˛wD™©{ŸtāmQ€{EJ§KPśƘƿ¥@‰sCT•É}ɃwˆƇy±ŸgÑ“}T[÷kÐ禫…SÒ¥¸ëBX½‰HáŵÀğtSÝÂa[ƣ°¯¦P]£ġ“–“Òk®G²„èQ°óMq}EŠóƐÇ\\ƒ‡@áügQ͋u¥Fƒ“T՛¿Jû‡]|mvāÎYua^WoÀa·­ząÒot×¶CLƗi¯¤mƎHNJ¤îìɾŊìTdåwsRÖgĒųúÍġäÕ}Q¶—ˆ¿A•†‹[¡Œ{d×uQAƒ›M•xV‹vMOmăl«ct[wº_šÇʊŽŸjb£ĦS_é“QZ“_lwgOiýe`YYLq§IÁˆdz£ÙË[ÕªuƏ³ÍT—s·bÁĽäė[›b[ˆŗfãcn¥îC¿÷µ[ŏÀQ­ōšĉm¿Á^£mJVm‡—L[{Ï_£›F¥Ö{ŹA}…×Wu©ÅaųijƳhB{·TQqÙIķˑZđ©Yc|M¡…L•eVUóK_QWk’_ĥ‘¿ãZ•»X\\ĴuUƒè‡lG®ěłTĠğDєOrÍd‚ÆÍz]‹±…ŭ©ŸÅ’]ŒÅÐ}UË¥©Tċ™ïxgckfWgi\\ÏĒ¥HkµE˜ë{»ÏetcG±ahUiñiWsɁˆ·c–C‚Õk]wȑ|ća}w…VaĚá žŒG°ùnM¬¯†{ÈˆÐÆA’¥ÄêJxÙ¢”hP¢Ûˆº€µwWOŸóFŽšÁz^ÀŗÎú´§¢T¤ǻƺSė‰ǵhÝÅQgvBHouʝl_o¿Ga{ïq{¥|ſĿHĂ÷aĝÇq‡Z‘ñiñC³ª—…»E`¨åXēÕqÉû[l•}ç@čƘóO¿¡ƒFUsA‰“ʽīccšocƒ‚ƒÇS}„“£‡IS~ălkĩXçmĈ…ŀЂoÐdxÒuL^T{r@¢‘žÍƒĝKén£kQ™‰yšÅõËXŷƏL§~}kqš»IHėDžjĝŸ»ÑÞoŸå°qTt|r©ÏS‹¯·eŨĕx«È[eMˆ¿yuˆ‘pN~¹ÏyN£{©’—g‹ħWí»Í¾s“əšDž_ÃĀɗ±ą™ijĉʍŌŷ—S›É“A‹±åǥɋ@럣R©ąP©}ĹªƏj¹erƒLDĝ·{i«ƫC£µsKCš…GS|úþX”gp›{ÁX¿Ÿć{ƱȏñZáĔyoÁhA™}ŅĆfdʼn„_¹„Y°ėǩÑ¡H¯¶oMQqð¡Ë™|‘Ñ`ƭŁX½·óۓxğįÅcQ‡ˆ“ƒs«tȋDžF“Ÿù^i‘t«Č¯[›hAi©á¥ÇĚ×l|¹y¯YȵƓ‹ñǙµï‚ċ™Ļ|Dœ™üȭ¶¡˜›oŽäÕG\\ďT¿Òõr¯œŸLguÏYęRƩšɷŌO\\İТæ^Ŋ IJȶȆbÜGŽĝ¬¿ĚVĎgª^íu½jÿĕęjık@Ľƒ]ėl¥Ë‡ĭûÁ„ƒėéV©±ćn©­ȇžÍq¯½•YÃÔʼn“ÉNѝÅÝy¹NqáʅDǡËñ­ƁYÅy̱os§ȋµʽǘǏƬɱà‘ưN¢ƔÊuľýľώȪƺɂļžxœZĈ}ÌʼnŪ˜ĺœŽĭFЛĽ̅ȣͽÒŵìƩÇϋÿȮǡŏçƑůĕ~Ǎ›¼ȳÐUf†dIxÿ\\G ˆzâɏÙOº·pqy£†@ŒŠqþ@Ǟ˽IBäƣzsÂZ†ÁàĻdñ°ŕzéØűzșCìDȐĴĺf®ŽÀľưø@ɜÖÞKĊŇƄ§‚͑těï͡VAġÑÑ»d³öǍÝXĉĕÖ{þĉu¸ËʅğU̎éhɹƆ̗̮ȘNJ֥ड़ࡰţાíϲäʮW¬®ҌeרūȠkɬɻ̼ãüfƠSצɩςåȈHϚÎKdzͲOðÏȆƘ¼CϚǚ࢚˼ФԂ¤ƌžĞ̪Qʤ´¼mȠJˀŸƲÀɠmǐnǔĎȆÞǠN~€ʢĜ‚¶ƌĆĘźʆȬ˪ĚǏĞGȖƴƀj`ĢçĶāàŃºē̃ĖćšYŒÀŎüôQÐÂŎŞdžŞêƖš˜oˆDĤÕºÑǘÛˤ³̀gńƘĔÀ^žªƂ`ªt¾äƚêĦĀ¼Ð€Ĕǎ¨Ȕ»͠^ˮÊȦƤøxRrŜH¤¸ÂxDĝŒ|ø˂˜ƮÐ¬ɚwɲFjĔ²Äw°dždÀɞ_ĸdîàŎjʜêTĞªŌ‡ŜWÈ|tqĢUB~´°ÎFC•ŽU¼pĀēƄN¦¾O¶ŠłKĊOj“Ě”j´ĜYp˜{¦„ˆSĚÍ\\Tš×ªV–÷Ší¨ÅDK°ßtŇĔKš¨ǵÂcḷ̌ĚǣȄĽF‡lġUĵœŇ‹ȣFʉɁƒMğįʏƶɷØŭOǽ«ƽū¹Ʊő̝Ȩ§ȞʘĖiɜɶʦ}¨֪ࠜ̀ƇǬ¹ǨE˦ĥªÔêFŽxúQ„Er´W„rh¤Ɛ \\talĈDJ˜Ü|[Pll̚¸ƎGú´Pž¬W¦†^¦–H]prR“n|or¾wLVnÇIujkmon£cX^Bh`¥V”„¦U¤¸}€xRj–[^xN[~ªŠxQ„‚[`ªHÆÂExx^wšN¶Ê˜|¨ì†˜€MrœdYp‚oRzNy˜ÀDs~€bcfÌ`L–¾n‹|¾T‚°c¨È¢a‚r¤–`[|òDŞĔöxElÖdH„ÀI`„Ď\\Àì~ƎR¼tf•¦^¢ķ¶e”ÐÚMŒptgj–„ɡČÅyġLû™ŇV®ŠÄÈƀ†Ď°P|ªVV†ªj–¬ĚÒêp¬–E|ŬÂc|ÀtƐK fˆ{ĘFǜƌXƲąo½Ę‘\\¥–o}›Ûu£ç­kX‘{uĩ«āíÓUŅßŢq€Ť¥lyň[€oi{¦‹L‡ń‡ðFȪȖ”ĒL„¿Ì‹ˆfŒ£K£ʺ™oqNŸƒwğc`ue—tOj×°KJ±qƒÆġm‰Ěŗos¬…qehqsuœƒH{¸kH¡Š…ÊRǪÇƌbȆ¢´ä܍¢NìÉʖ¦â©Ġu¦öČ^â£Ăh–šĖMÈÄw‚\\fŦ°W ¢¾luŸD„wŠ\\̀ʉÌÛM…Ā[bӞEn}¶Vc…ê“sƒ"]],"encodeOffsets":[[[129102,52189]]]}},{"type":"Feature","id":"210000","properties":{"id":"210000","cp":[123.429096,41.796767],"name":"辽宁","childNum":16},"geometry":{"type":"MultiPolygon","coordinates":[["@@L–Ž@@s™a"],["@@MnNm"],["@@d‚c"],["@@eÀ‚C@b‚“‰"],["@@f‡…Xwkbr–Ä`qg"],["@@^jtW‘Q"],["@@~ Y]c"],["@@G`ĔN^_¿Z‚ÃM"],["@@iX¶B‹Y"],["@@„YƒZ"],["@@L_{Epf"],["@@^WqCT\\"],["@@\\[“‹§t|”¤_"],["@@m`n_"],["@@Ïxnj{q_×^Giip"],["@@@œé^B†‡ntˆaÊU—˜Ÿ]x ¯ÄPIJ­°h€ʙK³†VˆÕ@Y~†|EvĹsDŽ¦­L^p²ŸÒG ’Ël]„xxÄ_˜fT¤Ď¤cŽœP„–C¨¸TVjbgH²sdÎdHt`Bˆ—²¬GJję¶[ÐhjeXdlwhšðSȦªVÊπ‹Æ‘Z˜ÆŶ®²†^ŒÎyÅÎcPqń“ĚDMħĜŁH­ˆk„çvV[ij¼W–‚YÀäĦ’‘`XlžR`žôLUVžfK–¢†{NZdĒª’YĸÌÚJRr¸SA|ƴgŴĴÆbvªØX~†źBŽ|¦ÕœEž¤Ð`\\|Kˆ˜UnnI]¤ÀÂĊnŎ™R®Ő¿¶\\ÀøíDm¦ÎbŨab‰œaĘ\\ľã‚¸a˜tÎSƐ´©v\\ÖÚÌǴ¤Â‡¨JKr€Z_Z€fjþhPkx€`Y”’RIŒjJcVf~sCN¤ ˆE‚œhæm‰–sHy¨SðÑÌ\\\\ŸĐRZk°IS§fqŒßýáЍÙÉÖ[^¯ǤŲ„ê´\\¦¬ĆPM¯£Ÿˆ»uïpùzEx€žanµyoluqe¦W^£ÊL}ñrkqWňûP™‰UP¡ôJŠoo·ŒU}£Œ„[·¨@XŒĸŸ“‹‹DXm­Ûݏº‡›GU‹CÁª½{íĂ^cj‡k“¶Ã[q¤“LÉö³cux«zZfƒ²BWÇ®Yß½ve±ÃC•ý£W{Ú^’q^sÑ·¨‹ÍOt“¹·C¥‡GD›rí@wÕKţ݋˜Ÿ«V·i}xËÍ÷‘i©ĝ‡ɝǡ]ƒˆ{c™±OW‹³Ya±Ÿ‰_穂Hžĕoƫ€Ňqƒr³‰Lys[„ñ³¯OS–ďOMisZ†±ÅFC¥Pq{‚Ã[Pg}\\—¿ghćO…•k^ģÁFıĉĥM­oEqqZûěʼn³F‘¦oĵ—hŸÕP{¯~TÍlª‰N‰ßY“Ð{Ps{ÃVU™™eĎwk±ʼnVÓ½ŽJãÇÇ»Jm°dhcÀff‘dF~ˆ€ĀeĖ€d`sx² šƒ®EżĀdQ‹Âd^~ăÔHˆ¦\\›LKpĄVez¤NP ǹӗR™ÆąJSh­a[¦´Âghwm€BÐ¨źhI|žVVŽ—Ž|p] ¼èNä¶ÜBÖ¼“L`‚¼bØæŒKV”ŸpoœúNZÞÒKxpw|ÊEMnzEQšŽIZ”ŽZ‡NBˆčÚFÜçmĩ‚WĪñt‘ÞĵÇñZ«uD‚±|Əlij¥ãn·±PmÍa‰–da‡ CL‡Ǒkùó¡³Ï«QaċϑOÃ¥ÕđQȥċƭy‹³ÃA"]],"encodeOffsets":[[[123686,41445]],[[126019,40435]],[[124393,40128]],[[126117,39963]],[[125322,40140]],[[126686,40700]],[[126041,40374]],[[125584,40168]],[[125453,40165]],[[125362,40214]],[[125280,40291]],[[125774,39997]],[[125976,40496]],[[125822,39993]],[[125509,40217]],[[122731,40949]]]}},{"type":"Feature","id":"220000","properties":{"id":"220000","cp":[125.3245,43.886841],"name":"吉林","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@‘p䔳PClƒFbbÍzš€wBG’ĭ€Z„Åi“»ƒlY­ċ²SgŽkÇ£—^S‰“qd¯•‹R…©éŽ£¯S†\\cZ¹iűƏCuƍÓX‡oR}“M^o•£…R}oªU­F…uuXHlEŕ‡€Ï©¤ÛmTŽþ¤D–²ÄufàÀ­XXȱAe„yYw¬dvõ´KÊ£”\\rµÄl”iˆdā]|DÂVŒœH¹ˆÞ®ÜWnŒC”Œķ W‹§@\\¸‹ƒ~¤‹Vp¸‰póIO¢ŠVOšŇürXql~òÉK]¤¥Xrfkvzpm¶bwyFoúvð‡¼¤ N°ąO¥«³[ƒéǡű_°Õ\\ÚÊĝŽþâőàerR¨­JYlďQ[ ÏYëЧTGz•tnŠß¡gFkMŸāGÁ¤ia ɉ™È¹`\\xs€¬dĆkNnuNUŠ–užP@‚vRY¾•–\\¢…ŒGªóĄ~RãÖÎĢù‚đŴÕhQŽxtcæëSɽʼníëlj£ƍG£nj°KƘµDsØÑpyƸ®¿bXp‚]vbÍZuĂ{nˆ^IüœÀSք”¦EŒvRÎûh@℈[‚Əȉô~FNr¯ôçR±ƒ­HÑl•’Ģ–^¤¢‚OðŸŒævxsŒ]ÞÁTĠs¶¿âƊGW¾ìA¦·TѬ†è¥€ÏÐJ¨¼ÒÖ¼ƒƦɄxÊ~S–tD@ŠĂ¼Ŵ¡jlºWžvЉˆzƦZЎ²CH— „Axiukd‹ŒGgetqmcžÛ£Ozy¥cE}|…¾cZ…k‚‰¿uŐã[oxGikfeäT@…šSUwpiÚFM©’£è^ڟ‚`@v¶eň†f h˜eP¶žt“äOlÔUgƒÞzŸU`lœ}ÔÆUvØ_Ō¬Öi^ĉi§²ÃŠB~¡Ĉ™ÚEgc|DC_Ȧm²rBx¼MÔ¦ŮdĨÃâYx‘ƘDVÇĺĿg¿cwÅ\\¹˜¥Yĭlœ¤žOv†šLjM_a W`zļMž·\\swqÝSA‡š—q‰Śij¯Š‘°kŠRē°wx^Đkǂғ„œž“œŽ„‹\\]˜nrĂ}²ĊŲÒøãh·M{yMzysěnĒġV·°“G³¼XÀ““™¤¹i´o¤ŃšŸÈ`̃DzÄUĞd\\i֚ŒˆmÈBĤÜɲDEh LG¾ƀľ{WaŒYÍȏĢĘÔRîĐj‹}Ǟ“ccj‡oUb½š{“h§Ǿ{K‹ƖµÎ÷žGĀÖŠåưÎs­l›•yiē«‹`姝H¥Ae^§„GK}iã\\c]v©ģZ“mÃ|“[M}ģTɟĵ‘Â`À–çm‰‘FK¥ÚíÁbXš³ÌQґHof{‰]e€pt·GŋĜYünĎųVY^’˜ydõkÅZW„«WUa~U·Sb•wGçǑ‚“iW^q‹F‚“›uNĝ—·Ew„‹UtW·Ýďæ©PuqEzwAV•—XR‰ãQ`­©GŒM‡ehc›c”ďϝd‡©ÑW_ϗYƅŒ»…é\\ƒɹ~ǙG³mØ©BšuT§Ĥ½¢Ã_ý‘L¡‘ýŸqT^rme™\\Pp•ZZbƒyŸ’uybQ—efµ]UhĿDCmûvašÙNSkCwn‰cćfv~…Y‹„ÇG"],"encodeOffsets":[[130196,42528]]}},{"type":"Feature","id":"230000","properties":{"id":"230000","cp":[128.642464,46.756967],"name":"黑龙江","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@UƒµNÿ¥īè灋•HÍøƕ¶LŒǽ|g¨|”™Ža¾pViˆdd”~ÈiŒíďÓQġėǐZ΋ŽXb½|ſÃH½ŸKFgɱCģÛÇA‡n™‹jÕc[VĝDZÃ˄Ç_™ £ń³pŽj£º”š¿”»WH´¯”U¸đĢmžtĜyzzNN|g¸÷äűѱĉā~mq^—Œ[ƒ”››”ƒǁÑďlw]¯xQĔ‰¯l‰’€°řĴrŠ™˜BˆÞTxr[tޏĻN_yŸX`biN™Ku…P›£k‚ZĮ—¦[ºxÆÀdhŽĹŀUÈƗCw’áZħÄŭcÓ¥»NAw±qȥnD`{ChdÙFćš}¢‰A±Äj¨]ĊÕjŋ«×`VuÓś~_kŷVÝyh„“VkÄãPs”Oµ—fŸge‚Ň…µf@u_Ù ÙcŸªNªÙEojVx™T@†ãSefjlwH\\pŏäÀvŠŽlY†½d{†F~¦dyz¤PÜndsrhf‹HcŒvlwjFœ£G˜±DύƥY‡yϊu¹XikĿ¦ÏqƗǀOŜ¨LI|FRĂn sª|Cš˜zxAè¥bœfudTrFWÁ¹Am|˜ĔĕsķÆF‡´Nš‰}ć…UŠÕ@Áijſmužç’uð^ÊýowŒFzØÎĕNőžǏȎôªÌŒDŽàĀÄ˄ĞŀƒʀĀƘŸˮȬƬĊ°ƒUŸzou‡xe]}Ž…AyȑW¯ÌmK‡“Q]‹Īºif¸ÄX|sZt|½ÚUÎ lkš^p{f¤lˆºlÆW –€A²˜PVܜPH”Êâ]ÎĈÌÜk´\\@qàsĔÄQºpRij¼èi†`¶—„bXƒrBgxfv»ŽuUiˆŒ^v~”J¬mVp´£Œ´VWrnP½ì¢BX‚¬h™ŠðX¹^TjVœŠriªj™tŊÄm€tPGx¸bgRšŽsT`ZozÆO]’ÒFô҆Oƒ‡ŊŒvŞ”p’cGŒêŠsx´DR–Œ{A†„EOr°Œ•žx|íœbˆ³Wm~DVjºéNN†Ëܲɶ­GƒxŷCStŸ}]ûō•SmtuÇÃĕN•™āg»šíT«u}ç½BĵÞʣ¥ëÊ¡Mێ³ãȅ¡ƋaǩÈÉQ‰†G¢·lG|›„tvgrrf«†ptęŘnŠÅĢr„I²¯LiØsPf˜_vĠd„xM prʹšL¤‹¤‡eˌƒÀđK“žïÙVY§]I‡óáĥ]ķ†Kˆ¥Œj|pŇ\\kzţ¦šnņäÔVĂîά|vW’®l¤èØr‚˜•xm¶ă~lÄƯĄ̈́öȄEÔ¤ØQĄ–Ą»ƢjȦOǺ¨ìSŖÆƬy”Qœv`–cwƒZSÌ®ü±DŽ]ŀç¬B¬©ńzƺŷɄeeOĨS’Œfm Ċ‚ƀP̎ēz©Ċ‚ÄÕÊmgŸÇsJ¥ƔˆŊśæ’΁Ñqv¿íUOµª‰ÂnĦÁ_½ä@ê텣P}Ġ[@gġ}g“ɊדûÏWXá¢užƻÌsNͽƎÁ§č՛AēeL³àydl›¦ĘVçŁpśdžĽĺſʃQíÜçÛġԏsĕ¬—Ǹ¯YßċġHµ ¡eå`ļƒrĉŘóƢFì“ĎWøxÊk†”ƈdƬv|–I|·©NqńRŀƒ¤é”eŊœŀ›ˆàŀU²ŕƀB‚Q£Ď}L¹Îk@©ĈuǰųǨ”Ú§ƈnTËÇéƟÊcfčŤ^Xm‡—HĊĕË«W·ċëx³ǔķÐċJā‚wİ_ĸ˜Ȁ^ôWr­°oú¬Ħ…ŨK~”ȰCĐ´Ƕ£’fNÎèâw¢XnŮeÂÆĶŽ¾¾xäLĴĘlļO¤ÒĨA¢Êɚ¨®‚ØCÔ ŬGƠ”ƦYĜ‡ĘÜƬDJ—g_ͥœ@čŅĻA“¶¯@wÎqC½Ĉ»NŸăëK™ďÍQ“Ùƫ[«Ãí•gßÔÇOÝáW‘ñuZ“¯ĥ€Ÿŕā¡ÑķJu¤E Ÿå¯°WKɱ_d_}}vyŸõu¬ï¹ÓU±½@gÏ¿rýD‰†g…Cd‰µ—°MFYxw¿CG£‹Rƛ½Õ{]L§{qqąš¿BÇƻğëšܭNJË|c²}Fµ}›ÙRsÓpg±ŠQNqǫŋRwŕnéÑÉKŸ†«SeYR…ŋ‹@{¤SJ}šD Ûǖ֍Ÿ]gr¡µŷjqWÛham³~S«“„›Þ]"]],"encodeOffsets":[[[134456,44547]]]}},{"type":"Feature","id":"320000","properties":{"id":"320000","cp":[119.767413,33.041544],"name":"江苏","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@cþÅPiŠ`ZŸRu¥É\\]~°ŽY`µ†Óƒ^phÁbnÀşúŽòa–ĬºTÖŒb‚˜e¦¦€{¸ZâćNpŒ©žHr|^ˆmjhŠSEb\\afv`sz^lkŽlj‹Ätg‹¤D˜­¾Xš¿À’|ДiZ„ȀåB·î}GL¢õcßjaŸyBFµÏC^ĭ•cÙt¿sğH]j{s©HM¢ƒQnDÀ©DaÜތ·jgàiDbPufjDk`dPOîƒhw¡ĥ‡¥šG˜ŸP²ĐobºrY†„î¶aHŢ´ ]´‚rılw³r_{£DB_Ûdåuk|ˆŨ¯F Cºyr{XFy™e³Þċ‡¿Â™kĭB¿„MvÛpm`rÚã”@ƹhågËÖƿxnlč¶Åì½Ot¾dJlŠVJʜǀœŞqvnOŠ^ŸJ”Z‘ż·Q}ê͎ÅmµÒ]Žƍ¦Dq}¬R^èĂ´ŀĻĊIԒtžIJyQŐĠMNtœR®òLh‰›Ěs©»œ}OӌGZz¶A\\jĨFˆäOĤ˜HYš†JvÞHNiÜaϚɖnFQlšNM¤ˆB´ĄNöɂtp–Ŭdf先‹qm¿QûŠùއÚb¤uŃJŴu»¹Ą•lȖħŴw̌ŵ²ǹǠ͛hĭłƕrçü±Y™xci‡tğ®jű¢KOķ•Coy`å®VTa­_Ā]ŐÝɞï²ʯÊ^]afYǸÃĆēĪȣJđ͍ôƋĝÄ͎ī‰çÛɈǥ£­ÛmY`ó£Z«§°Ó³QafusNıDž_k}¢m[ÝóDµ—¡RLčiXy‡ÅNïă¡¸iĔϑNÌŕoēdōîåŤûHcs}~Ûwbù¹£¦ÓCt‹OPrƒE^ÒoŠg™ĉIµžÛÅʹK…¤½phMŠü`o怆ŀ"],"encodeOffsets":[[121740,32276]]}},{"type":"Feature","id":"330000","properties":{"id":"330000","cp":[120.153576,29.287459],"name":"浙江","childNum":45},"geometry":{"type":"MultiPolygon","coordinates":[["@@E^dQ]K"],["@@jX^j‡"],["@@sfŠbU‡"],["@@qP\\xz[ck"],["@@‘Rƒ¢‚FX}°[s_"],["@@Cbœ\\—}"],["@@e|v\\la{u"],["@@v~u}"],["@@QxÂF¯}"],["@@¹nŒvÞs¯o"],["@@rSkUEj"],["@@bi­ZŒP"],["@@p[}INf"],["@@À¿€"],["@@¹dnbŒ…"],["@@rSŸBnR"],["@@g~h}"],["@@FlEk"],["@@OdPc"],["@@v[u\\"],["@@FjâL~wyoo~›sµL–\\"],["@@¬e¹aNˆ"],["@@\\nÔ¡q]L³ë\\ÿ®ŒQ֎"],["@@ÊA­©[¬"],["@@KxŒv­"],["@@@hlIk]"],["@@pW{o||j"],["@@Md|_mC"],["@@¢…X£ÏylD¼XˆtH"],["@@hlÜ[LykAvyfw^Ež›¤"],["@@fp¤Mus“R"],["@@®_ma~•LÁ¬šZ"],["@@iM„xZ"],["@@ZcYd"],["@@Z~dOSo|A¿qZv"],["@@@`”EN¡v"],["@@|–TY{"],["@@@n@m"],["@@XWkCT\\"],["@@ºwšZRkĕWO¢"],["@@™X®±Grƪ\\ÔáXq{‹"],["@@ůTG°ĄLHm°UC‹"],["@@¤Ž€aÜx~}dtüGæţŎíĔcŖpMËВj碷ðĄÆMzˆjWKĎ¢Q¶˜À_꒔_Bı€i«pZ€gf€¤Nrq]§ĂN®«H±‡yƳí¾×ŸīàLłčŴǝĂíÀBŖÕªˆŠÁŖHŗʼnåqûõi¨hÜ·ƒñt»¹ýv_[«¸m‰YL¯‰Qª…mĉÅdMˆ•gÇjcº«•ęœ¬­K­´ƒB«Âącoċ\\xKd¡gěŧ«®á’[~ıxu·Å”KsËɏc¢Ù\\ĭƛëbf¹­ģSƒĜkáƉÔ­ĈZB{ŠaM‘µ‰fzʼnfåÂŧįƋǝÊĕġć£g³ne­ą»@­¦S®‚\\ßðCšh™iqªĭiAu‡A­µ”_W¥ƣO\\lċĢttC¨£t`ˆ™PZäuXßBs‡Ļyek€OđġĵHuXBšµ]׌‡­­\\›°®¬F¢¾pµ¼kŘó¬Wät’¸|@ž•L¨¸µr“ºù³Ù~§WI‹ŸZWŽ®’±Ð¨ÒÉx€`‰²pĜ•rOògtÁZ}þÙ]„’¡ŒŸFK‚wsPlU[}¦Rvn`hq¬\\”nQ´ĘRWb”‚_ rtČFI֊kŠŠĦPJ¶ÖÀÖJĈĄTĚòžC ²@Pú…Øzœ©PœCÈÚœĒ±„hŖ‡l¬â~nm¨f©–iļ«m‡nt–u†ÖZÜÄj“ŠLŽ®E̜Fª²iÊxبžIÈhhst"],["@@o\\V’zRZ}y"],["@@†@°¡mۛGĕ¨§Ianá[ýƤjfæ‡ØL–•äGr™"]],"encodeOffsets":[[[125592,31553]],[[125785,31436]],[[125729,31431]],[[125513,31380]],[[125223,30438]],[[125115,30114]],[[124815,29155]],[[124419,28746]],[[124095,28635]],[[124005,28609]],[[125000,30713]],[[125111,30698]],[[125078,30682]],[[125150,30684]],[[124014,28103]],[[125008,31331]],[[125411,31468]],[[125329,31479]],[[125626,30916]],[[125417,30956]],[[125254,30976]],[[125199,30997]],[[125095,31058]],[[125083,30915]],[[124885,31015]],[[125218,30798]],[[124867,30838]],[[124755,30788]],[[124802,30809]],[[125267,30657]],[[125218,30578]],[[125200,30562]],[[124968,30474]],[[125167,30396]],[[124955,29879]],[[124714,29781]],[[124762,29462]],[[124325,28754]],[[123990,28459]],[[125366,31477]],[[125115,30363]],[[125369,31139]],[[122495,31878]],[[125329,30690]],[[125192,30787]]]}},{"type":"Feature","id":"340000","properties":{"id":"340000","cp":[117.283042,31.26119],"name":"安徽","childNum":3},"geometry":{"type":"MultiPolygon","coordinates":[["@@^iuLX^"],["@@‚e©Ehl"],["@@°ZÆëϵmkǀwÌÕæhºgBĝâqÙĊz›ÖgņtÀÁÊÆá’hEz|WzqD¹€Ÿ°E‡ŧl{ævÜcA`¤C`|´qžxIJkq^³³ŸGšµbƒíZ…¹qpa±ď OH—¦™Ħˆx¢„gPícOl_iCveaOjCh߸i݋bÛªCC¿€m„RV§¢A|t^iĠGÀtÚs–d]ĮÐDE¶zAb àiödK¡~H¸íæAžǿYƒ“j{ď¿‘™À½W—®£ChŒÃsiŒkkly]_teu[bFa‰Tig‡n{]Gqªo‹ĈMYá|·¥f¥—őaSÕė™NµñĞ«ImŒ_m¿Âa]uĜp …Z_§{Cƒäg¤°r[_Yj‰ÆOdý“[ŽI[á·¥“Q_n‡ùgL¾mv™ˊBÜÆ¶ĊJhšp“c¹˜O]iŠ]œ¥ jtsggJǧw×jÉ©±›EFˍ­‰Ki”ÛÃÕYv…s•ˆm¬njĻª•§emná}k«ŕˆƒgđ²Ù›DǤ›í¡ªOy›†×Où±@DŸñSęćăÕIÕ¿IµĥO‰‰jNÕËT¡¿tNæŇàåyķrĕq§ÄĩsWÆßŽF¶žX®¿‰mŒ™w…RIޓfßoG‘³¾©uyH‘į{Ɓħ¯AFnuP…ÍÔzšŒV—dàôº^Ðæd´€‡oG¤{S‰¬ćxã}›ŧ×Kǥĩ«žÕOEзÖdÖsƘѨ[’Û^Xr¢¼˜§xvěƵ`K”§ tÒ´Cvlo¸fzŨð¾NY´ı~ÉĔē…ßúLÃϖ_ÈÏ|]ÂÏFl”g`bšežž€n¾¢pU‚h~ƴ˶_‚r sĄ~cž”ƈ]|r c~`¼{À{ȒiJjz`îÀT¥Û³…]’u}›f…ïQl{skl“oNdŸjŸäËzDvčoQŠďHI¦rb“tHĔ~BmlRš—V_„ħTLnñH±’DžœL‘¼L˜ªl§Ťa¸ŒĚlK²€\\RòvDcÎJbt[¤€D@®hh~kt°ǾzÖ@¾ªdb„YhüóZ ň¶vHrľ\\ʗJuxAT|dmÀO„‹[ÃԋG·ĚąĐlŪÚpSJ¨ĸˆLvÞcPæķŨŽ®mАˆálŸwKhïgA¢ųƩޖ¤OȜm’°ŒK´"]],"encodeOffsets":[[[121722,32278]],[[119475,30423]],[[119168,35472]]]}},{"type":"Feature","id":"350000","properties":{"id":"350000","cp":[118.306239,26.075302],"name":"福建","childNum":18},"geometry":{"type":"MultiPolygon","coordinates":[["@@“zht´‡]"],["@@aj^~ĆG—©O"],["@@ed¨„C}}i"],["@@@vˆPGsQ"],["@@‰sBz‚ddW]Q"],["@@SލQ“{"],["@@NŽVucW"],["@@qptBAq"],["@@‰’¸[mu"],["@@Q\\pD]_"],["@@jSwUadpF"],["@@eXª~ƒ•"],["@@AjvFso"],["@@fT–›_Çí\\Ÿ™—v|ba¦jZÆy€°"],["@@IjJi"],["@@wJI€ˆxš«¼AoNe{M­"],["@@K‰±¡Óˆ”ČäeZ"],["@@k¡¹Eh~c®wBk‹UplÀ¡I•~Māe£bN¨gZý¡a±Öcp©PhžI”Ÿ¢Qq…ÇGj‹|¥U™ g[Ky¬ŏ–v@OpˆtÉEŸF„\\@ åA¬ˆV{Xģ‰ĐBy…cpě…¼³Ăp·¤ƒ¥o“hqqÚ¡ŅLsƒ^ᗞ§qlŸÀhH¨MCe»åÇGD¥zPO£čÙkJA¼ß–ėu›ĕeûҍiÁŧSW¥˜QŠûŗ½ùěcݧSùĩąSWó«íęACµ›eR—åǃRCÒÇZÍ¢‹ź±^dlsŒtjD¸•‚ZpužÔâÒH¾oLUêÃÔjjēò´ĄW‚ƛ…^Ñ¥‹ĦŸ@Çò–ŠmŒƒOw¡õyJ†yD}¢ďÑÈġfŠZd–a©º²z£šN–ƒjD°Ötj¶¬ZSÎ~¾c°¶Ðm˜x‚O¸¢Pl´žSL|¥žA†ȪĖM’ņIJg®áIJČĒü` ŽQF‡¬h|ÓJ@zµ |ê³È ¸UÖŬŬÀEttĸr‚]€˜ðŽM¤ĶIJHtÏ A’†žĬkvsq‡^aÎbvŒd–™fÊòSD€´Z^’xPsÞrv‹ƞŀ˜jJd×ŘÉ ®A–ΦĤd€xĆqAŒ†ZR”ÀMźŒnĊ»ŒİÐZ— YX–æJŠyĊ²ˆ·¶q§·–K@·{s‘Xãô«lŗ¶»o½E¡­«¢±¨Yˆ®Ø‹¶^A™vWĶGĒĢžPlzfˆļŽtàAvWYãšO_‡¤sD§ssČġ[kƤPX¦Ž`¶“ž®ˆBBvĪjv©šjx[L¥àï[F…¼ÍË»ğV`«•Ip™}ccÅĥZE‹ãoP…´B@ŠD—¸m±“z«Ƴ—¿å³BRضˆœWlâþäą`“]Z£Tc— ĹGµ¶H™m@_©—kŒ‰¾xĨ‡ôȉðX«½đCIbćqK³Á‹Äš¬OAwã»aLʼn‡ËĥW[“ÂGI—ÂNxij¤D¢ŽîĎÎB§°_JœGsƒ¥E@…¤uć…P‘å†cuMuw¢BI¿‡]zG¹guĮck\\_"]],"encodeOffsets":[[[123250,27563]],[[122541,27268]],[[123020,27189]],[[122916,27125]],[[122887,26845]],[[122808,26762]],[[122568,25912]],[[122778,26197]],[[122515,26757]],[[122816,26587]],[[123388,27005]],[[122450,26243]],[[122578,25962]],[[121255,25103]],[[120987,24903]],[[122339,25802]],[[121042,25093]],[[122439,26024]]]}},{"type":"Feature","id":"360000","properties":{"id":"360000","cp":[115.592151,27.676493],"name":"江西","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@ĢĨƐgÂMD~ņªe^\\^§„ý©j׍cZ†Ø¨zdÒa¶ˆlҍJŒìõ`oz÷@¤u޸´†ôęöY¼‰HČƶajlÞƩ¥éZ[”|h}^U Œ ¥p„ĄžƦO lt¸Æ €Q\\€ŠaÆ|CnÂOjt­ĚĤd’ÈŒF`’¶„@Ðë” ¦ōҞ¨Sêv†HĢûXD®…QgėWiØPÞìºr¤dž€NĠ¢l–•ĄtZoœCƞÔºCxrpĠV®Ê{f_Y`_ƒeq’’®Aot`@o‚DXfkp¨|Šs¬\\D‘ÄSfè©Hn¬…^DhÆyøJh“ØxĢĀLʈ„ƠPżċĄwȠ̦G®ǒĤäTŠÆ~ĦwŠ«|TF¡Šn€c³Ïå¹]ĉđxe{ÎӐ†vOEm°BƂĨİ|G’vz½ª´€H’àp”eJ݆Qšxn‹ÀŠW­žEµàXÅĪt¨ÃĖrÄwÀFÎ|ňÓMå¼ibµ¯»åDT±m[“r«_gŽmQu~¥V\\OkxtL E¢‹ƒ‘Ú^~ýê‹Pó–qo슱_Êw§ÑªåƗ⼋mĉŹ‹¿NQ“…YB‹ąrwģcÍ¥B•Ÿ­ŗÊcØiI—žƝĿuŒqtāwO]‘³YCñTeɕš‹caub͈]trlu€ī…B‘ПGsĵıN£ï—^ķqss¿FūūV՟·´Ç{éĈý‰ÿ›OEˆR_ŸđûIċâJh­ŅıN‘ȩĕB…¦K{Tk³¡OP·wn—µÏd¯}½TÍ«YiµÕsC¯„iM•¤™­•¦¯P|ÿUHv“he¥oFTu‰õ\\ŽOSs‹MòđƇiaºćXŸĊĵà·çhƃ÷ǜ{‘ígu^›đg’m[×zkKN‘¶Õ»lčÓ{XSƉv©_ÈëJbVk„ĔVÀ¤P¾ºÈMÖxlò~ªÚàGĂ¢B„±’ÌŒK˜y’áV‡¼Ã~­…`g›ŸsÙfI›Ƌlę¹e|–~udjˆuTlXµf`¿JdŠ[\\˜„L‚‘²"],"encodeOffsets":[[116689,26234]]}},{"type":"Feature","id":"370000","properties":{"id":"370000","cp":[118.000923,36.275807],"name":"山东","childNum":13},"geometry":{"type":"MultiPolygon","coordinates":[["@@Xjd]{K"],["@@itbFHy"],["@@HlGk"],["@@T‚ŒGŸy"],["@@K¬˜•‹U"],["@@WdXc"],["@@PtOs"],["@@•LnXhc"],["@@ppVƒu]Or"],["@@cdzAUa"],["@@udRhnCI‡"],["@@ˆoIƒpR„"],["@@Ľč{fzƤî’Kš–ÎMĮ]†—ZFˆ½Y]â£ph’™š¶¨râøÀ†ÎǨ¤^ºÄ”Gzˆ~grĚĜlĞÆ„LĆdž¢Îo¦–cv“Kb€gr°Wh”mZp ˆL]LºcU‰Æ­n”żĤÌǜbAnrOAœ´žȊcÀbƦUØrĆUÜøœĬƞ†š˜Ez„VL®öØBkŖÝĐ˹ŧ̄±ÀbÎɜnb²ĦhņBĖ›žįĦåXćì@L¯´ywƕCéõė ƿ¸‘lµ¾Z|†ZWyFYŸ¨Mf~C¿`€à_RÇzwƌfQnny´INoƬˆèôº|sT„JUš›‚L„îVj„ǎ¾Ē؍‚Dz²XPn±ŴPè¸ŔLƔÜƺ_T‘üÃĤBBċȉöA´fa„˜M¨{«M`‡¶d¡ô‰Ö°šmȰBÔjjŒ´PM|”c^d¤u•ƒ¤Û´Œä«ƢfPk¶Môlˆ]Lb„}su^ke{lC‘…M•rDŠÇ­]NÑFsmoõľH‰yGă{{çrnÓE‰‹ƕZGª¹Fj¢ïW…uøCǷ돡ąuhÛ¡^Kx•C`C\\bÅxì²ĝÝ¿_N‰īCȽĿåB¥¢·IŖÕy\\‡¹kx‡Ã£Č×GDyÕ¤ÁçFQ¡„KtŵƋ]CgÏAùSed‡cÚź—ŠuYfƒyMmhUWpSyGwMPqŀ—›Á¼zK›¶†G•­Y§Ëƒ@–´śÇµƕBmœ@Io‚g——Z¯u‹TMx}C‘‰VK‚ï{éƵP—™_K«™pÛÙqċtkkù]gŽ‹Tğwo•ɁsMõ³ă‡AN£™MRkmEʕč™ÛbMjÝGu…IZ™—GPģ‡ãħE[iµBEuŸDPԛ~ª¼ętŠœ]ŒûG§€¡QMsğNPŏįzs£Ug{đJĿļā³]ç«Qr~¥CƎÑ^n¶ÆéÎR~ݏY’I“] P‰umŝrƿ›‰›Iā‹[x‰edz‹L‘¯v¯s¬ÁY…~}…ťuٌg›ƋpÝĄ_ņī¶ÏSR´ÁP~ž¿Cyžċßdwk´Ss•X|t‰`Ä Èð€AªìÎT°¦Dd–€a^lĎDĶÚY°Ž`ĪŴǒˆ”àŠv\\ebŒZH„ŖR¬ŢƱùęO•ÑM­³FۃWp[ƒ"]],"encodeOffsets":[[[123806,39303]],[[123821,39266]],[[123742,39256]],[[123702,39203]],[[123649,39066]],[[123847,38933]],[[123580,38839]],[[123894,37288]],[[123043,36624]],[[123344,38676]],[[123522,38857]],[[123628,38858]],[[118260,36742]]]}},{"type":"Feature","id":"410000","properties":{"id":"410000","cp":[113.665412,33.757975],"name":"河南","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@•ýL™ùµP³swIÓxcŢĞð†´E®žÚPt†ĴXØx¶˜@«ŕŕQGƒ‹Yfa[şu“ßǩ™đš_X³ijÕčC]kbc•¥CS¯ëÍB©÷‹–³­Siˆ_}m˜YTtž³xlàcȂzÀD}ÂOQ³ÐTĨ¯†ƗòËŖ[hœł‹Ŧv~††}ÂZž«¤lPǕ£ªÝŴÅR§ØnhcŒtâk‡nύ­ľŹUÓÝdKuķ‡I§oTũÙďkęĆH¸ÓŒ\\ăŒ¿PcnS{wBIvɘĽ[GqµuŸŇôYgûƒZcaŽ©@½Õǽys¯}lgg@­C\\£as€IdÍuCQñ[L±ęk·‹ţb¨©kK—’»›KC²‘òGKmĨS`ƒ˜UQ™nk}AGē”sqaJ¥ĐGR‰ĎpCuÌy ã iMc”plk|tRk†ðœev~^‘´†¦ÜŽSí¿_iyjI|ȑ|¿_»d}qŸ^{“Ƈdă}Ÿtqµ`Ƴĕg}V¡om½fa™Ço³TTj¥„tĠ—Ry”K{ùÓjuµ{t}uËR‘iŸvGŠçJFjµŠÍyqΘàQÂFewixGw½Yŷpµú³XU›½ġy™łå‰kÚwZXˆ·l„¢Á¢K”zO„Λ΀jc¼htoDHr…|­J“½}JZ_¯iPq{tę½ĕ¦Zpĵø«kQ…Ťƒ]MÛfaQpě±ǽ¾]u­Fu‹÷nƒ™čįADp}AjmcEǒaª³o³ÆÍSƇĈÙDIzˑ赟^ˆKLœ—i—Þñ€[œƒaA²zz‰Ì÷Dœ|[šíijgf‚ÕÞd®|`ƒĆ~„oĠƑô³Ŋ‘D×°¯CsŠøÀ«ì‰UMhTº¨¸ǡîS–Ô„DruÂÇZ•ÖEŽ’vPZ„žW”~؋ÐtĄE¢¦Ðy¸bŠô´oŬ¬Ž²Ês~€€]®tªašpŎJ¨Öº„_ŠŔ–`’Ŗ^Ѝ\\Ĝu–”~m²Ƹ›¸fW‰ĦrƔ}Î^gjdfÔ¡J}\\n C˜¦þWxªJRÔŠu¬ĨĨmF†dM{\\d\\ŠYÊ¢ú@@¦ª²SŠÜsC–}fNècbpRmlØ^g„d¢aÒ¢CZˆZxvÆ¶N¿’¢T@€uCœ¬^ĊðÄn|žlGl’™Rjsp¢ED}€Fio~ÔNŽ‹„~zkĘHVsDzßjƒŬŒŠŢ`Pûàl¢˜\\ÀœEhŽİgÞē X¼Pk–„|m"],"encodeOffsets":[[118256,37017]]}},{"type":"Feature","id":"420000","properties":{"id":"420000","cp":[113.298572,30.684355],"name":"湖北","childNum":3},"geometry":{"type":"MultiPolygon","coordinates":[["@@AB‚"],["@@lskt"],["@@¾«}{ra®pîÃ\\™›{øCŠËyyB±„b\\›ò˜Ý˜jK›‡L ]ĎĽÌ’JyÚCƈćÎT´Å´pb©È‘dFin~BCo°BĎĚømvŒ®E^vǾ½Ĝ²Ro‚bÜeNŽ„^ĺ£R†¬lĶ÷YoĖ¥Ě¾|sOr°jY`~I”¾®I†{GqpCgyl{‡£œÍƒÍyPL“¡ƒ¡¸kW‡xYlÙæŠšŁĢzœ¾žV´W¶ùŸo¾ZHxjwfx„GNÁ•³Xéæl¶‰EièIH‰ u’jÌQ~v|sv¶Ôi|ú¢Fh˜Qsğ¦ƒSiŠBg™ÐE^ÁÐ{–čnOÂȞUÎóĔ†ÊēIJ}Z³½Mŧïeyp·uk³DsѨŸL“¶_œÅuèw»—€¡WqÜ]\\‘Ò§tƗcÕ¸ÕFÏǝĉăxŻČƟO‡ƒKÉġÿ×wg”÷IÅzCg†]m«ªGeçÃTC’«[‰t§{loWeC@ps_Bp‘­r‘„f_``Z|ei¡—oċMqow€¹DƝӛDYpûs•–‹Ykıǃ}s¥ç³[§ŸcYЧHK„«Qy‰]¢“wwö€¸ïx¼ņ¾Xv®ÇÀµRĠЋžHMž±cÏd„ƒǍũȅȷ±DSyúĝ£ŤĀàtÖÿï[îb\\}pĭÉI±Ñy…¿³x¯N‰o‰|¹H™ÏÛm‹júË~Tš•u˜ęjCöAwě¬R’đl¯ Ñb­‰ŇT†Ŀ_[Œ‘IčĄʿnM¦ğ\\É[T·™k¹œ©oĕ@A¾w•ya¥Y\\¥Âaz¯ãÁ¡k¥ne£Ûw†E©Êō¶˓uoj_Uƒ¡cF¹­[Wv“P©w—huÕyBF“ƒ`R‹qJUw\\i¡{jŸŸEPïÿ½fć…QÑÀQ{ž‚°‡fLԁ~wXg—ītêݾ–ĺ‘Hdˆ³fJd]‹HJ²…E€ƒoU¥†HhwQsƐ»Xmg±çve›]Dm͂PˆoCc¾‹_h”–høYrŊU¶eD°Č_N~øĹĚ·`z’]Äþp¼…äÌQŒv\\rCŒé¾TnkžŐڀÜa‡“¼ÝƆ̶Ûo…d…ĔňТJq’Pb ¾|JŒ¾fXŠƐîĨ_Z¯À}úƲ‹N_ĒĊ^„‘ĈaŐyp»CÇĕKŠšñL³ŠġMŒ²wrIÒŭxjb[œžn«øœ˜—æˆàƒ ^²­h¯Ú€ŐªÞ¸€Y²ĒVø}Ā^İ™´‚LŠÚm„¥ÀJÞ{JVŒųÞŃx×sxxƈē ģMř–ÚðòIf–Ċ“Œ\\Ʈ±ŒdʧĘD†vČ_Àæ~DŒċ´A®µ†¨ØLV¦êHÒ¤"]],"encodeOffsets":[[[113712,34000]],[[115612,30507]],[[113649,34054]]]}},{"type":"Feature","id":"430000","properties":{"id":"430000","cp":[111.782279,28.09409],"name":"湖南","childNum":3},"geometry":{"type":"MultiPolygon","coordinates":[["@@—n„FTs"],["@@ßÅÆá‰½ÔXr—†CO™“…ËR‘ïÿĩ­TooQyšÓ[‹ŅBE¬–ÎÓXa„į§Ã¸G °ITxp‰úxÚij¥Ïš–̾ŠedžÄ©ĸG…œàGh‚€M¤–Â_U}Ċ}¢pczfŠþg¤€”ÇòAV‘‹M"],["@@©K—ƒA·³CQ±Á«³BUŠƑ¹AŠtćOw™D]ŒJiØSm¯b£‘ylƒ›X…HËѱH•«–‘C^õľA–Å§¤É¥„ïyuǙuA¢^{ÌC´­¦ŷJ£^[†“ª¿‡ĕ~•Ƈ…•N… skóā‡¹¿€ï]ă~÷O§­@—Vm¡‹Qđ¦¢Ĥ{ºjԏŽŒª¥nf´•~ÕoŸž×Ûą‹MąıuZœmZcÒ IJβSÊDŽŶ¨ƚƒ’CÖŎªQؼrŭŽ­«}NÏürʬŒmjr€@ĘrTW ­SsdHzƓ^ÇÂyUi¯DÅYlŹu{hTœ}mĉ–¹¥ě‰Dÿë©ıÓ[Oº£ž“¥ót€ł¹MՄžƪƒ`Pš…Di–ÛUоÅ‌ìˆU’ñB“È£ýhe‰dy¡oċ€`pfmjP~‚kZa…ZsÐd°wj§ƒ@€Ĵ®w~^‚kÀÅKvNmX\\¨a“”сqvíó¿F„¤¡@ũÑVw}S@j}¾«pĂr–ªg àÀ²NJ¶¶Dô…K‚|^ª†Ž°LX¾ŴäPᜣEXd›”^¶›IJÞܓ~‘u¸ǔ˜Ž›MRhsR…e†`ÄofIÔ\\Ø i”ćymnú¨cj ¢»–GČìƊÿШXeĈ¾Oð Fi ¢|[jVxrIQŒ„_E”zAN¦zLU`œcªx”OTu RLÄ¢dV„i`p˔vŎµªÉžF~ƒØ€d¢ºgİàw¸Áb[¦Zb¦–z½xBĖ@ªpº›šlS¸Ö\\Ĕ[N¥ˀmĎă’J\\‹ŀ`€…ňSڊĖÁĐiO“Ĝ«BxDõĚiv—ž–S™Ì}iùŒžÜnšÐºGŠ{Šp°M´w†ÀÒzJ²ò¨ oTçüöoÛÿñŽőФ‚ùTz²CȆȸǎۃƑÐc°dPÎŸğ˶[Ƚu¯½WM¡­Éž“’B·rížnZŸÒ `‡¨GA¾\\pē˜XhÆRC­üWGġu…T靧Ŏѝ©ò³I±³}_‘‹EÃħg®ęisÁPDmÅ{‰b[Rşs·€kPŸŽƥƒóRo”O‹ŸVŸ~]{g\\“êYƪ¦kÝbiċƵŠGZ»Ěõ…ó·³vŝž£ø@pyö_‹ëŽIkѵ‡bcѧy…×dY؎ªiþž¨ƒ[]f]Ņ©C}ÁN‡»hĻħƏ’ĩ"]],"encodeOffsets":[[[115640,30489]],[[112543,27312]],[[116690,26230]]]}},{"type":"Feature","id":"440000","properties":{"id":"440000","cp":[113.280637,23.125178],"name":"广东","childNum":24},"geometry":{"type":"MultiPolygon","coordinates":[["@@QdˆAua"],["@@ƒlxDLo"],["@@sbhNLo"],["@@Ă āŸ"],["@@WltO[["],["@@Krœ]S"],["@@e„„I]y"],["@@I|„Mym"],["@@ƒÛ³LSŒž¼Y"],["@@nvºB–ëui©`¾"],["@@zdšÛ›Jw®"],["@@†°…¯"],["@@a yAª¸ËJIx،@€ĀHAmßV¡o•fu•o"],["@@šs‰ŗÃÔėAƁ›ZšÄ ~°ČP‚‹äh"],["@@‹¶Ý’Ì‚vmĞh­ı‡Q"],["@@HœŠdSjĒ¢D}war…“u«ZqadYM"],["@@elŒ\\LqqU"],["@@~rMo\\"],["@@f„^ƒC"],["@@øPªoj÷ÍÝħXČx”°Q¨ıXNv"],["@@gÇƳˆŽˆ”oˆŠˆ[~tly"],["@@E–ÆC¿‘"],["@@OŽP"],["@@w‹†đóg‰™ĝ—[³‹¡VÙæÅöM̳¹pÁaËýý©D©Ü“JŹƕģGą¤{Ùū…ǘO²«BƱéA—Ò‰ĥ‡¡«BhlmtÃPµyU¯uc“d·w_bŝcīímGOŽ|KP’ȏ‡ŹãŝIŕŭŕ@Óoo¿ē‹±ß}Ž…ŭ‚ŸIJWÈCőâUâǙI›ğʼn©I›ijEׅÁ”³Aó›wXJþ±ÌŒÜӔĨ£L]ĈÙƺZǾĆĖMĸĤfŒÎĵl•ŨnȈ‘ĐtF”Š–FĤ–‚êk¶œ^k°f¶gŠŽœ}®Fa˜f`vXŲxl˜„¦–ÔÁ²¬ÐŸ¦pqÊ̲ˆi€XŸØRDÎ}†Ä@ZĠ’s„x®AR~®ETtĄZ†–ƈfŠŠHâÒÐA†µ\\S¸„^wĖkRzŠalŽŜ|E¨ÈNĀňZTŒ’pBh£\\ŒĎƀuXĖtKL–¶G|Ž»ĺEļĞ~ÜĢÛĊrˆO˜Ùîvd]nˆ¬VœÊĜ°R֟pM††–‚ƂªFbwžEÀˆ˜©Œž\\…¤]ŸI®¥D³|ˎ]CöAŤ¦…æ’´¥¸Lv¼€•¢ĽBaô–F~—š®²GÌҐEY„„œzk¤’°ahlV՞I^‹šCxĈPŽsB‰ƒºV‰¸@¾ªR²ĨN]´_eavSi‡vc•}p}Đ¼ƌkJœÚe thœ†_¸ ºx±ò_xN›Ë‹²‘@ƒă¡ßH©Ùñ}wkNÕ¹ÇO½¿£ĕ]ly_WìIžÇª`ŠuTÅxYĒÖ¼k֞’µ‚MžjJÚwn\\h‘œĒv]îh|’È›Ƅøègž¸Ķß ĉĈWb¹ƀdéƌNTtP[ŠöSvrCZžžaGuœbo´ŖÒÇА~¡zCI…özx¢„Pn‹•‰Èñ @ŒĥÒ¦†]ƞŠV}³ăĔñiiÄÓVépKG½Ä‘ÓávYo–C·sit‹iaÀy„ŧΡÈYDÑům}‰ý|m[węõĉZÅxUO}÷N¹³ĉo_qtă“qwµŁYلǝŕ¹tïÛUïmRCº…ˆĭ|µ›ÕÊK™½R‘ē ó]‘–GªęAx–»HO£|ām‡¡diď×YïYWªʼnOeÚtĐ«zđ¹T…ā‡úE™á²\\‹ķÍ}jYàÙÆſ¿Çdğ·ùTßÇţʄ¡XgWÀLJğ·¿ÃˆOj YÇ÷Qě‹i"]],"encodeOffsets":[[[117381,22988]],[[116552,22934]],[[116790,22617]],[[116973,22545]],[[116444,22536]],[[116931,22515]],[[116496,22490]],[[116453,22449]],[[113301,21439]],[[118726,21604]],[[118709,21486]],[[113210,20816]],[[115482,22082]],[[113171,21585]],[[113199,21590]],[[115232,22102]],[[115739,22373]],[[115134,22184]],[[113056,21175]],[[119573,21271]],[[119957,24020]],[[115859,22356]],[[116561,22649]],[[116285,22746]]]}},{"type":"Feature","id":"450000","properties":{"id":"450000","cp":[108.320004,22.82402],"name":"广西","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@H– TQ§•A"],["@@ĨʪƒLƒƊDÎĹĐCǦė¸zÚGn£¾›rªŀÜt¬@֛ڈSx~øOŒ˜ŶÐÂæȠ\\„ÈÜObĖw^oބLf¬°bI lTØB̈F£Ć¹gñĤaY“t¿¤VSñœK¸¤nM†¼‚JE±„½¸šŠño‹ÜCƆæĪ^ŠĚQÖ¦^‡ˆˆf´Q†üÜʝz¯šlzUĺš@쇀p¶n]sxtx¶@„~ÒĂJb©gk‚{°‚~c°`ԙ¬rV\\“la¼¤ôá`¯¹LC†ÆbŒxEræO‚v[H­˜„[~|aB£ÖsºdAĐzNÂðsŽÞƔ…Ĥªbƒ–ab`ho¡³F«èVloޤ™ÔRzpp®SŽĪº¨ÖƒºN…ij„d`’a”¦¤F³ºDÎńĀìŠCžĜº¦Ċ•~nS›|gźvZkCÆj°zVÈÁƔ]LÊFZg…čP­kini«‹qǀcz͔Y®¬Ů»qR×ō©DՄ‘§ƙǃŵTÉĩ±ŸıdÑnYY›IJvNĆÌØÜ Öp–}e³¦m‹©iÓ|¹Ÿħņ›|ª¦QF¢Â¬ʖovg¿em‡^ucà÷gՎuŒíÙćĝ}FϼĹ{µHK•sLSđƃr‹č¤[Ag‘oS‹ŇYMÿ§Ç{Fśbky‰lQxĕƒ]T·¶[B…ÑÏGáşşƇe€…•ăYSs­FQ}­Bƒw‘tYğÃ@~…C̀Q ×W‡j˱rÉ¥oÏ ±«ÓÂ¥•ƒ€k—ŽwWűŒmcih³K›~‰µh¯e]lµ›él•E쉕E“ďs‡’mǖŧē`ãògK_ÛsUʝ“ćğ¶hŒöŒO¤Ǜn³Žc‘`¡y‹¦C‘ez€YŠwa™–‘[ďĵűMę§]X˜Î_‚훘Û]é’ÛUćİÕBƣ±…dƒy¹T^džûÅÑŦ·‡PĻþÙ`K€¦˜…¢ÍeœĥR¿Œ³£[~Œäu¼dl‰t‚†W¸oRM¢ď\\zœ}Æzdvň–{ÎXF¶°Â_„ÒÂÏL©Ö•TmuŸ¼ãl‰›īkiqéfA„·Êµ\\őDc¥ÝF“y›Ôć˜c€űH_hL܋êĺШc}rn`½„Ì@¸¶ªVLŒŠhŒ‹\\•Ţĺk~ŽĠið°|gŒtTĭĸ^x‘vK˜VGréAé‘bUu›MJ‰VÃO¡…qĂXËS‰ģãlýàŸ_ju‡YÛÒB†œG^˜é֊¶§ŽƒEG”ÅzěƒƯ¤Ek‡N[kdåucé¬dnYpAyČ{`]þ¯T’bÜÈk‚¡Ġ•vŒàh„ÂƄ¢Jî¶²"]],"encodeOffsets":[[[111707,21520]],[[107619,25527]]]}},{"type":"Feature","id":"460000","properties":{"id":"460000","cp":[109.83119,19.031971],"name":"海南","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@š¦Ŝil¢”XƦ‘ƞò–ïè§ŞCêɕrŧůÇąĻõ™·ĉ³œ̅kÇm@ċȧƒŧĥ‰Ľʉ­ƅſ“ȓÒ˦ŝE}ºƑ[ÍĜȋ gÎfǐÏĤ¨êƺ\\Ɔ¸ĠĎvʄȀœÐ¾jNðĀÒRŒšZdž™zÐŘΰH¨Ƣb²_Ġ "],"encodeOffsets":[[112750,20508]]}},{"type":"Feature","id":"510000","properties":{"id":"510000","cp":[104.065735,30.659462],"name":"四川","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@LqKr"],["@@Š[ĻéV£ž_ţġñpG •réÏ·~ąSfy×͂·ºſƽiÍıƣıĻmHH}siaX@iǰÁÃ×t«ƒ­Tƒ¤J–JJŒyJ•ÈŠ`Ohߦ¡uËhIyCjmÿw…ZG……Ti‹SˆsO‰žB²ŸfNmsPaˆ{M{ŠõE‘^Hj}gYpaeuž¯‘oáwHjÁ½M¡pM“–uå‡mni{fk”\\oƒÎqCw†EZ¼K›ĝŠƒAy{m÷L‡wO×SimRI¯rK™õBS«sFe‡]fµ¢óY_ÆPRcue°Cbo׌bd£ŌIHgtrnyPt¦foaXďx›lBowz‹_{ÊéWiêE„GhܸºuFĈIxf®Ž•Y½ĀǙ]¤EyŸF²ċ’w¸¿@g¢§RGv»–áŸW`ÃĵJwi]t¥wO­½a[׈]`Ãi­üL€¦LabbTÀå’c}Íh™Æhˆ‹®BH€î|Ék­¤S†y£„ia©taį·Ɖ`ō¥Uh“O…ƒĝLk}©Fos‰´›Jm„µlŁu—…ø–nÑJWΪ–YÀïAetTžŅ‚ӍG™Ë«bo‰{ıwodƟ½ƒžOġܑµxàNÖ¾P²§HKv¾–]|•B‡ÆåoZ`¡Ø`ÀmºĠ~ÌЧnDž¿¤]wğ@sƒ‰rğu‰~‘Io”[é±¹ ¿žſđӉ@q‹gˆ¹zƱřaí°KtǤV»Ã[ĩǭƑ^ÇÓ@ỗs›Zϕ‹œÅĭ€Ƌ•ěpwDóÖሯneQˌq·•GCœýS]xŸ·ý‹q³•O՜Œ¶Qzßti{ř‰áÍÇWŝŭñzÇW‹pç¿JŒ™‚Xœĩè½cŒF–ÂLiVjx}\\N†ŇĖ¥Ge–“JA¼ÄHfÈu~¸Æ«dE³ÉMA|b˜Ò…˜ćhG¬CM‚õŠ„ƤąAvƒüV€éŀ‰_V̳ĐwQj´·ZeÈÁ¨X´Æ¡Qu·»Ÿ“˜ÕZ³ġqDo‰y`L¬gdp°şŠp¦ėìÅĮZްIä”h‚‘ˆzŠĵœf²å ›ĚрKp‹IN|‹„Ñz]ń……·FU×é»R³™MƒÉ»GM«€ki€™ér™}Ã`¹ăÞmȝnÁîRǀ³ĜoİzŔwǶVÚ£À]ɜ»ĆlƂ²Ġ…þTº·àUȞÏʦ¶†I’«dĽĢdĬ¿–»Ĕ׊h\\c¬†ä²GêëĤł¥ÀǿżÃÆMº}BÕĢyFVvw–ˆxBèĻĒ©Ĉ“tCĢɽŠȣ¦āæ·HĽî“ôNԓ~^¤Ɗœu„œ^s¼{TA¼ø°¢İªDè¾Ň¶ÝJ‘®Z´ğ~Sn|ªWÚ©òzPOȸ‚bð¢|‹øĞŠŒœŒQìÛÐ@Ğ™ǎRS¤Á§d…i“´ezÝúØã]Hq„kIŸþËQǦÃsǤ[E¬ÉŪÍxXƒ·ÖƁİlƞ¹ª¹|XÊwn‘ÆƄmÀêErĒtD®ċæcQƒ”E®³^ĭ¥©l}äQto˜ŖÜqƎkµ–„ªÔĻĴ¡@Ċ°B²Èw^^RsºT£ڿœQP‘JvÄz„^Đ¹Æ¯fLà´GC²‘dt˜­ĀRt¼¤ĦOðğfÔðDŨŁĞƘïžPȆ®âbMüÀXZ ¸£@Ś›»»QÉ­™]d“sÖ×_͖_ÌêŮPrĔĐÕGĂeZÜîĘqBhtO ¤tE[h|Y‹Ô‚ZśÎs´xº±UŒ’ñˆt|O’ĩĠºNbgþŠJy^dÂY Į„]Řz¦gC‚³€R`Šz’¢AjŒ¸CL„¤RÆ»@­Ŏk\\Ç´£YW}z@Z}‰Ã¶“oû¶]´^N‡Ò}èN‚ª–P˜Íy¹`S°´†ATe€VamdUĐwʄvĮÕ\\ƒu‹Æŗ¨Yp¹àZÂm™Wh{á„}WØǍ•Éüw™ga§áCNęÎ[ĀÕĪgÖɪX˜øx¬½Ů¦¦[€—„NΆL€ÜUÖ´òrÙŠxR^–†J˜k„ijnDX{Uƒ~ET{ļº¦PZc”jF²Ė@Žp˜g€ˆ¨“B{ƒu¨ŦyhoÚD®¯¢˜ WòàFΤ¨GDäz¦kŮPœġq˚¥À]€Ÿ˜eŽâÚ´ªKxī„Pˆ—Ö|æ[xäJÞĥ‚s’NÖ½ž€I†¬nĨY´®Ð—ƐŠ€mD™ŝuäđđEb…e’e_™v¡}ìęNJē}q”É埁T¯µRs¡M@}ůa†a­¯wvƉåZwž\\Z{åû^›"]],"encodeOffsets":[[[108815,30935]],[[110617,31811]]]}},{"type":"Feature","id":"520000","properties":{"id":"520000","cp":[106.713478,26.578343],"name":"贵州","childNum":3},"geometry":{"type":"MultiPolygon","coordinates":[["@@†G\\†lY£‘in"],["@@q‚|ˆ‚mc¯tχVSÎ"],["@@hÑ£Is‡NgßH†›HªķÃh_¹ƒ¡ĝħń¦uيùŽgS¯JHŸ|sÝÅtÁïyMDč»eÕtA¤{b\\}—ƒG®u\\åPFq‹wÅaD…žK°ºâ_£ùbµ”mÁ‹ÛœĹM[q|hlaªāI}тƒµ@swtwm^oµˆD鼊yV™ky°ÉžûÛR…³‚‡eˆ‡¥]RՋěħ[ƅåÛDpŒ”J„iV™™‰ÂF²I…»mN·£›LbÒYb—WsÀbŽ™pki™TZĄă¶HŒq`……ĥ_JŸ¯ae«ƒKpÝx]aĕÛPƒÇȟ[ÁåŵÏő—÷Pw}‡TœÙ@Õs«ĿÛq©½œm¤ÙH·yǥĘĉBµĨÕnđ]K„©„œá‹ŸG纍§Õßg‡ǗĦTèƤƺ{¶ÉHÎd¾ŚÊ·OÐjXWrãLyzÉAL¾ę¢bĶėy_qMĔąro¼hĊžw¶øV¤w”²Ĉ]ʚKx|`ź¦ÂÈdr„cȁbe¸›`I¼čTF´¼Óýȃr¹ÍJ©k_șl³´_pН`oÒh޶pa‚^ÓĔ}D»^Xyœ`d˜[Kv…JPhèhCrĂĚÂ^Êƌ wˆZL­Ġ£šÁbrzOIl’MM”ĪŐžËr×ÎeŦŽtw|Œ¢mKjSǘňĂStÎŦEtqFT†¾†E쬬ôxÌO¢Ÿ KгŀºäY†„”PVgŎ¦Ŋm޼VZwVlŒ„z¤…ž£Tl®ctĽÚó{G­A‡ŒÇgeš~Αd¿æaSba¥KKûj®_ć^\\ؾbP®¦x^sxjĶI_Ä X‚⼕Hu¨Qh¡À@Ëô}ޱžGNìĎlT¸ˆ…`V~R°tbÕĊ`¸úÛtπFDu€[ƒMfqGH·¥yA‰ztMFe|R‚_Gk†ChZeÚ°to˜v`x‹b„ŒDnÐ{E}šZ˜è€x—†NEފREn˜[Pv@{~rĆAB§‚EO¿|UZ~ì„Uf¨J²ĂÝÆ€‚sª–B`„s¶œfvö¦ŠÕ~dÔq¨¸º»uù[[§´sb¤¢zþFœ¢Æ…Àhˆ™ÂˆW\\ıŽËI݊o±ĭŠ£þˆÊs}¡R]ŒěƒD‚g´VG¢‚j±®è†ºÃmpU[Á›‘Œëº°r›ÜbNu¸}Žº¼‡`ni”ºÔXĄ¤¼Ôdaµ€Á_À…†ftQQgœR—‘·Ǔ’v”}Ýלĵ]µœ“Wc¤F²›OĩųãW½¯K‚©…]€{†LóµCIµ±Mß¿hŸ•©āq¬o‚½ž~@i~TUxŪÒ¢@ƒ£ÀEîôruń‚”“‚b[§nWuMÆLl¿]x}ij­€½"]],"encodeOffsets":[[[112158,27383]],[[112105,27474]],[[112095,27476]]]}},{"type":"Feature","id":"530000","properties":{"id":"530000","cp":[101.512251,24.740609],"name":"云南","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@[„ùx½}ÑRH‘YīĺûsÍn‘iEoã½Ya²ė{c¬ĝg•ĂsA•ØÅwď‚õzFjw}—«Dx¿}UũlŸê™@•HÅ­F‰¨ÇoJ´Ónũuą¡Ã¢pÒŌ“Ø TF²‚xa²ËX€‚cʋlHîAßËŁkŻƑŷÉ©h™W­æßU‡“Ës¡¦}•teèÆ¶StǀÇ}Fd£j‹ĈZĆÆ‹¤T‚č\\Dƒ}O÷š£Uˆ§~ŃG™‚åŃDĝ¸œTsd¶¶Bªš¤u¢ŌĎo~t¾ÍŶÒtD¦Ú„iôö‰€z›ØX²ghįh½Û±¯€ÿm·zR¦Ɵ`ªŊÃh¢rOԍ´£Ym¼èêf¯ŪĽn„†cÚbŒw\\zlvWžªâˆ ¦g–mĿBş£¢ƹřbĥkǫßeeZkÙIKueT»sVesb‘aĕ ¶®dNœĄÄpªyސ¼—„³BE˜®l‡ŽGœŭCœǶwêżĔÂe„pÍÀQƞpC„–¼ŲÈ­AÎô¶R„ä’Q^Øu¬°š_Èôc´¹ò¨P΢hlϦ´Ħ“Æ´sâDŽŲPnÊD^¯°’Upv†}®BP̪–jǬx–Söwlfòªv€qĸ|`H€­viļ€ndĜ­Ćhň•‚em·FyށqóžSᝑ³X_ĞçêtryvL¤§z„¦c¦¥jnŞk˜ˆlD¤øz½ĜàžĂŧMÅ|áƆàÊcðÂF܎‚áŢ¥\\\\º™İøÒÐJĴ‡„îD¦zK²ǏÎEh~’CD­hMn^ÌöÄ©ČZÀžaü„fɭyœpį´ěFűk]Ôě¢qlÅĆÙa¶~Äqššê€ljN¬¼H„ÊšNQ´ê¼VظE††^ŃÒyŒƒM{ŒJLoÒœęæŸe±Ķ›y‰’‡gã“¯JYÆĭĘëo¥Š‰o¯hcK«z_pŠrC´ĢÖY”—¼ v¸¢RŽÅW³Â§fǸYi³xR´ďUˊ`êĿU„û€uĆBƒƣö‰N€DH«Ĉg†——Ñ‚aB{ÊNF´¬c·Åv}eÇÃGB»”If•¦HňĕM…~[iwjUÁKE•Ž‹¾dĪçW›šI‹èÀŒoÈXòyŞŮÈXâÎŚŠj|àsRy‹µÖ›–Pr´þŒ ¸^wþTDŔ–Hr¸‹žRÌmf‡żÕâCôox–ĜƌÆĮŒ›Ð–œY˜tâŦÔ@]ÈǮƒ\\μģUsȯLbîƲŚºyh‡rŒŠ@ĒԝƀŸÀ²º\\êp“’JŠ}ĠvŠqt„Ġ@^xÀ£È†¨mËÏğ}n¹_¿¢×Y_æpˆÅ–A^{½•Lu¨GO±Õ½ßM¶w’ÁĢۂP‚›Ƣ¼pcIJxŠ|ap̬HšÐŒŊSfsðBZ¿©“XÏÒK•k†÷Eû¿‰S…rEFsÕūk”óVǥʼniTL‚¡n{‹uxţÏh™ôŝ¬ğōN“‘NJkyPaq™Âğ¤K®‡YŸxÉƋÁ]āęDqçgOg†ILu—\\_gz—]W¼ž~CÔē]bµogpў_oď`´³Țkl`IªºÎȄqÔþž»E³ĎSJ»œ_f·‚adÇqƒÇc¥Á_Źw{™L^ɱćx“U£µ÷xgĉp»ĆqNē`rĘzaĵĚ¡K½ÊBzyäKXqiWPÏɸ½řÍcÊG|µƕƣG˛÷Ÿk°_^ý|_zċBZocmø¯hhcæ\\lˆMFlư£Ĝ„ÆyH“„F¨‰µêÕ]—›HA…àӄ^it `þßäkŠĤÎT~Wlÿ¨„ÔPzUC–NVv [jâôDôď[}ž‰z¿–msSh‹¯{jïğl}šĹ[–őŒ‰gK‹©U·µË@¾ƒm_~q¡f¹…ÅË^»‘f³ø}Q•„¡Ö˳gͱ^ǁ…\\ëÃA_—¿bW›Ï[¶ƛ鏝£F{īZgm@|kHǭƁć¦UĔťƒ×ë}ǝƒeďºȡȘÏíBə£āĘPªij¶“ʼnÿ‡y©n‰ď£G¹¡I›Š±LÉĺÑdĉ܇W¥˜‰}g˜Á†{aqÃ¥aŠıęÏZ—ï`"],"encodeOffsets":[[104636,22969]]}},{"type":"Feature","id":"540000","properties":{"id":"540000","cp":[89.132212,30.860361],"name":"西藏","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@hžľxŽŖ‰xƒÒVކºÅâAĪÝȆµę¯Ňa±r_w~uSÕň‘qOj]ɄQ…£Z……UDûoY’»©M[‹L¼qãË{V͕çWViŽ]ë©Ä÷àyƛh›ÚU°ŒŒa”d„cQƒ~Mx¥™cc¡ÙaSyF—ցk­ŒuRýq¿Ôµ•QĽ³aG{¿FµëªéĜÿª@¬·–K‰·àariĕĀ«V»Ŷ™Ĵū˜gèLǴŇƶaf‹tŒèBŚ£^Šâ†ǐÝ®–šM¦ÁǞÿ¬LhŸŽJ¾óƾƺcxw‹f]Y…´ƒ¦|œQLn°aœdĊ…œ\\¨o’œǀÍŎœ´ĩĀd`tÊQŞŕ|‚¨C^©œĈ¦„¦ÎJĊ{ŽëĎjª²rЉšl`¼Ą[t|¦St辉PŒÜK¸€d˜Ƅı]s¤—î_v¹ÎVòŦj˜£Əsc—¬_Ğ´|٘¦Avަw`ăaÝaa­¢e¤ı²©ªSªšÈMĄwžÉØŔì@T‘¤—Ę™\\õª@”þo´­xA s”ÂtŎKzó´ÇĊµ¢rž^nĊ­Æ¬×üGž¢‚³ {âĊ]š™G‚~bÀgVjzlhǶf€žOšfdЉªB]pj„•TO–tĊ‚n¤}®¦ƒČ¥d¢¼»ddš”Y¼Žt—¢eȤJ¤}Ǿ¡°§¤AГlc@ĝ”sªćļđAç‡wx•UuzEÖġ~AN¹ÄÅȀݦ¿ģŁéì±H…ãd«g[؉¼ēÀ•cīľġ¬cJ‘µ…ÐʥVȝ¸ßS¹†ý±ğkƁ¼ą^ɛ¤Ûÿ‰b[}¬ōõÃ]ËNm®g@•Bg}ÍF±ǐyL¥íCˆƒIij€Ï÷њį[¹¦[⚍EÛïÁÉdƅß{âNÆāŨߝ¾ě÷yC£‡k­´ÓH@¹†TZ¥¢įƒ·ÌAЧ®—Zc…v½ŸZ­¹|ŕWZqgW“|ieZÅYVӁqdq•bc²R@†c‡¥Rã»Ge†ŸeƃīQ•}J[ғK…¬Ə|o’ėjġĠÑN¡ð¯EBčnwôɍėªƒ²•CλŹġǝʅįĭạ̃ūȹ]ΓͧgšsgȽóϧµǛ†ęgſ¶ҍć`ĘąŌJޚä¤rÅň¥ÖÁUětęuůÞiĊÄÀ\\Æs¦ÓRb|Â^řÌkÄŷ¶½÷‡f±iMݑ›‰@ĥ°G¬ÃM¥n£Øą‚ğ¯ß”§aëbéüÑOčœk£{\\‘eµª×M‘šÉfm«Ƒ{Å׃Gŏǩãy³©WÑăû‚··‘Q—òı}¯ã‰I•éÕÂZ¨īès¶ZÈsŽæĔTŘvŽgÌsN@îá¾ó@‰˜ÙwU±ÉT廣TđŸWxq¹Zo‘b‹s[׌¯cĩv‡Œėŧ³BM|¹k‰ªħ—¥TzNYnݍßpęrñĠĉRS~½ŠěVVе‚õ‡«ŒM££µB•ĉ¥áºae~³AuĐh`Ü³ç@BۘïĿa©|z²Ý¼D”£à貋ŸƒIƒû›I ā€óK¥}rÝ_Á´éMaň¨€~ªSĈ½Ž½KÙóĿeƃÆBŽ·¬ën×W|Uº}LJrƳ˜lŒµ`bÔ`QˆˆÐÓ@s¬ñIŒÍ@ûws¡åQÑßÁ`ŋĴ{Ī“T•ÚÅTSij‚‹Yo|Ç[ǾµMW¢ĭiÕØ¿@˜šMh…pÕ]j†éò¿OƇĆƇp€êĉâlØw–ěsˆǩ‚ĵ¸c…bU¹ř¨WavquSMzeo_^gsÏ·¥Ó@~¯¿RiīB™Š\\”qTGªÇĜçPoŠÿfñòą¦óQīÈáP•œābß{ƒZŗĸIæÅ„hnszÁCËìñšÏ·ąĚÝUm®ó­L·ăU›Èíoù´Êj°ŁŤ_uµ^‘°Œìǖ@tĶĒ¡Æ‡M³Ģ«˜İĨÅ®ğ†RŽāð“ggheÆ¢z‚Ê©Ô\\°ÝĎz~ź¤Pn–MĪÖB£Ÿk™n鄧żćŠ˜ĆK„ǰ¼L¶è‰âz¨u¦¥LDĘz¬ýÎmĘd¾ß”Fz“hg²™Fy¦ĝ¤ċņbΛ@y‚Ąæm°NĮZRÖíŽJ²öLĸÒ¨Y®ƌÐV‰à˜tt_ڀÂyĠzž]Ţh€zĎ{†ĢX”ˆc|šÐqŽšfO¢¤ög‚ÌHNŽ„PKŖœŽ˜Uú´xx[xˆvĐCûŠìÖT¬¸^}Ìsòd´_އKgžLĴ…ÀBon|H@–Êx˜—¦BpŰˆŌ¿fµƌA¾zLjRxжF”œkĄźRzŀˆ~¶[”´Hnª–VƞuĒ­È¨ƎcƽÌm¸ÁÈM¦x͊ëÀxdžB’šú^´W†£–d„kɾĬpœw‚˂ØɦļĬIŚœÊ•n›Ŕa¸™~J°î”lɌxĤÊÈðhÌ®‚g˜T´øŽàCˆŽÀ^ªerrƘdž¢İP|Ė ŸWœªĦ^¶´ÂL„aT±üWƜ˜ǀRšŶUńšĖ[QhlLüA†‹Ü\\†qR›Ą©"],"encodeOffsets":[[90849,37210]]}},{"type":"Feature","id":"610000","properties":{"id":"610000","cp":[108.948024,34.263161],"name":"陕西","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@˜p¢—ȮµšûG™Ħ}Ħšðǚ¶òƄ€jɂz°{ºØkÈęâ¦jª‚Bg‚\\œċ°s¬Ž’]jžú ‚E”Ȍdž¬s„t‡”RˆÆdĠݎwܔ¸ôW¾ƮłÒ_{’Ìšû¼„jº¹¢GǪÒ¯ĘƒZ`ºŊƒecņąš~BÂgzpâēòYǠȰÌTΨÂWœ|fcŸă§uF—Œ@NŸ¢XLƒŠRMº[ğȣſï|¥J™kc`sʼnǷ’Y¹‹W@µ÷K…ãï³ÛIcñ·VȋڍÒķø©—þ¥ƒy‚ÓŸğęmWµÎumZyOŅƟĥÓ~sÑL¤µaŅY¦ocyZ{‰y c]{ŒTa©ƒ`U_Ěē£ωÊƍKù’K¶ȱÝƷ§{û»ÅÁȹÍéuij|¹cÑd‘ŠìUYƒŽO‘uF–ÕÈYvÁCqӃT•Ǣí§·S¹NgŠV¬ë÷Át‡°Dد’C´ʼnƒópģ}„ċcE˅FŸŸéGU¥×K…§­¶³B‹Č}C¿åċ`wġB·¤őcƭ²ő[Å^axwQO…ÿEËߌ•ĤNĔŸwƇˆÄŠńwĪ­Šo[„_KÓª³“ÙnK‰Çƒěœÿ]ď€ă_d©·©Ýŏ°Ù®g]±„Ÿ‡ß˜å›—¬÷m\\›iaǑkěX{¢|ZKlçhLt€Ňîŵ€œè[€É@ƉĄEœ‡tƇÏ˜³­ħZ«mJ…›×¾‘MtÝĦ£IwÄå\\Õ{‡˜ƒOwĬ©LÙ³ÙgBƕŀr̛ĢŭO¥lãyC§HÍ£ßEñŸX¡—­°ÙCgpťz‘ˆb`wI„vA|§”‡—hoĕ@E±“iYd¥OϹS|}F@¾oAO²{tfžÜ—¢Fǂ҈W²°BĤh^Wx{@„¬‚­F¸¡„ķn£P|ŸªĴ@^ĠĈæb–Ôc¶l˜Yi…–^Mi˜cϰÂ[ä€vï¶gv@À“Ĭ·lJ¸sn|¼u~a]’ÆÈtŌºJp’ƒþ£KKf~ЦUbyäIšĺãn‡Ô¿^­žŵMT–hĠܤko¼Ŏìąǜh`[tŒRd²IJ_œXPrɲ‰l‘‚XžiL§àƒ–¹ŽH˜°Ȧqº®QC—bA†„ŌJ¸ĕÚ³ĺ§ `d¨YjžiZvRĺ±öVKkjGȊĐePОZmļKÀ€‚[ŠŽ`ösìh†ïÎoĬdtKÞ{¬èÒÒBŒÔpIJÇĬJŊ¦±J«ˆY§‹@·pH€µàåVKe›pW†ftsAÅqC·¬ko«pHÆuK@oŸHĆۄķhx“e‘n›S³àǍrqƶRbzy€¸ËАl›¼EºpĤ¼Œx¼½~Ğ’”à@†ÚüdK^ˆmÌSj"],"encodeOffsets":[[110234,38774]]}},{"type":"Feature","id":"620000","properties":{"id":"620000","cp":[103.823557,36.058039],"name":"甘肃","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@VuUv"],["@@ũ‹EĠtt~nkh`Q‰¦ÅÄÜdw˜Ab×ĠąJˆ¤DüègĺqBqœj°lI¡ĨÒ¤úSHbš‡ŠjΑBаaZˆ¢KJŽ’O[|A£žDx}Nì•HUnrk„ kp€¼Y kMJn[aG‚áÚÏ[½rc†}aQxOgsPMnUs‡nc‹Z…ž–sKúvA›t„Þġ’£®ĀYKdnFwš¢JE°”Latf`¼h¬we|€Æ‡šbj}GA€·~WŽ”—`†¢MC¤tL©IJ°qdf”O‚“bÞĬ¹ttu`^ZúE`Œ[@„Æsîz®¡’C„ƳƜG²“R‘¢R’m”fŽwĸg܃‚ą G@pzJM½mŠhVy¸uÈÔO±¨{LfæU¶ßGĂq\\ª¬‡²I‚¥IʼnÈīoı‹ÓÑAçÑ|«LÝcspīðÍg…të_õ‰\\ĉñLYnĝg’ŸRǡÁiHLlõUĹ²uQjYi§Z_c¨Ÿ´ĹĖÙ·ŋI…ƒaBD˜­R¹ȥr—¯G•ºß„K¨jWk’ɱŠOq›Wij\\a­‹Q\\sg_ĆǛōëp»£lğۀgS•ŶN®À]ˆÓäm™ĹãJaz¥V}‰Le¤L„ýo‘¹IsŋÅÇ^‘Žbz…³tmEÁ´aйcčecÇN•ĊãÁ\\蝗dNj•]j†—ZµkÓda•ćå]ğij@ ©O{¤ĸm¢ƒE·®ƒ«|@Xwg]A챝‡XǁÑdzªc›wQÚŝñsÕ³ÛV_ýƒ˜¥\\ů¥©¾÷w—Ž©WÕÊĩhÿÖÁRo¸V¬âDb¨šhûx–Ê×nj~Zâƒg|šXÁnßYoº§ZÅŘvŒ[„ĭÖʃuďxcVbnUSf…B¯³_Tzº—ΕO©çMÑ~Mˆ³]µ^püµ”ŠÄY~y@X~¤Z³€[Èōl@®Å¼£QKƒ·Di‹¡By‘ÿ‰Q_´D¥hŗyƒ^ŸĭÁZ]cIzý‰ah¹MĪğP‘s{ò‡‹‘²Vw¹t³Ŝˁ[ŽÑ}X\\gsFŸ£sPAgěp×ëfYHāďÖqēŭOÏë“dLü•\\iŒ”t^c®šRʺ¶—¢H°mˆ‘rYŸ£BŸ¹čIoľu¶uI]vģSQ{ƒUŻ”Å}QÂ|̋°ƅ¤ĩŪU ꡞÌZҞ\\v˜²PĔ»ƢNHƒĂyAmƂwVmž`”]ȏb•”H`‰Ì¢²ILvĜ—H®¤Dlt_„¢JJÄämèÔDëþgºƫ™”aʎÌrêYi~ ÎݤNpÀA¾Ĕ¼b…ð÷’Žˆ‡®‚”üs”zMzÖĖQdȨý†v§Tè|ªH’þa¸|šÐ ƒwKĢx¦ivr^ÿ ¸l öæfƟĴ·PJv}n\\h¹¶v†·À|\\ƁĚN´Ĝ€çèÁz]ġ¤²¨QÒŨTIl‡ªťØ}¼˗ƦvÄùØE‹’«Fï˛Iq”ōŒTvāÜŏ‚íÛߜÛV—j³âwGăÂíNOŠˆŠPìyV³ʼnĖýZso§HіiYw[߆\\X¦¥c]ÔƩÜ·«j‡ÐqvÁ¦m^ċ±R™¦΋ƈťĚgÀ»IïĨʗƮްƝ˜ĻþÍAƉſ±tÍEÕÞāNU͗¡\\ſčåÒʻĘm ƭÌŹöʥ’ëQ¤µ­ÇcƕªoIýˆ‰Iɐ_mkl³ă‰Ɠ¦j—¡Yz•Ňi–}Msßõ–īʋ —}ƒÁVmŸ_[n}eı­Uĥ¼‘ª•I{ΧDӜƻėoj‘qYhĹT©oūĶ£]ďxĩ‹ǑMĝ‰q`B´ƃ˺Ч—ç~™²ņj@”¥@đ´ί}ĥtPńǾV¬ufӃÉC‹tÓ̻‰…¹£G³€]ƖƾŎĪŪĘ̖¨ʈĢƂlɘ۪üºňUðǜȢƢż̌ȦǼ‚ĤŊɲĖ­Kq´ï¦—ºĒDzņɾªǀÞĈĂD†½ĄĎÌŗĞrôñnŽœN¼â¾ʄľԆ|DŽŽ֦ज़ȗlj̘̭ɺƅêgV̍ʆĠ·ÌĊv|ýĖÕWĊǎÞ´õ¼cÒÒBĢ͢UĜð͒s¨ňƃLĉÕÝ@ɛƯ÷¿Ľ­ĹeȏijëCȚDŲyê×Ŗyò¯ļcÂßY…tÁƤyAã˾J@ǝrý‹‰@¤…rz¸oP¹ɐÚyᐇHŸĀ[Jw…cVeȴϜ»ÈŽĖ}ƒŰŐèȭǢόĀƪÈŶë;Ñ̆ȤМľĮEŔ—ĹŊũ~ËUă{ŸĻƹɁύȩþĽvĽƓÉ@ē„ĽɲßǐƫʾǗĒpäWÐxnsÀ^ƆwW©¦cÅ¡Ji§vúF¶Ž¨c~c¼īŒeXǚ‹\\đ¾JŽwÀďksãA‹fÕ¦L}wa‚o”Z’‹D½†Ml«]eÒÅaɲáo½FõÛ]ĻÒ¡wYR£¢rvÓ®y®LF‹LzĈ„ôe]gx}•|KK}xklL]c¦£fRtív¦†PĤoH{tK"]],"encodeOffsets":[[[108619,36299]],[[108589,36341]]]}},{"type":"Feature","id":"630000","properties":{"id":"630000","cp":[96.778916,35.623178],"name":"青海","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@InJm"],["@@CƒÆ½OŃĦsΰ~dz¦@@“Ņiš±è}ؘƄ˹A³r_ĞŠǒNΌĐw¤^ŬĵªpĺSZg’rpiƼĘԛ¨C|͖J’©Ħ»®VIJ~f\\m `Un„˜~ʌŸ•ĬàöNt•~ňjy–¢Zi˜Ɣ¥ĄŠk´nl`JʇŠJþ©pdƖ®È£¶ìRʦ‘źõƮËnŸʼėæÑƀĎ[‚˜¢VÎĂMÖÝÎF²sƊƀÎBļýƞ—¯ʘƭðħ¼Jh¿ŦęΌƇš¥²Q]Č¥nuÂÏriˆ¸¬ƪÛ^Ó¦d€¥[Wà…x\\ZŽjҕ¨GtpþYŊĕ´€zUO뇉P‰îMĄÁxH´á˜iÜUà›îÜՁĂÛSuŎ‹r“œJð̬EŒ‘FÁú×uÃÎkr“Ē{V}İ«O_ÌËĬ©ŽÓŧSRѱ§Ģ£^ÂyèçěM³Ƃę{[¸¿u…ºµ[gt£¸OƤĿéYŸõ·kŸq]juw¥Dĩƍ€õÇPéĽG‘ž©ã‡¤G…uȧþRcÕĕNy“yût“ˆ­‡ø‘†ï»a½ē¿BMoᣟÍj}éZËqbʍš“Ƭh¹ìÿÓAçãnIáI`ƒks£CG­ě˜Uy×Cy•…’Ÿ@¶ʡÊBnāzG„ơMē¼±O÷õJËĚăVŸĪũƆ£Œ¯{ËL½Ìzż“„VR|ĠTbuvJvµhĻĖH”Aëáa…­OÇðñęNw‡…œľ·L›mI±íĠĩPÉ×®ÿs—’cB³±JKßĊ«`…ađ»·QAmO’‘Vţéÿ¤¹SQt]]Çx€±¯A@ĉij¢Ó祖•ƒl¶ÅÛr—ŕspãRk~¦ª]Į­´“FR„åd­ČsCqđéFn¿Åƃm’Éx{W©ºƝºįkÕƂƑ¸wWūЩÈFž£\\tÈ¥ÄRÈýÌJ ƒlGr^×äùyÞ³fj”c†€¨£ÂZ|ǓMĝšÏ@ëÜőR‹›ĝ‰Œ÷¡{aïȷPu°ËXÙ{©TmĠ}Y³’­ÞIňµç½©C¡į÷¯B»|St»›]vƒųƒs»”}MÓ ÿʪƟǭA¡fs˜»PY¼c¡»¦c„ċ­¥£~msĉP•–Siƒ^o©A‰Šec‚™PeǵŽkg‚yUi¿h}aH™šĉ^|ᴟ¡HØûÅ«ĉ®]m€¡qĉ¶³ÈyôōLÁst“BŸ®wn±ă¥HSò뚣˜S’ë@לÊăxÇN©™©T±ª£IJ¡fb®ÞbŽb_Ą¥xu¥B—ž{łĝ³«`d˜Ɛt—¤ťiñžÍUuºí`£˜^tƃIJc—·ÛLO‹½Šsç¥Ts{ă\\_»™kϊ±q©čiìĉ|ÍIƒ¥ć¥›€]ª§D{ŝŖÉR_sÿc³Īō›ƿΑ›§p›[ĉ†›c¯bKm›R¥{³„Z†e^ŽŒwx¹dƽŽôIg §Mĕ ƹĴ¿—ǣÜ̓]‹Ý–]snåA{‹eŒƭ`ǻŊĿ\\ijŬű”YÂÿ¬jĖqŽßbЏ•L«¸©@ěĀ©ê¶ìÀEH|´bRľž–Ó¶rÀQþ‹vl®Õ‚E˜TzÜdb ˜hw¤{LR„ƒd“c‹b¯‹ÙVgœ‚ƜßzÃô쮍^jUèXΖ|UäÌ»rKŽ\\ŒªN‘¼pZCü†VY††¤ɃRi^rPҒTÖ}|br°qňb̰ªiƶGQ¾²„x¦PœmlŜ‘[Ĥ¡ΞsĦŸÔÏâ\\ªÚŒU\\f…¢N²§x|¤§„xĔsZPòʛ²SÐqF`ª„VƒÞŜĶƨVZŒÌL`ˆ¢dŐIqr\\oäõ–F礻Ŷ×h¹]Clـ\\¦ďÌį¬řtTӺƙgQÇÓHţĒ”´ÃbEÄlbʔC”|CˆŮˆk„Ʈ[ʼ¬ňœ´KŮÈΰÌζƶlð”ļA†TUvdTŠG†º̼ŠÔ€ŒsÊDԄveOg"]],"encodeOffsets":[[[105308,37219]],[[95370,40081]]]}},{"type":"Feature","id":"640000","properties":{"id":"640000","cp":[106.278179,37.26637],"name":"宁夏","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@KëÀęĞ«OęȿȕŸı]ʼn¡åįÕÔ«Ǵõƪ™ĚQÐZhv K°›öqÀѐS[ÃÖHƖčË‡nL]ûc…Ùß@‚“ĝ‘¾}w»»‹oģF¹œ»kÌÏ·{zPƒ§B­¢íyÅt@ƒ@áš]Yv_ssģ¼i߁”ĻL¾ġsKD£¡N_…“˜X¸}B~Haiˆ™Åf{«x»ge_bs“KF¯¡Ix™mELcÿZ¤­Ģ‘ƒÝœsuBLù•t†ŒYdˆmVtNmtOPhRw~bd…¾qÐ\\âÙH\\bImlNZŸ»loƒŸqlVm–Gā§~QCw¤™{A\\‘PKŸNY‡¯bF‡kC¥’sk‹Šs_Ã\\ă«¢ħkJi¯r›rAhĹûç£CU‡ĕĊ_ԗBixÅُĄnªÑaM~ħpOu¥sîeQ¥¤^dkKwlL~{L~–hw^‚ófćƒKyEŒ­K­zuÔ¡qQ¤xZÑ¢^ļöܾEpž±âbÊÑÆ^fk¬…NC¾‘Œ“YpxbK~¥Že֎ŒäBlt¿Đx½I[ĒǙŒWž‹f»Ĭ}d§dµùEuj¨‚IÆ¢¥dXªƅx¿]mtÏwßR͌X¢͎vÆzƂZò®ǢÌʆCrâºMÞzžÆMҔÊÓŊZľ–r°Î®Ȉmª²ĈUªĚøºˆĮ¦ÌĘk„^FłĬhĚiĀ˾iİbjÕ"],["@@mfwěwMrŢªv@G‰"]],"encodeOffsets":[[[109366,40242]],[[108600,36303]]]}},{"type":"Feature","id":"650000","properties":{"id":"650000","cp":[85.617733,40.792818],"name":"新疆","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@QØĔ²X¨”~ǘBºjʐߨvK”ƔX¨vĊOžÃƒ·¢i@~c—‡ĝe_«”Eš“}QxgɪëÏÃ@sÅyXoŖ{ô«ŸuX…ê•Îf`œC‚¹ÂÿÐGĮÕĞXŪōŸMźÈƺQèĽôe|¿ƸJR¤ĘEjcUóº¯Ĩ_ŘÁMª÷Ð¥Oéȇ¿ÖğǤǷÂF҇zÉx[]­Ĥĝ‰œ¦EP}ûƥé¿İƷTėƫœŕƅ™ƱB»Đ±’ēO…¦E–•}‘`cȺrĦáŖuҞª«IJ‡πdƺÏØZƴwʄ¤ĖGЙǂZ̓èH¶}ÚZצʥĪï|ÇĦMŔ»İĝLj‹ì¥Βœba­¯¥ǕǚkĆŵĦɑĺƯxūД̵nơʃĽá½M»›òmqóŘĝč˾ăC…ćāƿÝɽ©DZŅ¹đ¥˜³ðLrÁ®ɱĕģʼnǻ̋ȥơŻǛȡVï¹Ň۩ûkɗġƁ§ʇė̕ĩũƽō^ƕŠUv£ƁQï“Ƶkŏ½ΉÃŭdzLқʻ«ƭ\\lƒ‡ŭD‡“{ʓDkaFÃÄa“³ŤđÔGRÈƚhSӹŚsİ«ĐË[¥ÚDkº^Øg¼ŵ¸£EÍö•€ůʼnT¡c_‡ËKY‹ƧUśĵ„݃U_©rETÏʜ±OñtYw獃{£¨uM³x½şL©Ùá[ÓÐĥ Νtģ¢\\‚ś’nkO›w¥±ƒT»ƷFɯàĩÞáB¹Æ…ÑUw„੍žĽw[“mG½Èå~‡Æ÷QyŠěCFmĭZī—ŵVÁ™ƿQƛ—ûXS²‰b½KϽĉS›©ŷXĕŸ{ŽĕK·¥Ɨcqq©f¿]‡ßDõU³h—­gËÇïģÉɋw“k¯í}I·šœbmœÉ–ř›īJɥĻˁ×xo›ɹī‡l•c…¤³Xù]‘™DžA¿w͉ì¥wÇN·ÂËnƾƍdǧđ®Ɲv•Um©³G\\“}µĿ‡QyŹl㓛µEw‰LJQ½yƋBe¶ŋÀů‡ož¥A—˜Éw@•{Gpm¿Aij†ŽKLhˆ³`ñcËtW‚±»ÕS‰ëüÿďD‡u\\wwwù³—V›LŕƒOMËGh£õP¡™er™Ïd{“‡ġWÁ…č|yšg^ğyÁzÙs`—s|ÉåªÇ}m¢Ń¨`x¥’ù^•}ƒÌ¥H«‰Yªƅ”Aйn~Ꝛf¤áÀz„gŠÇDIԝ´AňĀ҄¶ûEYospõD[{ù°]u›Jq•U•|Soċxţ[õÔĥkŋÞŭZ˺óYËüċrw €ÞkrťË¿XGÉbřaDü·Ē÷Aê[Ää€I®BÕИÞ_¢āĠpŠÛÄȉĖġDKwbm‡ÄNô‡ŠfœƫVÉvi†dz—H‘‹QµâFšù­Âœ³¦{YGžƒd¢ĚÜO „€{Ö¦ÞÍÀPŒ^b–ƾŠlŽ[„vt×ĈÍE˨¡Đ~´î¸ùÎh€uè`¸ŸHÕŔVºwĠââWò‡@{œÙNÝ´ə²ȕn{¿¥{l—÷eé^e’ďˆXj©î\\ªÑò˜Üìc\\üqˆÕ[Č¡xoÂċªbØ­Œø|€¶ȴZdÆÂšońéŒGš\\”¼C°ÌƁn´nxšÊOĨ’ہƴĸ¢¸òTxÊǪMīИÖŲÃɎOvˆʦƢ~FއRěò—¿ġ~åŊœú‰Nšžš¸qŽ’Ę[Ĕ¶ÂćnÒPĒÜvúĀÊbÖ{Äî¸~Ŕünp¤ÂH¾œĄYÒ©ÊfºmԈĘcDoĬMŬ’˜S¤„s²‚”ʘچžȂVŦ –ŽèW°ªB|IJXŔþÈJĦÆæFĚêŠYĂªĂ]øªŖNÞüA€’fɨJ€˜¯ÎrDDšĤ€`€mz\\„§~D¬{vJÂ˜«lµĂb–¤p€ŌŰNĄ¨ĊXW|ų ¿¾ɄĦƐMT”‡òP˜÷fØĶK¢ȝ˔Sô¹òEð­”`Ɩ½ǒÂň×äı–§ĤƝ§C~¡‚hlå‚ǺŦŞkâ’~}ŽFøàIJaĞ‚fƠ¥Ž„Ŕdž˜®U¸ˆźXœv¢aƆúŪtŠųƠjd•ƺŠƺÅìnrh\\ĺ¯äɝĦ]èpĄ¦´LƞĬŠ´ƤǬ˼Ēɸ¤rºǼ²¨zÌPðŀbþ¹ļD¢¹œ\\ĜÑŚŸ¶ZƄ³àjĨoâŠȴLʉȮŒĐ­ĚăŽÀêZǚŐ¤qȂ\\L¢ŌİfÆs|zºeªÙæ§΢{Ā´ƐÚ¬¨Ĵà²łhʺKÞºÖTŠiƢ¾ªì°`öøu®Ê¾ãØ"],"encodeOffsets":[[88824,50096]]}},{"type":"Feature","id":"110000","properties":{"id":"110000","cp":[116.405285,39.904989],"name":"北京","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@ĽOÁ›ûtŷmiÍt_H»Ĩ±d`й­{bw…Yr“³S]§§o¹€qGtm_Sŧ€“oa›‹FLg‘QN_•dV€@Zom_ć\\ߚc±x¯oœRcfe…£’o§ËgToÛJíĔóu…|wP¤™XnO¢ÉˆŦ¯rNÄā¤zâŖÈRpŢZŠœÚ{GŠrFt¦Òx§ø¹RóäV¤XdˆżâºWbwڍUd®bêņ¾‘jnŎGŃŶŠnzÚSeîĜZczî¾i]͜™QaúÍÔiþĩȨWĢ‹ü|Ėu[qb[swP@ÅğP¿{\\‡¥A¨Ï‘Ѩj¯ŠX\\¯œMK‘pA³[H…īu}}"],"encodeOffsets":[[120023,41045]]}},{"type":"Feature","id":"120000","properties":{"id":"120000","cp":[117.190182,39.125596],"name":"天津","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@ŬgX§Ü«E…¶Ḟ“¬O_™ïlÁg“z±AXe™µÄĵ{¶]gitgšIj·›¥îakS€‰¨ÐƎk}ĕ{gB—qGf{¿a†U^fI“ư‹³õ{YƒıëNĿžk©ïËZŏ‘R§òoY×Ógc…ĥs¡bġ«@dekąI[nlPqCnp{ˆō³°`{PNdƗqSÄĻNNâyj]äžÒD ĬH°Æ]~¡HO¾ŒX}ÐxŒgp“gWˆrDGˆŒpù‚Š^L‚ˆrzWxˆZ^¨´T\\|~@I‰zƒ–bĤ‹œjeĊªz£®Ĕvě€L†mV¾Ô_ȔNW~zbĬvG†²ZmDM~”~"],"encodeOffsets":[[120237,41215]]}},{"type":"Feature","id":"310000","properties":{"id":"310000","cp":[121.472644,31.231706],"name":"上海","childNum":6},"geometry":{"type":"MultiPolygon","coordinates":[["@@ɧư¬EpƸÁxc‡"],["@@©„ªƒ"],["@@”MA‹‘š"],["@@Qp݁E§ÉC¾"],["@@bŝՕÕEȣÚƥêImɇǦèÜĠŒÚžÃƌÃ͎ó"],["@@ǜûȬɋŠŭ™×^‰sYŒɍDŋ‘ŽąñCG²«ªč@h–_p¯A{‡oloY€¬j@IJ`•gQڛhr|ǀ^MIJvtbe´R¯Ô¬¨YŽô¤r]ì†Ƭį"]],"encodeOffsets":[[[124702,32062]],[[124547,32200]],[[124808,31991]],[[124726,32110]],[[124903,32376]],[[124438,32149]]]}},{"type":"Feature","id":"500000","properties":{"id":"500000","cp":[107.304962,29.533155],"name":"重庆","childNum":2},"geometry":{"type":"MultiPolygon","coordinates":[["@@vjG~nGŘŬĶȂƀƾ¹¸ØÎezĆT¸}êЖqHŸðqĖ䒊¥^CƒIj–²p…\\_ æüY|[YxƊæuž°xb®…Űb@~¢NQt°¶‚Sæ “Ê~rljĔëĚ¢~šuf`‘‚†fa‚ĔJåĊ„nÖ]„jƎćÊ@Š£¾a®£Ű{ŶĕF‹ègLk{Y|¡ĜWƔtƬJÑxq‹±ĢN´‰òK‰™–LÈüD|s`ŋ’ć]ƒÃ‰`đŒMûƱ½~Y°ħ`ƏíW‰½eI‹½{aŸ‘OIrÏ¡ĕŇa†p†µÜƅġ‘œ^ÖÛbÙŽŏml½S‹êqDu[R‹ãË»†ÿw`»y‘¸_ĺę}÷`M¯ċfCVµqʼn÷Z•gg“Œ`d½pDO‡ÎCnœ^uf²ènh¼WtƏxRGg¦…pV„†FI±ŽG^ŒIc´ec‡’G•ĹÞ½sëĬ„h˜xW‚}Kӈe­Xsbk”F¦›L‘ØgTkïƵNï¶}Gy“w\\oñ¡nmĈzjŸ•@™Óc£»Wă¹Ój“_m»ˆ¹·~MvÛaqœ»­‰êœ’\\ÂoVnŽÓØÍ™²«‹bq¿efE „€‹Ĝ^Qž~ Évý‡ş¤²Į‰pEİ}zcĺƒL‹½‡š¿gņ›¡ýE¡ya£³t\\¨\\vú»¼§·Ñr_oÒý¥u‚•_n»_ƒ•At©Þűā§IVeëƒY}{VPÀFA¨ąB}q@|Ou—\\Fm‰QF݅Mw˜å}]•€|FmϋCaƒwŒu_p—¯sfÙgY…DHl`{QEfNysBЦzG¸rHe‚„N\\CvEsÐùÜ_·ÖĉsaQ¯€}_U‡†xÃđŠq›NH¬•Äd^ÝŰR¬ã°wećJEž·vÝ·Hgƒ‚éFXjÉê`|yŒpxkAwœWĐpb¥eOsmzwqChóUQl¥F^laf‹anòsr›EvfQdÁUVf—ÎvÜ^efˆtET¬ôA\\œ¢sJŽnQTjP؈xøK|nBz‰„œĞ»LY‚…FDxӄvr“[ehľš•vN”¢o¾NiÂxGp⬐z›bfZo~hGi’]öF|‰|Nb‡tOMn eA±ŠtPT‡LjpYQ|†SH††YĀxinzDJ€Ìg¢và¥Pg‰_–ÇzII‹€II•„£®S¬„Øs쐣ŒN"],["@@ifjN@s"]],"encodeOffsets":[[[109628,30765]],[[111725,31320]]]}},{"type":"Feature","id":"810000","properties":{"id":"810000","cp":[114.173355,22.320048],"name":"香港","childNum":5},"geometry":{"type":"MultiPolygon","coordinates":[["@@AlBk"],["@@mŽn"],["@@EpFo"],["@@ea¢pl¸Eõ¹‡hj[ƒ]ÔCΖ@lj˜¡uBXŸ…•´‹AI¹…[‹yDUˆ]W`çwZkmc–…M›žp€Åv›}I‹oJlcaƒfёKްä¬XJmÐ đhI®æÔtSHn€Eˆ„ÒrÈc"],["@@rMUw‡AS®€e"]],"encodeOffsets":[[[117111,23002]],[[117072,22876]],[[117045,22887]],[[116975,23082]],[[116882,22747]]]}},{"type":"Feature","id":"820000","properties":{"id":"820000","cp":[113.54909,22.198951],"name":"澳门","childNum":1},"geometry":{"type":"Polygon","coordinates":["@@kÊd°å§s"],"encodeOffsets":[[116279,22639]]}}],"UTF8Encoding":true});})); \ No newline at end of file diff --git a/public/resource/assets/libs/echarts/echarts-wordcloud.min.js b/public/resource/assets/libs/echarts/echarts-wordcloud.min.js new file mode 100644 index 0000000..f66e691 --- /dev/null +++ b/public/resource/assets/libs/echarts/echarts-wordcloud.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e(require("echarts")):"function"==typeof define&&define.amd?define(["echarts"],e):"object"==typeof exports?exports["echarts-wordcloud"]=e(require("echarts")):t["echarts-wordcloud"]=e(t.echarts)}(this,function(t){return function(t){function e(n){if(r[n])return r[n].exports;var i=r[n]={i:n,l:!1,exports:{}};return t[n].call(i.exports,i,i.exports,e),i.l=!0,i.exports}var r={};return e.m=t,e.c=r,e.d=function(t,r,n){e.o(t,r)||Object.defineProperty(t,r,{configurable:!1,enumerable:!0,get:n})},e.n=function(t){var r=t&&t.__esModule?function(){return t.default}:function(){return t};return e.d(r,"a",r),r},e.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},e.p="",e(e.s=25)}([function(t,e){function r(t,e){G[t]=e}function n(t){if(null==t||"object"!=typeof t)return t;var e=t,r=W.call(t);if("[object Array]"===r){e=[];for(var i=0,a=t.length;i1e-10&&(i.width+=a/s,i.height+=a/s,i.x-=a/s/2,i.y-=a/s/2)}return i}return t},contain:function(t,e){var r=this.transformCoordToLocal(t,e),n=this.getBoundingRect(),i=this.style;if(t=r[0],e=r[1],n.contain(t,e)){var a=this.path.data;if(i.hasStroke()){var o=i.lineWidth,l=i.strokeNoScale?this.getLineScale():1;if(l>1e-10&&(i.hasFill()||(o=Math.max(o,this.strokeContainThreshold)),s.containStroke(a,o/l,t,e)))return!0}if(i.hasFill())return s.contain(a,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):i.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var r=this.shape;if(r){if(a.isObject(t))for(var n in t)t.hasOwnProperty(n)&&(r[n]=t[n]);else r[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&u(t[0]-1)>1e-10&&u(t[3]-1)>1e-10?Math.sqrt(u(t[0]*t[3]-t[2]*t[1])):1}},n.extend=function(t){var e=function(e){n.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var r=t.shape;if(r){this.shape=this.shape||{};var i=this.shape;for(var a in r)!i.hasOwnProperty(a)&&r.hasOwnProperty(a)&&(i[a]=r[a])}t.init&&t.init.call(this,e)};a.inherits(e,n);for(var r in t)"style"!==r&&"shape"!==r&&(e.prototype[r]=t[r]);return e},a.inherits(n,i);var f=n;t.exports=f},function(t,e){function r(t,e){var r=new S(2);return null==t&&(t=0),null==e&&(e=0),r[0]=t,r[1]=e,r}function n(t,e){return t[0]=e[0],t[1]=e[1],t}function i(t){var e=new S(2);return e[0]=t[0],e[1]=t[1],e}function a(t,e,r){return t[0]=e,t[1]=r,t}function o(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t}function s(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t}function l(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t}function h(t){return Math.sqrt(u(t))}function u(t){return t[0]*t[0]+t[1]*t[1]}function c(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t}function f(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t}function d(t,e){return t[0]*e[0]+t[1]*e[1]}function v(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t}function g(t,e){var r=h(e);return 0===r?(t[0]=0,t[1]=0):(t[0]=e[0]/r,t[1]=e[1]/r),t}function p(t,e){return Math.sqrt((t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1]))}function m(t,e){return(t[0]-e[0])*(t[0]-e[0])+(t[1]-e[1])*(t[1]-e[1])}function x(t,e){return t[0]=-e[0],t[1]=-e[1],t}function y(t,e,r,n){return t[0]=e[0]+n*(r[0]-e[0]),t[1]=e[1]+n*(r[1]-e[1]),t}function w(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[2]*i+r[4],t[1]=r[1]*n+r[3]*i+r[5],t}function _(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t}function b(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t}var S="undefined"==typeof Float32Array?Array:Float32Array,M=h,T=u,k=p,C=m;e.create=r,e.copy=n,e.clone=i,e.set=a,e.add=o,e.scaleAndAdd=s,e.sub=l,e.len=h,e.length=M,e.lenSquare=u,e.lengthSquare=T,e.mul=c,e.div=f,e.dot=d,e.scale=v,e.normalize=g,e.distance=p,e.dist=k,e.distanceSquare=m,e.distSquare=C,e.negate=x,e.lerp=y,e.applyTransform=w,e.min=_,e.max=b},function(t,e,r){function n(t,e,r,n){r<0&&(t+=r,r=-r),n<0&&(e+=n,n=-n),this.x=t,this.y=e,this.width=r,this.height=n}var i=r(2),a=r(8),o=i.applyTransform,s=Math.min,l=Math.max;n.prototype={constructor:n,union:function(t){var e=s(t.x,this.x),r=s(t.y,this.y);this.width=l(t.x+t.width,this.x+this.width)-e,this.height=l(t.y+t.height,this.y+this.height)-r,this.x=e,this.y=r},applyTransform:function(){var t=[],e=[],r=[],n=[];return function(i){if(i){t[0]=r[0]=this.x,t[1]=n[1]=this.y,e[0]=n[0]=this.x+this.width,e[1]=r[1]=this.y+this.height,o(t,t,i),o(e,e,i),o(r,r,i),o(n,n,i),this.x=s(t[0],e[0],r[0],n[0]),this.y=s(t[1],e[1],r[1],n[1]);var a=l(t[0],e[0],r[0],n[0]),h=l(t[1],e[1],r[1],n[1]);this.width=a-this.x,this.height=h-this.y}}}(),calculateTransform:function(t){var e=this,r=t.width/e.width,n=t.height/e.height,i=a.create();return a.translate(i,i,[-e.x,-e.y]),a.scale(i,i,[r,n]),a.translate(i,i,[t.x,t.y]),i},intersect:function(t){if(!t)return!1;t instanceof n||(t=n.create(t));var e=this,r=e.x,i=e.x+e.width,a=e.y,o=e.y+e.height,s=t.x,l=t.x+t.width,h=t.y,u=t.y+t.height;return!(i=r.x&&t<=r.x+r.width&&e>=r.y&&e<=r.y+r.height},clone:function(){return new n(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},n.create=function(t){return new n(t.x,t.y,t.width,t.height)};var h=n;t.exports=h},function(t,e,r){function n(t){return t>-b&&tb||t<-b}function a(t,e,r,n,i){var a=1-i;return a*a*(a*t+3*i*e)+i*i*(i*n+3*a*r)}function o(t,e,r,n,i){var a=1-i;return 3*(((e-t)*a+2*(r-e)*i)*a+(n-r)*i*i)}function s(t,e,r,i,a,o){var s=i+3*(e-r)-t,l=3*(r-2*e+t),h=3*(e-t),u=t-a,c=l*l-3*s*h,f=l*h-9*s*u,d=h*h-3*l*u,v=0;if(n(c)&&n(f))if(n(l))o[0]=0;else{var g=-h/l;g>=0&&g<=1&&(o[v++]=g)}else{var p=f*f-4*c*d;if(n(p)){var m=f/c,g=-l/s+m,x=-m/2;g>=0&&g<=1&&(o[v++]=g),x>=0&&x<=1&&(o[v++]=x)}else if(p>0){var y=_(p),b=c*l+1.5*s*(-f+y),S=c*l+1.5*s*(-f-y);b=b<0?-w(-b,T):w(b,T),S=S<0?-w(-S,T):w(S,T);var g=(-l-(b+S))/(3*s);g>=0&&g<=1&&(o[v++]=g)}else{var k=(2*c*l-3*s*f)/(2*_(c*c*c)),C=Math.acos(k)/3,P=_(c),I=Math.cos(C),g=(-l-2*P*I)/(3*s),x=(-l+P*(I+M*Math.sin(C)))/(3*s),A=(-l+P*(I-M*Math.sin(C)))/(3*s);g>=0&&g<=1&&(o[v++]=g),x>=0&&x<=1&&(o[v++]=x),A>=0&&A<=1&&(o[v++]=A)}}return v}function l(t,e,r,a,o){var s=6*r-12*e+6*t,l=9*e+3*a-3*t-9*r,h=3*e-3*t,u=0;if(n(l)){if(i(s)){var c=-h/s;c>=0&&c<=1&&(o[u++]=c)}}else{var f=s*s-4*l*h;if(n(f))o[0]=-s/(2*l);else if(f>0){var d=_(f),c=(-s+d)/(2*l),v=(-s-d)/(2*l);c>=0&&c<=1&&(o[u++]=c),v>=0&&v<=1&&(o[u++]=v)}}return u}function h(t,e,r,n,i,a){var o=(e-t)*i+t,s=(r-e)*i+e,l=(n-r)*i+r,h=(s-o)*i+o,u=(l-s)*i+s,c=(u-h)*i+h;a[0]=t,a[1]=o,a[2]=h,a[3]=c,a[4]=c,a[5]=u,a[6]=l,a[7]=n}function u(t,e,r,n,i,o,s,l,h,u,c){var f,d,v,g,p,m=.005,x=1/0;k[0]=h,k[1]=u;for(var w=0;w<1;w+=.05)C[0]=a(t,r,i,s,w),C[1]=a(e,n,o,l,w),(g=y(k,C))=0&&g=0&&c<=1&&(o[u++]=c)}}else{var f=l*l-4*s*h;if(n(f)){var c=-l/(2*s);c>=0&&c<=1&&(o[u++]=c)}else if(f>0){var d=_(f),c=(-l+d)/(2*s),v=(-l-d)/(2*s);c>=0&&c<=1&&(o[u++]=c),v>=0&&v<=1&&(o[u++]=v)}}return u}function v(t,e,r){var n=t+r-2*e;return 0===n?.5:(t-e)/n}function g(t,e,r,n,i){var a=(e-t)*n+t,o=(r-e)*n+e,s=(o-a)*n+a;i[0]=t,i[1]=a,i[2]=s,i[3]=s,i[4]=o,i[5]=r}function p(t,e,r,n,i,a,o,s,l){var h,u=.005,f=1/0;k[0]=o,k[1]=s;for(var d=0;d<1;d+=.05){C[0]=c(t,r,i,d),C[1]=c(e,n,a,d);var v=y(k,C);v=0&&vA&&(I=0,P={}),I++,P[r]=i,i}function a(t,e,r,n,i,a,l){return a?s(t,e,r,n,i,a,l):o(t,e,r,n,i,l)}function o(t,e,r,n,a,o){var s=m(t,e,a,o),u=i(t,e);a&&(u+=a[1]+a[3]);var c=s.outerHeight,f=l(0,u,r),d=h(0,c,n),v=new _(f,d,u,c);return v.lineHeight=s.lineHeight,v}function s(t,e,r,n,i,a,o){var s=x(t,{rich:a,truncate:o,font:e,textAlign:r,textPadding:i}),u=s.outerWidth,c=s.outerHeight,f=l(0,u,r),d=h(0,c,n);return new _(f,d,u,c)}function l(t,e,r){return"right"===r?t-=e:"center"===r&&(t-=e/2),t}function h(t,e,r){return"middle"===r?t-=e/2:"bottom"===r&&(t-=e),t}function u(t,e,r){var n=e.x,i=e.y,a=e.height,o=e.width,s=a/2,l="left",h="top";switch(t){case"left":n-=r,i+=s,l="right",h="middle";break;case"right":n+=r+o,i+=s,h="middle";break;case"top":n+=o/2,i-=r,l="center",h="bottom";break;case"bottom":n+=o/2,i+=a+r,l="center";break;case"inside":n+=o/2,i+=s,l="center",h="middle";break;case"insideLeft":n+=r,i+=s,h="middle";break;case"insideRight":n+=o-r,i+=s,l="right",h="middle";break;case"insideTop":n+=o/2,i+=r,l="center";break;case"insideBottom":n+=o/2,i+=a-r,l="center",h="bottom";break;case"insideTopLeft":n+=r,i+=r;break;case"insideTopRight":n+=o-r,i+=r,l="right";break;case"insideBottomLeft":n+=r,i+=a-r,h="bottom";break;case"insideBottomRight":n+=o-r,i+=a-r,l="right",h="bottom"}return{x:n,y:i,textAlign:l,textVerticalAlign:h}}function c(t,e,r,n,i){if(!e)return"";var a=(t+"").split("\n");i=f(e,r,n,i);for(var o=0,s=a.length;o=o;l++)s-=o;var h=i(r);return h>s&&(r="",h=0),s=t-h,n.ellipsis=r,n.ellipsisWidth=h,n.contentWidth=s,n.containerWidth=t,n}function d(t,e){var r=e.containerWidth,n=e.font,a=e.contentWidth;if(!r)return"";var o=i(t,n);if(o<=r)return t;for(var s=0;;s++){if(o<=a||s>=e.maxIterations){t+=e.ellipsis;break}var l=0===s?v(t,a,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*a/o):0;t=t.substr(0,l),o=i(t,n)}return""===t&&(t=e.placeholder),t}function v(t,e,r,n){for(var i=0,a=0,o=t.length;al)t="",a=[];else if(null!=h)for(var u=f(h-(r?r[1]+r[3]:0),e,n.ellipsis,{minChar:n.minChar,placeholder:n.placeholder}),c=0,v=a.length;ca&&y(r,t.substring(a,o)),y(r,n[2],n[1]),a=O.lastIndex}ap)return{lines:[],width:0,height:0};M.textWidth=i(M.text,I);var D=T.textWidth,L=null==D||"auto"===D;if("string"==typeof D&&"%"===D.charAt(D.length-1))M.percentWidth=D,u.push(M),D=0;else{if(L){D=M.textWidth;var F=T.textBackgroundColor,R=F&&F.image;R&&(R=b.findExistImage(R),b.isImageReady(R)&&(D=Math.max(D,R.width*A/R.height)))}var B=P?P[1]+P[3]:0;D+=B;var z=null!=v?v-_:null;null!=z&&zthis._ux||y(e-this._yi)>this._uy||this._len<5;return this.addData(h.L,t,e),this._ctx&&r&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),r&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,r,n,i,a){return this.addData(h.C,t,e,r,n,i,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,r,n,i,a):this._ctx.bezierCurveTo(t,e,r,n,i,a)),this._xi=i,this._yi=a,this},quadraticCurveTo:function(t,e,r,n){return this.addData(h.Q,t,e,r,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,r,n):this._ctx.quadraticCurveTo(t,e,r,n)),this._xi=r,this._yi=n,this},arc:function(t,e,r,n,i,a){return this.addData(h.A,t,e,r,r,n,i-n,0,a?0:1),this._ctx&&this._ctx.arc(t,e,r,n,i,a),this._xi=p(i)*r+t,this._yi=m(i)*r+t,this},arcTo:function(t,e,r,n,i){return this._ctx&&this._ctx.arcTo(t,e,r,n,i),this},rect:function(t,e,r,n){return this._ctx&&this._ctx.rect(t,e,r,n),this.addData(h.R,t,e,r,n),this},closePath:function(){this.addData(h.Z);var t=this._ctx,e=this._x0,r=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,r),t.closePath()),this._xi=e,this._yi=r,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,r=0;re.length&&(this._expandData(),e=this.data);for(var r=0;r0&&d<=t||u<0&&d>=t||0==u&&(c>0&&p<=e||c<0&&p>=e);)n=this._dashIdx,r=o[n],d+=u*r,p+=c*r,this._dashIdx=(n+1)%m,u>0&&dl||c>0&&ph||s[n%2?"moveTo":"lineTo"](u>=0?v(d,t):g(d,t),c>=0?v(p,e):g(p,e));u=d-t,c=p-e,this._dashOffset=-x(u*u+c*c)},_dashedBezierTo:function(t,e,r,i,a,o){var s,l,h,u,c,f=this._dashSum,d=this._dashOffset,v=this._lineDash,g=this._ctx,p=this._xi,m=this._yi,y=n.cubicAt,w=0,_=this._dashIdx,b=v.length,S=0;for(d<0&&(d=f+d),d%=f,s=0;s<1;s+=.1)l=y(p,t,r,a,s+.1)-y(p,t,r,a,s),h=y(m,e,i,o,s+.1)-y(m,e,i,o,s),w+=x(l*l+h*h);for(;_d);_++);for(s=(S-d)/w;s<=1;)u=y(p,t,r,a,s),c=y(m,e,i,o,s),_%2?g.moveTo(u,c):g.lineTo(u,c),s+=v[_]/w,_=(_+1)%b;_%2!=0&&g.lineTo(a,o),l=a-u,h=o-c,this._dashOffset=-x(l*l+h*h)},_dashedQuadraticTo:function(t,e,r,n){var i=r,a=n;r=(r+2*t)/3,n=(n+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,r,n,i,a)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,w&&(this.data=new Float32Array(t)))},getBoundingRect:function(){u[0]=u[1]=f[0]=f[1]=Number.MAX_VALUE,c[0]=c[1]=d[0]=d[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,r=0,n=0,s=0,l=0;ll||y(o-i)>u||f===c-1)&&(t.lineTo(a,o),n=a,i=o);break;case h.C:t.bezierCurveTo(s[f++],s[f++],s[f++],s[f++],s[f++],s[f++]),n=s[f-2],i=s[f-1];break;case h.Q:t.quadraticCurveTo(s[f++],s[f++],s[f++],s[f++]),n=s[f-2],i=s[f-1];break;case h.A:var v=s[f++],g=s[f++],x=s[f++],w=s[f++],_=s[f++],b=s[f++],S=s[f++],M=s[f++],T=x>w?x:w,k=x>w?1:x/w,C=x>w?w/x:1,P=Math.abs(x-w)>.001,I=_+b;P?(t.translate(v,g),t.rotate(S),t.scale(k,C),t.arc(0,0,T,_,I,1-M),t.scale(1/k,1/C),t.rotate(-S),t.translate(-v,-g)):t.arc(v,g,T,_,I,1-M),1==f&&(e=p(_)*x+v,r=m(_)*w+g),n=p(I)*x+v,i=m(I)*w+g;break;case h.R:e=n=s[f],r=i=s[f+1],t.rect(s[f++],s[f++],s[f++],s[f++]);break;case h.Z:t.closePath(),n=e,i=r}}}},_.CMD=h;var b=_;t.exports=b},function(e,r){e.exports=t},function(t,e){function r(){var t=new u(6);return n(t),t}function n(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t[4]=0,t[5]=0,t}function i(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4],t[5]=e[5],t}function a(t,e,r){var n=e[0]*r[0]+e[2]*r[1],i=e[1]*r[0]+e[3]*r[1],a=e[0]*r[2]+e[2]*r[3],o=e[1]*r[2]+e[3]*r[3],s=e[0]*r[4]+e[2]*r[5]+e[4],l=e[1]*r[4]+e[3]*r[5]+e[5];return t[0]=n,t[1]=i,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t}function o(t,e,r){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[4]=e[4]+r[0],t[5]=e[5]+r[1],t}function s(t,e,r){var n=e[0],i=e[2],a=e[4],o=e[1],s=e[3],l=e[5],h=Math.sin(r),u=Math.cos(r);return t[0]=n*u+o*h,t[1]=-n*h+o*u,t[2]=i*u+s*h,t[3]=-i*h+u*s,t[4]=u*a+h*l,t[5]=u*l-h*a,t}function l(t,e,r){var n=r[0],i=r[1];return t[0]=e[0]*n,t[1]=e[1]*i,t[2]=e[2]*n,t[3]=e[3]*i,t[4]=e[4]*n,t[5]=e[5]*i,t}function h(t,e){var r=e[0],n=e[2],i=e[4],a=e[1],o=e[3],s=e[5],l=r*o-a*n;return l?(l=1/l,t[0]=o*l,t[1]=-a*l,t[2]=-n*l,t[3]=r*l,t[4]=(n*s-o*i)*l,t[5]=(a*i-r*s)*l,t):null}var u="undefined"==typeof Float32Array?Array:Float32Array;e.create=r,e.identity=n,e.copy=i,e.mul=a,e.translate=o,e.rotate=s,e.scale=l,e.invert=h},function(t,e,r){function n(t){return t.replace(/^\s+/,"").replace(/\s+$/,"")}function i(t,e,r,n){var i=e[1]-e[0],a=r[1]-r[0];if(0===i)return 0===a?r[0]:(r[0]+r[1])/2;if(n)if(i>0){if(t<=e[0])return r[0];if(t>=e[1])return r[1]}else{if(t>=e[0])return r[0];if(t<=e[1])return r[1]}else{if(t===e[0])return r[0];if(t===e[1])return r[1]}return(t-e[0])/i*a+r[0]}function a(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?n(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function o(t,e,r){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),r?t:+t}function s(t){return t.sort(function(t,e){return t-e}),t}function l(t){if(t=+t,isNaN(t))return 0;for(var e=1,r=0;Math.round(t*e)/e!==t;)e*=10,r++;return r}function h(t){var e=t.toString(),r=e.indexOf("e");if(r>0){var n=+e.slice(r+1);return n<0?-n:0}var i=e.indexOf(".");return i<0?0:e.length-1-i}function u(t,e){var r=Math.log,n=Math.LN10,i=Math.floor(r(t[1]-t[0])/n),a=Math.round(r(Math.abs(e[1]-e[0]))/n),o=Math.min(Math.max(-i+a,0),20);return isFinite(o)?o:20}function c(t,e,r){if(!t[e])return 0;var n=w.reduce(t,function(t,e){return t+(isNaN(e)?0:e)},0);if(0===n)return 0;for(var i=Math.pow(10,r),a=w.map(t,function(t){return(isNaN(t)?0:t)/n*i*100}),o=100*i,s=w.map(a,function(t){return Math.floor(t)}),l=w.reduce(s,function(t,e){return t+e},0),h=w.map(a,function(t,e){return t-s[e]});lu&&(u=h[f],c=f);++s[c],h[c]=0,++l}return s[e]/i}function f(t){var e=2*Math.PI;return(t%e+e)%e}function d(t){return t>-_&&t<_}function v(t){if(t instanceof Date)return t;if("string"==typeof t){var e=b.exec(t);if(!e)return new Date(NaN);if(e[8]){var r=+e[4]||0;return"Z"!==e[8].toUpperCase()&&(r-=e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,r,+(e[5]||0),+e[6]||0,+e[7]||0))}return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,+e[7]||0)}return null==t?new Date(NaN):new Date(Math.round(t))}function g(t){return Math.pow(10,p(t))}function p(t){return Math.floor(Math.log(t)/Math.LN10)}function m(t,e){var r,n=p(t),i=Math.pow(10,n),a=t/i;return r=e?a<1.5?1:a<2.5?2:a<4?3:a<7?5:10:a<1?1:a<2?2:a<3?3:a<5?5:10,t=r*i,n>=-20?+t.toFixed(n<0?-n:0):t}function x(t){function e(t,r,n){return t.interval[n]=0}var w=r(0),_=1e-4,b=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/;e.linearMap=i,e.parsePercent=a,e.round=o,e.asc=s,e.getPrecision=l,e.getPrecisionSafe=h,e.getPixelPrecision=u,e.getPercentWithPrecision=c,e.MAX_SAFE_INTEGER=9007199254740991,e.remRadian=f,e.isRadianAroundZero=d,e.parseDate=v,e.quantity=g,e.nice=m,e.reformIntervals=x,e.isNumeric=y},function(t,e,r){function n(t){if("string"==typeof t){var e=l.get(t);return e&&e.image}return t}function i(t,e,r,n,i){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!r)return e;var s=l.get(t),h={hostEl:r,cb:n,cbPayload:i};return s?(e=s.image,!o(e)&&s.pending.push(h)):(!e&&(e=new Image),e.onload=a,l.put(t,e.__cachedImgObj={image:e,pending:[h]}),e.src=e.__zrImageSrc=t),e}return t}return e}function a(){var t=this.__cachedImgObj;this.onload=this.__cachedImgObj=null;for(var e=0;e=0||n&&i.indexOf(n,s)<0)){var l=e.getShallow(s);null!=l&&(a[t[o][0]]=l)}}return a}}var i=r(0);t.exports=n},function(t,e,r){function n(t){t=t||{},o.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new a(t.style,this),this._rect=null,this.__clipPaths=[]}var i=r(0),a=r(40),o=r(16),s=r(48);n.prototype={constructor:n,type:"displayable",__dirty:!0,invisible:!1,z:0,z2:0,zlevel:0,draggable:!1,dragging:!1,silent:!1,culling:!1,cursor:"pointer",rectHover:!1,progressive:-1,beforeBrush:function(t){},afterBrush:function(t){},brush:function(t,e){},getBoundingRect:function(){},contain:function(t,e){return this.rectContain(t,e)},traverse:function(t,e){t.call(e,this)},rectContain:function(t,e){var r=this.transformCoordToLocal(t,e);return this.getBoundingRect().contain(r[0],r[1])},dirty:function(){this.__dirty=!0,this._rect=null,this.__zr&&this.__zr.refresh()},animateStyle:function(t){return this.animate("style",t)},attrKV:function(t,e){"style"!==t?o.prototype.attrKV.call(this,t,e):this.style.set(e)},setStyle:function(t,e){return this.style.set(t,e),this.dirty(!1),this},useStyle:function(t){return this.style=new a(t,this),this.dirty(!1),this}},i.inherits(n,o),i.mixin(n,s);var l=n;t.exports=l},function(t,e,r){function n(t){return isNaN(t)?"-":(t=(t+"").split("."),t[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:""))}function i(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}function a(t){return String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function o(t,e,r){c.isArray(e)||(e=[e]);var n=e.length;if(!n)return"";for(var i=e[0].$vars||[],o=0;o':""}function h(t,e,r){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var n=d.parseDate(e),i=r?"UTC":"",a=n["get"+i+"FullYear"](),o=n["get"+i+"Month"]()+1,s=n["get"+i+"Date"](),l=n["get"+i+"Hours"](),h=n["get"+i+"Minutes"](),u=n["get"+i+"Seconds"]();return t=t.replace("MM",m(o)).replace("M",o).replace("yyyy",a).replace("yy",a%100).replace("dd",m(s)).replace("d",s).replace("hh",m(l)).replace("h",l).replace("mm",m(h)).replace("m",h).replace("ss",m(u)).replace("s",u)}function u(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t}var c=r(0),f=r(5),d=r(9),v=c.normalizeCssArray,g=["a","b","c","d","e","f","g"],p=function(t,e){return"{"+t+(null==e?"":e)+"}"},m=function(t){return t<10?"0"+t:t},x=f.truncateText,y=f.getBoundingRect;e.addCommas=n,e.toCamelCase=i,e.normalizeCssArray=v,e.encodeHTML=a,e.formatTpl=o,e.formatTplSimple=s,e.getTooltipMarker=l,e.formatTime=h,e.capitalFirst=u,e.truncateText=x,e.getTextRect=y},function(t,e){var r=function(){this.head=null,this.tail=null,this._len=0},n=r.prototype;n.insert=function(t){var e=new i(t);return this.insertEntry(e),e},n.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},n.remove=function(t){var e=t.prev,r=t.next;e?e.next=r:this.head=r,r?r.prev=e:this.tail=e,t.next=t.prev=null,this._len--},n.len=function(){return this._len},n.clear=function(){this.head=this.tail=null,this._len=0};var i=function(t){this.value=t,this.next,this.prev},a=function(t){this._list=new r,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},o=a.prototype;o.put=function(t,e){var r=this._list,n=this._map,a=null;if(null==n[t]){var o=r.len(),s=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var l=r.head;r.remove(l),delete n[l.key],a=l.value,this._lastRemovedEntry=l}s?s.value=e:s=new i(e),s.key=t,r.insertEntry(s),n[t]=s}return a},o.get=function(t){var e=this._map[t],r=this._list;if(null!=e)return e!==r.tail&&(r.remove(e),r.insertEntry(e)),e.value},o.clear=function(){this._list.clear(),this._map={}};var s=a;t.exports=s},function(t,e){var r={};r="undefined"==typeof navigator?{browser:{},os:{},node:!0,canvasSupported:!0,svgSupported:!0}:function(t){var e={},r={},n=t.match(/Firefox\/([\d.]+)/),i=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),a=t.match(/Edge\/([\d.]+)/),o=/micromessenger/i.test(t);return n&&(r.firefox=!0,r.version=n[1]),i&&(r.ie=!0,r.version=i[1]),a&&(r.edge=!0,r.version=a[1]),o&&(r.weChat=!0),{browser:r,os:e,node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!r.ie&&!r.edge,pointerEventsSupported:"onpointerdown"in window&&(r.edge||r.ie&&r.version>=11)}}(navigator.userAgent);var n=r;t.exports=n},function(t,e,r){var n=r(41),i=r(42),a=r(17),o=r(43),s=r(0),l=function(t){a.call(this,t),i.call(this,t),o.call(this,t),this.id=t.id||n()};l.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var r=this.transform;r||(r=this.transform=[1,0,0,1,0,0]),r[4]+=t,r[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var r=this[t];r||(r=this[t]=[]),r[0]=e[0],r[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(s.isObject(t))for(var r in t)t.hasOwnProperty(r)&&this.attrKV(r,t[r]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var r=0;rs||t<-s}var i=r(8),a=r(2),o=i.identity,s=5e-5,l=function(t){t=t||{},t.position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},h=l.prototype;h.transform=null,h.needLocalTransform=function(){return n(this.rotation)||n(this.position[0])||n(this.position[1])||n(this.scale[0]-1)||n(this.scale[1]-1)},h.updateTransform=function(){var t=this.parent,e=t&&t.transform,r=this.needLocalTransform(),n=this.transform;if(!r&&!e)return void(n&&o(n));n=n||i.create(),r?this.getLocalTransform(n):o(n),e&&(r?i.mul(n,t.transform,n):i.copy(n,t.transform)),this.transform=n,this.invTransform=this.invTransform||i.create(),i.invert(this.invTransform,n)},h.getLocalTransform=function(t){return l.getLocalTransform(this,t)},h.setTransform=function(t){var e=this.transform,r=t.dpr||1;e?t.setTransform(r*e[0],r*e[1],r*e[2],r*e[3],r*e[4],r*e[5]):t.setTransform(r,0,0,r,0,0)},h.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var u=[];h.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(i.mul(u,t.invTransform,e),e=u);var r=e[0]*e[0]+e[1]*e[1],a=e[2]*e[2]+e[3]*e[3],o=this.position,s=this.scale;n(r-1)&&(r=Math.sqrt(r)),n(a-1)&&(a=Math.sqrt(a)),e[0]<0&&(r=-r),e[3]<0&&(a=-a),o[0]=e[4],o[1]=e[5],s[0]=r,s[1]=a,this.rotation=Math.atan2(-e[1]/a,e[0]/r)}},h.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),r=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(r=-r),[e,r]},h.transformCoordToLocal=function(t,e){var r=[t,e],n=this.invTransform;return n&&a.applyTransform(r,r,n),r},h.transformCoordToGlobal=function(t,e){var r=[t,e],n=this.transform;return n&&a.applyTransform(r,r,n),r},l.getLocalTransform=function(t,e){e=e||[],o(e);var r=t.origin,n=t.scale||[1,1],a=t.rotation||0,s=t.position||[0,0];return r&&(e[4]-=r[0],e[5]-=r[1]),i.scale(e,e,n),a&&i.rotate(e,e,a),r&&(e[4]+=r[0],e[5]+=r[1]),e[4]+=s[0],e[5]+=s[1],e};var c=l;t.exports=c},function(t,e,r){function n(t){return t=Math.round(t),t<0?0:t>255?255:t}function i(t){return t=Math.round(t),t<0?0:t>360?360:t}function a(t){return t<0?0:t>1?1:t}function o(t){return n(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function s(t){return a(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function l(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}function h(t,e,r){return t+(e-t)*r}function u(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t}function c(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function f(t,e){k&&c(k,e),k=T.put(t,k||e.slice())}function d(t,e){if(t){e=e||[];var r=T.get(t);if(r)return c(e,r);t+="";var n=t.replace(/ /g,"").toLowerCase();if(n in M)return c(e,M[n]),f(t,e),e;if("#"!==n.charAt(0)){var i=n.indexOf("("),a=n.indexOf(")");if(-1!==i&&a+1===n.length){var l=n.substr(0,i),h=n.substr(i+1,a-(i+1)).split(","),d=1;switch(l){case"rgba":if(4!==h.length)return void u(e,0,0,0,1);d=s(h.pop());case"rgb":return 3!==h.length?void u(e,0,0,0,1):(u(e,o(h[0]),o(h[1]),o(h[2]),d),f(t,e),e);case"hsla":return 4!==h.length?void u(e,0,0,0,1):(h[3]=s(h[3]),v(h,e),f(t,e),e);case"hsl":return 3!==h.length?void u(e,0,0,0,1):(v(h,e),f(t,e),e);default:return}}u(e,0,0,0,1)}else{if(4===n.length){var g=parseInt(n.substr(1),16);return g>=0&&g<=4095?(u(e,(3840&g)>>4|(3840&g)>>8,240&g|(240&g)>>4,15&g|(15&g)<<4,1),f(t,e),e):void u(e,0,0,0,1)}if(7===n.length){var g=parseInt(n.substr(1),16);return g>=0&&g<=16777215?(u(e,(16711680&g)>>16,(65280&g)>>8,255&g,1),f(t,e),e):void u(e,0,0,0,1)}}}}function v(t,e){var r=(parseFloat(t[0])%360+360)%360/360,i=s(t[1]),a=s(t[2]),o=a<=.5?a*(i+1):a+i-a*i,h=2*a-o;return e=e||[],u(e,n(255*l(h,o,r+1/3)),n(255*l(h,o,r)),n(255*l(h,o,r-1/3)),1),4===t.length&&(e[3]=t[3]),e}function g(t){if(t){var e,r,n=t[0]/255,i=t[1]/255,a=t[2]/255,o=Math.min(n,i,a),s=Math.max(n,i,a),l=s-o,h=(s+o)/2;if(0===l)e=0,r=0;else{r=h<.5?l/(s+o):l/(2-s-o);var u=((s-n)/6+l/2)/l,c=((s-i)/6+l/2)/l,f=((s-a)/6+l/2)/l;n===s?e=f-c:i===s?e=1/3+u-f:a===s&&(e=2/3+c-u),e<0&&(e+=1),e>1&&(e-=1)}var d=[360*e,r,h];return null!=t[3]&&d.push(t[3]),d}}function p(t,e){var r=d(t);if(r){for(var n=0;n<3;n++)r[n]=e<0?r[n]*(1-e)|0:(255-r[n])*e+r[n]|0;return b(r,4===r.length?"rgba":"rgb")}}function m(t){var e=d(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)}function x(t,e,r){if(e&&e.length&&t>=0&&t<=1){r=r||[];var i=t*(e.length-1),o=Math.floor(i),s=Math.ceil(i),l=e[o],u=e[s],c=i-o;return r[0]=n(h(l[0],u[0],c)),r[1]=n(h(l[1],u[1],c)),r[2]=n(h(l[2],u[2],c)),r[3]=a(h(l[3],u[3],c)),r}}function y(t,e,r){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),o=Math.floor(i),s=Math.ceil(i),l=d(e[o]),u=d(e[s]),c=i-o,f=b([n(h(l[0],u[0],c)),n(h(l[1],u[1],c)),n(h(l[2],u[2],c)),a(h(l[3],u[3],c))],"rgba");return r?{color:f,leftIndex:o,rightIndex:s,value:i}:f}}function w(t,e,r,n){if(t=d(t))return t=g(t),null!=e&&(t[0]=i(e)),null!=r&&(t[1]=s(r)),null!=n&&(t[2]=s(n)),b(v(t),"rgba")}function _(t,e){if((t=d(t))&&null!=e)return t[3]=a(e),b(t,"rgba")}function b(t,e){if(t&&t.length){var r=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(r+=","+t[3]),e+"("+r+")"}}var S=r(14),M={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},T=new S(20),k=null,C=x,P=y;e.parse=d,e.lift=p,e.toHex=m,e.fastLerp=x,e.fastMapToColor=C,e.lerp=y,e.mapToColor=P,e.modifyHSL=w,e.modifyAlpha=_,e.stringify=b},function(t,e){var r=1;"undefined"!=typeof window&&(r=Math.max(window.devicePixelRatio||1,1));var n=r;e.debugMode=0,e.devicePixelRatio=n},function(t,e,r){function n(t){return i(t),M(t.rich,i),t}function i(t){if(t){t.font=P.makeFont(t);var e=t.textAlign;"middle"===e&&(e="center"),t.textAlign=null==e||O[e]?e:"left";var r=t.textVerticalAlign||t.textBaseline;"center"===r&&(r="middle"),t.textVerticalAlign=null==r||D[r]?r:"top";t.textPadding&&(t.textPadding=T(t.textPadding))}}function a(t,e,r,n,i){n.rich?s(t,e,r,n,i):o(t,e,r,n,i)}function o(t,e,r,n,i){var a=g(e,"font",n.font||P.DEFAULT_FONT),o=n.textPadding,s=t.__textCotentBlock;s&&!t.__dirty||(s=t.__textCotentBlock=P.parsePlainText(r,a,o,n.truncate));var l=s.outerHeight,u=s.lines,d=s.lineHeight,x=v(l,n,i),w=x.baseX,_=x.baseY,b=x.textAlign,S=x.textVerticalAlign;h(e,n,i,w,_);var M=P.adjustTextY(_,l,S),T=w,k=M,C=c(n);if(C||o){var I=P.getWidth(r,a),A=I;o&&(A+=o[1]+o[3]);var O=P.adjustTextX(w,A,b);C&&f(t,e,n,O,M,A,l),o&&(T=y(w,b,o),k+=o[0])}g(e,"textAlign",b||"left"),g(e,"textBaseline","middle"),g(e,"shadowBlur",n.textShadowBlur||0),g(e,"shadowColor",n.textShadowColor||"transparent"),g(e,"shadowOffsetX",n.textShadowOffsetX||0),g(e,"shadowOffsetY",n.textShadowOffsetY||0),k+=d/2;var D=n.textStrokeWidth,L=p(n.textStroke,D),F=m(n.textFill);L&&(g(e,"lineWidth",D),g(e,"strokeStyle",L)),F&&g(e,"fillStyle",F);for(var R=0;R=0&&(T=C[R],"right"===T.textAlign);)u(t,e,T,n,A,b,F,"right"),O-=T.width,F-=T.width,R--;for(L+=(a-(L-_)-(S-F)-O)/2;D<=R;)T=C[D],u(t,e,T,n,A,b,L+T.width/2,"center"),L+=T.width,D++;b+=A}}function h(t,e,r,n,i){if(r&&e.textRotation){var a=e.textOrigin;"center"===a?(n=r.width/2+r.x,i=r.height/2+r.y):a&&(n=a[0]+r.x,i=a[1]+r.y),t.translate(n,i),t.rotate(-e.textRotation),t.translate(-n,-i)}}function u(t,e,r,n,i,a,o,s){var l=n.rich[r.styleName]||{},h=r.textVerticalAlign,u=a+i/2;"top"===h?u=a+r.height/2:"bottom"===h&&(u=a+i-r.height/2),!r.isLineHolder&&c(l)&&f(t,e,l,"right"===s?o-r.width:"center"===s?o-r.width/2:o,u-r.height/2,r.width,r.height);var d=r.textPadding;d&&(o=y(o,s,d),u-=r.height/2-d[2]-r.textHeight/2),g(e,"shadowBlur",S(l.textShadowBlur,n.textShadowBlur,0)),g(e,"shadowColor",l.textShadowColor||n.textShadowColor||"transparent"),g(e,"shadowOffsetX",S(l.textShadowOffsetX,n.textShadowOffsetX,0)),g(e,"shadowOffsetY",S(l.textShadowOffsetY,n.textShadowOffsetY,0)),g(e,"textAlign",s),g(e,"textBaseline","middle"),g(e,"font",r.font||P.DEFAULT_FONT);var v=p(l.textStroke||n.textStroke,w),x=m(l.textFill||n.textFill),w=b(l.textStrokeWidth,n.textStrokeWidth);v&&(g(e,"lineWidth",w),g(e,"strokeStyle",v),e.strokeText(r.text,o,u)),x&&(g(e,"fillStyle",x),e.fillText(r.text,o,u))}function c(t){return t.textBackgroundColor||t.textBorderWidth&&t.textBorderColor}function f(t,e,r,n,i,a,o){var s=r.textBackgroundColor,l=r.textBorderWidth,h=r.textBorderColor,u=k(s);if(g(e,"shadowBlur",r.textBoxShadowBlur||0),g(e,"shadowColor",r.textBoxShadowColor||"transparent"),g(e,"shadowOffsetX",r.textBoxShadowOffsetX||0),g(e,"shadowOffsetY",r.textBoxShadowOffsetY||0),u||l&&h){e.beginPath();var c=r.textBorderRadius;c?I.buildPath(e,{x:n,y:i,width:a,height:o,r:c}):e.rect(n,i,a,o),e.closePath()}if(u)g(e,"fillStyle",s),e.fill();else if(C(s)){var f=s.image;f=A.createOrUpdateImage(f,null,t,d,s),f&&A.isImageReady(f)&&e.drawImage(f,n,i,a,o)}l&&h&&(g(e,"lineWidth",l),g(e,"strokeStyle",h),e.stroke())}function d(t,e){e.image=t}function v(t,e,r){var n=e.x||0,i=e.y||0,a=e.textAlign,o=e.textVerticalAlign;if(r){var s=e.textPosition;if(s instanceof Array)n=r.x+x(s[0],r.width),i=r.y+x(s[1],r.height);else{var l=P.adjustTextPositionOnRect(s,r,e.textDistance);n=l.x,i=l.y,a=a||l.textAlign,o=o||l.textVerticalAlign}var h=e.textOffset;h&&(n+=h[0],i+=h[1])}return{baseX:n,baseY:i,textAlign:a,textVerticalAlign:o}}function g(t,e,r){return t[e]=r,t[e]}function p(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function m(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function x(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function y(t,e,r){return"right"===e?t-r[1]:"center"===e?t+r[3]/2-r[1]/2:t+r[3]}function w(t,e){return null!=t&&(t||e.textBackgroundColor||e.textBorderWidth&&e.textBorderColor||e.textPadding)}var _=r(0),b=_.retrieve2,S=_.retrieve3,M=_.each,T=_.normalizeCssArray,k=_.isString,C=_.isObject,P=r(5),I=r(21),A=r(10),O={left:1,right:1,center:1},D={top:1,bottom:1,middle:1};e.normalizeTextStyle=n,e.renderText=a,e.getStroke=p,e.getFill=m,e.needDrawText=w},function(t,e){function r(t,e){var r,n,i,a,o=e.x,s=e.y,l=e.width,h=e.height,u=e.r;l<0&&(o+=l,l=-l),h<0&&(s+=h,h=-h),"number"==typeof u?r=n=i=a=u:u instanceof Array?1===u.length?r=n=i=a=u[0]:2===u.length?(r=i=u[0],n=a=u[1]):3===u.length?(r=u[0],n=a=u[1],i=u[2]):(r=u[0],n=u[1],i=u[2],a=u[3]):r=n=i=a=0;var c;r+n>l&&(c=r+n,r*=l/c,n*=l/c),i+a>l&&(c=i+a,i*=l/c,a*=l/c),n+i>h&&(c=n+i,n*=h/c,i*=h/c),r+a>h&&(c=r+a,r*=h/c,a*=h/c),t.moveTo(o+r,s),t.lineTo(o+l-n,s),0!==n&&t.quadraticCurveTo(o+l,s,o+l,s+n),t.lineTo(o+l,s+h-i),0!==i&&t.quadraticCurveTo(o+l,s+h,o+l-i,s+h),t.lineTo(o+a,s+h),0!==a&&t.quadraticCurveTo(o,s+h,o,s+h-a),t.lineTo(o,s+r),0!==r&&t.quadraticCurveTo(o,s,o+r,s)}e.buildPath=r},function(t,e){function r(t){return t%=n,t<0&&(t+=n),t}var n=2*Math.PI;e.normalizeRadian=r},function(t,e,r){function n(t,e,r){var n=e.points,o=e.smooth;if(n&&n.length>=2){if(o&&"spline"!==o){var s=a(n,o,r,e.smoothConstraint);t.moveTo(n[0][0],n[0][1]);for(var l=n.length,h=0;h<(r?l:l-1);h++){var u=s[2*h],c=s[2*h+1],f=n[(h+1)%l];t.bezierCurveTo(u[0],u[1],c[0],c[1],f[0],f[1])}}else{"spline"===o&&(n=i(n,r)),t.moveTo(n[0][0],n[0][1]);for(var h=1,d=n.length;h128){var l=r.data[o]+r.data[o+1]+r.data[o+2];i+=l,++a}}for(var h=i/a,o=0;oh?(n.data[o]=0,n.data[o+1]=0,n.data[o+2]=0,n.data[o+3]=0):(n.data[o]=255,n.data[o+1]=255,n.data[o+2]=255,n.data[o+3]=255)}e.putImageData(n,0,0)}var i=r(7),a=r(27);r(28),r(77);var o=r(78);if(!o.isSupported)throw new Error("Sorry your browser not support wordCloud");i.registerLayout(function(t,e){t.eachSeriesByType("wordCloud",function(r){function s(t){var e=t.detail.item;t.detail.drawn&&r.layoutInstance.ondraw&&(t.detail.drawn.gx+=l.x/m,t.detail.drawn.gy+=l.y/m,r.layoutInstance.ondraw(e[0],e[1],e[2],t.detail.drawn))}var l=a.getLayoutRect(r.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()}),h=r.getData(),u=document.createElement("canvas");u.width=l.width,u.height=l.height;var c=u.getContext("2d"),f=r.get("maskImage");if(f)try{c.drawImage(f,0,0,u.width,u.height),n(u)}catch(t){console.error("Invalid mask image"),console.error(t.toString())}var d=r.get("sizeRange"),v=r.get("rotationRange"),g=h.getDataExtent("value"),p=Math.PI/180,m=r.get("gridSize");o(u,{list:h.mapArray("value",function(t,e){var r=h.getItemModel(e);return[h.getName(e),r.get("textStyle.normal.textSize",!0)||i.number.linearMap(t,g,d),e]}).sort(function(t,e){return e[1]-t[1]}),fontFamily:r.get("textStyle.normal.fontFamily")||r.get("textStyle.emphasis.fontFamily")||t.get("textStyle.fontFamily"),fontWeight:r.get("textStyle.normal.fontWeight")||r.get("textStyle.emphasis.fontWeight")||t.get("textStyle.fontWeight"),gridSize:m,ellipticity:l.height/l.width,minRotation:v[0]*p,maxRotation:v[1]*p,clearCanvas:!f,rotateRatio:1,rotationStep:r.get("rotationStep")*p,drawOutOfBound:r.get("drawOutOfBound"),shuffle:!1,shape:r.get("shape")}),u.addEventListener("wordclouddrawn",s),r.layoutInstance&&r.layoutInstance.dispose(),r.layoutInstance={ondraw:null,dispose:function(){u.removeEventListener("wordclouddrawn",s),u.addEventListener("wordclouddrawn",function(t){t.preventDefault()})}}})}),i.registerPreprocessor(function(t){function e(t){t&&i.util.each(n,function(e){t.hasOwnProperty(e)&&(t["text"+i.format.capitalFirst(e)]=t[e])})}var r=(t||{}).series;!i.util.isArray(r)&&(r=r?[r]:[]);var n=["shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];i.util.each(r,function(t){if(t&&"wordCloud"===t.type){var r=t.textStyle||{};e(r.normal),e(r.emphasis)}})})},function(t,e,r){function n(t,e,r,n,i){var a=0,o=0;null==n&&(n=1/0),null==i&&(i=1/0);var s=0;e.eachChild(function(l,h){var u,c,f=l.position,d=l.getBoundingRect(),v=e.childAt(h+1),g=v&&v.getBoundingRect();if("horizontal"===t){var p=d.width+(g?-g.x+d.x:0);u=a+p,u>n||l.newline?(a=0,u=p,o+=s+r,s=d.height):s=Math.max(s,d.height)}else{var m=d.height+(g?-g.y+d.y:0);c=o+m,c>i||l.newline?(a+=s+r,o=0,c=m,s=d.width):s=Math.max(s,d.width)}l.newline||(f[0]=a,f[1]=o,"horizontal"===t?a=u+r:o=c+r)})}function i(t,e,r){var n=e.width,i=e.height,a=v(t.x,n),o=v(t.y,i),s=v(t.x2,n),l=v(t.y2,i);return(isNaN(a)||isNaN(parseFloat(t.x)))&&(a=0),(isNaN(s)||isNaN(parseFloat(t.x2)))&&(s=n),(isNaN(o)||isNaN(parseFloat(t.y)))&&(o=0),(isNaN(l)||isNaN(parseFloat(t.y2)))&&(l=i),r=g.normalizeCssArray(r||0),{width:Math.max(s-a-r[1]-r[3],0),height:Math.max(l-o-r[0]-r[2],0)}}function a(t,e,r){r=g.normalizeCssArray(r||0);var n=e.width,i=e.height,a=v(t.left,n),o=v(t.top,i),s=v(t.right,n),l=v(t.bottom,i),h=v(t.width,n),u=v(t.height,i),c=r[2]+r[0],d=r[1]+r[3],p=t.aspect;switch(isNaN(h)&&(h=n-s-d-a),isNaN(u)&&(u=i-l-c-o),null!=p&&(isNaN(h)&&isNaN(u)&&(p>n/i?h=.8*n:u=.8*i),isNaN(h)&&(h=p*u),isNaN(u)&&(u=h/p)),isNaN(a)&&(a=n-s-h-d),isNaN(o)&&(o=i-l-u-c),t.left||t.right){case"center":a=n/2-h/2-r[3];break;case"right":a=n-h-d}switch(t.top||t.bottom){case"middle":case"center":o=i/2-u/2-r[0];break;case"bottom":o=i-u-c}a=a||0,o=o||0,isNaN(h)&&(h=n-d-a-(s||0)),isNaN(u)&&(u=i-c-o-(l||0));var m=new f(a+r[3],o+r[0],h,u);return m.margin=r,m}function o(t,e,r,n,i){var o=!i||!i.hv||i.hv[0],s=!i||!i.hv||i.hv[1],l=i&&i.boundingMode||"all";if(o||s){var h;if("raw"===l)h="group"===t.type?new f(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(h=t.getBoundingRect(),t.needLocalTransform()){var u=t.getLocalTransform();h=h.clone(),h.applyTransform(u)}e=a(c.defaults({width:h.width,height:h.height},e),r,n);var d=t.position,v=o?e.x-h.x:0,g=s?e.y-h.y:0;t.attr("position","raw"===l?[v,g]:[d[0]+v,d[1]+g])}}function s(t,e){return null!=t[x[e][0]]||null!=t[x[e][1]]&&null!=t[x[e][2]]}function l(t,e,r){function n(r,n){var o={},l=0,h={},u=0;if(p(r,function(e){h[e]=t[e]}),p(r,function(t){i(e,t)&&(o[t]=h[t]=e[t]),a(o,t)&&l++,a(h,t)&&u++}),s[n])return a(e,r[1])?h[r[2]]=null:a(e,r[2])&&(h[r[1]]=null),h;if(2!==u&&l){if(l>=2)return o;for(var c=0;c=r.length&&r.push({option:t})}}),r}function u(t){var e=y.createHashMap();S(t,function(t,r){var n=t.exist;n&&e.set(n.id,t)}),S(t,function(t,r){var n=t.option;y.assert(!n||null==n.id||!e.get(n.id)||e.get(n.id)===t,"id duplicates: "+(n&&n.id)),n&&null!=n.id&&e.set(n.id,t),!t.keyInfo&&(t.keyInfo={})}),S(t,function(t,r){var n=t.exist,i=t.option,a=t.keyInfo;if(M(i)){if(a.name=null!=i.name?i.name+"":n?n.name:"\0-",n)a.id=n.id;else if(null!=i.id)a.id=i.id+"";else{var o=0;do{a.id="\0"+a.name+"\0"+o++}while(e.get(a.id))}e.set(a.id,t)}})}function c(t){return M(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function f(t,e){function r(t,e,r){for(var i=0,a=t.length;i=0)&&(n={textFill:null,textStroke:t.textStroke,textStrokeWidth:t.textStrokeWidth},t.textFill="#fff",null==t.textStroke&&(t.textStroke=r.autoColor,null==t.textStrokeWidth&&(t.textStrokeWidth=2))),n}function L(t){var e=t.insideRollback;e&&(t.textFill=e.textFill,t.textStroke=e.textStroke,t.textStrokeWidth=e.textStrokeWidth)}function F(t,e){var r=e||e.getModel("textStyle");return[t.fontStyle||r&&r.getShallow("fontStyle")||"",t.fontWeight||r&&r.getShallow("fontWeight")||"",(t.fontSize||r&&r.getShallow("fontSize")||12)+"px",t.fontFamily||r&&r.getShallow("fontFamily")||"sans-serif"].join(" ")}function R(t,e,r,n,i,a){if("function"==typeof i&&(a=i,i=null),n&&n.isAnimationEnabled()){var o=t?"Update":"",s=n.getShallow("animationDuration"+o),l=n.getShallow("animationEasing"+o),h=n.getShallow("animationDelay"+o);"function"==typeof h&&(h=h(i,n.getAnimationDelayParams?n.getAnimationDelayParams(e,i):null)),"function"==typeof s&&(s=s(i)),s>0?e.animateTo(r,s,h||0,l,a,!!a):(e.stopAnimation(),e.attr(r),a&&a())}else e.stopAnimation(),e.attr(r),a&&a()}function B(t,e,r,n,i){R(!0,t,e,r,n,i)}function z(t,e,r,n,i){R(!1,t,e,r,n,i)}function N(t,e){for(var r=U.identity([]);t&&t!==e;)U.mul(r,t.getLocalTransform(),r),t=t.parent;return r}function E(t,e,r){return e&&!Y.isArrayLike(e)&&(e=Q.getLocalTransform(e)),r&&(e=U.invert([],e)),$.applyTransform([],t,e)}function W(t,e,r){var n=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),i=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),a=["left"===t?-n:"right"===t?n:0,"top"===t?-i:"bottom"===t?i:0];return a=E(a,e,r),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?"right":"left":a[1]>0?"bottom":"top"}function q(t,e,r,n){function i(t){var e={position:$.clone(t.position),rotation:t.rotation};return t.shape&&(e.shape=Y.extend({},t.shape)),e}if(t&&e){var a=function(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var n=i(t);t.attr(i(e)),B(t,n,r,t.dataIndex)}}})}}function H(t,e){return Y.map(t,function(t){var r=t[0];r=gt(r,e.x),r=pt(r,e.x+e.width);var n=t[1];return n=gt(n,e.y),n=pt(n,e.y+e.height),[r,n]})}function j(t,e){var r=gt(t.x,e.x),n=pt(t.x+t.width,e.x+e.width),i=gt(t.y,e.y),a=pt(t.y+t.height,e.y+e.height);if(n>=r&&a>=i)return{x:r,y:i,width:n-r,height:a-i}}function X(t,e,r){e=Y.extend({rectHover:!0},e);var n=e.style={strokeNoScale:!0};if(r=r||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(n.image=t.slice(8),Y.defaults(n,r),new K(e)):a(t.replace("path://",""),e,r,"center")}var Y=r(0),V=r(39),G=r(18),U=r(8),$=r(2),Z=r(1),Q=r(17),K=r(58);e.Image=K;var J=r(59);e.Group=J;var tt=r(60);e.Text=tt;var et=r(61);e.Circle=et;var rt=r(62);e.Sector=rt;var nt=r(64);e.Ring=nt;var it=r(65);e.Polygon=it;var at=r(68);e.Polyline=at;var ot=r(69);e.Rect=ot;var st=r(70);e.Line=st;var lt=r(71);e.BezierCurve=lt;var ht=r(72);e.Arc=ht;var ut=r(73);e.CompoundPath=ut;var ct=r(74);e.LinearGradient=ct;var ft=r(75);e.RadialGradient=ft;var dt=r(3);e.BoundingRect=dt;var vt=Math.round,gt=Math.max,pt=Math.min,mt={},xt=V.mergePath;e.extendShape=n,e.extendPath=i,e.makePath=a,e.makeImage=o,e.mergePath=xt,e.resizePath=l,e.subPixelOptimizeLine=h,e.subPixelOptimizeRect=u,e.subPixelOptimize=c,e.setHoverStyle=M,e.setLabelStyle=T,e.setTextStyle=k,e.setText=C,e.getFont=F,e.updateProps=B,e.initProps=z,e.getTransform=N,e.applyTransform=E,e.transformDirection=W,e.groupTransition=q,e.clipPointsByRect=H,e.clipRectByRect=j,e.createIcon=X},function(t,e,r){function n(t,e,r,n,i,a,o,s,l,h,u){var c=l*(p/180),f=g(c)*(t-r)/2+v(c)*(e-n)/2,m=-1*v(c)*(t-r)/2+g(c)*(e-n)/2,w=f*f/(o*o)+m*m/(s*s);w>1&&(o*=d(w),s*=d(w));var _=(i===a?-1:1)*d((o*o*(s*s)-o*o*(m*m)-s*s*(f*f))/(o*o*(m*m)+s*s*(f*f)))||0,b=_*o*m/s,S=_*-s*f/o,M=(t+r)/2+g(c)*b-v(c)*S,T=(e+n)/2+v(c)*b+g(c)*S,k=y([1,0],[(f-b)/o,(m-S)/s]),C=[(f-b)/o,(m-S)/s],P=[(-1*f-b)/o,(-1*m-S)/s],I=y(C,P);x(C,P)<=-1&&(I=p),x(C,P)>=1&&(I=0),0===a&&I>0&&(I-=2*p),1===a&&I<0&&(I+=2*p),u.addData(h,M,T,o,s,k,I,c,a)}function i(t){if(!t)return[];var e,r=t.replace(/-/g," -").replace(/ /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e0&&""===p[0]&&p.shift();for(var m=0;m0},extendFrom:function(t,e){if(t)for(var r in t)!t.hasOwnProperty(r)||!0!==e&&(!1===e?this.hasOwnProperty(r):null==t[r])||(this[r]=t[r])},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,i){for(var a="radial"===e.type?n:r,o=a(t,e,i),s=e.colorStops,l=0;l3&&(e=r.call(e,1));for(var i=this._$handlers[t],a=i.length,o=0;o4&&(e=r.call(e,1,e.length-1));for(var i=e[e.length-1],a=this._$handlers[t],o=a.length,s=0;s0&&this.animate(t,!1).when(null==n?500:n,a).delay(i||0),this}};var f=c;t.exports=f},function(t,e,r){function n(t,e){return t[e]}function i(t,e,r){t[e]=r}function a(t,e,r){return(e-t)*r+t}function o(t,e,r){return r>.5?e:t}function s(t,e,r,n,i){var o=t.length;if(1==i)for(var s=0;si)t.length=i;else for(var a=n;a=0&&!(P[r]<=e);r--);r=Math.min(r,_-2)}else{for(r=H;r<_&&!(P[r]>e);r++);r=Math.min(r-1,_-2)}H=r,j=e;var n=P[r+1]-P[r];if(0!==n)if(z=(e-P[r])/n,w)if(E=I[r],N=I[0===r?r:r-1],W=I[r>_-2?_-1:r+1],q=I[r>_-3?_-1:r+2],M)u(N,E,W,q,z,z*z,z*z*z,g(t,i),C);else{var l;if(T)l=u(N,E,W,q,z,z*z,z*z*z,X,1),l=d(X);else{if(k)return o(E,W,z);l=c(N,E,W,q,z,z*z,z*z*z)}x(t,i,l)}else if(M)s(I[r],I[r+1],z,g(t,i),C);else{var l;if(T)s(I[r],I[r+1],z,X,1),l=d(X);else{if(k)return o(I[r],I[r+1],z);l=a(I[r],I[r+1],z)}x(t,i,l)}},V=new p({target:t._target,life:b,loop:t._loop,delay:t._delay,onframe:Y,ondestroy:r});return e&&"spline"!==e&&(V.easing=e),V}}}var p=r(45),m=r(18),x=r(0),y=x.isArrayLike,w=Array.prototype.slice,_=function(t,e,r,a){this._tracks={},this._target=t,this._loop=e||!1,this._getter=r||n,this._setter=a||i,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};_.prototype={when:function(t,e){var r=this._tracks;for(var n in e)if(e.hasOwnProperty(n)){if(!r[n]){r[n]=[];var i=this._getter(this._target,n);if(null==i)continue;0!==t&&r[n].push({time:0,value:f(i)})}r[n].push({time:t,value:e[n]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t1&&(a=function(){for(var t in arguments)console.log(arguments[t])});var o=a;t.exports=o},function(t,e,r){var n=r(20),i=r(3),a=new i,o=function(){};o.prototype={constructor:o,drawRectText:function(t,e){var r=this.style;e=r.textRect||e,this.__dirty&&n.normalizeTextStyle(r,!0);var i=r.text;if(null!=i&&(i+=""),n.needDrawText(i,r)){t.save();var o=this.transform;r.transformText?this.setTransform(t):o&&(a.copy(e),a.applyTransform(o),e=a),n.renderText(this,t,i,r,e),t.restore()}}};var s=o;t.exports=s},function(t,e,r){function n(t,e,r){if(0!==t.length){var n,i=t[0],a=i[0],o=i[0],s=i[1],l=i[1];for(n=1;n1e-4)return s[0]=t-r,s[1]=e-n,h[0]=t+r,void(h[1]=e+n);if(g[0]=d(i)*r+t,g[1]=f(i)*n+e,p[0]=d(a)*r+t,p[1]=f(a)*n+e,u(s,g,p),c(h,g,p),i%=v,i<0&&(i+=v),a%=v,a<0&&(a+=v),i>a&&!o?a+=v:ii&&(m[0]=d(w)*r+t,m[1]=f(w)*n+e,u(s,m,s),c(h,m,h))}var l=r(2),h=r(4),u=Math.min,c=Math.max,f=Math.sin,d=Math.cos,v=2*Math.PI,g=l.create(),p=l.create(),m=l.create(),x=[],y=[];e.fromPoints=n,e.fromLine=i,e.fromCubic=a,e.fromQuadratic=o,e.fromArc=s},function(t,e,r){function n(t,e){return Math.abs(t-e)e&&u>n&&u>o&&u>l||u1&&i(),f=x.cubicAt(e,n,o,l,M[0]),g>1&&(d=x.cubicAt(e,n,o,l,M[1]))),2==g?me&&s>n&&s>a||s=0&&h<=1){for(var u=0,c=x.quadraticAt(e,n,a,h),f=0;fr||s<-r)return 0;var l=Math.sqrt(r*r-s*s);S[0]=-l,S[1]=l;var h=Math.abs(n-i);if(h<1e-4)return 0;if(h%_<1e-4){n=0,i=_;var u=a?1:-1;return o>=S[0]+t&&o<=S[1]+t?u:0}if(a){var l=n;n=m(i),i=m(l)}else n=m(n),i=m(i);n>i&&(i+=_);for(var c=0,f=0;f<2;f++){var d=S[f];if(d+t>o){var v=Math.atan2(s,d),u=a?1:-1;v<0&&(v=_+v),(v>=n&&v<=i||v+_>=n&&v+_<=i)&&(v>Math.PI/2&&v<1.5*Math.PI&&(u=-u),c+=u)}}return c}function l(t,e,r,i,l){for(var h=0,u=0,c=0,p=0,m=0,x=0;x1&&(r||(h+=y(u,c,p,m,i,l))),1==x&&(u=t[x],c=t[x+1],p=u,m=c),_){case w.M:p=t[x++],m=t[x++],u=p,c=m;break;case w.L:if(r){if(f.containStroke(u,c,t[x],t[x+1],e,i,l))return!0}else h+=y(u,c,t[x],t[x+1],i,l)||0;u=t[x++],c=t[x++];break;case w.C:if(r){if(d.containStroke(u,c,t[x++],t[x++],t[x++],t[x++],t[x],t[x+1],e,i,l))return!0}else h+=a(u,c,t[x++],t[x++],t[x++],t[x++],t[x],t[x+1],i,l)||0;u=t[x++],c=t[x++];break;case w.Q:if(r){if(v.containStroke(u,c,t[x++],t[x++],t[x],t[x+1],e,i,l))return!0}else h+=o(u,c,t[x++],t[x++],t[x],t[x+1],i,l)||0;u=t[x++],c=t[x++];break;case w.A:var b=t[x++],S=t[x++],M=t[x++],T=t[x++],k=t[x++],C=t[x++],P=(t[x++],1-t[x++]),I=Math.cos(k)*M+b,A=Math.sin(k)*T+S;x>1?h+=y(u,c,I,A,i,l):(p=I,m=A);var O=(i-b)*T/M+b;if(r){if(g.containStroke(b,S,T,k,k+C,P,e,O,l))return!0}else h+=s(b,S,T,k,k+C,P,O,l);u=Math.cos(k+C)*M+b,c=Math.sin(k+C)*T+S;break;case w.R:p=u=t[x++],m=c=t[x++];var D=t[x++],L=t[x++],I=p+D,A=m+L;if(r){if(f.containStroke(p,m,I,m,e,i,l)||f.containStroke(I,m,I,A,e,i,l)||f.containStroke(I,A,p,A,e,i,l)||f.containStroke(p,A,p,m,e,i,l))return!0}else h+=y(I,m,I,A,i,l),h+=y(p,A,p,m,i,l);break;case w.Z:if(r){if(f.containStroke(u,c,p,m,e,i,l))return!0}else h+=y(u,c,p,m,i,l);u=p,c=m}}return r||n(c,m)||(h+=y(u,c,p,m,i,l)||0),0!==h}function h(t,e,r){return l(t,0,!1,e,r)}function u(t,e,r,n){return l(t,e,!0,r,n)}var c=r(6),f=r(51),d=r(52),v=r(53),g=r(54),p=r(22),m=p.normalizeRadian,x=r(4),y=r(55),w=c.CMD,_=2*Math.PI,b=1e-4,S=[-1,-1,-1],M=[-1,-1];e.contain=h,e.containStroke=u},function(t,e){function r(t,e,r,n,i,a,o){if(0===i)return!1;var s=i,l=0,h=t;if(o>e+s&&o>n+s||ot+s&&a>r+s||ae+f&&c>n+f&&c>o+f&&c>l+f||ct+f&&u>r+f&&u>a+f&&u>s+f||ue+u&&h>n+u&&h>o+u||ht+u&&l>r+u&&l>i+u||lr||f+ci&&(i+=o);var v=Math.atan2(u,h);return v<0&&(v+=o),v>=n&&v<=i||v+o>=n&&v+o<=i}var i=r(22),a=i.normalizeRadian,o=2*Math.PI;e.containStroke=n},function(t,e){function r(t,e,r,n,i,a){if(a>e&&a>n||ai?o:0}t.exports=r},function(t,e){var r=function(t,e){this.image=t,this.repeat=e,this.type="pattern"};r.prototype.getCanvasPattern=function(t){return t.createPattern(this.image,this.repeat||"repeat")};var n=r;t.exports=n},function(t,e,r){function n(t,e){var r,n,i,a,c,f,d=t.data,v=s.M,g=s.C,p=s.L,m=s.R,x=s.A,y=s.Q;for(i=0,a=0;i=0&&(r.splice(n,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,r=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof o&&t.addChildrenToStorage(e)),r&&r.refresh()},remove:function(t){var e=this.__zr,r=this.__storage,i=this._children,a=n.indexOf(i,t);return a<0?this:(i.splice(a,1),t.parent=null,r&&(r.delFromStorage(t),t instanceof o&&t.delChildrenFromStorage(r)),e&&e.refresh(),this)},removeAll:function(){var t,e,r=this._children,n=this.__storage;for(e=0;e=11?function(){var e,r=this.__clipPaths,n=this.style;if(r)for(var i=0;ir-2?r-1:d+1],c=t[d>r-3?r-1:d+2]);var p=v*v,m=v*p;i.push([n(h[0],g[0],u[0],c[0],v,p,m),n(h[1],g[1],u[1],c[1],v,p,m)])}return i}var a=r(2),o=a.distance;t.exports=i},function(t,e,r){function n(t,e,r,n){var i,f,d,v,g=[],p=[],m=[],x=[];if(n){d=[1/0,1/0],v=[-1/0,-1/0];for(var y=0,w=t.length;y=0?1/(Math.cos(2*Math.PI/10-e)+3.07768*Math.sin(2*Math.PI/10-e)):1/(Math.cos(e)+3.07768*Math.sin(e))}}n.gridSize=Math.max(Math.floor(n.gridSize),4);var h,u,c,f,d,v,g,p=n.gridSize,m=p-n.maskGapWidth,x=Math.abs(n.maxRotation-n.minRotation),y=Math.min(n.maxRotation,n.minRotation),w=n.rotationStep;switch(n.color){case"random-dark":g=function(){return r(10,50)};break;case"random-light":g=function(){return r(50,90)};break;default:"function"==typeof n.color&&(g=n.color)}var _=null;"function"==typeof n.classes&&(_=n.classes);var b,S=!1,M=[],T=function(t){var e,r,n=t.currentTarget,i=n.getBoundingClientRect();t.touches?(e=t.touches[0].clientX,r=t.touches[0].clientY):(e=t.clientX,r=t.clientY);var a=e-i.left,o=r-i.top,s=Math.floor(a*(n.width/i.width||1)/p),l=Math.floor(o*(n.height/i.height||1)/p);return M[s][l]},k=function(t){var e=T(t);if(b!==e){if(b=e,!e)return void n.hover(void 0,void 0,t);n.hover(e.item,e.dimension,t)}},C=function(t){var e=T(t);e&&(n.click(e.item,e.dimension,t),t.preventDefault())},P=[],I=function(t){if(P[t])return P[t];var e=8*t,r=e,i=[];for(0===t&&i.push([f[0],f[1],0]);r--;){var a=1;"circle"!==n.shape&&(a=n.shape(r/e*2*Math.PI)),i.push([f[0]+t*a*Math.cos(-r/e*2*Math.PI),f[1]+t*a*Math.sin(-r/e*2*Math.PI)*n.ellipticity,r/e*2*Math.PI])}return P[t]=i,i},A=function(){return n.abortThreshold>0&&(new Date).getTime()-v>n.abortThreshold},O=function(){return 0===n.rotateRatio?0:Math.random()>n.rotateRatio?0:0===x?y:y+Math.round(Math.random()*x/w)*w},D=function(t,e,r){var i=n.weightFactor(e);if(i<=n.minSize)return!1;var a=1;iP[1]&&(P[1]=C),SP[2]&&(P[2]=S);break t}}return{mu:a,occupied:k,bounds:P,gw:y,gh:x,fillTextOffsetX:g,fillTextOffsetY:m,fillTextWidth:h,fillTextHeight:u,fontSize:i}},L=function(t,e,r,i,a){for(var o=a.length;o--;){var s=t+a[o][0],l=e+a[o][1];if(s>=u||l>=c||s<0||l<0){if(!n.drawOutOfBound)return!1}else if(!h[s][l])return!1}return!0},F=function(e,r,i,a,o,s,l,h,u){var c,f=i.fontSize;c=g?g(a,o,f,s,l):n.color;var d;d=_?_(a,o,f,s,l):n.classes;var v=i.bounds;v[3],v[0],v[1],v[3],v[2],v[0],t.forEach(function(t){if(t.getContext){var o=t.getContext("2d"),s=i.mu;o.save(),o.scale(1/s,1/s),o.font=n.fontWeight+" "+(f*s).toString(10)+"px "+n.fontFamily,o.fillStyle=c,o.translate((e+i.gw/2)*p*s,(r+i.gh/2)*p*s),0!==h&&o.rotate(-h),o.textBaseline="middle",o.fillText(a,i.fillTextOffsetX*s,(i.fillTextOffsetY+.5*f)*s),o.restore()}else{var l=document.createElement("span"),v="";v="rotate("+-h/Math.PI*180+"deg) ",1!==i.mu&&(v+="translateX(-"+i.fillTextWidth/4+"px) scale("+1/i.mu+")");var g={position:"absolute",display:"block",font:n.fontWeight+" "+f*i.mu+"px "+n.fontFamily,left:(e+i.gw/2)*p+i.fillTextOffsetX+"px",top:(r+i.gh/2)*p+i.fillTextOffsetY+"px",width:i.fillTextWidth+"px",height:i.fillTextHeight+"px",lineHeight:f+"px",whiteSpace:"nowrap",transform:v,webkitTransform:v,msTransform:v,transformOrigin:"50% 40%",webkitTransformOrigin:"50% 40%",msTransformOrigin:"50% 40%"};c&&(g.color=c),l.textContent=a;for(var m in g)l.style[m]=g[m];if(u)for(var x in u)l.setAttribute(x,u[x]);d&&(l.className+=d),t.appendChild(l)}})},R=function(e,r,n,i,a){if(!(e>=u||r>=c||e<0||r<0)){if(h[e][r]=!1,n){t[0].getContext("2d").fillRect(e*p,r*p,m,m)}S&&(M[e][r]={item:a,dimension:i})}},B=function(e,r,i,a,o,s){var l,h=o.occupied,f=n.drawMask;f&&(l=t[0].getContext("2d"),l.save(),l.fillStyle=n.maskColor);var d;if(S){var v=o.bounds;d={x:(e+v[3])*p,y:(r+v[0])*p,w:(v[1]-v[3]+1)*p,h:(v[2]-v[0]+1)*p}}for(var g=h.length;g--;){var m=e+h[g][0],x=r+h[g][1];m>=u||x>=c||m<0||x<0||R(m,x,f,d,s)}f&&l.restore()},z=function(t){var e,r,i;Array.isArray(t)?(e=t[0],r=t[1]):(e=t.word,r=t.weight,i=t.attributes);var a=O(),o=D(e,r,a);if(!o)return!1;if(A())return!1;if(!n.drawOutOfBound){var l=o.bounds;if(l[1]-l[3]+1>u||l[2]-l[0]+1>c)return!1}for(var h=d+1;h--;){var f=I(d-h);n.shuffle&&(f=[].concat(f),s(f));for(var v=0;v=n.list.length)return w(P),N("wordcloudstop",!1),void _("wordcloudstart",T);v=(new Date).getTime();var e=z(n.list[o]),r=!N("wordclouddrawn",!0,{item:n.list[o],drawn:e});if(A()||r)return w(P),n.abort(),N("wordcloudabort",!1),N("wordcloudstop",!1),void _("wordcloudstart",T);o++,P=y(t,n.wait)},n.wait)}}()}};l.isSupported=a,l.minFontSize=o,n=[],void 0!==(i=function(){return l}.apply(e,n))&&(t.exports=i)}()}])}); \ No newline at end of file diff --git a/public/resource/assets/libs/echarts/echarts.min.js b/public/resource/assets/libs/echarts/echarts.min.js new file mode 100644 index 0000000..58e3398 --- /dev/null +++ b/public/resource/assets/libs/echarts/echarts.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.echarts={})}(this,function(t){"use strict";var e=2311,n=function(){return e++},v="object"==typeof wx&&"function"==typeof wx.getSystemInfoSync?{browser:{},os:{},node:!1,wxa:!0,canvasSupported:!0,svgSupported:!1,touchEventsSupported:!0,domSupported:!1}:"undefined"==typeof document&&"undefined"!=typeof self?{browser:{},os:{},node:!1,worker:!0,canvasSupported:!0,domSupported:!1}:"undefined"==typeof navigator?{browser:{},os:{},node:!0,worker:!1,canvasSupported:!0,svgSupported:!0,domSupported:!1}:function(t){var e={},i=t.match(/Firefox\/([\d.]+)/),n=t.match(/MSIE\s([\d.]+)/)||t.match(/Trident\/.+?rv:(([\d.]+))/),o=t.match(/Edge\/([\d.]+)/),a=/micromessenger/i.test(t);i&&(e.firefox=!0,e.version=i[1]);n&&(e.ie=!0,e.version=n[1]);o&&(e.edge=!0,e.version=o[1]);a&&(e.weChat=!0);return{browser:e,os:{},node:!1,canvasSupported:!!document.createElement("canvas").getContext,svgSupported:"undefined"!=typeof SVGRect,touchEventsSupported:"ontouchstart"in window&&!e.ie&&!e.edge,pointerEventsSupported:"onpointerdown"in window&&(e.edge||e.ie&&11<=e.version),domSupported:"undefined"!=typeof document}}(navigator.userAgent);var s={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},l={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},u=Object.prototype.toString,i=Array.prototype,r=i.forEach,h=i.filter,o=i.slice,c=i.map,d=i.reduce,a={};function f(t,e){"createCanvas"===t&&(y=null),a[t]=e}function L(t){if(null==t||"object"!=typeof t)return t;var e=t,i=u.call(t);if("[object Array]"===i){if(!$(t)){e=[];for(var n=0,o=t.length;n>1)%2;s.cssText=["position: absolute","visibility: hidden","padding: 0","margin: 0","border-width: 0","user-select: none","width:0","height:0",n[l]+":0",o[u]+":0",n[1-l]+":auto",o[1-u]+":auto",""].join("!important;"),t.appendChild(r),i.push(r)}return i}(e,a),a,o);if(r)return r(t,i,n),!0}return!1}function zt(t){return"CANVAS"===t.nodeName.toUpperCase()}var Bt="undefined"!=typeof window&&!!window.addEventListener,Vt=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Gt=[];function Ft(t,e,i,n){return i=i||{},n||!v.canvasSupported?Wt(t,e,i):v.browser.firefox&&null!=e.layerX&&e.layerX!==e.offsetX?(i.zrX=e.layerX,i.zrY=e.layerY):null!=e.offsetX?(i.zrX=e.offsetX,i.zrY=e.offsetY):Wt(t,e,i),i}function Wt(t,e,i){if(v.domSupported&&t.getBoundingClientRect){var n=e.clientX,o=e.clientY;if(zt(t)){var a=t.getBoundingClientRect();return i.zrX=n-a.left,void(i.zrY=o-a.top)}if(Rt(Gt,t,n,o))return i.zrX=Gt[0],void(i.zrY=Gt[1])}i.zrX=i.zrY=0}function Ht(t){return t||window.event}function Zt(t,e,i){if(null!=(e=Ht(e)).zrX)return e;var n=e.type;if(n&&0<=n.indexOf("touch")){var o="touchend"!==n?e.targetTouches[0]:e.changedTouches[0];o&&Ft(t,o,e,i)}else Ft(t,e,e,i),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;var a=e.button;return null==e.which&&void 0!==a&&Vt.test(e.type)&&(e.which=1&a?1:2&a?3:4&a?2:0),e}function Ut(t,e,i,n){Bt?t.addEventListener(e,i,n):t.attachEvent("on"+e,i)}var Xt=Bt?function(t){t.preventDefault(),t.stopPropagation(),t.cancelBubble=!0}:function(t){t.returnValue=!1,t.cancelBubble=!0};function Yt(t){return 2===t.which||3===t.which}function jt(){this._track=[]}function qt(t){var e=t[1][0]-t[0][0],i=t[1][1]-t[0][1];return Math.sqrt(e*e+i*i)}jt.prototype={constructor:jt,recognize:function(t,e,i){return this._doTrack(t,e,i),this._recognize(t)},clear:function(){return this._track.length=0,this},_doTrack:function(t,e,i){var n=t.touches;if(n){for(var o={points:[],touches:[],target:e,event:t},a=0,r=n.length;an.getWidth()||i<0||i>n.getHeight()}te.prototype={constructor:te,setHandlerProxy:function(e){this.proxy&&this.proxy.dispose(),e&&(E(ee,function(t){e.on&&e.on(t,this[t],this)},this),e.handler=this),this.proxy=e},mousemove:function(t){var e=t.zrX,i=t.zrY,n=ne(this,e,i),o=this._hovered,a=o.target;a&&!a.__zr&&(a=(o=this.findHover(o.x,o.y)).target);var r=this._hovered=n?{x:e,y:i}:this.findHover(e,i),s=r.target,l=this.proxy;l.setCursor&&l.setCursor(s?s.cursor:"default"),a&&s!==a&&this.dispatchToElement(o,"mouseout",t),this.dispatchToElement(r,"mousemove",t),s&&s!==a&&this.dispatchToElement(r,"mouseover",t)},mouseout:function(t){var e=t.zrEventControl,i=t.zrIsToLocalDOM;"only_globalout"!==e&&this.dispatchToElement(this._hovered,"mouseout",t),"no_globalout"!==e&&(i||this.trigger("globalout",{type:"globalout",event:t}))},resize:function(t){this._hovered={}},dispatch:function(t,e){var i=this[t];i&&i.call(this,e)},dispose:function(){this.proxy.dispose(),this.storage=this.proxy=this.painter=null},setCursorStyle:function(t){var e=this.proxy;e.setCursor&&e.setCursor(t)},dispatchToElement:function(t,e,i){var n=(t=t||{}).target;if(!n||!n.silent){for(var o="on"+e,a=function(t,e,i){return{type:t,event:i,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:i.zrX,offsetY:i.zrY,gestureEvent:i.gestureEvent,pinchX:i.pinchX,pinchY:i.pinchY,pinchScale:i.pinchScale,wheelDelta:i.zrDelta,zrByTouch:i.zrByTouch,which:i.which,stop:Jt}}(e,t,i);n&&(n[o]&&(a.cancelBubble=n[o].call(n,a)),n.trigger(e,a),n=n.parent,!a.cancelBubble););a.cancelBubble||(this.trigger(e,a),this.painter&&this.painter.eachOtherLayer(function(t){"function"==typeof t[o]&&t[o].call(t,a),t.trigger&&t.trigger(e,a)}))}},findHover:function(t,e,i){for(var n=this.storage.getDisplayList(),o={x:t,y:e},a=n.length-1;0<=a;a--){var r;if(n[a]!==i&&!n[a].ignore&&(r=ie(n[a],t,e))&&(o.topTarget||(o.topTarget=n[a]),r!==$t)){o.target=n[a];break}}return o},processGesture:function(t,e){this._gestureMgr||(this._gestureMgr=new jt);var i=this._gestureMgr;"start"===e&&i.clear();var n=i.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if("end"===e&&i.clear(),n){var o=n.type;t.gestureEvent=o,this.dispatchToElement({target:n.target},o,n.event)}}},E(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(r){te.prototype[r]=function(t){var e,i,n=t.zrX,o=t.zrY,a=ne(this,n,o);if("mouseup"===r&&a||(i=(e=this.findHover(n,o)).target),"mousedown"===r)this._downEl=i,this._downPoint=[t.zrX,t.zrY],this._upEl=i;else if("mouseup"===r)this._upEl=i;else if("click"===r){if(this._downEl!==this._upEl||!this._downPoint||4=this._maxSize&&0>4|(3840&n)>>8,240&n|(240&n)>>4,15&n|(15&n)<<4,1),Ge(t,e),e):void Re(e,0,0,0,1):7===o.length?0<=(n=parseInt(o.substr(1),16))&&n<=16777215?(Re(e,(16711680&n)>>16,(65280&n)>>8,255&n,1),Ge(t,e),e):void Re(e,0,0,0,1):void 0;var a=o.indexOf("("),r=o.indexOf(")");if(-1!==a&&r+1===o.length){var s=o.substr(0,a),l=o.substr(a+1,r-(a+1)).split(","),u=1;switch(s){case"rgba":if(4!==l.length)return void Re(e,0,0,0,1);u=Ne(l.pop());case"rgb":return 3!==l.length?void Re(e,0,0,0,1):(Re(e,Pe(l[0]),Pe(l[1]),Pe(l[2]),u),Ge(t,e),e);case"hsla":return 4!==l.length?void Re(e,0,0,0,1):(l[3]=Ne(l[3]),We(l,e),Ge(t,e),e);case"hsl":return 3!==l.length?void Re(e,0,0,0,1):(We(l,e),Ge(t,e),e);default:return}}Re(e,0,0,0,1)}}function We(t,e){var i=(parseFloat(t[0])%360+360)%360/360,n=Ne(t[1]),o=Ne(t[2]),a=o<=.5?o*(n+1):o+n-o*n,r=2*o-a;return Re(e=e||[],Le(255*Oe(r,a,i+1/3)),Le(255*Oe(r,a,i)),Le(255*Oe(r,a,i-1/3)),1),4===t.length&&(e[3]=t[3]),e}function He(t,e){var i=Fe(t);if(i){for(var n=0;n<3;n++)i[n]=e<0?i[n]*(1-e)|0:(255-i[n])*e+i[n]|0,255e);i++);i=Math.min(i-1,u-2)}C=e;var n=g[(D=i)+1]-g[i];if(0!=n)if(S=(e-g[i])/n,l)if(I=m[i],M=m[0===i?i:i-1],T=m[u-2=i.x&&t<=i.x+i.width&&e>=i.y&&e<=i.y+i.height},clone:function(){return new Di(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},Di.create=function(t){return new Di(t.x,t.y,t.width,t.height)};var Ci=function(t){for(var e in t=t||{},_i.call(this,t),t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};Ci.prototype={constructor:Ci,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,i=0;i>>1])<0?l=a:s=1+a;var u=n-s;switch(u){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;0>>1);0>>1);a(t,e[i+h])<0?l=h:r=h+1}return l}function Ri(p,g){var r,s,m=ki,l=0,v=[];function e(t){var e=r[t],i=s[t],n=r[t+1],o=s[t+1];s[t]=i+o,t===l-3&&(r[t+1]=r[t+2],s[t+1]=s[t+2]),l--;var a=Ei(p[n],p,e,i,0,g);e+=a,0!==(i-=a)&&0!==(o=Oi(p[e+i-1],p,n,o,o-1,g))&&(i<=o?function(t,e,i,n){var o=0;for(o=0;os[t+1])break;e(t)}},this.forceMergeRuns=function(){for(;1>=1;return t+e}(o);do{if((a=Pi(t,i,n,e))=e.maxIterations){t+=e.ellipsis;break}var s=0===r?bn(t,o,e.ascCharWidth,e.cnCharWidth):0f)return{lines:[],width:0,height:0};C.textWidth=pn(C.text,w);var S=x.textWidth,M=null==S||"auto"===S;if("string"==typeof S&&"%"===S.charAt(S.length-1))C.percentWidth=S,u.push(C),S=0;else{if(M){S=C.textWidth;var I=x.textBackgroundColor,T=I&&I.image;T&&sn(T=on(T))&&(S=Math.max(S,T.width*b/T.height))}var A=_?_[1]+_[3]:0;S+=A;var D=null!=d?d-v:null;null!=D&&Dn[0]){for(r=0;rt);r++);a=i[n[r]]}if(n.splice(r+1,0,t),!(i[t]=e).virtual)if(a){var l=a.dom;l.nextSibling?s.insertBefore(e.dom,l.nextSibling):s.appendChild(e.dom)}else s.firstChild?s.insertBefore(e.dom,s.firstChild):s.appendChild(e.dom)}else vi("Layer of zlevel "+t+" is not valid")},eachLayer:function(t,e){var i,n,o=this._zlevelList;for(n=0;n=a.length&&a.push({option:t})}}),a}function Zo(t){var r=Q();Eo(t,function(t,e){var i=t.exist;i&&r.set(i.id,t)}),Eo(t,function(t,e){var i=t.option;Y(!i||null==i.id||!r.get(i.id)||r.get(i.id)===t,"id duplicates: "+(i&&i.id)),i&&null!=i.id&&r.set(i.id,t),t.keyInfo||(t.keyInfo={})}),Eo(t,function(t,e){var i=t.exist,n=t.option,o=t.keyInfo;if(Ro(n)){if(o.name=null!=n.name?n.name+"":i?i.name:Bo+e,i)o.id=i.id;else if(null!=n.id)o.id=n.id+"";else for(var a=0;o.id="\0"+o.name+"\0"+a++,r.get(o.id););r.set(o.id,t)}})}function Uo(t){var e=t.name;return!(!e||!e.indexOf(Bo))}function Xo(t){return Ro(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function Yo(e,t){return null!=t.dataIndexInside?t.dataIndexInside:null!=t.dataIndex?O(t.dataIndex)?N(t.dataIndex,function(t){return e.indexOfRawIndex(t)}):e.indexOfRawIndex(t.dataIndex):null!=t.name?O(t.name)?N(t.name,function(t){return e.indexOfName(t)}):e.indexOfName(t.name):void 0}function jo(){var e="__\0ec_inner_"+qo+++"_"+Math.random().toFixed(5);return function(t){return t[e]||(t[e]={})}}var qo=0;function Ko(s,l,u){if(R(l)){var t={};t[l+"Index"]=0,l=t}var e=u&&u.defaultMainType;!e||$o(l,e+"Index")||$o(l,e+"Id")||$o(l,e+"Name")||(l[e+"Index"]=0);var h={};return Eo(l,function(t,e){t=l[e];if("dataIndex"!==e&&"dataIndexInside"!==e){var i=e.match(/^(\w+)(Index|Id|Name)$/)||[],n=i[1],o=(i[2]||"").toLowerCase();if(!(!n||!o||null==t||"index"===o&&"none"===t||u&&u.includeMainTypes&&_(u.includeMainTypes,n)<0)){var a={mainType:n};"index"===o&&"all"===t||(a[o]=t);var r=s.queryComponents(a);h[n+"Models"]=r,h[n+"Model"]=r[0]}}else h[e]=t}),h}function $o(t,e){return t&&t.hasOwnProperty(e)}function Jo(t,e,i){t.setAttribute?t.setAttribute(e,i):t[e]=i}function Qo(t){return"auto"===t?v.domSupported?"html":"richText":t||"html"}function ta(t,i){var n=Q(),o=[];return E(t,function(t){var e=i(t);(n.get(e)||(o.push(e),n.set(e,[]))).push(t)}),{keys:o,buckets:n}}var ea=".",ia="___EC__COMPONENT__CONTAINER___";function na(t){var e={main:"",sub:""};return t&&(t=t.split(ea),e.main=t[0]||"",e.sub=t[1]||""),e}function oa(t){(t.$constructor=t).extend=function(t){function e(){t.$constructor?t.$constructor.apply(this,arguments):i.apply(this,arguments)}var i=this;return k(e.prototype,t),e.extend=this.extend,e.superCall=sa,e.superApply=la,w(e,this),e.superClass=i,e}}var aa=0;function ra(t){var e=["__\0is_clz",aa++,Math.random().toFixed(3)].join("_");t.prototype[e]=!0,t.isInstance=function(t){return!(!t||!t[e])}}function sa(t,e){var i=U(arguments,2);return this.superClass.prototype[e].apply(t,i)}function la(t,e,i){return this.superClass.prototype[e].apply(t,i)}function ua(i,t){t=t||{};var o={};if(i.registerClass=function(t,e){if(e)if(function(t){Y(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}(e),(e=na(e)).sub){if(e.sub!==ia){(function(t){var e=o[t.main];e&&e[ia]||((e=o[t.main]={})[ia]=!0);return e})(e)[e.sub]=t}}else o[e.main]=t;return t},i.getClass=function(t,e,i){var n=o[t];if(n&&n[ia]&&(n=e?n[e]:null),i&&!n)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return n},i.getClassesByMainType=function(t){t=na(t);var i=[],e=o[t.main];return e&&e[ia]?E(e,function(t,e){e!==ia&&i.push(t)}):i.push(e),i},i.hasClass=function(t){return t=na(t),!!o[t.main]},i.getAllClassMainTypes=function(){var i=[];return E(o,function(t,e){i.push(e)}),i},i.hasSubTypes=function(t){t=na(t);var e=o[t.main];return e&&e[ia]},i.parseClassType=na,t.registerWhenExtend){var n=i.extend;n&&(i.extend=function(t){var e=n.call(this,t);return i.registerClass(e,t.type)})}return i}function ha(s){for(var t=0;tthis._ux||or(e-this._yi)>this._uy||this._len<5;return this.addData(ja.L,t,e),this._ctx&&i&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),i&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,i,n,o,a){return this.addData(ja.C,t,e,i,n,o,a),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,i,n,o,a):this._ctx.bezierCurveTo(t,e,i,n,o,a)),this._xi=o,this._yi=a,this},quadraticCurveTo:function(t,e,i,n){return this.addData(ja.Q,t,e,i,n),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,i,n):this._ctx.quadraticCurveTo(t,e,i,n)),this._xi=i,this._yi=n,this},arc:function(t,e,i,n,o,a){return this.addData(ja.A,t,e,i,i,n,o-n,0,a?0:1),this._ctx&&this._ctx.arc(t,e,i,n,o,a),this._xi=er(o)*i+t,this._yi=ir(o)*i+e,this},arcTo:function(t,e,i,n,o){return this._ctx&&this._ctx.arcTo(t,e,i,n,o),this},rect:function(t,e,i,n){return this._ctx&&this._ctx.rect(t,e,i,n),this.addData(ja.R,t,e,i,n),this},closePath:function(){this.addData(ja.Z);var t=this._ctx,e=this._x0,i=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,i),t.closePath()),this._xi=e,this._yi=i,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t;for(var e=this._dashIdx=0,i=0;ie.length&&(this._expandData(),e=this.data);for(var i=0;il||or(r-o)>u||c===h-1)&&(t.lineTo(a,r),n=a,o=r);break;case ja.C:t.bezierCurveTo(s[c++],s[c++],s[c++],s[c++],s[c++],s[c++]),n=s[c-2],o=s[c-1];break;case ja.Q:t.quadraticCurveTo(s[c++],s[c++],s[c++],s[c++]),n=s[c-2],o=s[c-1];break;case ja.A:var f=s[c++],p=s[c++],g=s[c++],m=s[c++],v=s[c++],y=s[c++],x=s[c++],_=s[c++],w=m=yr[n=0]+t&&r<=yr[1]+t?h:0}if(a){l=n;n=cr(o),o=cr(l)}else n=cr(n),o=cr(o);oMath.PI/2&&p<1.5*Math.PI&&(h=-h),c+=h)}}return c}function Sr(t,e,i,n,o){for(var a=0,r=0,s=0,l=0,u=0,h=0;hMath.abs(a[1])?0=e[1])return i[1]}else{if(t>=e[0])return i[0];if(t<=e[1])return i[1]}else{if(t===e[0])return i[0];if(t===e[1])return i[1]}return(t-e[0])/o*a+i[0]}function Rl(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?function(t){return t.replace(/^\s+|\s+$/g,"")}(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function zl(t,e,i){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),i?t:+t}function Bl(t){return t.sort(function(t,e){return t-e}),t}function Vl(t){if(t=+t,isNaN(t))return 0;for(var e=1,i=0;Math.round(t*e)/e!==t;)e*=10,i++;return i}function Gl(t){var e=t.toString(),i=e.indexOf("e");if(0h&&(h=u[d],c=d);++s[c],u[c]=0,++l}return s[e]/o}var Hl=9007199254740991;function Zl(t){var e=2*Math.PI;return(t%e+e)%e}function Ul(t){return-Ol"'])/g,ou={"&":"&","<":"<",">":">",'"':""","'":"'"};function au(t){return null==t?"":(t+"").replace(nu,function(t,e){return ou[e]})}function ru(t,e){return"{"+t+(null==e?"":e)+"}"}var su=["a","b","c","d","e","f","g"];function lu(t,e,i){O(e)||(e=[e]);var n=e.length;if(!n)return"";for(var o=e[0].$vars||[],a=0;a':'':{renderMode:o,content:"{marker"+a+"|} ",style:{color:i}}:""}function cu(t,e){return"0000".substr(0,e-(t+="").length)+t}function du(t,e,i){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var n=Yl(e),o=i?"UTC":"",a=n["get"+o+"FullYear"](),r=n["get"+o+"Month"]()+1,s=n["get"+o+"Date"](),l=n["get"+o+"Hours"](),u=n["get"+o+"Minutes"](),h=n["get"+o+"Seconds"](),c=n["get"+o+"Milliseconds"]();return t=t.replace("MM",cu(r,2)).replace("M",r).replace("yyyy",a).replace("yy",a%100).replace("dd",cu(s,2)).replace("d",s).replace("hh",cu(l,2)).replace("h",l).replace("mm",cu(u,2)).replace("m",u).replace("ss",cu(h,2)).replace("s",h).replace("SSS",cu(c,3))}function fu(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t}var pu=xn;var gu=(Object.freeze||Object)({addCommas:tu,toCamelCase:eu,normalizeCssArray:iu,encodeHTML:au,formatTpl:lu,formatTplSimple:uu,getTooltipMarker:hu,formatTime:du,capitalFirst:fu,truncateText:pu,getTextBoundingRect:function(t){return gn(t.text,t.font,t.textAlign,t.textVerticalAlign,t.textPadding,t.textLineHeight,t.rich,t.truncate)},getTextRect:function(t,e,i,n,o,a,r,s){return gn(t,e,i,n,o,s,a,r)}}),mu=E,vu=["left","right","top","bottom","width","height"],yu=[["width","left","right"],["height","top","bottom"]];function xu(h,c,d,f,p){var g=0,m=0;null==f&&(f=1/0),null==p&&(p=1/0);var v=0;c.eachChild(function(t,e){var i,n,o=t.position,a=t.getBoundingRect(),r=c.childAt(e+1),s=r&&r.getBoundingRect();if("horizontal"===h){var l=a.width+(s?-s.x+a.x:0);v=f<(i=g+l)||t.newline?(g=0,i=l,m+=v+d,a.height):Math.max(v,a.height)}else{var u=a.height+(s?-s.y+a.y:0);v=p<(n=m+u)||t.newline?(g+=v+d,m=0,n=u,a.width):Math.max(v,a.width)}t.newline||(o[0]=g,o[1]=m,"horizontal"===h?g=i+d:m=n+d)})}var _u=xu;T(xu,"vertical"),T(xu,"horizontal");function wu(t,e,i){i=iu(i||0);var n=e.width,o=e.height,a=Rl(t.left,n),r=Rl(t.top,o),s=Rl(t.right,n),l=Rl(t.bottom,o),u=Rl(t.width,n),h=Rl(t.height,o),c=i[2]+i[0],d=i[1]+i[3],f=t.aspect;switch(isNaN(u)&&(u=n-s-d-a),isNaN(h)&&(h=o-l-c-r),null!=f&&(isNaN(u)&&isNaN(h)&&(n/oe)return t[n];return t[i-1]}(s,i):r;if((l=l||r)&&l.length){var u=l[o];return t&&(a[t]=u),n.colorIdx=(o+1)%l.length,u}}},Ru="original",zu="arrayRows",Bu="objectRows",Vu="keyedColumns",Gu="unknown",Fu="typedArray",Wu="column",Hu="row";function Zu(t){this.fromDataset=t.fromDataset,this.data=t.data||(t.sourceFormat===Vu?{}:[]),this.sourceFormat=t.sourceFormat||Gu,this.seriesLayoutBy=t.seriesLayoutBy||Wu,this.dimensionsDefine=t.dimensionsDefine,this.encodeDefine=t.encodeDefine&&Q(t.encodeDefine),this.startIndex=t.startIndex||0,this.dimensionsDetectCount=t.dimensionsDetectCount}Zu.seriesDataToSource=function(t){return new Zu({data:t,sourceFormat:V(t)?Fu:Ru,fromDataset:!1})},ra(Zu);var Uu={Must:1,Might:2,Not:3},Xu=jo();function Yu(t){var e=t.option,i=e.data,n=V(i)?Fu:Ru,o=!1,a=e.seriesLayoutBy,r=e.sourceHeader,s=e.dimensions,l=Ju(t);if(l){var u=l.option;i=u.source,n=Xu(l).sourceFormat,o=!0,a=a||u.seriesLayoutBy,null==r&&(r=u.sourceHeader),s=s||u.dimensions}var h=function(t,e,i,n,o){if(!t)return{dimensionsDefine:ju(o)};var a,r;if(e===zu)"auto"===n||null==n?qu(function(t){null!=t&&"-"!==t&&(R(t)?null==r&&(r=1):r=0)},i,t,10):r=n?1:0,o||1!==r||(o=[],qu(function(t,e){o[e]=null!=t?t:""},i,t)),a=o?o.length:i===Hu?t.length:t[0]?t[0].length:null;else if(e===Bu)o=o||function(t){var e,i=0;for(;i":"\n",f="richText"===c,p={},g=0;function i(t){return{renderMode:c,content:au(tu(t)),style:p}}var m=this.getData(),a=m.mapDimension("defaultedTooltip",!0),n=a.length,r=this.getRawValue(o),s=O(r),v=m.getItemVisual(o,"color");z(v)&&v.colorStops&&(v=(v.colorStops[0]||{}).color),v=v||"transparent";var l=(1":"",n=i+u.join(i||", ");return{renderMode:c,content:n,style:p}}(r):i(n?Wh(m,o,a[0]):s?r[0]:r)).content,u=d.seriesIndex+"at"+g,y=hu({color:v,type:"item",renderMode:c,markerId:u});p[u]=v,++g;var x=m.getName(o),_=this.name;Uo(this)||(_=""),_=_?au(_)+(h?": ":e):"";var w="string"==typeof y?y:y.content;return{html:h?w+_+l:_+w+(x?au(x)+": "+l:l),markers:p}},isAnimationEnabled:function(){if(v.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){this.dataTask.dirty()},getColorFromPalette:function(t,e,i){var n=this.ecModel,o=Eu.getColorFromPalette.call(this,t,e,i);return o=o||n.getColorFromPalette(t,e,i)},coordDimToDataDim:function(t){return this.getRawData().mapDimension(t,!0)},getProgressive:function(){return this.get("progressive")},getProgressiveThreshold:function(){return this.get("progressiveThreshold")},getAxisTooltipData:null,getTooltipPosition:null,pipeTask:null,preventIncremental:null,pipelineContext:null});function sc(t){var e=t.name;Uo(t)||(t.name=function(t){var i=t.getRawData(),e=i.mapDimension("seriesName",!0),n=[];return E(e,function(t){var e=i.getDimensionInfo(t);e.displayName&&n.push(e.displayName)}),n.join(" ")}(t)||e)}function lc(t){return t.model.getRawData().count()}function uc(t){var e=t.model;return e.setData(e.getRawData().cloneShallow()),hc}function hc(t,e){t.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function cc(e,i){E(e.CHANGABLE_METHODS,function(t){e.wrapMethod(t,T(dc,i))})}function dc(t){var e=fc(t);e&&e.setOutputEnd(this.count())}function fc(t){var e=(t.ecModel||{}).scheduler,i=e&&e.getPipeline(t.uid);if(i){var n=i.currentTask;if(n){var o=n.agentStubMap;o&&(n=o.get(t.uid))}return n}}b(rc,Uh),b(rc,Eu);var pc=function(){this.group=new Ci,this.uid=Nl("viewComponent")};pc.prototype={constructor:pc,init:function(t,e){},render:function(t,e,i,n){},dispose:function(){},filterForExposedEvent:null};var gc=pc.prototype;gc.updateView=gc.updateLayout=gc.updateVisual=function(t,e,i,n){},oa(pc),ua(pc,{registerWhenExtend:!0});function mc(){var s=jo();return function(t){var e=s(t),i=t.pipelineContext,n=e.large,o=e.progressiveRender,a=e.large=i&&i.large,r=e.progressiveRender=i&&i.progressiveRender;return!!(n^a||o^r)&&"reset"}}var vc=jo(),yc=mc();function xc(){this.group=new Ci,this.uid=Nl("viewChart"),this.renderTask=Xh({plan:Sc,reset:Mc}),this.renderTask.context={view:this}}var _c=xc.prototype={type:"chart",init:function(t,e){},render:function(t,e,i,n){},highlight:function(t,e,i,n){bc(t.getData(),n,"emphasis")},downplay:function(t,e,i,n){bc(t.getData(),n,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){},incrementalPrepareRender:null,incrementalRender:null,updateTransform:null,filterForExposedEvent:null};function wc(t,e,i){if(t&&(t.trigger(e,i),t.isGroup&&!Qs(t)))for(var n=0,o=t.childCount();nc?i+=p(g("data.partialData"),{displayCnt:c}):i+=g("data.allData");for(var r=[],s=0;si.blockIndex?i.step:null,a=n&&n.modDataCount;return{step:o,modBy:null!=a?Math.ceil(a/o):null,modDataCount:a}}},zc.getPipeline=function(t){return this._pipelineMap.get(t)},zc.updateStreamModes=function(t,e){var i=this._pipelineMap.get(t.uid),n=t.getData().count(),o=i.progressiveEnabled&&e.incrementalPrepareRender&&n>=i.threshold,a=t.get("large")&&n>=t.get("largeThreshold"),r="mod"===t.get("progressiveChunkMode")?n:null;t.pipelineContext=i.context={progressiveRender:o,modDataCount:r,large:a}},zc.restorePipelines=function(t){var n=this,o=n._pipelineMap=Q();t.eachSeries(function(t){var e=t.getProgressive(),i=t.uid;o.set(i,{id:i,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:e&&!(t.preventIncremental&&t.preventIncremental()),blockIndex:-1,step:Math.round(e||700),count:0}),qc(n,t,t.dataTask)})},zc.prepareStageTasks=function(){var i=this._stageTaskMap,n=this.ecInstance.getModel(),o=this.api;E(this._allHandlers,function(t){var e=i.get(t.uid)||i.set(t.uid,[]);t.reset&&function(n,o,t,a,r){var s=t.seriesTaskMap||(t.seriesTaskMap=Q()),e=o.seriesType,i=o.getTargetSeries;o.createOnAllSeries?a.eachRawSeries(l):e?a.eachRawSeriesByType(e,l):i&&i(a,r).each(l);function l(t){var e=t.uid,i=s.get(e)||s.set(e,Xh({plan:Zc,reset:Uc,count:jc}));i.context={model:t,ecModel:a,api:r,useClearVisual:o.isVisual&&!o.isLayout,plan:o.plan,reset:o.reset,scheduler:n},qc(n,t,i)}var u=n._pipelineMap;s.each(function(t,e){u.get(e)||(t.dispose(),s.removeKey(e))})}(this,t,e,n,o),t.overallReset&&function(n,t,e,i,o){var a=e.overallTask=e.overallTask||Xh({reset:Gc});a.context={ecModel:i,api:o,overallReset:t.overallReset,scheduler:n};var r=a.agentStubMap=a.agentStubMap||Q(),s=t.seriesType,l=t.getTargetSeries,u=!0,h=t.modifyOutputEnd;s?i.eachRawSeriesByType(s,c):l?l(i,o).each(c):(u=!1,E(i.getSeries(),c));function c(t){var e=t.uid,i=r.get(e);i||(i=r.set(e,Xh({reset:Fc,onDirty:Hc})),a.dirty()),i.context={model:t,overallProgress:u,modifyOutputEnd:h},i.agent=a,i.__block=u,qc(n,t,i)}var d=n._pipelineMap;r.each(function(t,e){d.get(e)||(t.dispose(),a.dirty(),r.removeKey(e))})}(this,t,e,n,o)},this)},zc.prepareView=function(t,e,i,n){var o=t.renderTask,a=o.context;a.model=e,a.ecModel=i,a.api=n,o.__block=!t.incrementalPrepareRender,qc(this,e,o)},zc.performDataProcessorTasks=function(t,e){Bc(this,this._dataProcessorHandlers,t,e,{block:!0})},zc.performVisualTasks=function(t,e,i){Bc(this,this._visualHandlers,t,e,i)},zc.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e|=t.dataTask.perform()}),this.unfinished|=e},zc.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.blockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)})};var Vc=zc.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)};function Gc(t){t.overallReset(t.ecModel,t.api,t.payload)}function Fc(t,e){return t.overallProgress&&Wc}function Wc(){this.agent.dirty(),this.getDownstream().dirty()}function Hc(){this.agent&&this.agent.dirty()}function Zc(t){return t.plan&&t.plan(t.model,t.ecModel,t.api,t.payload)}function Uc(t){t.useClearVisual&&t.data.clearAllVisual();var e=t.resetDefines=Vo(t.reset(t.model,t.ecModel,t.api,t.payload));return 1t.get("hoverLayerThreshold")&&!v.node&&t.eachSeries(function(t){if(!t.preventUsingHoverLayer){var e=i._chartsMap[t.__viewId];e.__alive&&e.group.traverse(function(t){t.useHoverLayer=!0})}})}(n,t),Oc(n._zr.dom,t)}function qd(e,i){Id(of,function(t){t(e,i)})}Rd.resize=function(t){if(!this._disposed){this._zr.resize(t);var e=this._model;if(this._loadingFX&&this._loadingFX.resize(),e){var i=e.resetOption("media"),n=t&&t.silent;this[Ld]=!0,i&&Vd(this),Bd.update.call(this),this[Ld]=!1,Hd.call(this,n),Zd.call(this,n)}}},Rd.showLoading=function(t,e){if(!this._disposed&&(Ad(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),sf[t])){var i=sf[t](this._api,e),n=this._zr;this._loadingFX=i,n.add(i)}},Rd.hideLoading=function(){this._disposed||(this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null)},Rd.makeActionFromEvent=function(t){var e=k({},t);return e.type=tf[t.type],e},Rd.dispatchAction=function(t,e){this._disposed||(Ad(e)||(e={silent:!!e}),Qd[t.type]&&this._model&&(this[Ld]?this._pendingActions.push(t):(Wd.call(this,t,e.silent),e.flush?this._zr.flush(!0):!1!==e.flush&&v.browser.weChat&&this._throttledZrFlush(),Hd.call(this,e.silent),Zd.call(this,e.silent))))},Rd.appendData=function(t){if(!this._disposed){var e=t.seriesIndex;this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0}},Rd.on=Nd("on",!1),Rd.off=Nd("off",!1),Rd.one=Nd("one",!1);var Kd=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];function $d(t,e){var i=t.get("z"),n=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=n&&(t.zlevel=n))})}function Jd(){this.eventInfo}Rd._initEvents=function(){Id(Kd,function(u){function t(t){var e,i=this.getModel(),n=t.target;if("globalout"===u)e={};else if(n&&null!=n.dataIndex){var o=n.dataModel||i.getSeriesByIndex(n.seriesIndex);e=o&&o.getDataParams(n.dataIndex,n.dataType,n)||{}}else n&&n.eventData&&(e=k({},n.eventData));if(e){var a=e.componentType,r=e.componentIndex;"markLine"!==a&&"markPoint"!==a&&"markArea"!==a||(a="series",r=e.seriesIndex);var s=a&&null!=r&&i.getComponent(a,r),l=s&&this["series"===s.mainType?"_chartsMap":"_componentsMap"][s.__viewId];e.event=t,e.type=u,this._ecEventProcessor.eventInfo={targetEl:n,packedEvent:e,model:s,view:l},this.trigger(u,e)}}t.zrEventfulCallAtLast=!0,this._zr.on(u,t,this)},this),Id(tf,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},Rd.isDisposed=function(){return this._disposed},Rd.clear=function(){this._disposed||this.setOption({series:[]},!0)},Rd.dispose=function(){if(!this._disposed){this._disposed=!0,Jo(this.getDom(),df,"");var e=this._api,i=this._model;Id(this._componentsViews,function(t){t.dispose(i,e)}),Id(this._chartsViews,function(t){t.dispose(i,e)}),this._zr.dispose(),delete lf[this.id]}},b(Ed,Ct),Jd.prototype={constructor:Jd,normalizeQuery:function(t){var s={},l={},u={};if(R(t)){var e=Dd(t);s.mainType=e.main||null,s.subType=e.sub||null}else{var h=["Index","Name","Id"],c={name:1,dataIndex:1,dataType:1};E(t,function(t,e){for(var i=!1,n=0;nx[1]&&(x[1]=y)}e&&(this._nameList[d]=e[f])}this._rawCount=this._count=l,this._extent={},qf(this)},Yf._initDataFromProvider=function(t,e){if(!(e<=t)){for(var i,n=this._chunkSize,o=this._rawData,a=this._storage,r=this.dimensions,s=r.length,l=this._dimensionInfos,u=this._nameList,h=this._idList,c=this._rawExtent,d=this._nameRepeatCount={},f=this._chunkCount,p=0;pM[1]&&(M[1]=S)}if(!o.pure){var I=u[v];if(m&&null==I)if(null!=m.name)u[v]=I=m.name;else if(null!=i){var T=r[i],A=a[T][y];if(A){I=A[x];var D=l[T].ordinalMeta;D&&D.categories.length&&(I=D.categories[I])}}var C=null==m?null:m.id;null==C&&null!=I&&(d[I]=d[I]||0,0=this._rawCount||t<0)return-1;if(!this._indices)return t;var e=this._indices,i=e[t];if(null!=i&&it))return a;o=a-1}}return-1},Yf.indicesOfNearest=function(t,e,i){var n=[];if(!this._storage[t])return n;null==i&&(i=1/0);for(var o=1/0,a=-1,r=0,s=0,l=this.count();st[I][1])&&(M=!1)}M&&(a[r++]=this.getRawIndex(m))}return rw[1]&&(w[1]=_)}}}return o},Yf.downSample=function(t,e,i,n){for(var o=ep(this,[t]),a=o._storage,r=[],s=Math.floor(1/e),l=a[t],u=this.count(),h=this._chunkSize,c=o._rawExtent[t],d=new(Wf(this))(u),f=0,p=0;pc[1]&&(c[1]=x),d[f++]=_}return o._count=f,o._indices=d,o.getRawIndex=Jf,o},Yf.getItemModel=function(t){var e=this.hostModel;return new Cl(this.getRawDataItem(t),e,e&&e.ecModel)},Yf.diff=function(e){var i=this;return new Lf(e?e.getIndices():[],this.getIndices(),function(t){return Qf(e,t)},function(t){return Qf(i,t)})},Yf.getVisual=function(t){var e=this._visual;return e&&e[t]},Yf.setVisual=function(t,e){if(Rf(t))for(var i in t)t.hasOwnProperty(i)&&this.setVisual(i,t[i]);else this._visual=this._visual||{},this._visual[t]=e},Yf.setLayout=function(t,e){if(Rf(t))for(var i in t)t.hasOwnProperty(i)&&this.setLayout(i,t[i]);else this._layout[t]=e},Yf.getLayout=function(t){return this._layout[t]},Yf.getItemLayout=function(t){return this._itemLayouts[t]},Yf.setItemLayout=function(t,e,i){this._itemLayouts[t]=i?k(this._itemLayouts[t]||{},e):e},Yf.clearItemLayouts=function(){this._itemLayouts.length=0},Yf.getItemVisual=function(t,e,i){var n=this._itemVisuals[t],o=n&&n[e];return null!=o||i?o:this.getVisual(e)},Yf.setItemVisual=function(t,e,i){var n=this._itemVisuals[t]||{},o=this.hasItemVisual;if(this._itemVisuals[t]=n,Rf(e))for(var a in e)e.hasOwnProperty(a)&&(n[a]=e[a],o[a]=!0);else n[e]=i,o[e]=!0},Yf.clearAllVisual=function(){this._visual={},this._itemVisuals=[],this.hasItemVisual={}};function op(t){t.seriesIndex=this.seriesIndex,t.dataIndex=this.dataIndex,t.dataType=this.dataType}function ap(t,e,i){Zu.isInstance(e)||(e=Zu.seriesDataToSource(e)),i=i||{},t=(t||[]).slice();for(var n=(i.dimsDef||[]).slice(),o=Q(),a=Q(),l=[],r=function(t,e,i,n){var o=Math.max(t.dimensionsDetectCount||1,e.length,i.length,n||0);return E(e,function(t){var e=t.dimsDef;e&&(o=Math.max(o,e.length))}),o}(e,t,n,i.dimCount),s=0;s=e[0]&&t<=e[1]},gp.prototype.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},gp.prototype.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},gp.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1])},gp.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e))},gp.prototype.getExtent=function(){return this._extent.slice()},gp.prototype.setExtent=function(t,e){var i=this._extent;isNaN(t)||(i[0]=t),isNaN(e)||(i[1]=e)},gp.prototype.isBlank=function(){return this._isBlank},gp.prototype.setBlank=function(t){this._isBlank=t},gp.prototype.getLabel=null,oa(gp),ua(gp,{registerWhenExtend:!0}),mp.createByAxisModel=function(t){var e=t.option,i=e.data,n=i&&N(i,xp);return new mp({categories:n,needCollect:!n,deduplication:!1!==e.dedplication})};var vp=mp.prototype;function yp(t){return t._map||(t._map=Q(t.categories))}function xp(t){return z(t)&&null!=t.value?t.value:t+""}vp.getOrdinal=function(t){return yp(this).get(t)},vp.parseAndCollect=function(t){var e,i=this._needCollect;if("string"!=typeof t&&!i)return t;if(i&&!this._deduplication)return e=this.categories.length,this.categories[e]=t,e;var n=yp(this);return null==(e=n.get(t))&&(i?(e=this.categories.length,this.categories[e]=t,n.set(t,e)):e=NaN),e};var _p=gp.prototype,wp=gp.extend({type:"ordinal",init:function(t,e){t&&!O(t)||(t=new mp({categories:t})),this._ordinalMeta=t,this._extent=e||[0,t.categories.length-1]},parse:function(t){return"string"==typeof t?this._ordinalMeta.getOrdinal(t):Math.round(t)},contain:function(t){return t=this.parse(t),_p.contain.call(this,t)&&null!=this._ordinalMeta.categories[t]},normalize:function(t){return _p.normalize.call(this,this.parse(t))},scale:function(t){return Math.round(_p.scale.call(this,t))},getTicks:function(){for(var t=[],e=this._extent,i=e[0];i<=e[1];)t.push(i),i++;return t},getLabel:function(t){if(!this.isBlank())return this._ordinalMeta.categories[t]},count:function(){return this._extent[1]-this._extent[0]+1},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e))},getOrdinalMeta:function(){return this._ordinalMeta},niceTicks:et,niceExtent:et});wp.create=function(){return new wp};var bp=zl;function Sp(t){return Gl(t)+2}function Mp(t,e,i){t[e]=Math.max(Math.min(t[e],i[1]),i[0])}function Ip(t,e){isFinite(t[0])||(t[0]=e[0]),isFinite(t[1])||(t[1]=e[1]),Mp(t,0,e),Mp(t,1,e),t[0]>t[1]&&(t[0]=t[1])}var Tp=zl,Ap=gp.extend({type:"interval",_interval:0,_intervalPrecision:2,setExtent:function(t,e){var i=this._extent;isNaN(t)||(i[0]=parseFloat(t)),isNaN(e)||(i[1]=parseFloat(e))},unionExtent:function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1]),Ap.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=Sp(t)},getTicks:function(t){var e=this._interval,i=this._extent,n=this._niceExtent,o=this._intervalPrecision,a=[];if(!e)return a;i[0]s&&(t?a.push(Tp(s+e,o)):a.push(i[1])),a},getMinorTicks:function(t){for(var e=this.getTicks(!0),i=[],n=this.getExtent(),o=1;on[0]&&h>>1;t[o][1]>1^-(1&s),l=l>>1^-(1&l),o=s+=o,a=l+=a,n.push([s/i,l/i])}return n}Tg.prototype={constructor:Tg,properties:null,getBoundingRect:function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,i=[e,e],n=[-e,-e],o=[],a=[],r=this.geometries,s=0;ss[1];d(e[0].coord,s[0])&&(n?e[0].coord=s[0]:e.shift());n&&d(s[0],e[0].coord)&&e.unshift({coord:s[0]});d(s[1],a.coord)&&(n?a.coord=s[1]:e.pop());n&&d(a.coord,s[1])&&e.push({coord:s[1]});function d(t,e){return t=zl(t),e=zl(e),c?en[0]&&(n[0]=a[0]),a[1]>n[1]&&(n[1]=a[1])}return{min:e?i:n,max:e?n:i}}var ym=Ar.extend({type:"ec-polyline",shape:{points:[],smooth:0,smoothConstraint:!0,smoothMonotone:null,connectNulls:!1},style:{fill:null,stroke:"#000"},brush:Xr(Ar.prototype.brush),buildPath:function(t,e){var i=e.points,n=0,o=i.length,a=vm(i,e.smoothConstraint);if(e.connectNulls){for(;0n)return!1;return!0}(a,e))){var r=e.mapDimension(a.dim),s={};return E(a.getViewLabels(),function(t){s[t.tickValue]=1}),function(t){return!s.hasOwnProperty(e.get(r,t))}}}}function Am(t,e,i){if("cartesian2d"!==t.type)return wm(t,e,i);var n=t.getBaseAxis().isHorizontal(),o=_m(t,e,i);if(!i.get("clip",!0)){var a=o.shape,r=Math.max(a.width,a.height);n?(a.y-=r,a.height+=2*r):(a.x-=r,a.width+=2*r)}return o}xc.extend({type:"line",init:function(){var t=new Ci,e=new em;this.group.add(e.group),this._symbolDraw=e,this._lineGroup=t},render:function(t,e,i){var n=t.coordinateSystem,o=this.group,a=t.getData(),r=t.getModel("lineStyle"),s=t.getModel("areaStyle"),l=a.mapArray(a.getItemLayout),u="polar"===n.type,h=this._coordSys,c=this._symbolDraw,d=this._polyline,f=this._polygon,p=this._lineGroup,g=t.get("animation"),m=!s.isEmpty(),v=s.get("origin"),y=function(t,e,i){if(!i.valueDim)return[];for(var n=[],o=0,a=e.count();oh[c-1].coord&&(h.reverse(),d.reverse());var f=h[0].coord-10,p=h[c-1].coord+10,g=p-f;if(g<.001)return"transparent";E(h,function(t){t.offset=(t.coord-f)/g}),h.push({offset:c?h[c-1].offset:.5,color:d[1]||"transparent"}),h.unshift({offset:c?h[0].offset:.5,color:d[0]||"transparent"});var m=new gs(0,0,0,0,h,!0);return m[n]=f,m[n+"2"]=p,m}}}(a,n)||a.getVisual("color");d.useStyle(D(r.getLineStyle(),{fill:"none",stroke:M,lineJoin:"bevel"}));var I=t.get("smooth");if(I=Mm(t.get("smooth")),d.setShape({smooth:I,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")}),f){var T=a.getCalculationInfo("stackedOnSeries"),A=0;f.useStyle(D(s.getAreaStyle(),{fill:M,opacity:.7,lineJoin:"bevel"})),T&&(A=Mm(T.get("smooth"))),f.setShape({smooth:I,stackedOnSmooth:A,smoothMonotone:t.get("smoothMonotone"),connectNulls:t.get("connectNulls")})}this._data=a,this._coordSys=n,this._stackedOnPoints=y,this._points=l,this._step=S,this._valueOrigin=v},dispose:function(){},highlight:function(t,e,i,n){var o=t.getData(),a=Yo(o,n);if(!(a instanceof Array)&&null!=a&&0<=a){var r=o.getItemGraphicEl(a);if(!r){var s=o.getItemLayout(a);if(!s)return;if(this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(s[0],s[1]))return;(r=new Ug(o,a)).position=s,r.setZ(t.get("zlevel"),t.get("z")),r.ignore=isNaN(s[0])||isNaN(s[1]),r.__temp=!0,o.setItemGraphicEl(a,r),r.stopSymbolAnimation(!0),this.group.add(r)}r.highlight()}else xc.prototype.highlight.call(this,t,e,i,n)},downplay:function(t,e,i,n){var o=t.getData(),a=Yo(o,n);if(null!=a&&0<=a){var r=o.getItemGraphicEl(a);r&&(r.__temp?(o.setItemGraphicEl(a,null),this.group.remove(r)):r.downplay())}else xc.prototype.downplay.call(this,t,e,i,n)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new ym({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e},_newPolygon:function(t,e){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new xm({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(i),this._polygon=i},_updateAnimation:function(t,e,i,n,o,a){var r=this._polyline,s=this._polygon,l=t.hostModel,u=function(t,e,i,n,o,a,r,s){for(var l=function(t,e){var i=[];return e.diff(t).add(function(t){i.push({cmd:"+",idx:t})}).update(function(t,e){i.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){i.push({cmd:"-",idx:t})}).execute(),i}(t,e),u=[],h=[],c=[],d=[],f=[],p=[],g=[],m=rm(o,e,r),v=rm(a,t,s),y=0;ye&&(e=t[i]);return isFinite(e)?e:NaN},min:function(t){for(var e=1/0,i=0;ie[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},w(Em,Vg);var Rm={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},zm={};zm.categoryAxis=m({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},Rm),zm.valueAxis=m({boundaryGap:[0,0],splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:"#eee",width:1}}},Rm),zm.timeAxis=D({scale:!0,min:"dataMin",max:"dataMax"},zm.valueAxis),zm.logAxis=D({scale:!0,logBase:10},zm.valueAxis);function Bm(a,t,r,e){E(Vm,function(o){t.extend({type:a+"Axis."+o,mergeDefaultAndTheme:function(t,e){var i=this.layoutMode,n=i?Mu(t):{};m(t,e.getTheme().get(o+"Axis")),m(t,this.getDefaultOption()),t.type=r(a,t),i&&Su(t,n,i)},optionUpdated:function(){"category"===this.option.type&&(this.__ordinalMeta=mp.createByAxisModel(this))},getCategories:function(t){var e=this.option;if("category"===e.type)return t?e.data:this.__ordinalMeta.categories},getOrdinalMeta:function(){return this.__ordinalMeta},defaultOption:p([{},zm[o+"Axis"],e],!0)})}),Lu.registerSubTypeDefaulter(a+"Axis",T(r,a))}var Vm=["value","category","time","log"],Gm=Lu.extend({type:"cartesian2dAxis",axis:null,init:function(){Gm.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){Gm.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){Gm.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});function Fm(t,e){return e.type||(e.data?"category":"value")}m(Gm.prototype,cg);var Wm={offset:0};function Hm(t,e){return t.getCoordSysModel()===e}function Zm(t,e,i){this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this._initCartesian(t,e,i),this.model=t}Bm("x",Gm,Fm,Wm),Bm("y",Gm,Fm,Wm),Lu.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}});var Um=Zm.prototype;function Xm(t,e,i,n){i.getAxesOnZeroOf=function(){return o?[o]:[]};var o,a=t[e],r=i.model,s=r.get("axisLine.onZero"),l=r.get("axisLine.onZeroAxisIndex");if(s){if(null!=l)Ym(a[l])&&(o=a[l]);else for(var u in a)if(a.hasOwnProperty(u)&&Ym(a[u])&&!n[h(a[u])]){o=a[u];break}o&&(n[h(o)]=!0)}function h(t){return t.dim+"_"+t.index}}function Ym(t){return t&&"category"!==t.type&&"time"!==t.type&&function(t){var e=t.scale.getExtent(),i=e[0],n=e[1];return!(0u[1]?-1:1,c=["start"===a?u[0]-h*l:"end"===a?u[1]+h*l:(u[0]+u[1])/2,av(a)?t.labelOffset+r*l:0],d=e.get("nameRotate");null!=d&&(d=d*Jm/180),av(a)?n=ev(t.rotation,null!=d?d:t.rotation,r):(n=function(t,e,i,n){var o,a,r=Zl(i-t.rotation),s=n[0]>n[1],l="start"===e&&!s||"start"!==e&&s;o=Ul(r-Jm/2)?(a=l?"bottom":"top","center"):Ul(r-1.5*Jm)?(a=l?"top":"bottom","center"):(a="middle",r<1.5*Jm&&Jm/2l[1]&&l.reverse(),(null==r||r>l[1])&&(r=l[1]),r=i.r0}}});var ey=Math.PI/180;function iy(o,t,e,i,n,a,r,s,l,u){function h(t,e,i){for(var n=t;nl+r);n++)if(o[n].y+=i,to[n].y+o[n].height)return void c(n,i/2);c(e-1,i/2)}function c(t,e){for(var i=t;0<=i&&!(o[i].y-eo[i-1].y+o[i-1].height));i--);}function d(t,e,i,n,o,a){for(var r=e?Number.MAX_VALUE:0,s=0,l=t.length;s=e?v.push(o[y]):m.push(o[y]);d(m,!1,t,e,i,n),d(v,!0,t,e,i,n)}function ny(t){return"center"===t.position}function oy(L,k,P,t,N,e){var O,E,R=L.getData(),z=[],B=!1,V=(L.get("minShowLabelAngle")||0)*ey;R.each(function(t){var e=R.getItemLayout(t),i=R.getItemModel(t),n=i.getModel("label"),o=n.get("position")||i.get("emphasis.label.position"),a=n.get("distanceToLabelLine"),r=n.get("alignTo"),s=Rl(n.get("margin"),P),l=n.get("bleedMargin"),u=n.getFont(),h=i.getModel("labelLine"),c=h.get("length");c=Rl(c,P);var d=h.get("length2");if(d=Rl(d,P),!(e.anglei[0]&&isFinite(h)&&isFinite(i[0]););else{var l=o.getTicks().length-1;c"+N(t,function(t,e){var i=o.get(o.mapDimension(t.dim),n);return au(t.name+" : "+i)}).join("
")},getTooltipPosition:function(t){if(null!=t)for(var e=this.getData(),i=this.coordinateSystem,n=e.getValues(N(i.dimensions,function(t){return e.mapDimension(t)}),t,!0),o=0,a=n.length;o"+au(n+" : "+i)},getTooltipPosition:function(t){if(null!=t){var e=this.getData().getName(t),i=this.coordinateSystem,n=i.getRegion(e);return n&&i.dataToPoint(n.center)}},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},defaultOption:{zlevel:0,z:2,coordinateSystem:"geo",map:"",left:"center",top:"center",aspectScale:.75,showLegendSymbol:!0,dataRangeHoverLink:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{show:!1,color:"#000"},itemStyle:{borderWidth:.5,borderColor:"#444",areaColor:"#eee"},emphasis:{label:{show:!0,color:"rgb(100,0,0)"},itemStyle:{areaColor:"rgba(255,215,0,0.8)"}}}}),Xv);var Oy="\0_ec_interaction_mutex";function Ey(t,e){return!!Ry(t)[e]}function Ry(t){return t[Oy]||(t[Oy]={})}function zy(i){this.pointerChecker,this._zr=i,this._opt={};var t=A,n=t(By,this),o=t(Vy,this),a=t(Gy,this),r=t(Fy,this),s=t(Wy,this);Ct.call(this),this.setPointerChecker=function(t){this.pointerChecker=t},this.enable=function(t,e){this.disable(),this._opt=D(L(e)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),null==t&&(t=!0),!0!==t&&"move"!==t&&"pan"!==t||(i.on("mousedown",n),i.on("mousemove",o),i.on("mouseup",a)),!0!==t&&"scale"!==t&&"zoom"!==t||(i.on("mousewheel",r),i.on("pinch",s))},this.disable=function(){i.off("mousedown",n),i.off("mousemove",o),i.off("mouseup",a),i.off("mousewheel",r),i.off("pinch",s)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function By(t){if(!(Yt(t)||t.target&&t.target.draggable)){var e=t.offsetX,i=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,i)&&(this._x=e,this._y=i,this._dragging=!0)}}function Vy(t){if(this._dragging&&Uy("moveOnMouseMove",t,this._opt)&&"pinch"!==t.gestureEvent&&!Ey(this._zr,"globalPan")){var e=t.offsetX,i=t.offsetY,n=this._x,o=this._y,a=e-n,r=i-o;this._x=e,this._y=i,this._opt.preventDefaultMouseMove&&Xt(t.event),Zy(this,"pan","moveOnMouseMove",t,{dx:a,dy:r,oldX:n,oldY:o,newX:e,newY:i})}}function Gy(t){Yt(t)||(this._dragging=!1)}function Fy(t){var e=Uy("zoomOnMouseWheel",t,this._opt),i=Uy("moveOnMouseWheel",t,this._opt),n=t.wheelDelta,o=Math.abs(n),a=t.offsetX,r=t.offsetY;if(0!==n&&(e||i)){if(e){var s=3e&&(e=n.height)}this.height=e+1},getNodeById:function(t){if(this.getId()===t)return this;for(var e=0,i=this.children,n=i.length;ea&&(a=t.depth)});var r=t.expandAndCollapse&&0<=t.initialTreeDepth?t.initialTreeDepth:a;return o.root.eachNode("preorder",function(t){var e=t.hostTree.data.getRawDataItem(t.dataIndex);t.isExpand=e&&null!=e.collapsed?!e.collapsed:t.depth<=r}),o.data},getOrient:function(){var t=this.get("orient");return"horizontal"===t?t="LR":"vertical"===t&&(t="TB"),t},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},formatTooltip:function(t){for(var e=this.getData().tree,i=e.root.children[0],n=e.getNodeByDataIndex(t),o=n.getValue(),a=n.name;n&&n!==i;)a=n.parentNode.name+"."+a,n=n.parentNode;return au(a+(isNaN(o)||null==o?"":" : "+o))},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",left:"12%",top:"12%",right:"12%",bottom:"12%",layout:"orthogonal",edgeShape:"curve",edgeForkPosition:"50%",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:"LR",symbol:"emptyCircle",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:"#ccc",width:1.5,curveness:.5},itemStyle:{color:"lightsteelblue",borderColor:"#c23531",borderWidth:1.5},label:{show:!0,color:"#555"},leaves:{label:{show:!0}},animationEasing:"linear",animationDuration:700,animationDurationUpdate:1e3}});var Ex=Cs({shape:{parentPoint:[],childPoints:[],orient:"",forkPosition:""},style:{stroke:"#000",fill:null},buildPath:function(t,e){var i=e.childPoints,n=i.length,o=e.parentPoint,a=i[0],r=i[n-1];if(1===n)return t.moveTo(o[0],o[1]),void t.lineTo(a[0],a[1]);var s=e.orient,l="TB"===s||"BT"===s?0:1,u=1-l,h=Rl(e.forkPosition,1),c=[];c[l]=o[l],c[u]=o[u]+(r[u]-o[u])*h,t.moveTo(o[0],o[1]),t.lineTo(c[0],c[1]),t.moveTo(a[0],a[1]),c[l]=a[l],t.lineTo(c[0],c[1]),c[l]=r[l],t.lineTo(c[0],c[1]),t.lineTo(r[0],r[1]);for(var d=1;dx.x)||(m-=Math.PI);var b=v?"left":"right",S=a.labelModel.get("rotate"),M=S*(Math.PI/180);g.setStyle({textPosition:a.labelModel.get("position")||b,textRotation:null==S?-m:M,textOrigin:"center",verticalAlign:"middle"})}!function(t,e,i,n,o,a,r,s,l){var u=l.edgeShape,h=n.__edge;if("curve"===u)e.parentNode&&e.parentNode!==i&&cl(h=h||(n.__edge=new ds({shape:Gx(l,o,o),style:D({opacity:0,strokeNoScale:!0},l.lineStyle)})),{shape:Gx(l,a,r),style:{opacity:1}},t);else if("polyline"===u&&"orthogonal"===l.layout&&e!==i&&e.children&&0!==e.children.length&&!0===e.isExpand){for(var c=e.children,d=[],f=0;fh.getLayout().x&&(h=t),t.depth>c.depth&&(c=t)});var d=u===h?1:r(u,h)/2,f=d-u.getLayout().x,p=0,g=0,m=0,v=0;if("radial"===n)p=o/(h.getLayout().x+d+f),g=a/(c.depth-1||1),Fx(l,function(t){m=(t.getLayout().x+f)*p,v=(t.depth-1)*g;var e=Lx(m,v);t.setLayout({x:e.x,y:e.y,rawX:m,rawY:v},!0)});else{var y=t.getOrient();"RL"===y||"LR"===y?(g=a/(h.getLayout().x+d+f),p=o/(c.depth-1||1),Fx(l,function(t){v=(t.getLayout().x+f)*g,m="LR"===y?(t.depth-1)*p:o-(t.depth-1)*p,t.setLayout({x:m,y:v},!0)})):"TB"!==y&&"BT"!==y||(p=o/(h.getLayout().x+d+f),g=a/(c.depth-1||1),Fx(l,function(t){m=(t.getLayout().x+f)*p,v="TB"===y?(t.depth-1)*g:a-(t.depth-1)*g,t.setLayout({x:m,y:v},!0)}))}}}(t,e)})}),rc.extend({type:"series.treemap",layoutMode:"box",dependencies:["grid","polar"],preventUsingHoverLayer:!0,_viewRoot:null,defaultOption:{progressive:0,left:"center",top:"middle",right:null,bottom:null,width:"80%",height:"80%",sort:!0,clipWindow:"origin",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:"▶",zoomToNodeRatio:.1024,roam:!0,nodeClick:"zoomToNode",animation:!0,animationDurationUpdate:900,animationEasing:"quinticInOut",breadcrumb:{show:!0,height:22,left:"center",top:"bottom",emptyItemWidth:25,itemStyle:{color:"rgba(0,0,0,0.7)",borderColor:"rgba(255,255,255,0.7)",borderWidth:1,shadowColor:"rgba(150,150,150,1)",shadowBlur:3,shadowOffsetX:0,shadowOffsetY:0,textStyle:{color:"#fff"}},emphasis:{textStyle:{}}},label:{show:!0,distance:0,padding:5,position:"inside",color:"#fff",ellipsis:!0},upperLabel:{show:!1,position:[0,"50%"],height:20,color:"#fff",ellipsis:!0,verticalAlign:"middle"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:"#fff",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,"50%"],color:"#fff",ellipsis:!0,verticalAlign:"middle"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:"index",visibleMin:10,childrenVisibleMin:null,levels:[]},getInitialData:function(t,e){var i={name:t.name,children:t.data};!function i(t){var n=0;E(t.children,function(t){i(t);var e=t.value;O(e)&&(e=e[0]),n+=e});var e=t.value;O(e)&&(e=e[0]);null!=e&&!isNaN(e)||(e=n);e<0&&(e=0);O(t.value)?t.value[0]=e:t.value=e}(i);var n=t.levels||[];n=t.levels=function(t,e){var n,i=e.get("color");if(!i)return;if(E(t=t||[],function(t){var e=new Cl(t),i=e.get("color");(e.get("itemStyle.color")||i&&"none"!==i)&&(n=!0)}),!n){(t[0]||(t[0]={})).color=i.slice()}return t}(n,e);var o={};return o.levels=n,Ix.createTree(i,this,o).data},optionUpdated:function(){this.resetViewRoot()},formatTooltip:function(t){var e=this.getData(),i=this.getRawValue(t),n=O(i)?tu(i[0]):tu(i);return au(e.getName(t)+": "+n)},getDataParams:function(t){var e=rc.prototype.getDataParams.apply(this,arguments),i=this.getData().tree.getNodeByDataIndex(t);return e.treePathInfo=Ux(i,this),e},setLayoutInfo:function(t){this.layoutInfo=this.layoutInfo||{},k(this.layoutInfo,t)},mapIdToIndex:function(t){var e=this._idIndexMap;e||(e=this._idIndexMap=Q(),this._idIndexMapCount=0);var i=e.get(t);return null==i&&e.set(t,i=this._idIndexMapCount++),i},getViewRoot:function(){return this._viewRoot},resetViewRoot:function(t){t?this._viewRoot=t:t=this._viewRoot;var e=this.getRawData().tree.root;t&&(t===e||e.contains(t))||(this._viewRoot=e)}});var Xx=5;function Yx(t){this.group=new Ci,t.add(this.group)}function jx(t,e,i,n,o,a){var r=[[o?t:t-Xx,e],[t+i,e],[t+i,e+n],[o?t:t-Xx,e+n]];return a||r.splice(2,0,[t+i+Xx,e+n/2]),o||r.push([t,e+n/2]),r}Yx.prototype={constructor:Yx,render:function(t,e,i,n){var o=t.getModel("breadcrumb"),a=this.group;if(a.removeAll(),o.get("show")&&i){var r=o.getModel("itemStyle"),s=r.getModel("textStyle"),l={pos:{left:o.get("left"),right:o.get("right"),top:o.get("top"),bottom:o.get("bottom")},box:{width:e.getWidth(),height:e.getHeight()},emptyItemWidth:o.get("emptyItemWidth"),totalWidth:0,renderList:[]};this._prepare(i,l,s),this._renderContent(t,l,r,s,n),bu(a,l.pos,l.box)}},_prepare:function(t,e,i){for(var n=t;n;n=n.parentNode){var o=n.getModel().get("name"),a=i.getTextRect(o),r=Math.max(a.width+16,e.emptyItemWidth);e.totalWidth+=r+8,e.renderList.push({node:n,text:o,width:r})}},_renderContent:function(t,e,i,n,o){for(var a,r,s=0,l=e.emptyItemWidth,u=t.get("breadcrumb.height"),h=function(t,e,i){var n=e.width,o=e.height,a=Rl(t.x,n),r=Rl(t.y,o),s=Rl(t.x2,n),l=Rl(t.y2,o);return(isNaN(a)||isNaN(parseFloat(t.x)))&&(a=0),(isNaN(s)||isNaN(parseFloat(t.x2)))&&(s=n),(isNaN(r)||isNaN(parseFloat(t.y)))&&(r=0),(isNaN(l)||isNaN(parseFloat(t.y2)))&&(l=o),i=iu(i||0),{width:Math.max(s-a-i[1]-i[3],0),height:Math.max(l-r-i[0]-i[2],0)}}(e.pos,e.box),c=e.totalWidth,d=e.renderList,f=d.length-1;0<=f;f--){var p=d[f],g=p.node,m=p.width,v=p.text;c>h.width&&(c-=m-l,m=l,v=null);var y=new Qr({shape:{points:jx(s,0,m,u,f===d.length-1,0===f)},style:D(i.getItemStyle(),{lineJoin:"bevel",text:v,textFill:n.getTextColor(),textFont:n.getFont()}),z:10,onclick:T(o,g)});this.group.add(y),a=t,r=g,y.eventData={componentType:"series",componentSubType:"treemap",componentIndex:a.componentIndex,seriesIndex:a.componentIndex,seriesName:a.name,seriesType:"treemap",selfType:"breadcrumb",nodeData:{dataIndex:r&&r.dataIndex,name:r&&r.name},treePathInfo:r&&Ux(r,a)},s+=m+8}},remove:function(){this.group.removeAll()}};function qx(t){var e=a_(t);return e.stroke=e.fill=e.lineWidth=null,e}var Kx=A,$x=Ci,Jx=rs,Qx=E,t_=["label"],e_=["emphasis","label"],i_=["upperLabel"],n_=["emphasis","upperLabel"],o_=10,a_=ha([["fill","color"],["stroke","strokeColor"],["lineWidth","strokeWidth"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]);function r_(c,r,s,l,u,e,d,t,i,n){if(d){var f=d.getLayout(),o=c.getData();if(o.setItemGraphicEl(d.dataIndex,null),f&&f.isInView){var h=f.width,p=f.height,g=f.borderWidth,m=f.invisible,v=d.getRawIndex(),y=t&&t.getRawIndex(),a=d.viewChildren,x=f.upperHeight,_=a&&a.length,w=d.getModel("itemStyle"),b=d.getModel("emphasis.itemStyle"),S=C("nodeGroup",$x);if(S){if(i.add(S),S.attr("position",[f.x||0,f.y||0]),S.__tmNodeWidth=h,S.__tmNodeHeight=p,f.isAboveViewRoot)return S;var M=d.getModel(),I=C("background",Jx,n,1);if(I&&function(t,e,i){if(e.dataIndex=d.dataIndex,e.seriesIndex=c.seriesIndex,e.setShape({x:0,y:0,width:h,height:p}),m)A(e);else{e.invisible=!1;var n=d.getVisual("borderColor",!0),o=b.get("borderColor"),a=qx(w);a.fill=n;var r=a_(b);if(r.fill=o,i){var s=h-2*g;D(a,r,n,s,x,{x:g,y:0,width:s,height:x})}else a.text=r.text=null;e.setStyle(a),Us(e,r)}t.add(e)}(S,I,_&&f.upperHeight),_)Qs(S)&&Js(S,!1),I&&(Js(I,!0),o.setItemGraphicEl(d.dataIndex,I));else{var T=C("content",Jx,n,2);T&&function(t,e){e.dataIndex=d.dataIndex,e.seriesIndex=c.seriesIndex;var i=Math.max(h-2*g,0),n=Math.max(p-2*g,0);if(e.culling=!0,e.setShape({x:g,y:g,width:i,height:n}),m)A(e);else{e.invisible=!1;var o=d.getVisual("color",!0),a=qx(w);a.fill=o;var r=a_(b);D(a,r,o,i,n),e.setStyle(a),Us(e,r)}t.add(e)}(S,T),I&&Qs(I)&&Js(I,!1),Js(S,!0),o.setItemGraphicEl(d.dataIndex,S)}return S}}}function A(t){t.invisible||e.push(t)}function D(t,e,i,n,o,a){var r=W(c.getFormattedLabel(d.dataIndex,"normal",null,null,a?"upperLabel":"label"),M.get("name"));if(!a&&f.isLeafRoot){var s=c.get("drillDownIcon",!0);r=s?s+" "+r:r}var l=M.getModel(a?i_:t_),u=M.getModel(a?n_:e_),h=l.getShallow("show");el(t,e,l,u,{defaultText:h?r:null,autoColor:i,isRectText:!0}),a&&(t.textRect=L(a)),t.truncate=h&&l.get("ellipsis")?{outerWidth:n,outerHeight:o,minChar:2}:null}function C(t,e,i,n){var o=null!=y&&s[t][y],a=u[t];return o?(s[t][y]=null,function(t,e,i){(t[v]={}).old="nodeGroup"===i?e.position.slice():k({},e.shape)}(a,o,t)):m||((o=new e({z:function(t,e){var i=t*o_+e;return(i-1)/i}(i,n)})).__tmDepth=i,function(t,e,i){var n=t[v]={},o=d.parentNode;if(o&&(!l||"drillDown"===l.direction)){var a=0,r=0,s=u.background[o.getRawIndex()];!l&&s&&s.old&&(a=s.old.width,r=s.old.height),n.old="nodeGroup"===i?[0,r]:{x:a,y:r,width:0,height:0}}n.fadein="nodeGroup"!==i}(a,0,o.__tmStorageName=t)),r[t][v]=o}}Df({type:"treemap",init:function(t,e){this._containerGroup,this._storage={nodeGroup:[],background:[],content:[]},this._oldTree,this._breadcrumb,this._controller,this._state="ready"},render:function(t,e,i,n){if(!(_(e.findComponents({mainType:"series",subType:"treemap",query:n}),t)<0)){this.seriesModel=t,this.api=i,this.ecModel=e;var o=Wx(n,["treemapZoomToNode","treemapRootToNode"],t),a=n&&n.type,r=t.layoutInfo,s=!this._oldTree,l=this._storage,u="treemapRootToNode"===a&&o&&l?{rootNodeGroup:l.nodeGroup[o.node.getRawIndex()],direction:n.direction}:null,h=this._giveContainerGroup(r),c=this._doRender(h,t,u);s||a&&"treemapZoomToNode"!==a&&"treemapRootToNode"!==a?c.renderFinally():this._doAnimation(h,c,t,u),this._resetController(i),this._renderBreadcrumb(t,i,o)}},_giveContainerGroup:function(t){var e=this._containerGroup;return e||(e=this._containerGroup=new $x,this._initEvents(e),this.group.add(e)),e.attr("position",[t.x,t.y]),e},_doRender:function(t,e,i){var n=e.getData().tree,o=this._oldTree,a={nodeGroup:[],background:[],content:[]},r={nodeGroup:[],background:[],content:[]},s=this._storage,l=[],c=T(r_,e,r,s,i,a,l);!function a(r,s,l,u,h){u?Qx(s=r,function(t,e){t.isRemoved()||i(e,e)}):new Lf(s,r,t,t).add(i).update(i).remove(T(i,null)).execute();function t(t){return t.getId()}function i(t,e){var i=null!=t?r[t]:null,n=null!=e?s[e]:null,o=c(i,n,l,h);o&&a(i&&i.viewChildren||[],n&&n.viewChildren||[],o,u,h+1)}}(n.root?[n.root]:[],o&&o.root?[o.root]:[],t,n===o||!o,0);var u,h,d=(h={nodeGroup:[],background:[],content:[]},(u=s)&&Qx(u,function(t,e){var i=h[e];Qx(t,function(t){t&&(i.push(t),t.__tmWillDelete=1)})}),h);return this._oldTree=n,this._storage=r,{lastsForAnimation:a,willDeleteEls:d,renderFinally:function(){Qx(d,function(t){Qx(t,function(t){t.parent&&t.parent.remove(t)})}),Qx(l,function(t){t.invisible=!0,t.dirty()})}}},_doAnimation:function(t,a,e,s){if(e.get("animation")){var l=e.get("animationDurationUpdate"),u=e.get("animationEasing"),h=function(){var a,r=[],s={};return{add:function(t,e,i,n,o){return R(n)&&(o=n,n=0),!s[t.id]&&(s[t.id]=1,r.push({el:t,target:e,time:i,delay:n,easing:o}),!0)},done:function(t){return a=t,this},start:function(){for(var t=r.length,e=0,i=r.length;e=r.length||t===r[t.depth]){var i=O_(l,c,t,e,y,s);n(t,i,o,a,r,s)}})}else p=L_(c),t.setVisual("color",p)}(a,{},N(o.levelModels,function(t){return t?t.get(A_):null}),r,t.getViewRoot().getAncestors(),t)}};function C_(i,n,o,a){var r=k({},n);return E(["color","colorAlpha","colorSaturation"],function(t){var e=i.get(t,!0);null==e&&o&&(e=o[t]),null==e&&(e=n[t]),null==e&&(e=a.get(t)),null!=e&&(r[t]=e)}),r}function L_(t){var e=k_(t,"color");if(e){var i=k_(t,"colorAlpha"),n=k_(t,"colorSaturation");return n&&(e=qe(e,null,null,n)),i&&(e=Ke(e,i)),e}}function k_(t,e){var i=t[e];if(null!=i&&"none"!==i)return i}function P_(t,e,i,n,o,a){if(a&&a.length){var r=N_(e,"color")||null!=o.color&&"none"!==o.color&&(N_(e,"colorAlpha")||N_(e,"colorSaturation"));if(r){var s=e.get("visualMin"),l=e.get("visualMax"),u=i.dataExtent.slice();null!=s&&su[1]&&(u[1]=l);var h=e.get("colorMappingBy"),c={type:r.name,dataExtent:u,visual:r.range};"color"!==c.type||"index"!==h&&"id"!==h?c.mappingMethod="linear":(c.mappingMethod="category",c.loop=!0);var d=new f_(c);return d.__drColorMappingBy=h,d}}}function N_(t,e){var i=t.get(e);return T_(i)&&i.length?{name:e,range:i}:null}function O_(t,e,i,n,o,a){var r=k({},e);if(o){var s=o.type,l="color"===s&&o.__drColorMappingBy,u="index"===l?n:"id"===l?a.mapIdToIndex(i.getId()):i.getValue(t.get("visualDimension"));r[s]=o.mapValueToVisual(u)}return r}var E_=Math.max,R_=Math.min,z_=W,B_=E,V_=["itemStyle","borderWidth"],G_=["itemStyle","gapWidth"],F_=["upperLabel","show"],W_=["upperLabel","height"],H_={seriesType:"treemap",reset:function(t,e,i,n){var o=i.getWidth(),a=i.getHeight(),r=t.option,s=wu(t.getBoxLayoutParams(),{width:i.getWidth(),height:i.getHeight()}),l=r.size||[],u=Rl(z_(s.width,l[0]),o),h=Rl(z_(s.height,l[1]),a),c=n&&n.type,d=Wx(n,["treemapZoomToNode","treemapRootToNode"],t),f="treemapRender"===c||"treemapMove"===c?n.rootRect:null,p=t.getViewRoot(),g=Hx(p);if("treemapMove"!==c){var m="treemapZoomToNode"===c?function(t,e,i,n,o){var a,r=(e||{}).node,s=[n,o];if(!r||r===i)return s;var l=n*o,u=l*t.option.zoomToNodeRatio;for(;a=r.parentNode;){for(var h=0,c=a.children,d=0,f=c.length;ds[1]&&(s[1]=e)})}else s=[NaN,NaN];return{sum:n,dataExtent:s}}(e,r,s);if(0===u.sum)return t.viewChildren=[];if(u.sum=function(t,e,i,n,o){if(!n)return i;for(var a=t.get("visibleMin"),r=o.length,s=r,l=r-1;0<=l;l--){var u=o["asc"===n?r-l-1:l].getValue();u/i*ei[l[r]])&&(h=i[l[r]]);for(var c=0,d=t.length;c "+d)),u++)}var f,p=i.get("coordinateSystem");if("cartesian2d"===p||"polar"===p)f=pp(t,i);else{var g=sh.get(p),m=g&&"view"!==g.type&&g.dimensions||[];_(m,"value")<0&&m.concat(["value"]);var v=sp(t,{coordDimensions:m});(f=new Xf(v,i)).initData(t)}var y=new Xf(["value"],i);return y.initData(l,s),o&&o(f,y),mx({mainData:f,struct:a,structAttr:"graph",datas:{node:f,edge:y},datasAttr:{node:"data",edge:"edgeData"}}),a.update(),a}var ew=Af({type:"series.graph",init:function(t){ew.superApply(this,"init",arguments);var e=this;function i(){return e._categoriesData}this.legendVisualProvider=new Yv(i,i),this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeOption:function(t){ew.superApply(this,"mergeOption",arguments),this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},mergeDefaultAndTheme:function(t){ew.superApply(this,"mergeDefaultAndTheme",arguments),Go(t,["edgeLabel"],["show"])},getInitialData:function(t,s){var e=t.edges||t.links||[],i=t.data||t.nodes||[],l=this;if(i&&e)return tw(i,e,this,!0,function(t,e){t.wrapMethod("getItemModel",function(t){var e=l._categoriesModels[t.getShallow("category")];return e&&(e.parentModel=t.parentModel,t.parentModel=e),t});var i=l.getModel("edgeLabel"),n=new Cl({label:i.option},i.parentModel,s),o=l.getModel("emphasis.edgeLabel"),a=new Cl({emphasis:{label:o.option}},o.parentModel,s);function r(t){return(t=this.parsePath(t))&&"label"===t[0]?n:t&&"emphasis"===t[0]&&"label"===t[1]?a:this.parentModel}e.wrapMethod("getItemModel",function(t){return t.customizeGetParent(r),t})}).data},getGraph:function(){return this.getData().graph},getEdgeData:function(){return this.getGraph().edgeData},getCategoriesData:function(){return this._categoriesData},formatTooltip:function(t,e,i){if("edge"!==i)return ew.superApply(this,"formatTooltip",arguments);var n=this.getData(),o=this.getDataParams(t,i),a=n.graph.getEdgeByIndex(t),r=n.getName(a.node1.dataIndex),s=n.getName(a.node2.dataIndex),l=[];return null!=r&&l.push(r),null!=s&&l.push(s),l=au(l.join(" > ")),o.value&&(l+=" : "+au(o.value)),l},_updateCategoriesData:function(){var t=N(this.option.categories||[],function(t){return null!=t.value?t:k({value:0},t)}),e=new Xf(["value"],this);e.initData(t),this._categoriesData=e,this._categoriesModels=e.mapArray(function(t){return e.getItemModel(t,!0)})},setZoom:function(t){this.option.zoom=t},setCenter:function(t){this.option.center=t},isAnimationEnabled:function(){return ew.superCall(this,"isAnimationEnabled")&&!("force"===this.get("layout")&&this.get("force.layoutAnimation"))},defaultOption:{zlevel:0,z:2,coordinateSystem:"view",legendHoverLink:!0,hoverAnimation:!0,layout:null,focusNodeAdjacency:!1,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:"center",top:"center",symbol:"circle",symbolSize:10,edgeSymbol:["none","none"],edgeSymbolSize:10,edgeLabel:{position:"middle",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:"{b}"},itemStyle:{},lineStyle:{color:"#aaa",width:1,curveness:0,opacity:.5},emphasis:{label:{show:!0}}}}),iw=ls.prototype,nw=ds.prototype;function ow(t){return isNaN(+t.cpx1)||isNaN(+t.cpy1)}var aw=Cs({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){this[ow(e)?"_buildPathLine":"_buildPathCurve"](t,e)},_buildPathLine:iw.buildPath,_buildPathCurve:nw.buildPath,pointAt:function(t){return this[ow(this.shape)?"_pointAtLine":"_pointAtCurve"](t)},_pointAtLine:iw.pointAt,_pointAtCurve:nw.pointAt,tangentAt:function(t){var e=this.shape,i=ow(e)?[e.x2-e.x1,e.y2-e.y1]:this._tangentAtCurve(t);return mt(i,i)},_tangentAtCurve:nw.tangentAt}),rw=["fromSymbol","toSymbol"];function sw(t){return"_"+t+"Type"}function lw(t,e,i){var n=e.getItemVisual(i,"color"),o=e.getItemVisual(i,t),a=e.getItemVisual(i,t+"Size");if(o&&"none"!==o){O(a)||(a=[a,a]);var r=_g(o,-a[0]/2,-a[1]/2,a[0],a[1],n);return r.name=t,r}}function uw(t,e){t.x1=e[0][0],t.y1=e[0][1],t.x2=e[1][0],t.y2=e[1][1],t.percent=1;var i=e[2];i?(t.cpx1=i[0],t.cpy1=i[1]):(t.cpx1=NaN,t.cpy1=NaN)}function hw(t,e,i){Ci.call(this),this._createLine(t,e,i)}var cw=hw.prototype;function dw(t){this._ctor=t||hw,this.group=new Ci}cw.beforeUpdate=function(){var t=this.childOfName("fromSymbol"),e=this.childOfName("toSymbol"),i=this.childOfName("label");if(t||e||!i.ignore){for(var n=1,o=this.parent;o;)o.scale&&(n/=o.scale[0]),o=o.parent;var a=this.childOfName("line");if(this.__dirty||a.__dirty){var r=a.shape.percent,s=a.pointAt(0),l=a.pointAt(r),u=ht([],l,s);if(mt(u,u),t){t.attr("position",s);var h=a.tangentAt(0);t.attr("rotation",Math.PI/2-Math.atan2(h[1],h[0])),t.attr("scale",[n*r,n*r])}if(e){e.attr("position",l);h=a.tangentAt(1);e.attr("rotation",-Math.PI/2-Math.atan2(h[1],h[0])),e.attr("scale",[n*r,n*r])}if(!i.ignore){var c,d,f,p;i.attr("position",l);var g=i.__labelDistance,m=g[0]*n,v=g[1]*n,y=r/2,x=[(h=a.tangentAt(y))[1],-h[0]],_=a.pointAt(y);0=t&&(0===e?0:n[e-1][0])a&&(e[1-n]=e[n]+c.sign*a),e}function $w(t,e){var i=t[e]-t[1-e];return{span:Math.abs(i),sign:0o*(1-h[0])?(l="jump",r=s-o*(1-h[2])):0<=(r=s-o*h[1])&&(r=s-o*(1-h[1]))<=0&&(r=0),(r*=e.axisExpandWidth/u)?Kw(r,n,a,"all"):l="none";else{o=n[1]-n[0];(n=[eb(0,a[1]*s/o-o/2)])[1]=tb(a[1],n[0]+o),n[0]=n[1]-o}return{axisExpandWindow:n,behavior:l}}},sh.register("parallel",{create:function(n,o){var a=[];return n.eachComponent("parallel",function(t,e){var i=new rb(t,n,o);i.name="parallel_"+e,i.resize(t,o),(t.coordinateSystem=i).model=t,a.push(i)}),n.eachSeries(function(t){if("parallel"===t.get("coordinateSystem")){var e=n.queryComponents({mainType:"parallel",index:t.get("parallelIndex"),id:t.get("parallelId")})[0];t.coordinateSystem=e.coordinateSystem}}),a}});var lb=Lu.extend({type:"baseParallelAxis",axis:null,activeIntervals:[],getAreaSelectStyle:function(){return ha([["fill","color"],["lineWidth","borderWidth"],["stroke","borderColor"],["width","width"],["opacity","opacity"]])(this.getModel("areaSelectStyle"))},setActiveIntervals:function(t){var e=this.activeIntervals=L(t);if(e)for(var i=e.length-1;0<=i;i--)Bl(e[i])},getActiveState:function(t){var e=this.activeIntervals;if(!e.length)return"normal";if(null==t||isNaN(t))return"inactive";if(1===e.length){var i=e[0];if(i[0]<=t&&t<=i[1])return"active"}else for(var n=0,o=e.length;nn.getWidth()||i<0||i>n.getHeight()}(t,e)){var n=t._zr,o=t._covers,a=Lb(t,e,i);if(!t._dragging)for(var r=0;rf&&(f=m.depth),g.setLayout({depth:v?m.depth:c},!0),"vertical"===a?g.setLayout({dy:i},!0):g.setLayout({dx:i},!0);for(var y=0;y "))},preventIncremental:function(){return!!this.get("effect.show")},getProgressive:function(){var t=this.option.progressive;return null==t?this.option.large?1e4:this.get("progressive"):t},getProgressiveThreshold:function(){var t=this.option.progressiveThreshold;return null==t?this.option.large?2e4:this.get("progressiveThreshold"):t},defaultOption:{coordinateSystem:"geo",zlevel:0,z:2,legendHoverLink:!0,hoverAnimation:!0,xAxisIndex:0,yAxisIndex:0,symbol:["none","none"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:"circle",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:"end"},lineStyle:{opacity:.5}}});function uM(t,e,i){Ci.call(this),this.add(this.createLine(t,e,i)),this._updateEffectSymbol(t,e)}var hM=uM.prototype;function cM(t,e,i){Ci.call(this),this._createPolyline(t,e,i)}hM.createLine=function(t,e,i){return new hw(t,e,i)},hM._updateEffectSymbol=function(t,e){var i=t.getItemModel(e).getModel("effect"),n=i.get("symbolSize"),o=i.get("symbol");O(n)||(n=[n,n]);var a=i.get("color")||t.getItemVisual(e,"color"),r=this.childAt(1);this._symbolType!==o&&(this.remove(r),(r=_g(o,-.5,-.5,1,1,a)).z2=100,r.culling=!0,this.add(r)),r&&(r.setStyle("shadowColor",a),r.setStyle(i.getItemStyle(["color"])),r.attr("scale",n),r.setColor(a),r.attr("scale",n),this._symbolType=o,this._symbolScale=n,this._updateEffectAnimation(t,i,e))},hM._updateEffectAnimation=function(e,t,i){var n=this.childAt(1);if(n){var o=this,a=e.getItemLayout(i),r=1e3*t.get("period"),s=t.get("loop"),l=t.get("constantSpeed"),u=W(t.get("delay"),function(t){return t/e.count()*r/3}),h="function"==typeof u;if(n.ignore=!0,this.updateAnimationPoints(n,a),0e);r++);r=Math.min(r-1,o-2)}wt(t.position,i[r],i[r+1],(e-n[r])/(n[r+1]-n[r]));var s=i[r+1][0]-i[r][0],l=i[r+1][1]-i[r][1];t.rotation=-Math.atan2(l,s)-Math.PI/2,this._lastFrame=r,this._lastFramePercent=e,t.ignore=!1}},w(fM,uM);var gM=Cs({shape:{polyline:!1,curveness:0,segs:[]},buildPath:function(t,e){var i=e.segs,n=e.curveness;if(e.polyline)for(var o=0;o=e[0]&&t<=e[1]}}(y,e.option.range):function(e,n,o){var i=e[1]-e[0],a=(n=N(n,function(t){return{interval:[(t.interval[0]-e[0])/i,(t.interval[1]-e[0])/i]}})).length,r=0;return function(t){for(var e=r;e=e.y&&t[1]<=e.y+e.height:i.contain(i.toLocalCoord(t[1]))&&t[0]>=e.y&&t[0]<=e.y+e.height},pointToData:function(t){var e=this.getAxis();return[e.coordToData(e.toLocalCoord(t["horizontal"===e.orient?0:1]))]},dataToPoint:function(t){var e=this.getAxis(),i=this.getRect(),n=[],o="horizontal"===e.orient?0:1;return t instanceof Array&&(t=t[0]),n[o]=e.toGlobalCoord(e.dataToCoord(+t)),n[1-o]=0==o?i.y+i.height/2:i.x+i.width/2,n}}).dimensions});var jM=["axisLine","axisTickLabel","axisName"],qM=["splitArea","splitLine"],KM=pv.extend({type:"singleAxis",axisPointerClass:"SingleAxisPointer",render:function(e,t,i,n){var o=this.group;o.removeAll();var a=this._axisGroup;this._axisGroup=new Ci;var r=YM(e),s=new $m(e,r);E(jM,s.add,s),o.add(this._axisGroup),o.add(s.getGroup()),E(qM,function(t){e.get(t+".show")&&this["_"+t](e)},this),ml(a,this._axisGroup,e),KM.superCall(this,"render",e,t,i,n)},remove:function(){_v(this)},_splitLine:function(t){var e=t.axis;if(!e.scale.isBlank()){var i=t.getModel("splitLine"),n=i.getModel("lineStyle"),o=n.get("width"),a=n.get("color");a=a instanceof Array?a:[a];for(var r=t.coordinateSystem.getRect(),s=e.isHorizontal(),l=[],u=0,h=e.getTicksCoords({tickModel:i}),c=[],d=[],f=0;fr)return!0;if(a){var s=cv(t).seriesDataCount,l=n.getExtent();return Math.abs(l[0]-l[1])/s>r}return!1},makeElOption:function(t,e,i,n,o){},createPointerEl:function(t,e,i,n){var o=e.pointer;if(o){var a=pI(t).pointerEl=new bl[o.type](gI(e.pointer));t.add(a)}},createLabelEl:function(t,e,i,n){if(e.label){var o=pI(t).labelEl=new rs(gI(e.label));t.add(o),xI(o,n)}},updatePointerEl:function(t,e,i){var n=pI(t).pointerEl;n&&e.pointer&&(n.setStyle(e.pointer.style),i(n,{shape:e.pointer.shape}))},updateLabelEl:function(t,e,i,n){var o=pI(t).labelEl;o&&(o.setStyle(e.label.style),i(o,{shape:e.label.shape,position:e.label.position}),xI(o,n))},_renderHandle:function(t){if(!this._dragging&&this.updateHandleTransform){var e,i=this._axisPointerModel,n=this._api.getZr(),o=this._handle,a=i.getModel("handle"),r=i.get("status");if(!a.get("show")||!r||"hide"===r)return o&&n.remove(o),void(this._handle=null);this._handle||(e=!0,o=this._handle=yl(a.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){Xt(t.event)},onmousedown:mI(this._onHandleDragMove,this,0,0),drift:mI(this._onHandleDragMove,this),ondragend:mI(this._onHandleDragEnd,this)}),n.add(o)),wI(o,i,!1);o.setStyle(a.getItemStyle(null,["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"]));var s=a.get("size");O(s)||(s=[s,s]),o.attr("scale",[s[0]/2,s[1]/2]),Lc(this,"_doDispatchAxisPointer",a.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,e)}},_moveHandleToValue:function(t,e){yI(this._axisPointerModel,!e&&this._moveAnimation,this._handle,_I(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(t,e){var i=this._handle;if(i){this._dragging=!0;var n=this.updateHandleTransform(_I(i),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=n,i.stopAnimation(),i.attr(_I(n)),pI(i).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},_onHandleDragEnd:function(t){if(this._dragging=!1,this._handle){var e=this._axisPointerModel.get("value");this._moveHandleToValue(e),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),i=this._group,n=this._handle;e&&i&&(this._lastGraphicKey=null,i&&e.remove(i),n&&e.remove(n),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(t,e,i){return{x:t[i=i||0],y:t[1-i],width:e[i],height:e[1-i]}}}).constructor=vI);var LI=vI.extend({makeElOption:function(t,e,i,n,o){var a=i.axis,r=a.grid,s=n.get("type"),l=kI(r,a).getOtherAxis(a).getGlobalExtent(),u=a.toGlobalCoord(a.dataToCoord(e,!0));if(s&&"none"!==s){var h=bI(n),c=PI[s](a,u,l);c.style=h,t.graphicKey=c.type,t.pointer=c}TI(e,t,yv(r.model,i),i,n,o)},getHandleTransform:function(t,e,i){var n=yv(e.axis.grid.model,e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:II(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i,n){var o=i.axis,a=o.grid,r=o.getGlobalExtent(!0),s=kI(a,o).getOtherAxis(o).getGlobalExtent(),l="x"===o.dim?0:1,u=t.position;u[l]+=e[l],u[l]=Math.min(r[1],u[l]),u[l]=Math.max(r[0],u[l]);var h=(s[1]+s[0])/2,c=[h,h];c[l]=u[l];return{position:u,rotation:t.rotation,cursorPoint:c,tooltipOption:[{verticalAlign:"middle"},{align:"center"}][l]}}});function kI(t,e){var i={};return i[e.dim+"AxisIndex"]=e.index,t.getCartesian(i)}var PI={line:function(t,e,i){return{type:"Line",subPixelOptimize:!0,shape:AI([e,i[0]],[e,i[1]],NI(t))}},shadow:function(t,e,i){var n=Math.max(1,t.getBandWidth()),o=i[1]-i[0];return{type:"Rect",shape:DI([e-n/2,i[0]],[n,o],NI(t))}}};function NI(t){return"x"===t.dim?0:1}pv.registerAxisPointerClass("CartesianAxisPointer",LI),vf(function(t){if(t){t.axisPointer&&0!==t.axisPointer.length||(t.axisPointer={});var e=t.axisPointer.link;e&&!O(e)&&(t.axisPointer.link=[e])}}),yf(Cd.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=uv(t,e)}),xf({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},function(t,e,i){var n=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||A(i.dispatchAction,i),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){rI(r)&&(r=JM({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=rI(r),u=o.axesInfo,h=s.axesInfo,c="leave"===n||rI(r),d={},f={},p={list:[],map:{}},g={showPointer:tI(nI,f),showTooltip:tI(oI,p)};QM(s.coordSysMap,function(t,e){var a=l||t.containPoint(r);QM(s.coordSysAxesInfo[e],function(t,e){var i=t.axis,n=function(t,e){for(var i=0;i<(t||[]).length;i++){var n=t[i];if(e.axis.dim===n.axisDim&&e.axis.model.componentIndex===n.axisIndex)return n}}(u,t);if(!c&&a&&(!u||n)){var o=n&&n.value;null!=o||l||(o=i.pointToData(r)),null!=o&&iI(t,o,g,!1,d)}})});var m={};return QM(h,function(o,t){var a=o.linkGroup;a&&!f[t]&&QM(a.axesInfo,function(t,e){var i=f[e];if(t!==o&&i){var n=i.value;a.mapper&&(n=o.axis.scale.parse(a.mapper(n,aI(t),aI(o)))),m[o.key]=n}})}),QM(m,function(t,e){iI(h[e],t,g,!0,d)}),function(o,t,e){var a=e.axesInfo=[];QM(t,function(t,e){var i=t.axisPointerModel.option,n=o[e];n?(t.useHandle||(i.status="show"),i.value=n.value,i.seriesDataIndices=(n.payloadBatch||[]).slice()):t.useHandle||(i.status="hide"),"show"===i.status&&a.push({axisDim:t.axis.dim,axisIndex:t.axis.model.componentIndex,value:i.value})})}(f,h,d),function(t,e,i,n){if(rI(e)||!t.list.length)return n({type:"hideTip"});var o=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};n({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:i.tooltipOption,position:i.position,dataIndexInside:o.dataIndexInside,dataIndex:o.dataIndex,seriesIndex:o.seriesIndex,dataByCoordSys:t.list})}(p,r,t,a),function(t,e,i){var n=i.getZr(),o="axisPointerLastHighlights",a=eI(n)[o]||{},r=eI(n)[o]={};QM(t,function(t,e){var i=t.axisPointerModel.option;"show"===i.status&&QM(i.seriesDataIndices,function(t){var e=t.seriesIndex+" | "+t.dataIndex;r[e]=t})});var s=[],l=[];E(a,function(t,e){r[e]||l.push(t)}),E(r,function(t,e){a[e]||s.push(t)}),l.length&&i.dispatchAction({type:"downplay",escapeConnect:!0,batch:l}),s.length&&i.dispatchAction({type:"highlight",escapeConnect:!0,batch:s})}(h,0,i),d}});var OI=["x","y"],EI=["width","height"],RI=vI.extend({makeElOption:function(t,e,i,n,o){var a=i.axis,r=a.coordinateSystem,s=VI(r,1-BI(a)),l=r.dataToPoint(e)[0],u=n.get("type");if(u&&"none"!==u){var h=bI(n),c=zI[u](a,l,s);c.style=h,t.graphicKey=c.type,t.pointer=c}TI(e,t,YM(i),i,n,o)},getHandleTransform:function(t,e,i){var n=YM(e,{labelInside:!1});return n.labelMargin=i.get("handle.margin"),{position:II(e.axis,t,n),rotation:n.rotation+(n.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,i,n){var o=i.axis,a=o.coordinateSystem,r=BI(o),s=VI(a,r),l=t.position;l[r]+=e[r],l[r]=Math.min(s[1],l[r]),l[r]=Math.max(s[0],l[r]);var u=VI(a,1-r),h=(u[1]+u[0])/2,c=[h,h];return c[r]=l[r],{position:l,rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:"middle"}}}}),zI={line:function(t,e,i){return{type:"Line",subPixelOptimize:!0,shape:AI([e,i[0]],[e,i[1]],BI(t))}},shadow:function(t,e,i){var n=t.getBandWidth(),o=i[1]-i[0];return{type:"Rect",shape:DI([e-n/2,i[0]],[n,o],BI(t))}}};function BI(t){return t.isHorizontal()?0:1}function VI(t,e){var i=t.getRect();return[i[OI[e]],i[OI[e]]+i[EI[e]]]}pv.registerAxisPointerClass("SingleAxisPointer",RI),Tf({type:"single"});var GI=rc.extend({type:"series.themeRiver",dependencies:["singleAxis"],nameMap:null,init:function(t){GI.superApply(this,"init",arguments),this.legendVisualProvider=new Yv(A(this.getData,this),A(this.getRawData,this))},fixData:function(t){var e=t.length,i=ta(t,function(t){return t[2]}),n=[];i.buckets.each(function(t,e){n.push({name:e,dataList:t})});for(var o=n.length,a=-1,r=-1,s=0;sMath.PI/2?"right":"left"):y&&"center"!==y?"left"===y?(d=l.r0+v,f>Math.PI/2&&(y="right")):"right"===y&&(d=l.r-v,f>Math.PI/2&&(y="left")):(d=(l.r+l.r0)/2,y="center"),c.attr("style",{text:s,textAlign:y,textVerticalAlign:S("verticalAlign")||"middle",opacity:S("opacity")});var x=d*p+l.cx,_=d*g+l.cy;c.attr("position",[x,_]);var w=S("rotate"),b=0;function S(t){var e=a.get(t);return null==e?o.get(t):e}"radial"===w?(b=-f)<-Math.PI/2&&(b+=Math.PI):"tangential"===w?(b=Math.PI/2-f)>Math.PI/2?b-=Math.PI:b<-Math.PI/2&&(b+=Math.PI):"number"==typeof w&&(b=w*Math.PI/180),c.attr("rotation",b)},jI._initEvents=function(t,e,i,n){t.off("mouseover").off("mouseout").off("emphasis").off("normal");function o(){r.onEmphasis(n)}function a(){r.onNormal()}var r=this;i.isAnimationEnabled()&&t.on("mouseover",o).on("mouseout",a).on("emphasis",o).on("normal",a).on("downplay",function(){r.onDownplay()}).on("highlight",function(){r.onHighlight()})},w(YI,Ci);xc.extend({type:"sunburst",init:function(){},render:function(o,a,t,e){var n=this;this.seriesModel=o,this.api=t,this.ecModel=a;var r=o.getData(),s=r.tree.root,i=o.getViewRoot(),l=this.group,u=o.get("renderLabelForZeroData"),h=[];i.eachNode(function(t){h.push(t)});var c=this._oldChildren||[];if(function(i,n){if(0===i.length&&0===n.length)return;function t(t){return t.getId()}function e(t,e){!function(t,e){u||!t||t.getValue()||(t=null);if(t!==s&&e!==s)if(e&&e.piece)t?(e.piece.updateData(!1,t,"normal",o,a),r.setItemGraphicEl(t.dataIndex,e.piece)):function(t){if(!t)return;t.piece&&(l.remove(t.piece),t.piece=null)}(e);else if(t){var i=new YI(t,o,a);l.add(i),r.setItemGraphicEl(t.dataIndex,i)}}(null==t?null:i[t],null==e?null:n[e])}new Lf(n,i,t,t).add(e).update(e).remove(T(e,null)).execute()}(h,c),function(t,e){if(0=i.r0}}});var qI="sunburstRootToNode";xf({type:qI,update:"updateView"},function(o,t){t.eachComponent({mainType:"series",subType:"sunburst",query:o},function(t,e){var i=Wx(o,[qI],t);if(i){var n=t.getViewRoot();n&&(o.direction=Zx(n,i.node)?"rollUp":"drillDown"),t.resetViewRoot(i.node)}})});var KI="sunburstHighlight";xf({type:KI,update:"updateView"},function(n,t){t.eachComponent({mainType:"series",subType:"sunburst",query:n},function(t,e){var i=Wx(n,[KI],t);i&&(n.highlight=i.node)})});xf({type:"sunburstUnhighlight",update:"updateView"},function(i,t){t.eachComponent({mainType:"series",subType:"sunburst",query:i},function(t,e){i.unhighlight=!0})});var $I=Math.PI/180;function JI(t,e){if("function"==typeof e)return t.sort(e);var n="asc"===e;return t.sort(function(t,e){var i=(t.getValue()-e.getValue())*(n?1:-1);return 0==i?(t.dataIndex-e.dataIndex)*(n?-1:1):i})}function QI(a,r){return r=r||[0,0],N(["x","y"],function(t,e){var i=this.getAxis(t),n=r[e],o=a[e]/2;return"category"===i.type?i.getBandWidth():Math.abs(i.dataToCoord(n-o)-i.dataToCoord(n+o))},this)}bf(T(ty,"sunburst")),wf(T(function(t,e,C,i){e.eachSeriesByType(t,function(t){var e=t.get("center"),i=t.get("radius");O(i)||(i=[0,i]),O(e)||(e=[e,e]);var n=C.getWidth(),o=C.getHeight(),h=Math.min(n,o),c=Rl(e[0],n),d=Rl(e[1],o),f=Rl(i[0],h/2),a=Rl(i[1],h/2),r=-t.get("startAngle")*$I,p=t.get("minAngle")*$I,g=t.getData().tree.root,s=t.getViewRoot(),m=s.depth,l=t.get("sort");null!=l&&!function e(t,i){var n=t.children||[];t.children=JI(n,i);n.length&&E(t.children,function(t){e(t,i)})}(s,l);var u=0;E(s.children,function(t){isNaN(t.getValue())||u++});var v=s.getValue(),y=Math.PI/(v||u)*2,x=0t[1]&&t.reverse(),{coordSys:{type:"polar",cx:o.cx,cy:o.cy,r:t[1],r0:t[0]},api:{coord:A(function(t){var e=a.dataToRadius(t[0]),i=r.dataToAngle(t[1]),n=o.coordToPoint([e,i]);return n.push(e,i*Math.PI/180),n}),size:A(iT,o)}}},calendar:function(i){var t=i.getRect(),e=i.getRangeInfo();return{coordSys:{type:"calendar",x:t.x,y:t.y,width:t.width,height:t.height,cellWidth:i.getCellWidth(),cellHeight:i.getCellHeight(),rangeInfo:{start:e.start,end:e.end,weeks:e.weeks,dayCount:e.allDay}},api:{coord:function(t,e){return i.dataToPoint(t,e)}}}}};function hT(t,e,i,n,o){null==i[t]||o||(e[t]=i[t],i[t]=n[t])}function cT(a,r,e,t){var i=a.get("renderItem"),n=a.coordinateSystem,o={};n&&(o=n.prepareCustoms?n.prepareCustoms():uT[n.type](n));var s,l,u,h,c,d=D({getWidth:t.getWidth,getHeight:t.getHeight,getZr:t.getZr,getDevicePixelRatio:t.getDevicePixelRatio,value:function(t,e){return null==e&&(e=s),r.get(r.getDimension(t||0),e)},style:function(t,e){null==e&&(e=s),g(e);var i=l.getModel(oT).getItemStyle();null!=c&&(i.fill=c);var n=r.getItemVisual(e,"opacity");null!=n&&(i.opacity=n);var o=t?mT(t,u):u;return nl(i,o,null,{autoColor:c,isRectText:!0}),i.text=o.getShallow("show")?H(a.getFormattedLabel(e,"normal"),Zg(r,e)):null,t&&vT(i,t),i},styleEmphasis:function(t,e){null==e&&(e=s),g(e);var i=l.getModel(aT).getItemStyle(),n=t?mT(t,h):h;return nl(i,n,null,{isRectText:!0},!0),i.text=n.getShallow("show")?Z(a.getFormattedLabel(e,"emphasis"),a.getFormattedLabel(e,"normal"),Zg(r,e)):null,t&&vT(i,t),i},visual:function(t,e){return null==e&&(e=s),r.getItemVisual(e,t)},barLayout:function(t){if(n.getBaseAxis){return function(t){var e=[],i=t.axis;if("category"===i.type){for(var n=i.getBandWidth(),o=0;oe[1]&&e.reverse();var i=t.getExtent(),n=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:e[0],r:e[1],startAngle:-i[0]*n,endAngle:-i[1]*n,clockwise:t.inverse,contain:function(t,e){var i=t-this.cx,n=e-this.cy,o=i*i+n*n,a=this.r,r=this.r0;return o<=a*a&&r*r<=o}}}};var AT=Lu.extend({type:"polarAxis",axis:null,getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"polar",index:this.option.polarIndex,id:this.option.polarId})[0]}});m(AT.prototype,cg);var DT={splitNumber:5};function CT(t,e){return e.type||(e.data?"category":"value")}function LT(t,e){var i=this,n=i.getAngleAxis(),o=i.getRadiusAxis();if(n.scale.setExtent(1/0,-1/0),o.scale.setExtent(1/0,-1/0),t.eachSeries(function(t){if(t.coordinateSystem===i){var e=t.getData();E(e.mapDimension("radius",!0),function(t){o.scale.unionExtentFromData(e,fp(e,t))}),E(e.mapDimension("angle",!0),function(t){n.scale.unionExtentFromData(e,fp(e,t))})}}),ag(n.scale,n.model),ag(o.scale,o.model),"category"===n.type&&!n.onBand){var a=n.getExtent(),r=360/n.scale.count();n.inverse?a[1]+=r:a[1]-=r,n.setExtent(a[0],a[1])}}function kT(t,e){if(t.type=e.get("type"),t.scale=rg(e),t.onBand=e.get("boundaryGap")&&"category"===t.type,t.inverse=e.get("inverse"),"angleAxis"===e.mainType){t.inverse^=e.get("clockwise");var i=e.get("startAngle");t.setExtent(i,i+(t.inverse?-360:360))}(e.axis=t).model=e}Bm("angle",AT,CT,{startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:!1}}),Bm("radius",AT,CT,DT),If({type:"polar",dependencies:["polarAxis","angleAxis"],coordinateSystem:null,findAxisModel:function(t){var e;return this.ecModel.eachComponent(t,function(t){t.getCoordSysModel()===this&&(e=t)},this),e},defaultOption:{zlevel:0,z:0,center:["50%","50%"],radius:"80%"}}),sh.register("polar",{dimensions:TT.prototype.dimensions,create:function(i,s){var l=[];return i.eachComponent("polar",function(t,e){var i=new TT(e);i.update=LT;var n=i.getRadiusAxis(),o=i.getAngleAxis(),a=t.findAxisModel("radiusAxis"),r=t.findAxisModel("angleAxis");kT(n,a),kT(o,r),function(t,e,i){var n=e.get("center"),o=i.getWidth(),a=i.getHeight();t.cx=Rl(n[0],o),t.cy=Rl(n[1],a);var r=t.getRadiusAxis(),s=Math.min(o,a)/2,l=e.get("radius");null==l?l=[0,"100%"]:O(l)||(l=[0,l]),l=[Rl(l[0],s),Rl(l[1],s)],r.inverse?r.setExtent(l[1],l[0]):r.setExtent(l[0],l[1])}(i,t,s),l.push(i),(t.coordinateSystem=i).model=t}),i.eachSeries(function(t){if("polar"===t.get("coordinateSystem")){var e=i.queryComponents({mainType:"polar",index:t.get("polarIndex"),id:t.get("polarId")})[0];t.coordinateSystem=e.coordinateSystem}}),l}});var PT=["axisLine","axisLabel","axisTick","minorTick","splitLine","minorSplitLine","splitArea"];function NT(t,e,i){e[1]>e[0]&&(e=e.slice().reverse());var n=t.coordToPoint([e[0],i]),o=t.coordToPoint([e[1],i]);return{x1:n[0],y1:n[1],x2:o[0],y2:o[1]}}function OT(t){return t.getRadiusAxis().inverse?0:1}function ET(t){var e=t[0],i=t[t.length-1];e&&i&&Math.abs(Math.abs(e.coord-i.coord)-360)<1e-4&&t.pop()}pv.extend({type:"angleAxis",axisPointerClass:"PolarAxisPointer",render:function(e,t){if(this.group.removeAll(),e.get("show")){var i=e.axis,n=i.polar,o=n.getRadiusAxis().getExtent(),a=i.getTicksCoords(),r=i.getMinorTicksCoords(),s=N(i.getViewLabels(),function(t){return(t=L(t)).coord=i.dataToCoord(t.tickValue),t});ET(s),ET(a),E(PT,function(t){!e.get(t+".show")||i.scale.isBlank()&&"axisLine"!==t||this["_"+t](e,n,a,r,o,s)},this)}},_axisLine:function(t,e,i,n,o){var a,r=t.getModel("axisLine.lineStyle"),s=OT(e),l=s?0:1;(a=0===o[l]?new Yr({shape:{cx:e.cx,cy:e.cy,r:o[s]},style:r.getLineStyle(),z2:1,silent:!0}):new Kr({shape:{cx:e.cx,cy:e.cy,r:o[s],r0:o[l]},style:r.getLineStyle(),z2:1,silent:!0})).style.fill=null,this.group.add(a)},_axisTick:function(t,e,i,n,o){var a=t.getModel("axisTick"),r=(a.get("inside")?-1:1)*a.get("length"),s=o[OT(e)],l=N(i,function(t){return new ls({shape:NT(e,[s,s+r],t.coord)})});this.group.add(Es(l,{style:D(a.getModel("lineStyle").getLineStyle(),{stroke:t.get("axisLine.lineStyle.color")})}))},_minorTick:function(t,e,i,n,o){if(n.length){for(var a=t.getModel("axisTick"),r=t.getModel("minorTick"),s=(a.get("inside")?-1:1)*r.get("length"),l=o[OT(e)],u=[],h=0;hr?"left":"right",u=Math.abs(a[1]-s)/o<.3?"middle":a[1]>s?"top":"bottom";p&&p[n]&&p[n].textStyle&&(i=new Cl(p[n].textStyle,g,g.ecModel));var h=new Ur({silent:$m.isLabelSilent(c)});this.group.add(h),nl(h.style,i,{x:a[0],y:a[1],textFill:i.getTextColor()||c.get("axisLine.lineStyle.color"),text:t.formattedLabel,textAlign:l,textVerticalAlign:u}),v&&(h.eventData=$m.makeAxisEventDataBase(c),h.eventData.targetType="axisLabel",h.eventData.value=t.rawLabel)},this)},_splitLine:function(t,e,i,n,o){var a=t.getModel("splitLine").getModel("lineStyle"),r=a.get("color"),s=0;r=r instanceof Array?r:[r];for(var l=[],u=0;um?"left":"right",h=Math.abs(l[1]-v)/g<.3?"middle":l[1]>v?"top":"bottom"}return{position:l,align:u,verticalAlign:h}}(e,i,0,s,d))}});var VT={line:function(t,e,i,n,o){return"angle"===t.dim?{type:"Line",shape:AI(e.coordToPoint([n[0],i]),e.coordToPoint([n[1],i]))}:{type:"Circle",shape:{cx:e.cx,cy:e.cy,r:i}}},shadow:function(t,e,i,n,o){var a=Math.max(1,t.getBandWidth()),r=Math.PI/180;return"angle"===t.dim?{type:"Sector",shape:CI(e.cx,e.cy,n[0],n[1],(-i-a/2)*r,(a/2-i)*r)}:{type:"Sector",shape:CI(e.cx,e.cy,i-a/2,i+a/2,0,2*Math.PI)}}};function GT(n,t){t.update="updateView",xf(t,function(t,e){var i={};return e.eachComponent({mainType:"geo",query:t},function(e){e[n](t.name),E(e.coordinateSystem.regions,function(t){i[t.name]=e.isSelected(t.name)||!1})}),{selected:i,name:t.name}})}pv.registerAxisPointerClass("PolarAxisPointer",BT),wf(T(function(t,e,i){var N={},O=function(t){var g={};E(t,function(t,e){var i=t.getData(),n=t.coordinateSystem,o=n.getBaseAxis(),a=bT(n,o),r=o.getExtent(),s="category"===o.type?o.getBandWidth():Math.abs(r[1]-r[0])/i.count(),l=g[a]||{bandWidth:s,remainedWidth:s,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},u=l.stacks;g[a]=l;var h=wT(t);u[h]||l.autoWidthCount++,u[h]=u[h]||{width:0,maxWidth:0};var c=Rl(t.get("barWidth"),s),d=Rl(t.get("barMaxWidth"),s),f=t.get("barGap"),p=t.get("barCategoryGap");c&&!u[h].width&&(c=Math.min(l.remainedWidth,c),u[h].width=c,l.remainedWidth-=c),d&&(u[h].maxWidth=d),null!=f&&(l.gap=f),null!=p&&(l.categoryGap=p)});var d={};return E(g,function(t,i){d[i]={};var e=t.stacks,n=t.bandWidth,o=Rl(t.categoryGap,n),a=Rl(t.gap,1),r=t.remainedWidth,s=t.autoWidthCount,l=(r-o)/(s+(s-1)*a);l=Math.max(l,0),E(e,function(t,e){var i=t.maxWidth;i&&i=n.start.time&&i.timea.end.time&&t.reverse(),t},_getRangeInfo:function(t){var e;(t=[this.getDateInfo(t[0]),this.getDateInfo(t[1])])[0].time>t[1].time&&(e=!0,t.reverse());var i=Math.floor(t[1].time/864e5)-Math.floor(t[0].time/864e5)+1,n=new Date(t[0].time),o=n.getDate(),a=t[1].date.getDate();if(n.setDate(o+i-1),n.getDate()!==a)for(var r=0n.weeks||0===t&&en.lweek)return!1;var o=7*(t-1)-n.fweek+e,a=new Date(n.start.time);return a.setDate(n.start.d+o),this.getDateInfo(a)}},FT.dimensions=FT.prototype.dimensions,FT.getDimensionsInfo=FT.prototype.getDimensionsInfo,FT.create=function(i,n){var o=[];return i.eachComponent("calendar",function(t){var e=new FT(t,i,n);o.push(e),t.coordinateSystem=e}),i.eachSeries(function(t){"calendar"===t.get("coordinateSystem")&&(t.coordinateSystem=o[t.get("calendarIndex")||0])}),o},sh.register("calendar",FT);var HT=Lu.extend({type:"calendar",coordinateSystem:null,defaultOption:{zlevel:0,z:2,left:80,top:60,cellSize:20,orient:"horizontal",splitLine:{show:!0,lineStyle:{color:"#000",width:1,type:"solid"}},itemStyle:{color:"#fff",borderWidth:1,borderColor:"#ccc"},dayLabel:{show:!0,firstDay:0,position:"start",margin:"50%",nameMap:"en",color:"#000"},monthLabel:{show:!0,position:"start",margin:5,align:"center",nameMap:"en",formatter:null,color:"#000"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:"#ccc",fontFamily:"sans-serif",fontWeight:"bolder",fontSize:20}},init:function(t,e,i,n){var o=Mu(t);HT.superApply(this,"init",arguments),ZT(t,o)},mergeOption:function(t,e){HT.superApply(this,"mergeOption",arguments),ZT(this.option,t)}});function ZT(t,e){var i=t.cellSize;O(i)?1===i.length&&(i[1]=i[0]):i=t.cellSize=[i,i];var n=N([0,1],function(t){return function(t,e){return null!=t[yu[e][0]]||null!=t[yu[e][1]]&&null!=t[yu[e][2]]}(e,t)&&(i[t]="auto"),null!=i[t]&&"auto"!==i[t]});Su(t,e,{type:"box",ignoreSize:n})}var UT={EN:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],CN:["一月","二月","三月","四月","五月","六月","七月","八月","九月","十月","十一月","十二月"]},XT={EN:["S","M","T","W","T","F","S"],CN:["日","一","二","三","四","五","六"]};Tf({type:"calendar",_tlpoints:null,_blpoints:null,_firstDayOfMonth:null,_firstDayPoints:null,render:function(t,e,i){var n=this.group;n.removeAll();var o=t.coordinateSystem,a=o.getRangeInfo(),r=o.getOrient();this._renderDayRect(t,a,n),this._renderLines(t,a,r,n),this._renderYearText(t,a,r,n),this._renderMonthText(t,r,n),this._renderWeekText(t,a,r,n)},_renderDayRect:function(t,e,i){for(var n=t.coordinateSystem,o=t.getModel("itemStyle").getItemStyle(),a=n.getCellWidth(),r=n.getCellHeight(),s=e.start.time;s<=e.end.time;s=n.getNextNDay(s,1).time){var l=n.dataToRect([s],!1).tl,u=new rs({shape:{x:l[0],y:l[1],width:a,height:r},cursor:"default",style:o});i.add(u)}},_renderLines:function(i,t,n,o){var a=this,r=i.coordinateSystem,s=i.getModel("splitLine.lineStyle").getLineStyle(),l=i.get("splitLine.show"),e=s.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var u=t.start,h=0;u.time<=t.end.time;h++){d(u.formatedDate),0===h&&(u=r.getDateInfo(t.start.y+"-"+t.start.m));var c=u.date;c.setMonth(c.getMonth()+1),u=r.getDateInfo(c)}function d(t){a._firstDayOfMonth.push(r.getDateInfo(t)),a._firstDayPoints.push(r.dataToRect([t],!1).tl);var e=a._getLinePointsOfOneWeek(i,t,n);a._tlpoints.push(e[0]),a._blpoints.push(e[e.length-1]),l&&a._drawSplitline(e,s,o)}d(r.getNextNDay(t.end.time,1).formatedDate),l&&this._drawSplitline(a._getEdgesPoints(a._tlpoints,e,n),s,o),l&&this._drawSplitline(a._getEdgesPoints(a._blpoints,e,n),s,o)},_getEdgesPoints:function(t,e,i){var n=[t[0].slice(),t[t.length-1].slice()],o="horizontal"===i?0:1;return n[0][o]=n[0][o]-e/2,n[1][o]=n[1][o]+e/2,n},_drawSplitline:function(t,e,i){var n=new ts({z2:20,shape:{points:t},style:e});i.add(n)},_getLinePointsOfOneWeek:function(t,e,i){var n=t.coordinateSystem;e=n.getDateInfo(e);for(var o=[],a=0;a<7;a++){var r=n.getNextNDay(e.time,a),s=n.dataToRect([r.time],!1);o[2*r.day]=s.tl,o[2*r.day+1]=s["horizontal"===i?"bl":"tr"]}return o},_formatterLabel:function(t,e){return"string"==typeof t&&t?uu(t,e):"function"==typeof t?t(e):e.nameMap},_yearTextPositionControl:function(t,e,i,n,o){e=e.slice();var a=["center","bottom"];"bottom"===n?(e[1]+=o,a=["center","top"]):"left"===n?e[0]-=o:"right"===n?(e[0]+=o,a=["center","top"]):e[1]-=o;var r=0;return"left"!==n&&"right"!==n||(r=Math.PI/2),{rotation:r,position:e,style:{textAlign:a[0],textVerticalAlign:a[1]}}},_renderYearText:function(t,e,i,n){var o=t.getModel("yearLabel");if(o.get("show")){var a=o.get("margin"),r=o.get("position");r=r||("horizontal"!==i?"top":"left");var s=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],l=(s[0][0]+s[1][0])/2,u=(s[0][1]+s[1][1])/2,h="horizontal"===i?0:1,c={top:[l,s[h][1]],bottom:[l,s[1-h][1]],left:[s[1-h][0],u],right:[s[h][0],u]},d=e.start.y;+e.end.y>+e.start.y&&(d=d+"-"+e.end.y);var f=o.get("formatter"),p={start:e.start.y,end:e.end.y,nameMap:d},g=this._formatterLabel(f,p),m=new Ur({z2:30});nl(m.style,o,{text:g}),m.attr(this._yearTextPositionControl(m,c[r],i,r,a)),n.add(m)}},_monthTextPositionControl:function(t,e,i,n,o){var a="left",r="top",s=t[0],l=t[1];return"horizontal"===i?(l+=o,e&&(a="center"),"start"===n&&(r="bottom")):(s+=o,e&&(r="middle"),"start"===n&&(a="right")),{x:s,y:l,textAlign:a,textVerticalAlign:r}},_renderMonthText:function(t,e,i){var n=t.getModel("monthLabel");if(n.get("show")){var o=n.get("nameMap"),a=n.get("margin"),r=n.get("position"),s=n.get("align"),l=[this._tlpoints,this._blpoints];R(o)&&(o=UT[o.toUpperCase()]||[]);var u="start"===r?0:1,h="horizontal"===e?0:1;a="start"===r?-a:a;for(var c="center"===s,d=0;dd.getHeight()&&(i.textPosition="top",a=!0);var r=a?-5-n.height:p+8;o+n.width/2>d.getWidth()?(i.textPosition=["100%",r],i.textAlign="right"):o-n.width/2<0&&(i.textPosition=[0,r],i.textAlign="left")}})}function t(t,e){var i,n=m[t],o=m[e],a=u[n],r=new Cl(a,h,h.ecModel);if(l&&null!=l.newTitle&&(a.title=l.newTitle),n&&!o){if(function(t){return 0===t.indexOf("my")}(n))i={model:r,onclick:r.option.onclick,featureName:n};else{var s=tA(n);if(!s)return;i=new s(r,c,d)}g[n]=i}else{if(!(i=g[o]))return;i.model=r,i.ecModel=c,i.api=d}n||!o?r.get("show")&&!i.unusable?(function(o,a,t){var r=o.getModel("iconStyle"),s=o.getModel("emphasis.iconStyle"),e=a.getIcons?a.getIcons():o.get("icon"),l=o.get("title")||{};if("string"==typeof e){var i=e,n=l;l={},(e={})[t]=i,l[t]=n}var u=o.iconPaths={};E(e,function(t,e){var i=yl(t,{},{x:-p/2,y:-p/2,width:p,height:p});i.setStyle(r.getItemStyle()),i.hoverStyle=s.getItemStyle(),i.setStyle({text:l[e],textAlign:s.get("textAlign"),textBorderRadius:s.get("textBorderRadius"),textPadding:s.get("textPadding"),textFill:null});var n=h.getModel("tooltip");n&&n.get("show")&&i.attr("tooltip",k({content:l[e],formatter:n.get("formatter",!0)||function(){return l[e]},formatterParams:{componentType:"toolbox",name:e,title:l[e],$vars:["name","title"]},position:n.get("position",!0)||"bottom"},n.option)),$s(i),h.get("showTitle")&&(i.__title=l[e],i.on("mouseover",function(){var t=s.getItemStyle(),e="vertical"===h.get("orient")?null==h.get("right")?"right":"left":null==h.get("bottom")?"bottom":"top";i.setStyle({textFill:s.get("textFill")||t.fill||t.stroke||"#000",textBackgroundColor:s.get("textBackgroundColor"),textPosition:s.get("textPosition")||e})}).on("mouseout",function(){i.setStyle({textFill:null,textBackgroundColor:null})})),i.trigger(o.get("iconStatus."+e)||"normal"),f.add(i),i.on("click",A(a.onclick,a,c,d,e)),u[e]=i})}(r,i,n),r.setIconStatus=function(t,e){var i=this.option,n=this.iconPaths;i.iconStatus=i.iconStatus||{},i.iconStatus[t]=e,n[t]&&n[t].trigger(e)},i.render&&i.render(r,c,d,l)):i.remove&&i.remove(c,d):i.dispose&&i.dispose(c,d)}},updateView:function(t,e,i,n){E(this._features,function(t){t.updateView&&t.updateView(t.model,e,i,n)})},remove:function(e,i){E(this._features,function(t){t.remove&&t.remove(e,i)}),this.group.removeAll()},dispose:function(e,i){E(this._features,function(t){t.dispose&&t.dispose(e,i)})}});var nA=Nc.toolbox.saveAsImage;function oA(t){this.model=t}oA.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:nA.title,type:"png",connectedBackgroundColor:"#fff",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:nA.lang.slice()},oA.prototype.unusable=!v.canvasSupported,oA.prototype.onclick=function(t,e){var i=this.model,n=i.get("name")||t.get("title.0.text")||"echarts",o=i.get("type",!0)||"png",a=e.getConnectedDataURL({type:o,backgroundColor:i.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",connectedBackgroundColor:i.get("connectedBackgroundColor"),excludeComponents:i.get("excludeComponents"),pixelRatio:i.get("pixelRatio")});if("function"!=typeof MouseEvent||v.browser.ie||v.browser.edge)if(window.navigator.msSaveOrOpenBlob){for(var r=atob(a.split(",")[1]),s=r.length,l=new Uint8Array(s);s--;)l[s]=r.charCodeAt(s);var u=new Blob([l]);window.navigator.msSaveOrOpenBlob(u,n+"."+o)}else{var h=i.get("lang"),c='';window.open().document.write(c)}else{var d=document.createElement("a");d.download=n+"."+o,d.target="_blank",d.href=a;var f=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});d.dispatchEvent(f)}},QT("saveAsImage",oA);var aA=Nc.toolbox.magicType,rA="__ec_magicType_stack__";function sA(t){this.model=t}sA.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z"},title:L(aA.title),option:{},seriesIndex:{}};var lA=sA.prototype;lA.getIcons=function(){var t=this.model,e=t.get("icon"),i={};return E(t.get("type"),function(t){e[t]&&(i[t]=e[t])}),i};var uA={line:function(t,e,i,n){if("bar"===t)return m({id:e,type:"line",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.line")||{},!0)},bar:function(t,e,i,n){if("line"===t)return m({id:e,type:"bar",data:i.get("data"),stack:i.get("stack"),markPoint:i.get("markPoint"),markLine:i.get("markLine")},n.get("option.bar")||{},!0)},stack:function(t,e,i,n){var o=i.get("stack")===rA;if("line"===t||"bar"===t)return n.setIconStatus("stack",o?"normal":"emphasis"),m({id:e,stack:o?"":rA},n.get("option.stack")||{},!0)}},hA=[["line","bar"],["stack"]];lA.onclick=function(u,t,h){var c=this.model,e=c.get("seriesIndex."+h);if(uA[h]){var i,d={series:[]};if(E(hA,function(t){0<=_(t,h)&&E(t,function(t){c.setIconStatus(t,"normal")})}),c.setIconStatus(h,"emphasis"),u.eachComponent({mainType:"series",query:null==e?null:{seriesIndex:e}},function(t){var e=t.subType,i=t.id,n=uA[h](e,i,t,c);n&&(D(n,t.option),d.series.push(n));var o=t.coordinateSystem;if(o&&"cartesian2d"===o.type&&("line"===h||"bar"===h)){var a=o.getAxesByScale("ordinal")[0];if(a){var r=a.dim+"Axis",s=u.queryComponents({mainType:r,index:t.get(name+"Index"),id:t.get(name+"Id")})[0].componentIndex;d[r]=d[r]||[];for(var l=0;l<=s;l++)d[r][s]=d[r][s]||{};d[r][s].boundaryGap="bar"===h}}}),"stack"===h)i=d.series&&d.series[0]&&d.series[0].stack===rA?m({stack:aA.title.tiled},aA.title):L(aA.title);t.dispatchAction({type:"changeMagicType",currentType:h,newOption:d,newTitle:i})}},xf({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),QT("magicType",sA);var cA=Nc.toolbox.dataView,dA=new Array(60).join("-"),fA="\t";function pA(t){var e=function(t){var o={},a=[],r=[];return t.eachRawSeries(function(t){var e=t.coordinateSystem;if(!e||"cartesian2d"!==e.type&&"polar"!==e.type)a.push(t);else{var i=e.getBaseAxis();if("category"===i.type){var n=i.dim+"_"+i.index;o[n]||(o[n]={categoryAxis:i,valueAxis:e.getOtherAxis(i),series:[]},r.push({axisDim:i.dim,axisIndex:i.index})),o[n].series.push(t)}else a.push(t)}}),{seriesGroupByCategoryAxis:o,other:a,meta:r}}(t);return{value:M([function(t){var h=[];return E(t,function(t,e){var i=t.categoryAxis,n=t.valueAxis.dim,o=[" "].concat(N(t.series,function(t){return t.name})),a=[i.model.getCategories()];E(t.series,function(t){a.push(t.getRawData().mapArray(n,function(t){return t}))});for(var r=[o.join(fA)],s=0;st[1]&&t.reverse(),t}function AA(t,e){return Ko(t,e,{includeMainTypes:SA})}IA.setOutputRanges=function(t,e){this.matchOutputRanges(t,e,function(t,e,i){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var n=kA[t.brushType](0,i,e);t.__rangeOffset={offset:NA[t.brushType](n.values,t.range,[1,1]),xyMinMax:n.xyMinMax}}})},IA.matchOutputRanges=function(t,n,o){xA(t,function(i){var t=this.findTargetInfo(i,n);t&&!0!==t&&E(t.coordSyses,function(t){var e=kA[i.brushType](1,t,i.range);o(i,e.values,t,n)})},this)},IA.setInputRanges=function(t,o){xA(t,function(t){var e=this.findTargetInfo(t,o);if(t.range=t.range||[],e&&!0!==e){t.panelId=e.panelId;var i=kA[t.brushType](0,e.coordSys,t.coordRange),n=t.__rangeOffset;t.range=n?NA[t.brushType](i.values,n.offset,function(t,e){var i=EA(t),n=EA(e),o=[i[0]/n[0],i[1]/n[1]];return isNaN(o[0])&&(o[0]=1),isNaN(o[1])&&(o[1]=1),o}(i.xyMinMax,n.xyMinMax)):i.values}},this)},IA.makePanelOpts=function(i,n){return N(this._targetInfoList,function(t){var e=t.getPanelRect();return{panelId:t.panelId,defaultBrushType:n&&n(t),clipPath:Qb(e),isTargetByCursor:eS(e,i,t.coordSysModel),getLinearBrushOtherExtent:tS(e)}})},IA.controlSeries=function(t,e,i){var n=this.findTargetInfo(t,i);return!0===n||n&&0<=_A(n.coordSyses,e.coordinateSystem)},IA.findTargetInfo=function(t,e){for(var i=this._targetInfoList,n=AA(e,t),o=0;on[1]&&(n[1]=e[1])})}),n[1]c[1];if(r&&!s&&!l)return!0;r&&(n=!0),s&&(e=!0),l&&(i=!0)}return n&&e&&i}):YA(h,function(t){if("empty"===o)i.setData(u=u.map(t,function(t){return function(t){return t>=c[0]&&t<=c[1]}(t)?t:NaN}));else{var e={};e[t]=c,u.selectRange(e)}}),YA(h,function(t){u.setApproximateExtent(c,t)}))})}}};var KA=E,$A=ZA,JA=If({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null,minSpan:null,maxSpan:null,minValueSpan:null,maxValueSpan:null,rangeMode:null},init:function(t,e,i){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var n=QA(t);this.settledOption=n,this.mergeDefaultAndTheme(t,i),this.doInit(n)},mergeOption:function(t){var e=QA(t);m(this.option,t,!0),m(this.settledOption,e,!0),this.doInit(e)},doInit:function(t){var i=this.option;v.canvasSupported||(i.realtime=!1),this._setDefaultThrottle(t),tD(this,t);var n=this.settledOption;KA([["start","startValue"],["end","endValue"]],function(t,e){"value"===this._rangePropMode[e]&&(i[t[0]]=n[t[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var r=this._axisProxies;this.eachTargetAxis(function(t,e,i,n){var o=this.dependentModels[t.axis][e],a=o.__dzAxisProxy||(o.__dzAxisProxy=new XA(t.name,e,this,n));r[t.name+"_"+e]=a},this)},_resetTarget:function(){var i=this.option,t=this._judgeAutoMode();$A(function(t){var e=t.axisIndex;i[e]=Vo(i[e])},this),"axisIndex"===t?this._autoSetAxisIndex():"orient"===t&&this._autoSetOrient()},_judgeAutoMode:function(){var e=this.option,i=!1;$A(function(t){null!=e[t.axisIndex]&&(i=!0)},this);var t=e.orient;return null==t&&i?"orient":i?void 0:(null==t&&(e.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var a=!0,e=this.get("orient",!0),r=this.option,t=this.dependentModels;if(a){var i="vertical"===e?"y":"x";t[i+"Axis"].length?(r[i+"AxisIndex"]=[0],a=!1):KA(t.singleAxis,function(t){a&&t.get("orient",!0)===e&&(r.singleAxisIndex=[t.componentIndex],a=!1)})}a&&$A(function(t){if(a){var e=[],i=this.dependentModels[t.axis];if(i.length&&!e.length)for(var n=0,o=i.length;ne[0][1]&&(e[0][1]=a[0]),a[1]e[1][1]&&(e[1][1]=a[1])}return e&&FD(e)}};function FD(t){return new Di(t[0][0],t[1][0],t[0][1]-t[0][0],t[1][1]-t[1][0])}var WD=["#ddd"];If({type:"brush",dependencies:["geo","grid","xAxis","yAxis","parallel","series"],defaultOption:{toolbox:null,brushLink:null,seriesIndex:"all",geoIndex:null,xAxisIndex:null,yAxisIndex:null,brushType:"rect",brushMode:"single",transformable:!0,brushStyle:{borderWidth:1,color:"rgba(120,140,180,0.3)",borderColor:"rgba(120,140,180,0.8)"},throttleType:"fixRate",throttleDelay:0,removeOnClick:!0,z:1e4},areas:[],brushType:null,brushOption:{},coordInfoList:[],optionUpdated:function(t,e){var i=this.option;e||DD(i,t,["inBrush","outOfBrush"]);var n=i.inBrush=i.inBrush||{};i.outOfBrush=i.outOfBrush||{color:WD},n.hasOwnProperty("liftZ")||(n.liftZ=5)},setAreas:function(t){t&&(this.areas=N(t,function(t){return HD(this.option,t)},this))},setBrushOption:function(t){this.brushOption=HD(this.option,t),this.brushType=this.brushOption.brushType}});function HD(t,e){return m({brushType:t.brushType,brushMode:t.brushMode,transformable:t.transformable,brushStyle:new Cl(t.brushStyle).getItemStyle(),removeOnClick:t.removeOnClick,z:t.z},e,!0)}function ZD(t,e,i,n){n&&n.$from===t.id||this._brushController.setPanels(t.brushTargetManager.makePanelOpts(i)).enableBrush(t.brushOption).updateCovers(t.areas.slice())}Tf({type:"brush",init:function(t,e){this.ecModel=t,this.api=e,this.model,(this._brushController=new Sb(e.getZr())).on("brush",A(this._onBrush,this)).mount()},render:function(t){return this.model=t,ZD.apply(this,arguments)},updateTransform:function(t,e){return RD(e),ZD.apply(this,arguments)},updateView:ZD,dispose:function(){this._brushController.dispose()},_onBrush:function(t,e){var i=this.model.id;this.model.brushTargetManager.setOutputRanges(t,this.ecModel),e.isEnd&&!e.removeOnClick||this.api.dispatchAction({type:"brush",brushId:i,areas:L(t),$from:i}),e.isEnd&&this.api.dispatchAction({type:"brushEnd",brushId:i,areas:L(t),$from:i})}}),xf({type:"brush",event:"brush"},function(e,t){t.eachComponent({mainType:"brush",query:e},function(t){t.setAreas(e.areas)})}),xf({type:"brushSelect",event:"brushSelected",update:"none"},function(){}),xf({type:"brushEnd",event:"brushEnd",update:"none"},function(){});var UD=Nc.toolbox.brush;function XD(t,e,i){this.model=t,this.ecModel=e,this.api=i,this._brushType,this._brushMode}XD.defaultOption={show:!0,type:["rect","polygon","lineX","lineY","keep","clear"],icon:{rect:"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13",polygon:"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2",lineX:"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4",lineY:"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4",keep:"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z",clear:"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2"},title:L(UD.title)};var YD=XD.prototype;YD.render=YD.updateView=function(e,t,i){var n,o,a;t.eachComponent({mainType:"brush"},function(t){n=t.brushType,o=t.brushOption.brushMode||"single",a|=t.areas.length}),this._brushType=n,this._brushMode=o,E(e.get("type",!0),function(t){e.setIconStatus(t,("keep"===t?"multiple"===o:"clear"===t?a:t===n)?"emphasis":"normal")})},YD.getIcons=function(){var t=this.model,e=t.get("icon",!0),i={};return E(t.get("type",!0),function(t){e[t]&&(i[t]=e[t])}),i},YD.onclick=function(t,e,i){var n=this._brushType,o=this._brushMode;"clear"===i?(e.dispatchAction({type:"axisAreaSelect",intervals:[]}),e.dispatchAction({type:"brush",command:"clear",areas:[]})):e.dispatchAction({type:"takeGlobalCursor",key:"brush",brushOption:{brushType:"keep"===i?n:n!==i&&i,brushMode:"keep"===i?"multiple"===o?"single":"multiple":o}})},QT("brush",XD),vf(function(t,e){var i=t&&t.brush;if(O(i)||(i=i?[i]:[]),i.length){var n=[];E(i,function(t){var e=t.hasOwnProperty("toolbox")?t.toolbox:[];e instanceof Array&&(n=n.concat(e))});var o=t&&t.toolbox;O(o)&&(o=o[0]),o||(o={feature:{}},t.toolbox=[o]);var a=o.feature||(o.feature={}),r=a.brush||(a.brush={}),s=r.type||(r.type=[]);s.push.apply(s,n),function(i){var e={};E(i,function(t){e[t]=1}),i.length=0,E(e,function(t,e){i.push(e)})}(s),e&&!s.length&&s.push.apply(s,MD)}}),If({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),Tf({type:"title",render:function(t,e,i){if(this.group.removeAll(),t.get("show")){var n=this.group,o=t.getModel("textStyle"),a=t.getModel("subtextStyle"),r=t.get("textAlign"),s=H(t.get("textBaseline"),t.get("textVerticalAlign")),l=new Ur({style:nl({},o,{text:t.get("text"),textFill:o.getTextColor()},{disableBox:!0}),z2:10}),u=l.getBoundingRect(),h=t.get("subtext"),c=new Ur({style:nl({},a,{text:h,textFill:a.getTextColor(),y:u.height+t.get("itemGap"),textVerticalAlign:"top"},{disableBox:!0}),z2:10}),d=t.get("link"),f=t.get("sublink"),p=t.get("triggerEvent",!0);l.silent=!d&&!p,c.silent=!f&&!p,d&&l.on("click",function(){window.open(d,"_"+t.get("target"))}),f&&c.on("click",function(){window.open(f,"_"+t.get("subtarget"))}),l.eventData=c.eventData=p?{componentType:"title",componentIndex:t.componentIndex}:null,n.add(l),h&&n.add(c);var g=n.getBoundingRect(),m=t.getBoxLayoutParams();m.width=g.width,m.height=g.height;var v=wu(m,{width:i.getWidth(),height:i.getHeight()},t.get("padding"));r||("middle"===(r=t.get("left")||t.get("right"))&&(r="center"),"right"===r?v.x+=v.width:"center"===r&&(v.x+=v.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?v.y+=v.height:"middle"===s&&(v.y+=v.height/2),s=s||"top"),n.attr("position",[v.x,v.y]);var y={textAlign:r,textVerticalAlign:s};l.setStyle(y),c.setStyle(y),g=n.getBoundingRect();var x=v.margin,_=t.getItemStyle(["color","opacity"]);_.fill=t.get("backgroundColor");var w=new rs({shape:{x:g.x-x[3],y:g.y-x[0],width:g.width+x[1]+x[3],height:g.height+x[0]+x[2],r:t.get("borderRadius")},style:_,subPixelOptimize:!0,silent:!0});n.add(w)}}});function jD(t){var e=t.itemStyle||(t.itemStyle={}),i=e.emphasis||(e.emphasis={}),n=t.label||t.label||{},o=n.normal||(n.normal={}),a={normal:1,emphasis:1};E(n,function(t,e){a[e]||qD(o,e)||(o[e]=t)}),i.label&&!qD(n,"emphasis")&&(n.emphasis=i.label,delete i.label)}function qD(t,e){return t.hasOwnProperty(e)}Lu.registerSubTypeDefaulter("timeline",function(){return"slider"}),xf({type:"timelineChange",event:"timelineChanged",update:"prepareAndUpdate"},function(t,e){var i=e.getComponent("timeline");return i&&null!=t.currentIndex&&(i.setCurrentIndex(t.currentIndex),!i.get("loop",!0)&&i.isIndexMax()&&i.setPlayState(!1)),e.resetOption("timeline"),D({currentIndex:i.option.currentIndex},t)}),xf({type:"timelinePlayChange",event:"timelinePlayChanged",update:"update"},function(t,e){var i=e.getComponent("timeline");i&&null!=t.playState&&i.setPlayState(t.playState)});var KD=Lu.extend({type:"timeline",layoutMode:"box",defaultOption:{zlevel:0,z:4,show:!0,axisType:"time",realtime:!0,left:"20%",top:null,right:"20%",bottom:0,width:null,height:40,padding:5,controlPosition:"left",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:"#000"},data:[]},init:function(t,e,i){this._data,this._names,this.mergeDefaultAndTheme(t,i),this._initData()},mergeOption:function(t){KD.superApply(this,"mergeOption",arguments),this._initData()},setCurrentIndex:function(t){null==t&&(t=this.option.currentIndex);var e=this._data.count();this.option.loop?t=(t%e+e)%e:(e<=t&&(t=e-1),t<0&&(t=0)),this.option.currentIndex=t},getCurrentIndex:function(){return this.option.currentIndex},isIndexMax:function(){return this.getCurrentIndex()>=this._data.count()-1},setPlayState:function(t){this.option.autoPlay=!!t},getPlayState:function(){return!!this.option.autoPlay},_initData:function(){var t=this.option,e=t.data||[],i=t.axisType,o=this._names=[];if("category"===i){var a=[];E(e,function(t,e){var i,n=Wo(t);z(t)?(i=L(t)).value=e:i=e,a.push(i),R(n)||null!=n&&!isNaN(n)||(n=""),o.push(n+"")}),e=a}var n={category:"ordinal",time:"time"}[i]||"number";(this._data=new Xf([{name:"value",type:n}],this)).initData(e,o)},getData:function(){return this._data},getCategories:function(){if("category"===this.get("axisType"))return this._names.slice()}});b(KD.extend({type:"timeline.slider",defaultOption:{backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,orient:"horizontal",inverse:!1,tooltip:{trigger:"item"},symbol:"emptyCircle",symbolSize:10,lineStyle:{show:!0,width:2,color:"#304654"},label:{position:"auto",show:!0,interval:"auto",rotate:0,color:"#304654"},itemStyle:{color:"#304654",borderWidth:1},checkpointStyle:{symbol:"circle",symbolSize:13,color:"#c23531",borderWidth:5,borderColor:"rgba(194,53,49, 0.5)",animation:!0,animationDuration:300,animationEasing:"quinticInOut"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:22,itemGap:12,position:"left",playIcon:"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z",stopIcon:"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z",nextIcon:"path://M18.6,50.8l22.5-22.5c0.2-0.2,0.3-0.4,0.3-0.7c0-0.3-0.1-0.5-0.3-0.7L18.7,4.4c-0.1-0.1-0.2-0.3-0.2-0.5 c0-0.4,0.3-0.8,0.8-0.8c0.2,0,0.5,0.1,0.6,0.3l23.5,23.5l0,0c0.2,0.2,0.3,0.4,0.3,0.7c0,0.3-0.1,0.5-0.3,0.7l-0.1,0.1L19.7,52 c-0.1,0.1-0.3,0.2-0.5,0.2c-0.4,0-0.8-0.3-0.8-0.8C18.4,51.2,18.5,51,18.6,50.8z",prevIcon:"path://M43,52.8L20.4,30.3c-0.2-0.2-0.3-0.4-0.3-0.7c0-0.3,0.1-0.5,0.3-0.7L42.9,6.4c0.1-0.1,0.2-0.3,0.2-0.5 c0-0.4-0.3-0.8-0.8-0.8c-0.2,0-0.5,0.1-0.6,0.3L18.3,28.8l0,0c-0.2,0.2-0.3,0.4-0.3,0.7c0,0.3,0.1,0.5,0.3,0.7l0.1,0.1L41.9,54 c0.1,0.1,0.3,0.2,0.5,0.2c0.4,0,0.8-0.3,0.8-0.8C43.2,53.2,43.1,53,43,52.8z",color:"#304654",borderColor:"#304654",borderWidth:1},emphasis:{label:{show:!0,color:"#c23531"},itemStyle:{color:"#c23531"},controlStyle:{color:"#c23531",borderColor:"#c23531",borderWidth:2}},data:[]}}),Uh);function $D(t,e,i,n){Vg.call(this,t,e,i),this.type=n||"value",this.model=null}var JD=pc.extend({type:"timeline"});$D.prototype={constructor:$D,getLabelModel:function(){return this.model.getModel("label")},isHorizontal:function(){return"horizontal"===this.model.get("orient")}},w($D,Vg);var QD=A,tC=E,eC=Math.PI;function iC(t,e,i,n,o,a){var r=e.get("color");o?(o.setColor(r),i.add(o),a&&a.onUpdate(o)):((o=_g(t.get("symbol"),-1,-1,2,2,r)).setStyle("strokeNoScale",!0),i.add(o),a&&a.onCreate(o));var s=e.getItemStyle(["color","symbol","symbolSize"]);o.setStyle(s),n=m({rectHover:!0,z2:100},n,!0);var l=t.get("symbolSize");(l=l instanceof Array?l.slice():[+l,+l])[0]/=2,l[1]/=2,n.scale=l;var u=t.get("symbolOffset");if(u){var h=n.position=n.position||[0,0];h[0]+=Rl(u[0],l[0]),h[1]+=Rl(u[1],l[1])}var c=t.get("symbolRotate");return n.rotation=(c||0)*Math.PI/180||0,o.attr(n),o.updateTransform(),o}function nC(t,e,i,n,o){if(!t.dragging){var a=n.getModel("checkpointStyle"),r=i.dataToCoord(n.getData().get(["value"],e));o||!a.get("animation",!0)?t.attr({position:[r,0]}):(t.stopAnimation(!0),t.animateTo({position:[r,0]},a.get("animationDuration",!0),a.get("animationEasing",!0)))}}JD.extend({type:"timeline.slider",init:function(t,e){this.api=e,this._axis,this._viewRect,this._timer,this._currentPointer,this._mainGroup,this._labelGroup},render:function(e,t,i,n){if(this.model=e,this.api=i,this.ecModel=t,this.group.removeAll(),e.get("show",!0)){var o=this._layout(e,i),a=this._createGroup("mainGroup"),r=this._createGroup("labelGroup"),s=this._axis=this._createAxis(o,e);e.formatTooltip=function(t){return au(s.scale.getLabel(t))},tC(["AxisLine","AxisTick","Control","CurrentPointer"],function(t){this["_render"+t](o,a,s,e)},this),this._renderAxisLabel(o,r,s,e),this._position(o,e)}this._doPlayStop()},remove:function(){this._clearTimer(),this.group.removeAll()},dispose:function(){this._clearTimer()},_layout:function(t,e){var i=t.get("label.position"),n=t.get("orient"),o=function(t,e){return wu(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},t.get("padding"))}(t,e);null==i||"auto"===i?i="horizontal"===n?o.y+o.height/2n[1]&&(i=n[1]),i"),o&&(a+=aC(o),null!=i&&(a+=" : ")),null!=i&&(a+=aC(n)),a},getData:function(){return this._data},setData:function(t){this._data=t}});b(sC,Uh),sC.extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{show:!0,position:"inside"},itemStyle:{borderWidth:2},emphasis:{label:{show:!0}}}});var lC=_;function uC(t,e,i,n,o,a){var r=[],s=dp(e,n)?e.getCalculationInfo("stackResultDimension"):n,l=mC(e,s,t),u=e.indicesOfNearest(s,l)[0];r[o]=e.get(i,u),r[a]=e.get(s,u);var h=e.get(n,u),c=Vl(e.get(n,u));return 0<=(c=Math.min(c,20))&&(r[a]=+r[a].toFixed(c)),[r,h]}var hC=T,cC={min:hC(uC,"min"),max:hC(uC,"max"),average:hC(uC,"average")};function dC(t,e){var i=t.getData(),n=t.coordinateSystem;if(e&&!function(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}(e)&&!O(e.coord)&&n){var o=n.dimensions,a=fC(e,i,n,t);if((e=L(e)).type&&cC[e.type]&&a.baseAxis&&a.valueAxis){var r=lC(o,a.baseAxis.dim),s=lC(o,a.valueAxis.dim),l=cC[e.type](i,a.baseDataDim,a.valueDataDim,r,s);e.coord=l[0],e.value=l[1]}else{for(var u=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],h=0;h<2;h++)cC[u[h]]&&(u[h]=mC(i,i.mapDimension(o[h]),u[h]));e.coord=u}}return e}function fC(t,e,i,n){var o={};return null!=t.valueIndex||null!=t.valueDim?(o.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,o.valueAxis=i.getAxis(function(t,e){var i=t.getData(),n=i.dimensions;e=i.getDimension(e);for(var o=0;oi[o],f=[-h.x,-h.y];e||(f[n]=s.position[n]);var p=[0,0],g=[-c.x,-c.y],m=H(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?g[n]+=i[o]-c[o]:p[n]+=c[o]+m);g[1-n]+=h[a]/2-c[a]/2,s.attr("position",f),l.attr("position",p),u.attr("position",g);var v={x:0,y:0};if(v[o]=d?i[o]:h[o],v[a]=Math.max(h[a],c[a]),v[r]=Math.min(0,c[r]+g[1-n]),l.__rectSize=i[o],d){var y={x:0,y:0};y[o]=Math.max(i[o]-c[o]-m,0),y[a]=v[a],l.setClipPath(new rs({shape:y})),l.__rectSize=y[o]}else u.eachChild(function(t){t.attr({invisible:!0,silent:!0})});var x=this._getPageInfo(t);return null!=x.pageIndex&&cl(s,{position:x.contentPosition},d&&t),this._updatePageInfoView(t,x),v},_pageGo:function(t,e,i){var n=this._getPageInfo(e)[t];null!=n&&i.dispatchAction({type:"legendScroll",scrollDataIndex:n,legendId:e.id})},_updatePageInfoView:function(n,o){var a=this._controllerGroup;E(["pagePrev","pageNext"],function(t){var e=null!=o[t+"DataIndex"],i=a.childOfName(t);i&&(i.setStyle("fill",e?n.get("pageIconColor",!0):n.get("pageIconInactiveColor",!0)),i.cursor=e?"pointer":"default")});var t=a.childOfName("pageText"),e=n.get("pageFormatter"),i=o.pageIndex,r=null!=i?i+1:0,s=o.pageCount;t&&e&&t.setStyle("text",R(e)?e.replace("{current}",r).replace("{total}",s):e({current:r,total:s}))},_getPageInfo:function(t){var e=t.get("scrollDataIndex",!0),i=this.getContentGroup(),n=this._containerGroup.__rectSize,o=t.getOrient().index,a=UC[o],r=XC[o],s=this._findTargetItemIndex(e),l=i.children(),u=l[s],h=l.length,c=h?1:0,d={contentPosition:i.position.slice(),pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!u)return d;var f=y(u);d.contentPosition[o]=-f.s;for(var p=s+1,g=f,m=f,v=null;p<=h;++p)(!(v=y(l[p]))&&m.e>g.s+n||v&&!x(v,g.s))&&(g=m.i>g.i?m:v)&&(null==d.pageNextDataIndex&&(d.pageNextDataIndex=g.i),++d.pageCount),m=v;for(p=s-1,g=f,m=f,v=null;-1<=p;--p)(v=y(l[p]))&&x(m,v.s)||!(g.i=e&&t.s<=e+n}},_findTargetItemIndex:function(n){return this._showController?(this.getContentGroup().eachChild(function(t,e){var i=t.__legendDataIndex;null==a&&null!=i&&(a=e),i===n&&(o=e)}),null!=o?o:a):0;var o,a}});xf("legendScroll","legendscroll",function(t,e){var i=t.scrollDataIndex;null!=i&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},function(t){t.setScrollDataIndex(i)})});JA.extend({type:"dataZoom.slider",layoutMode:"box",defaultOption:{show:!0,right:"ph",top:"ph",width:"ph",height:"ph",left:null,bottom:null,backgroundColor:"rgba(47,69,84,0)",dataBackground:{lineStyle:{color:"#2f4554",width:.5,opacity:.3},areaStyle:{color:"rgba(47,69,84,0.3)",opacity:.3}},borderColor:"#ddd",fillerColor:"rgba(167,183,204,0.4)",handleIcon:"M8.2,13.6V3.9H6.3v9.7H3.1v14.9h3.3v9.7h1.8v-9.7h3.3V13.6H8.2z M9.7,24.4H4.8v-1.4h4.9V24.4z M9.7,19.1H4.8v-1.4h4.9V19.1z",handleSize:"100%",handleStyle:{color:"#a7b7cc"},labelPrecision:null,labelFormatter:null,showDetail:!0,showDataShadow:"auto",realtime:!0,zoomLock:!1,textStyle:{color:"#333"}}});var jC=rs,qC=El,KC=Bl,$C=A,JC=E,QC="horizontal",tL="vertical",eL=["line","bar","candlestick","scatter"],iL=eD.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,i,n){iL.superApply(this,"render",arguments),Lc(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),!1!==this.dataZoomModel.get("show")?(n&&"dataZoom"===n.type&&n.from===this.uid||this._buildView(),this._updateView()):this.group.removeAll()},remove:function(){iL.superApply(this,"remove",arguments),kc(this,"_dispatchZoomAction")},dispose:function(){iL.superApply(this,"dispose",arguments),kc(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new Ci;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,i=this._findCoordRect(),n={width:e.getWidth(),height:e.getHeight()},o=this._orient===QC?{right:n.width-i.x-i.width,top:n.height-30-7,width:i.width,height:30}:{right:7,top:i.y,width:30,height:i.height},a=Mu(t.option);E(["right","top","width","height"],function(t){"ph"===a[t]&&(a[t]=o[t])});var r=wu(a,n,t.padding);this._location={x:r.x,y:r.y},this._size=[r.width,r.height],this._orient===tL&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,i=this._orient,n=this.dataZoomModel.getFirstTargetAxisModel(),o=n&&n.get("inverse"),a=this._displayables.barGroup,r=(this._dataShadowInfo||{}).otherAxisInverse;a.attr(i!==QC||o?i===QC&&o?{scale:r?[-1,1]:[-1,-1]}:i!==tL||o?{scale:r?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:r?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:r?[1,1]:[1,-1]});var s=t.getBoundingRect([a]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size,i=this._displayables.barGroup;i.add(new jC({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40})),i.add(new jC({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:A(this._onClickPanelClick,this)}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,i=t.series,n=i.getRawData(),o=i.getShadowDim?i.getShadowDim():t.otherDim;if(null!=o){var a=n.getDataExtent(o),r=.3*(a[1]-a[0]);a=[a[0]-r,a[1]+r];var s,l=[0,e[1]],u=[0,e[0]],h=[[e[0],0],[0,0]],c=[],d=u[1]/(n.count()-1),f=0,p=Math.round(n.count()/e[0]);n.each([o],function(t,e){if(0e[0]||i[1]<0||i[1]>e[1])){var n=this._handleEnds,o=(n[0]+n[1])/2,a=this._updateInterval("all",i[0]-o);this._updateView(),a&&this._dispatchZoomAction()}},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_findCoordRect:function(){var i;if(JC(this.getTargetCoordInfo(),function(t){if(!i&&t.length){var e=t[0].model.coordinateSystem;i=e.getRect&&e.getRect()}}),!i){var t=this.api.getWidth(),e=this.api.getHeight();i={x:.2*t,y:.2*e,width:.6*t,height:.6*e}}return i}});function nL(t){return"vertical"===t?"ns-resize":"ew-resize"}JA.extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}});var oL="\0_ec_dataZoom_roams";function aL(t,n){var e=sL(t),o=n.dataZoomId,a=n.coordId;E(e,function(t,e){var i=t.dataZoomInfos;i[o]&&_(n.allCoordIds,a)<0&&(delete i[o],t.count--)}),lL(e);var i=e[a];i||((i=e[a]={coordId:a,dataZoomInfos:{},count:0}).controller=function(t,r){var e=new zy(t.getZr());return E(["pan","zoom","scrollMove"],function(a){e.on(a,function(n){var o=[];E(r.dataZoomInfos,function(t){if(n.isAvailableBehavior(t.dataZoomModel.option)){var e=(t.getRange||{})[a],i=e&&e(r.controller,n);!t.dataZoomModel.get("disabled",!0)&&i&&o.push({dataZoomId:t.dataZoomId,start:i[0],end:i[1]})}}),o.length&&r.dispatchAction(o)})}),e}(t,i),i.dispatchAction=T(uL,t)),i.dataZoomInfos[o]||i.count++,i.dataZoomInfos[o]=n;var r=function(t){var n,o={type_true:2,type_move:1,type_false:0,type_undefined:-1},a=!0;return E(t,function(t){var e=t.dataZoomModel,i=!e.get("disabled",!0)&&(!e.get("zoomLock",!0)||"move");o["type_"+n]"],O(t)&&(t=t.slice(),n=!0),o=e?t:n?[u(t[0]),u(t[1])]:u(t),R(l)?l.replace("{value}",n?o[0]:o).replace("{value2}",n?o[1]:o):C(l)?n?l(t[0],t[1]):l(t):n?t[0]===s[0]?i[0]+" "+o[1]:t[1]===s[1]?i[1]+" "+o[0]:o[0]+" - "+o[1]:o;function u(t){return t===s[0]?"min":t===s[1]?"max":(+t).toFixed(Math.min(r,20))}},resetExtent:function(){var t=this.option,e=TL([t.min,t.max]);this._dataExtent=e},getDataDimension:function(t){var e=this.option.dimension,i=t.dimensions;if(null!=e||i.length){if(null!=e)return t.getDimension(e);for(var n=t.dimensions,o=n.length-1;0<=o;o--){var a=n[o];if(!t.getDimensionInfo(a).isCalculationCoord)return a}}},getExtent:function(){return this._dataExtent.slice()},completeVisualOption:function(){var t=this.ecModel,e=this.option,i={inRange:e.inRange,outOfRange:e.outOfRange},n=e.target||(e.target={}),o=e.controller||(e.controller={});m(n,i),m(o,i);var u=this.isCategory();function a(n){ML(e.color)&&!n.inRange&&(n.inRange={color:e.color.slice().reverse()}),n.inRange=n.inRange||{color:t.get("gradientColor")},IL(this.stateList,function(t){var e=n[t];if(R(e)){var i=_L(e,"active",u);i?(n[t]={},n[t][e]=i):delete n[t]}},this)}a.call(this,n),a.call(this,o),function(t,e,i){var n=t[e],o=t[i];n&&!o&&(o=t[i]={},IL(n,function(t,e){if(f_.isValidType(e)){var i=_L(e,"inactive",u);null!=i&&(o[e]=i,"color"!==e||o.hasOwnProperty("opacity")||o.hasOwnProperty("colorAlpha")||(o.opacity=[0,0]))}}))}.call(this,n,"inRange","outOfRange"),function(a){var r=(a.inRange||{}).symbol||(a.outOfRange||{}).symbol,s=(a.inRange||{}).symbolSize||(a.outOfRange||{}).symbolSize,l=this.get("inactiveColor");IL(this.stateList,function(t){var e=this.itemSize,i=a[t];null==(i=i||(a[t]={color:u?l:[l]})).symbol&&(i.symbol=r&&L(r)||(u?"roundRect":["roundRect"])),null==i.symbolSize&&(i.symbolSize=s&&L(s)||(u?e[0]:[e[0],e[0]])),i.symbol=bL(i.symbol,function(t){return"none"===t||"square"===t?"roundRect":t});var n=i.symbolSize;if(null!=n){var o=-1/0;SL(n,function(t){oe[1]&&e.reverse(),e[0]=Math.max(e[0],t[0]),e[1]=Math.min(e[1],t[1]))},completeVisualOption:function(){DL.prototype.completeVisualOption.apply(this,arguments),E(this.stateList,function(t){var e=this.option.controller[t].symbolSize;e&&e[0]!==e[1]&&(e[0]=0)},this)},setSelected:function(t){this.option.range=t.slice(),this._resetRange()},getSelected:function(){var t=this.getExtent(),e=Bl((this.get("range")||[]).slice());return e[0]>t[1]&&(e[0]=t[1]),e[1]>t[1]&&(e[1]=t[1]),e[0]=i[1]||t<=e[1])?"inRange":"outOfRange"},findTargetDataIndices:function(n){var o=[];return this.eachTargetSeries(function(t){var i=[],e=t.getData();e.each(this.getDataDimension(e),function(t,e){n[0]<=t&&t<=n[1]&&i.push(e)},this),o.push({seriesId:t.id,dataIndex:i})},this),o},getVisualMeta:function(i){var t=kL(this,"outOfRange",this.getExtent()),e=kL(this,"inRange",this.option.range.slice()),n=[];function o(t,e){n.push({value:t,color:i(t,e)})}for(var a=0,r=0,s=e.length,l=t.length;rt[1])break;i.push({color:this.getControllerVisual(a,"color",e),offset:o/100})}return i.push({color:this.getControllerVisual(t[1],"color",e),offset:1}),i},_createBarPoints:function(t,e){var i=this.visualMapModel.itemSize;return[[i[0]-e[0],t[0]],[i[0],t[0]],[i[0],t[1]],[i[0]-e[1],t[1]]]},_createBarGroup:function(t){var e=this._orient,i=this.visualMapModel.get("inverse");return new Ci("horizontal"!==e||i?"horizontal"===e&&i?{scale:"bottom"===t?[-1,1]:[1,1],rotation:-Math.PI/2}:"vertical"!==e||i?{scale:"left"===t?[1,1]:[-1,1]}:{scale:"left"===t?[1,-1]:[-1,-1]}:{scale:"bottom"===t?[1,1]:[-1,1],rotation:Math.PI/2})},_updateHandle:function(n,o){if(this._useHandle){var a=this._shapes,r=this.visualMapModel,s=a.handleThumbs,l=a.handleLabels;RL([0,1],function(t){var e=s[t];e.setStyle("fill",o.handlesColor[t]),e.position[1]=n[t];var i=pl(a.handleLabelPoints[t],fl(e,this.group));l[t].setStyle({x:i[0],y:i[1],text:r.formatValueText(this._dataInterval[t]),textVerticalAlign:"middle",textAlign:this._applyTransform("horizontal"===this._orient?0===t?"bottom":"top":"left",a.barGroup)})},this)}},_showIndicator:function(t,e,i,n){var o=this.visualMapModel,a=o.getExtent(),r=o.itemSize,s=[0,r[1]],l=EL(t,a,s,!0),u=this._shapes,h=u.indicator;if(h){h.position[1]=l,h.attr("invisible",!1),h.setShape("points",function(t,e,i,n){return t?[[0,-zL(e,BL(i,0))],[6,0],[0,zL(e,BL(n-i,0))]]:[[0,0],[5,-5],[5,5]]}(!!i,n,l,r[1]));var c=this.getControllerVisual(t,"color",{convertOpacityToAlpha:!0});h.setStyle("fill",c);var d=pl(u.indicatorLabelPoint,fl(h,this.group)),f=u.indicatorLabel;f.attr("invisible",!1);var p=this._applyTransform("left",u.barGroup),g=this._orient;f.setStyle({text:(i||"")+o.formatValueText(e),textVerticalAlign:"horizontal"===g?p:"middle",textAlign:"horizontal"===g?"center":p,x:d[0],y:d[1]})}},_enableHoverLinkToSeries:function(){var n=this;this._shapes.barGroup.on("mousemove",function(t){if(n._hovering=!0,!n._dragging){var e=n.visualMapModel.itemSize,i=n._applyTransform([t.offsetX,t.offsetY],n._shapes.barGroup,!0,!0);i[1]=zL(BL(0,i[1]),e[1]),n._doHoverLinkToSeries(i[1],0<=i[0]&&i[0]<=e[0])}}).on("mouseout",function(){n._hovering=!1,n._dragging||n._clearHoverLinkToSeries()})},_enableHoverLinkFromSeries:function(){var t=this.api.getZr();this.visualMapModel.option.hoverLink?(t.on("mouseover",this._hoverLinkFromSeriesMouseOver,this),t.on("mouseout",this._hideIndicator,this)):this._clearHoverLinkFromSeries()},_doHoverLinkToSeries:function(t,e){var i=this.visualMapModel,n=i.itemSize;if(i.option.hoverLink){var o=[0,n[1]],a=i.getExtent();t=zL(BL(o[0],t),o[1]);var r=function(t,e,i){var n=6,o=t.get("hoverLinkDataSize");o&&(n=EL(o,e,i,!0)/2);return n}(i,a,o),s=[t-r,t+r],l=EL(t,o,a,!0),u=[EL(s[0],o,a,!0),EL(s[1],o,a,!0)];s[0] ",r):this._showIndicator(l,l,"≈ ",r));var h=this._hoverLinkDataIndices,c=[];(e||FL(i))&&(c=this._hoverLinkDataIndices=i.findTargetDataIndices(u));var d=function(t,e){var i={},n={};return o(t||[],i),o(e||[],n,i),[a(i),a(n)];function o(t,e,i){for(var n=0,o=t.length;ni&&n([i,e[0]],"outOfRange"),n(e.slice()),i=e[1])},this),{stops:a,outerColors:r}}function n(t,e){var i=s.getRepresentValue({interval:t});e=e||s.getValueState(i);var n=o(i,e);t[0]===-1/0?r[0]=n:t[1]===1/0?r[1]=n:a.push({value:t[0],color:n},{value:t[1],color:n})}}}),ZL={splitNumber:function(){var t=this.option,e=this._pieceList,i=Math.min(t.precision,20),n=this.getExtent(),o=t.splitNumber;o=Math.max(parseInt(o,10),1),t.splitNumber=o;for(var a=(n[1]-n[0])/o;+a.toFixed(i)!==a&&i<5;)i++;t.precision=i,a=+a.toFixed(i);var r=0;t.minOpen&&e.push({index:r++,interval:[-1/0,n[0]],close:[0,0]});for(var s=n[0],l=r+o;r","≥"][e[0]]];t.text=t.text||this.formatValueText(null!=t.value?t.value:t.interval,!1,i)},this)}};function UL(t,e){var i=t.inverse;("vertical"===t.orient?!i:i)&&e.reverse()}PL.extend({type:"visualMap.piecewise",doRender:function(){var a=this.group;a.removeAll();var r=this.visualMapModel,s=r.get("textGap"),t=r.textStyleModel,l=t.getFont(),u=t.getTextColor(),h=this._getItemAlign(),c=r.itemSize,e=this._getViewData(),i=e.endsText,d=W(r.get("showLabel",!0),!i);i&&this._renderEndsText(a,i[0],c,d,h),E(e.viewPieceList,function(t){var e=t.piece,i=new Ci;i.onclick=A(this._onItemClick,this,e),this._enableHoverLink(i,t.indexInModelPieceList);var n=r.getRepresentValue(e);if(this._createItemSymbol(i,n,[0,0,c[0],c[1]]),d){var o=this.visualMapModel.getValueState(n);i.add(new Ur({style:{x:"right"===h?-s:c[0]+s,y:c[1]/2,text:e.text,textVerticalAlign:"middle",textAlign:h,textFont:l,textFill:u,opacity:"outOfRange"===o?.5:1}}))}a.add(i)},this),i&&this._renderEndsText(a,i[1],c,d,h),_u(r.get("orient"),a,r.get("itemGap")),this.renderBackground(a),this.positionGroup(a)},_enableHoverLink:function(t,i){function e(t){var e=this.visualMapModel;e.option.hoverLink&&this.api.dispatchAction({type:t,batch:OL(e.findTargetDataIndices(i),e)})}t.on("mouseover",A(e,this,"highlight")).on("mouseout",A(e,this,"downplay"))},_getItemAlign:function(){var t=this.visualMapModel,e=t.option;if("vertical"===e.orient)return NL(t,this.api,t.itemSize);var i=e.align;return i&&"auto"!==i||(i="left"),i},_renderEndsText:function(t,e,i,n,o){if(e){var a=new Ci,r=this.visualMapModel.textStyleModel;a.add(new Ur({style:{x:n?"right"===o?i[0]:0:i[0]/2,y:i[1]/2,textVerticalAlign:"middle",textAlign:n?o:"center",text:e,textFont:r.getFont(),textFill:r.getTextColor()}})),t.add(a)}},_getViewData:function(){var t=this.visualMapModel,e=N(t.getPieceList(),function(t,e){return{piece:t,indexInModelPieceList:e}}),i=t.get("text"),n=t.get("orient"),o=t.get("inverse");return("horizontal"===n?o:!o)?e.reverse():i=i&&i.slice().reverse(),{viewPieceList:e,endsText:i}},_createItemSymbol:function(t,e,i){t.add(_g(this.getControllerVisual(e,"symbol"),i[0],i[1],i[2],i[3],this.getControllerVisual(e,"color")))},_onItemClick:function(t){var e=this.visualMapModel,i=e.option,n=L(i.selected),o=e.getSelectedMapKey(t);"single"===i.selectedMode?(n[o]=!0,E(n,function(t,e){n[e]=e===o})):n[o]=!n[o],this.api.dispatchAction({type:"selectDataRange",from:this.uid,visualMapId:this.visualMapModel.id,selected:n})}});vf(pL);var XL,YL="urn:schemas-microsoft-com:vml",jL="undefined"==typeof window?null:window,qL=!1,KL=jL&&jL.document;function $L(t){return XL(t)}if(KL&&!v.canvasSupported)try{KL.namespaces.zrvml||KL.namespaces.add("zrvml",YL),XL=function(t){return KL.createElement("')}}catch(t){XL=function(t){return KL.createElement("<"+t+' xmlns="'+YL+'" class="zrvml">')}}var JL,QL=rr.CMD,tk=Math.round,ek=Math.sqrt,ik=Math.abs,nk=Math.cos,ok=Math.sin,ak=Math.max;if(!v.canvasSupported){var rk=",",sk="progid:DXImageTransform.Microsoft",lk=21600,uk=lk/2,hk=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=lk+","+lk,t.coordorigin="0,0"},ck=function(t,e,i){return"rgb("+[t,e,i].join(",")+")"},dk=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},fk=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},pk=function(t,e,i){return 1e5*(parseFloat(t)||0)+1e3*(parseFloat(e)||0)+i},gk=Yn,mk=function(t,e,i){var n=Fe(e);i=+i,isNaN(i)&&(i=1),n&&(t.color=ck(n[0],n[1],n[2]),t.opacity=i*n[3])},vk=function(t,e,i,n){var o="fill"===e,a=t.getElementsByTagName(e)[0];null!=i[e]&&"none"!==i[e]&&(o||!o&&i.lineWidth)?(t[o?"filled":"stroked"]="true",i[e]instanceof cs&&fk(t,a),a=a||$L(e),o?function(t,e,i){var n,o,a=e.fill;if(null!=a)if(a instanceof cs){var r,s=0,l=[0,0],u=0,h=1,c=i.getBoundingRect(),d=c.width,f=c.height;if("linear"===a.type){r="gradient";var p=i.transform,g=[a.x*d,a.y*f],m=[a.x2*d,a.y2*f];p&&(bt(g,g,p),bt(m,m,p));var v=m[0]-g[0],y=m[1]-g[1];(s=180*Math.atan2(v,y)/Math.PI)<0&&(s+=360),s<1e-6&&(s=0)}else{r="gradientradial";g=[a.x*d,a.y*f],p=i.transform;var x=i.scale,_=d,w=f;l=[(g[0]-c.x)/_,(g[1]-c.y)/w],p&&bt(g,g,p),_/=x[0]*lk,w/=x[1]*lk;var b=ak(_,w);u=0/b,h=2*a.r/b-u}var S=a.colorStops.slice();S.sort(function(t,e){return t.offset-e.offset});for(var M=S.length,I=[],T=[],A=0;A=c&&d<=i+1){for(var n=[],o=0;o=c&&d<=o+1)return rP(h,e.components,u,l);p[t]=e}else p[t]=void 0}var s;f++}for(;f<=e;){var r=a();if(r)return r}},pushComponent:function(t,e,i){var n=t[t.length-1];n&&n.added===e&&n.removed===i?t[t.length-1]={count:n.count+1,added:e,removed:i}:t.push({count:1,added:e,removed:i})},extractCommon:function(t,e,i,n){for(var o=e.length,a=i.length,r=t.newPos,s=r-n,l=0;r+1el día", + eventLimitText: "más", + noEventsMessage: "No hay eventos para mostrar" + }; + + var _m19 = { + code: "es", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Ant", + next: "Sig", + today: "Hoy", + month: "Mes", + week: "Semana", + day: "Día", + list: "Agenda" + }, + weekLabel: "Sm", + allDayHtml: "Todo
el día", + eventLimitText: "más", + noEventsMessage: "No hay eventos para mostrar" + }; + + var _m20 = { + code: "et", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Eelnev", + next: "Järgnev", + today: "Täna", + month: "Kuu", + week: "Nädal", + day: "Päev", + list: "Päevakord" + }, + weekLabel: "näd", + allDayText: "Kogu päev", + eventLimitText: function (n) { + return "+ veel " + n; + }, + noEventsMessage: "Kuvamiseks puuduvad sündmused" + }; + + var _m21 = { + code: "eu", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Aur", + next: "Hur", + today: "Gaur", + month: "Hilabetea", + week: "Astea", + day: "Eguna", + list: "Agenda" + }, + weekLabel: "As", + allDayHtml: "Egun
osoa", + eventLimitText: "gehiago", + noEventsMessage: "Ez dago ekitaldirik erakusteko" + }; + + var _m22 = { + code: "fa", + week: { + dow: 6, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "قبلی", + next: "بعدی", + today: "امروز", + month: "ماه", + week: "هفته", + day: "روز", + list: "برنامه" + }, + weekLabel: "هف", + allDayText: "تمام روز", + eventLimitText: function (n) { + return "بیش از " + n; + }, + noEventsMessage: "هیچ رویدادی به نمایش" + }; + + var _m23 = { + code: "fi", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Edellinen", + next: "Seuraava", + today: "Tänään", + month: "Kuukausi", + week: "Viikko", + day: "Päivä", + list: "Tapahtumat" + }, + weekLabel: "Vk", + allDayText: "Koko päivä", + eventLimitText: "lisää", + noEventsMessage: "Ei näytettäviä tapahtumia" + }; + + var _m24 = { + code: "fr", + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Aujourd'hui", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sem.", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + var _m25 = { + code: "fr-ch", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Courant", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sm", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + var _m26 = { + code: "fr", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Aujourd'hui", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sem.", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + var _m27 = { + code: "gl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Ant", + next: "Seg", + today: "Hoxe", + month: "Mes", + week: "Semana", + day: "Día", + list: "Axenda" + }, + weekLabel: "Sm", + allDayHtml: "Todo
o día", + eventLimitText: "máis", + noEventsMessage: "Non hai eventos para amosar" + }; + + var _m28 = { + code: "he", + dir: 'rtl', + buttonText: { + prev: "הקודם", + next: "הבא", + today: "היום", + month: "חודש", + week: "שבוע", + day: "יום", + list: "סדר יום" + }, + allDayText: "כל היום", + eventLimitText: "אחר", + noEventsMessage: "אין אירועים להצגה", + weekLabel: "שבוע" + }; + + var _m29 = { + code: "hi", + week: { + dow: 0, + doy: 6 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "पिछला", + next: "अगला", + today: "आज", + month: "महीना", + week: "सप्ताह", + day: "दिन", + list: "कार्यसूची" + }, + weekLabel: "हफ्ता", + allDayText: "सभी दिन", + eventLimitText: function (n) { + return "+अधिक " + n; + }, + noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए" + }; + + var _m30 = { + code: "hr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prijašnji", + next: "Sljedeći", + today: "Danas", + month: "Mjesec", + week: "Tjedan", + day: "Dan", + list: "Raspored" + }, + weekLabel: "Tje", + allDayText: "Cijeli dan", + eventLimitText: function (n) { + return "+ još " + n; + }, + noEventsMessage: "Nema događaja za prikaz" + }; + + var _m31 = { + code: "hu", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "vissza", + next: "előre", + today: "ma", + month: "Hónap", + week: "Hét", + day: "Nap", + list: "Napló" + }, + weekLabel: "Hét", + allDayText: "Egész nap", + eventLimitText: "további", + noEventsMessage: "Nincs megjeleníthető esemény" + }; + + var _m32 = { + code: "id", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "mundur", + next: "maju", + today: "hari ini", + month: "Bulan", + week: "Minggu", + day: "Hari", + list: "Agenda" + }, + weekLabel: "Mg", + allDayHtml: "Sehari
penuh", + eventLimitText: "lebih", + noEventsMessage: "Tidak ada acara untuk ditampilkan" + }; + + var _m33 = { + code: "is", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Fyrri", + next: "Næsti", + today: "Í dag", + month: "Mánuður", + week: "Vika", + day: "Dagur", + list: "Dagskrá" + }, + weekLabel: "Vika", + allDayHtml: "Allan
daginn", + eventLimitText: "meira", + noEventsMessage: "Engir viðburðir til að sýna" + }; + + var _m34 = { + code: "it", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Prec", + next: "Succ", + today: "Oggi", + month: "Mese", + week: "Settimana", + day: "Giorno", + list: "Agenda" + }, + weekLabel: "Sm", + allDayHtml: "Tutto il
giorno", + eventLimitText: function (n) { + return "+altri " + n; + }, + noEventsMessage: "Non ci sono eventi da visualizzare" + }; + + var _m35 = { + code: "ja", + buttonText: { + prev: "前", + next: "次", + today: "今日", + month: "月", + week: "週", + day: "日", + list: "予定リスト" + }, + weekLabel: "週", + allDayText: "終日", + eventLimitText: function (n) { + return "他 " + n + " 件"; + }, + noEventsMessage: "表示する予定はありません" + }; + + var _m36 = { + code: "ka", + week: { + dow: 1, + doy: 7 + }, + buttonText: { + prev: "წინა", + next: "შემდეგი", + today: "დღეს", + month: "თვე", + week: "კვირა", + day: "დღე", + list: "დღის წესრიგი" + }, + weekLabel: "კვ", + allDayText: "მთელი დღე", + eventLimitText: function (n) { + return "+ კიდევ " + n; + }, + noEventsMessage: "ღონისძიებები არ არის" + }; + + var _m37 = { + code: "kk", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Алдыңғы", + next: "Келесі", + today: "Бүгін", + month: "Ай", + week: "Апта", + day: "Күн", + list: "Күн тәртібі" + }, + weekLabel: "Не", + allDayText: "Күні бойы", + eventLimitText: function (n) { + return "+ тағы " + n; + }, + noEventsMessage: "Көрсету үшін оқиғалар жоқ" + }; + + var _m38 = { + code: "ko", + buttonText: { + prev: "이전달", + next: "다음달", + today: "오늘", + month: "월", + week: "주", + day: "일", + list: "일정목록" + }, + weekLabel: "주", + allDayText: "종일", + eventLimitText: "개", + noEventsMessage: "일정이 없습니다" + }; + + var _m39 = { + code: "lb", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Zréck", + next: "Weider", + today: "Haut", + month: "Mount", + week: "Woch", + day: "Dag", + list: "Terminiwwersiicht" + }, + weekLabel: "W", + allDayText: "Ganzen Dag", + eventLimitText: "méi", + noEventsMessage: "Nee Evenementer ze affichéieren" + }; + + var _m40 = { + code: "lt", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Atgal", + next: "Pirmyn", + today: "Šiandien", + month: "Mėnuo", + week: "Savaitė", + day: "Diena", + list: "Darbotvarkė" + }, + weekLabel: "SAV", + allDayText: "Visą dieną", + eventLimitText: "daugiau", + noEventsMessage: "Nėra įvykių rodyti" + }; + + var _m41 = { + code: "lv", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Iepr.", + next: "Nāk.", + today: "Šodien", + month: "Mēnesis", + week: "Nedēļa", + day: "Diena", + list: "Dienas kārtība" + }, + weekLabel: "Ned.", + allDayText: "Visu dienu", + eventLimitText: function (n) { + return "+vēl " + n; + }, + noEventsMessage: "Nav notikumu" + }; + + var _m42 = { + code: "mk", + buttonText: { + prev: "претходно", + next: "следно", + today: "Денес", + month: "Месец", + week: "Недела", + day: "Ден", + list: "График" + }, + weekLabel: "Сед", + allDayText: "Цел ден", + eventLimitText: function (n) { + return "+повеќе " + n; + }, + noEventsMessage: "Нема настани за прикажување" + }; + + var _m43 = { + code: "ms", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Sebelum", + next: "Selepas", + today: "hari ini", + month: "Bulan", + week: "Minggu", + day: "Hari", + list: "Agenda" + }, + weekLabel: "Mg", + allDayText: "Sepanjang hari", + eventLimitText: function (n) { + return "masih ada " + n + " acara"; + }, + noEventsMessage: "Tiada peristiwa untuk dipaparkan" + }; + + var _m44 = { + code: "nb", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Forrige", + next: "Neste", + today: "I dag", + month: "Måned", + week: "Uke", + day: "Dag", + list: "Agenda" + }, + weekLabel: "Uke", + allDayText: "Hele dagen", + eventLimitText: "til", + noEventsMessage: "Ingen hendelser å vise" + }; + + var _m45 = { + code: "nl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Voorgaand", + next: "Volgende", + today: "Vandaag", + year: "Jaar", + month: "Maand", + week: "Week", + day: "Dag", + list: "Agenda" + }, + allDayText: "Hele dag", + eventLimitText: "extra", + noEventsMessage: "Geen evenementen om te laten zien" + }; + + var _m46 = { + code: "nn", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Førre", + next: "Neste", + today: "I dag", + month: "Månad", + week: "Veke", + day: "Dag", + list: "Agenda" + }, + weekLabel: "Veke", + allDayText: "Heile dagen", + eventLimitText: "til", + noEventsMessage: "Ingen hendelser å vise" + }; + + var _m47 = { + code: "pl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Poprzedni", + next: "Następny", + today: "Dziś", + month: "Miesiąc", + week: "Tydzień", + day: "Dzień", + list: "Plan dnia" + }, + weekLabel: "Tydz", + allDayText: "Cały dzień", + eventLimitText: "więcej", + noEventsMessage: "Brak wydarzeń do wyświetlenia" + }; + + var _m48 = { + code: "pt-br", + buttonText: { + prev: "Anterior", + next: "Próximo", + today: "Hoje", + month: "Mês", + week: "Semana", + day: "Dia", + list: "Compromissos" + }, + weekLabel: "Sm", + allDayText: "dia inteiro", + eventLimitText: function (n) { + return "mais +" + n; + }, + noEventsMessage: "Não há eventos para mostrar" + }; + + var _m49 = { + code: "pt", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Anterior", + next: "Seguinte", + today: "Hoje", + month: "Mês", + week: "Semana", + day: "Dia", + list: "Agenda" + }, + weekLabel: "Sem", + allDayText: "Todo o dia", + eventLimitText: "mais", + noEventsMessage: "Não há eventos para mostrar" + }; + + var _m50 = { + code: "ro", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "precedentă", + next: "următoare", + today: "Azi", + month: "Lună", + week: "Săptămână", + day: "Zi", + list: "Agendă" + }, + weekLabel: "Săpt", + allDayText: "Toată ziua", + eventLimitText: function (n) { + return "+alte " + n; + }, + noEventsMessage: "Nu există evenimente de afișat" + }; + + var _m51 = { + code: "ru", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Пред", + next: "След", + today: "Сегодня", + month: "Месяц", + week: "Неделя", + day: "День", + list: "Повестка дня" + }, + weekLabel: "Нед", + allDayText: "Весь день", + eventLimitText: function (n) { + return "+ ещё " + n; + }, + noEventsMessage: "Нет событий для отображения" + }; + + var _m52 = { + code: "sk", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Predchádzajúci", + next: "Nasledujúci", + today: "Dnes", + month: "Mesiac", + week: "Týždeň", + day: "Deň", + list: "Rozvrh" + }, + weekLabel: "Ty", + allDayText: "Celý deň", + eventLimitText: function (n) { + return "+ďalšie: " + n; + }, + noEventsMessage: "Žiadne akcie na zobrazenie" + }; + + var _m53 = { + code: "sl", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prejšnji", + next: "Naslednji", + today: "Trenutni", + month: "Mesec", + week: "Teden", + day: "Dan", + list: "Dnevni red" + }, + weekLabel: "Teden", + allDayText: "Ves dan", + eventLimitText: "več", + noEventsMessage: "Ni dogodkov za prikaz" + }; + + var _m54 = { + code: "sq", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "mbrapa", + next: "Përpara", + today: "sot", + month: "Muaj", + week: "Javë", + day: "Ditë", + list: "Listë" + }, + weekLabel: "Ja", + allDayHtml: "Gjithë
ditën", + eventLimitText: function (n) { + return "+më tepër " + n; + }, + noEventsMessage: "Nuk ka evente për të shfaqur" + }; + + var _m55 = { + code: "sr-cyrl", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Претходна", + next: "следећи", + today: "Данас", + month: "Месец", + week: "Недеља", + day: "Дан", + list: "Планер" + }, + weekLabel: "Сед", + allDayText: "Цео дан", + eventLimitText: function (n) { + return "+ још " + n; + }, + noEventsMessage: "Нема догађаја за приказ" + }; + + var _m56 = { + code: "sr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prethodna", + next: "Sledeći", + today: "Danas", + month: "Mеsеc", + week: "Nеdеlja", + day: "Dan", + list: "Planеr" + }, + weekLabel: "Sed", + allDayText: "Cеo dan", + eventLimitText: function (n) { + return "+ još " + n; + }, + noEventsMessage: "Nеma događaja za prikaz" + }; + + var _m57 = { + code: "sv", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Förra", + next: "Nästa", + today: "Idag", + month: "Månad", + week: "Vecka", + day: "Dag", + list: "Program" + }, + weekLabel: "v.", + allDayText: "Heldag", + eventLimitText: "till", + noEventsMessage: "Inga händelser att visa" + }; + + var _m58 = { + code: "th", + buttonText: { + prev: "ย้อน", + next: "ถัดไป", + today: "วันนี้", + month: "เดือน", + week: "สัปดาห์", + day: "วัน", + list: "แผนงาน" + }, + allDayText: "ตลอดวัน", + eventLimitText: "เพิ่มเติม", + noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง" + }; + + var _m59 = { + code: "tr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "geri", + next: "ileri", + today: "bugün", + month: "Ay", + week: "Hafta", + day: "Gün", + list: "Ajanda" + }, + weekLabel: "Hf", + allDayText: "Tüm gün", + eventLimitText: "daha fazla", + noEventsMessage: "Gösterilecek etkinlik yok" + }; + + var _m60 = { + code: "uk", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Попередній", + next: "далі", + today: "Сьогодні", + month: "Місяць", + week: "Тиждень", + day: "День", + list: "Порядок денний" + }, + weekLabel: "Тиж", + allDayText: "Увесь день", + eventLimitText: function (n) { + return "+ще " + n + "..."; + }, + noEventsMessage: "Немає подій для відображення" + }; + + var _m61 = { + code: "vi", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Trước", + next: "Tiếp", + today: "Hôm nay", + month: "Tháng", + week: "Tuần", + day: "Ngày", + list: "Lịch biểu" + }, + weekLabel: "Tu", + allDayText: "Cả ngày", + eventLimitText: function (n) { + return "+ thêm " + n; + }, + noEventsMessage: "Không có sự kiện để hiển thị" + }; + + var _m62 = { + code: "zh-cn", + week: { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "上月", + next: "下月", + today: "今天", + month: "月", + week: "周", + day: "日", + list: "日程" + }, + weekLabel: "周", + allDayText: "全天", + eventLimitText: function (n) { + return "另外 " + n + " 个"; + }, + noEventsMessage: "没有事件显示" + }; + + var _m63 = { + code: "zh-tw", + buttonText: { + prev: "上月", + next: "下月", + today: "今天", + month: "月", + week: "週", + day: "天", + list: "活動列表" + }, + weekLabel: "周", + allDayText: "整天", + eventLimitText: '顯示更多', + noEventsMessage: "没有任何活動" + }; + + var _rollupPluginMultiEntry_entryPoint = [ + _m0, _m1, _m2, _m3, _m4, _m5, _m6, _m7, _m8, _m9, _m10, _m11, _m12, _m13, _m14, _m15, _m16, _m17, _m18, _m19, _m20, _m21, _m22, _m23, _m24, _m25, _m26, _m27, _m28, _m29, _m30, _m31, _m32, _m33, _m34, _m35, _m36, _m37, _m38, _m39, _m40, _m41, _m42, _m43, _m44, _m45, _m46, _m47, _m48, _m49, _m50, _m51, _m52, _m53, _m54, _m55, _m56, _m57, _m58, _m59, _m60, _m61, _m62, _m63 + ]; + + return _rollupPluginMultiEntry_entryPoint; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales-all.min.js b/public/resource/assets/libs/fullcalendar/core/locales-all.min.js new file mode 100644 index 0000000..810d6de --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales-all.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).FullCalendarLocalesAll=t()}(this,function(){"use strict";return[{code:"af",week:{dow:1,doy:4},buttonText:{prev:"Vorige",next:"Volgende",today:"Vandag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayHtml:"Heeldag",eventLimitText:"Addisionele",noEventsMessage:"Daar is geen gebeurtenisse nie"},{code:"ar-dz",week:{dow:0,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-kw",week:{dow:0,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ly",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-ma",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-sa",week:{dow:0,doy:6},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar-tn",week:{dow:1,doy:4},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"ar",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"السابق",next:"التالي",today:"اليوم",month:"شهر",week:"أسبوع",day:"يوم",list:"أجندة"},weekLabel:"أسبوع",allDayText:"اليوم كله",eventLimitText:"أخرى",noEventsMessage:"أي أحداث لعرض"},{code:"bg",week:{dow:1,doy:7},buttonText:{prev:"назад",next:"напред",today:"днес",month:"Месец",week:"Седмица",day:"Ден",list:"График"},allDayText:"Цял ден",eventLimitText:function(e){return"+още "+e},noEventsMessage:"Няма събития за показване"},{code:"bs",week:{dow:1,doy:7},buttonText:{prev:"Prošli",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Sedmica",day:"Dan",list:"Raspored"},weekLabel:"Sed",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikazivanje"},{code:"ca",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Següent",today:"Avui",month:"Mes",week:"Setmana",day:"Dia",list:"Agenda"},weekLabel:"Set",allDayText:"Tot el dia",eventLimitText:"més",noEventsMessage:"No hi ha esdeveniments per mostrar"},{code:"cs",week:{dow:1,doy:4},buttonText:{prev:"Dříve",next:"Později",today:"Nyní",month:"Měsíc",week:"Týden",day:"Den",list:"Agenda"},weekLabel:"Týd",allDayText:"Celý den",eventLimitText:function(e){return"+další: "+e},noEventsMessage:"Žádné akce k zobrazení"},{code:"da",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Næste",today:"I dag",month:"Måned",week:"Uge",day:"Dag",list:"Agenda"},weekLabel:"Uge",allDayText:"Hele dagen",eventLimitText:"flere",noEventsMessage:"Ingen arrangementer at vise"},{code:"de",week:{dow:1,doy:4},buttonText:{prev:"Zurück",next:"Vor",today:"Heute",year:"Jahr",month:"Monat",week:"Woche",day:"Tag",list:"Terminübersicht"},weekLabel:"KW",allDayText:"Ganztägig",eventLimitText:function(e){return"+ weitere "+e},noEventsMessage:"Keine Ereignisse anzuzeigen"},{code:"el",week:{dow:1,doy:4},buttonText:{prev:"Προηγούμενος",next:"Επόμενος",today:"Σήμερα",month:"Μήνας",week:"Εβδομάδα",day:"Ημέρα",list:"Ατζέντα"},weekLabel:"Εβδ",allDayText:"Ολοήμερο",eventLimitText:"περισσότερα",noEventsMessage:"Δεν υπάρχουν γεγονότα για να εμφανιστεί"},{code:"en-au",week:{dow:1,doy:4}},{code:"en-gb",week:{dow:1,doy:4}},{code:"en-nz",week:{dow:1,doy:4}},{code:"es",week:{dow:0,doy:6},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo
el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"es",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Sig",today:"Hoy",month:"Mes",week:"Semana",day:"Día",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Todo
el día",eventLimitText:"más",noEventsMessage:"No hay eventos para mostrar"},{code:"et",week:{dow:1,doy:4},buttonText:{prev:"Eelnev",next:"Järgnev",today:"Täna",month:"Kuu",week:"Nädal",day:"Päev",list:"Päevakord"},weekLabel:"näd",allDayText:"Kogu päev",eventLimitText:function(e){return"+ veel "+e},noEventsMessage:"Kuvamiseks puuduvad sündmused"},{code:"eu",week:{dow:1,doy:7},buttonText:{prev:"Aur",next:"Hur",today:"Gaur",month:"Hilabetea",week:"Astea",day:"Eguna",list:"Agenda"},weekLabel:"As",allDayHtml:"Egun
osoa",eventLimitText:"gehiago",noEventsMessage:"Ez dago ekitaldirik erakusteko"},{code:"fa",week:{dow:6,doy:12},dir:"rtl",buttonText:{prev:"قبلی",next:"بعدی",today:"امروز",month:"ماه",week:"هفته",day:"روز",list:"برنامه"},weekLabel:"هف",allDayText:"تمام روز",eventLimitText:function(e){return"بیش از "+e},noEventsMessage:"هیچ رویدادی به نمایش"},{code:"fi",week:{dow:1,doy:4},buttonText:{prev:"Edellinen",next:"Seuraava",today:"Tänään",month:"Kuukausi",week:"Viikko",day:"Päivä",list:"Tapahtumat"},weekLabel:"Vk",allDayText:"Koko päivä",eventLimitText:"lisää",noEventsMessage:"Ei näytettäviä tapahtumia"},{code:"fr",buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la
journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr-ch",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Courant",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sm",allDayHtml:"Toute la
journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"fr",week:{dow:1,doy:4},buttonText:{prev:"Précédent",next:"Suivant",today:"Aujourd'hui",year:"Année",month:"Mois",week:"Semaine",day:"Jour",list:"Mon planning"},weekLabel:"Sem.",allDayHtml:"Toute la
journée",eventLimitText:"en plus",noEventsMessage:"Aucun événement à afficher"},{code:"gl",week:{dow:1,doy:4},buttonText:{prev:"Ant",next:"Seg",today:"Hoxe",month:"Mes",week:"Semana",day:"Día",list:"Axenda"},weekLabel:"Sm",allDayHtml:"Todo
o día",eventLimitText:"máis",noEventsMessage:"Non hai eventos para amosar"},{code:"he",dir:"rtl",buttonText:{prev:"הקודם",next:"הבא",today:"היום",month:"חודש",week:"שבוע",day:"יום",list:"סדר יום"},allDayText:"כל היום",eventLimitText:"אחר",noEventsMessage:"אין אירועים להצגה",weekLabel:"שבוע"},{code:"hi",week:{dow:0,doy:6},buttonText:{prev:"पिछला",next:"अगला",today:"आज",month:"महीना",week:"सप्ताह",day:"दिन",list:"कार्यसूची"},weekLabel:"हफ्ता",allDayText:"सभी दिन",eventLimitText:function(e){return"+अधिक "+e},noEventsMessage:"कोई घटनाओं को प्रदर्शित करने के लिए"},{code:"hr",week:{dow:1,doy:7},buttonText:{prev:"Prijašnji",next:"Sljedeći",today:"Danas",month:"Mjesec",week:"Tjedan",day:"Dan",list:"Raspored"},weekLabel:"Tje",allDayText:"Cijeli dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nema događaja za prikaz"},{code:"hu",week:{dow:1,doy:4},buttonText:{prev:"vissza",next:"előre",today:"ma",month:"Hónap",week:"Hét",day:"Nap",list:"Napló"},weekLabel:"Hét",allDayText:"Egész nap",eventLimitText:"további",noEventsMessage:"Nincs megjeleníthető esemény"},{code:"id",week:{dow:1,doy:7},buttonText:{prev:"mundur",next:"maju",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayHtml:"Sehari
penuh",eventLimitText:"lebih",noEventsMessage:"Tidak ada acara untuk ditampilkan"},{code:"is",week:{dow:1,doy:4},buttonText:{prev:"Fyrri",next:"Næsti",today:"Í dag",month:"Mánuður",week:"Vika",day:"Dagur",list:"Dagskrá"},weekLabel:"Vika",allDayHtml:"Allan
daginn",eventLimitText:"meira",noEventsMessage:"Engir viðburðir til að sýna"},{code:"it",week:{dow:1,doy:4},buttonText:{prev:"Prec",next:"Succ",today:"Oggi",month:"Mese",week:"Settimana",day:"Giorno",list:"Agenda"},weekLabel:"Sm",allDayHtml:"Tutto il
giorno",eventLimitText:function(e){return"+altri "+e},noEventsMessage:"Non ci sono eventi da visualizzare"},{code:"ja",buttonText:{prev:"前",next:"次",today:"今日",month:"月",week:"週",day:"日",list:"予定リスト"},weekLabel:"週",allDayText:"終日",eventLimitText:function(e){return"他 "+e+" 件"},noEventsMessage:"表示する予定はありません"},{code:"ka",week:{dow:1,doy:7},buttonText:{prev:"წინა",next:"შემდეგი",today:"დღეს",month:"თვე",week:"კვირა",day:"დღე",list:"დღის წესრიგი"},weekLabel:"კვ",allDayText:"მთელი დღე",eventLimitText:function(e){return"+ კიდევ "+e},noEventsMessage:"ღონისძიებები არ არის"},{code:"kk",week:{dow:1,doy:7},buttonText:{prev:"Алдыңғы",next:"Келесі",today:"Бүгін",month:"Ай",week:"Апта",day:"Күн",list:"Күн тәртібі"},weekLabel:"Не",allDayText:"Күні бойы",eventLimitText:function(e){return"+ тағы "+e},noEventsMessage:"Көрсету үшін оқиғалар жоқ"},{code:"ko",buttonText:{prev:"이전달",next:"다음달",today:"오늘",month:"월",week:"주",day:"일",list:"일정목록"},weekLabel:"주",allDayText:"종일",eventLimitText:"개",noEventsMessage:"일정이 없습니다"},{code:"lb",week:{dow:1,doy:4},buttonText:{prev:"Zréck",next:"Weider",today:"Haut",month:"Mount",week:"Woch",day:"Dag",list:"Terminiwwersiicht"},weekLabel:"W",allDayText:"Ganzen Dag",eventLimitText:"méi",noEventsMessage:"Nee Evenementer ze affichéieren"},{code:"lt",week:{dow:1,doy:4},buttonText:{prev:"Atgal",next:"Pirmyn",today:"Šiandien",month:"Mėnuo",week:"Savaitė",day:"Diena",list:"Darbotvarkė"},weekLabel:"SAV",allDayText:"Visą dieną",eventLimitText:"daugiau",noEventsMessage:"Nėra įvykių rodyti"},{code:"lv",week:{dow:1,doy:4},buttonText:{prev:"Iepr.",next:"Nāk.",today:"Šodien",month:"Mēnesis",week:"Nedēļa",day:"Diena",list:"Dienas kārtība"},weekLabel:"Ned.",allDayText:"Visu dienu",eventLimitText:function(e){return"+vēl "+e},noEventsMessage:"Nav notikumu"},{code:"mk",buttonText:{prev:"претходно",next:"следно",today:"Денес",month:"Месец",week:"Недела",day:"Ден",list:"График"},weekLabel:"Сед",allDayText:"Цел ден",eventLimitText:function(e){return"+повеќе "+e},noEventsMessage:"Нема настани за прикажување"},{code:"ms",week:{dow:1,doy:7},buttonText:{prev:"Sebelum",next:"Selepas",today:"hari ini",month:"Bulan",week:"Minggu",day:"Hari",list:"Agenda"},weekLabel:"Mg",allDayText:"Sepanjang hari",eventLimitText:function(e){return"masih ada "+e+" acara"},noEventsMessage:"Tiada peristiwa untuk dipaparkan"},{code:"nb",week:{dow:1,doy:4},buttonText:{prev:"Forrige",next:"Neste",today:"I dag",month:"Måned",week:"Uke",day:"Dag",list:"Agenda"},weekLabel:"Uke",allDayText:"Hele dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"nl",week:{dow:1,doy:4},buttonText:{prev:"Voorgaand",next:"Volgende",today:"Vandaag",year:"Jaar",month:"Maand",week:"Week",day:"Dag",list:"Agenda"},allDayText:"Hele dag",eventLimitText:"extra",noEventsMessage:"Geen evenementen om te laten zien"},{code:"nn",week:{dow:1,doy:4},buttonText:{prev:"Førre",next:"Neste",today:"I dag",month:"Månad",week:"Veke",day:"Dag",list:"Agenda"},weekLabel:"Veke",allDayText:"Heile dagen",eventLimitText:"til",noEventsMessage:"Ingen hendelser å vise"},{code:"pl",week:{dow:1,doy:4},buttonText:{prev:"Poprzedni",next:"Następny",today:"Dziś",month:"Miesiąc",week:"Tydzień",day:"Dzień",list:"Plan dnia"},weekLabel:"Tydz",allDayText:"Cały dzień",eventLimitText:"więcej",noEventsMessage:"Brak wydarzeń do wyświetlenia"},{code:"pt-br",buttonText:{prev:"Anterior",next:"Próximo",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Compromissos"},weekLabel:"Sm",allDayText:"dia inteiro",eventLimitText:function(e){return"mais +"+e},noEventsMessage:"Não há eventos para mostrar"},{code:"pt",week:{dow:1,doy:4},buttonText:{prev:"Anterior",next:"Seguinte",today:"Hoje",month:"Mês",week:"Semana",day:"Dia",list:"Agenda"},weekLabel:"Sem",allDayText:"Todo o dia",eventLimitText:"mais",noEventsMessage:"Não há eventos para mostrar"},{code:"ro",week:{dow:1,doy:7},buttonText:{prev:"precedentă",next:"următoare",today:"Azi",month:"Lună",week:"Săptămână",day:"Zi",list:"Agendă"},weekLabel:"Săpt",allDayText:"Toată ziua",eventLimitText:function(e){return"+alte "+e},noEventsMessage:"Nu există evenimente de afișat"},{code:"ru",week:{dow:1,doy:4},buttonText:{prev:"Пред",next:"След",today:"Сегодня",month:"Месяц",week:"Неделя",day:"День",list:"Повестка дня"},weekLabel:"Нед",allDayText:"Весь день",eventLimitText:function(e){return"+ ещё "+e},noEventsMessage:"Нет событий для отображения"},{code:"sk",week:{dow:1,doy:4},buttonText:{prev:"Predchádzajúci",next:"Nasledujúci",today:"Dnes",month:"Mesiac",week:"Týždeň",day:"Deň",list:"Rozvrh"},weekLabel:"Ty",allDayText:"Celý deň",eventLimitText:function(e){return"+ďalšie: "+e},noEventsMessage:"Žiadne akcie na zobrazenie"},{code:"sl",week:{dow:1,doy:7},buttonText:{prev:"Prejšnji",next:"Naslednji",today:"Trenutni",month:"Mesec",week:"Teden",day:"Dan",list:"Dnevni red"},weekLabel:"Teden",allDayText:"Ves dan",eventLimitText:"več",noEventsMessage:"Ni dogodkov za prikaz"},{code:"sq",week:{dow:1,doy:4},buttonText:{prev:"mbrapa",next:"Përpara",today:"sot",month:"Muaj",week:"Javë",day:"Ditë",list:"Listë"},weekLabel:"Ja",allDayHtml:"Gjithë
ditën",eventLimitText:function(e){return"+më tepër "+e},noEventsMessage:"Nuk ka evente për të shfaqur"},{code:"sr-cyrl",week:{dow:1,doy:7},buttonText:{prev:"Претходна",next:"следећи",today:"Данас",month:"Месец",week:"Недеља",day:"Дан",list:"Планер"},weekLabel:"Сед",allDayText:"Цео дан",eventLimitText:function(e){return"+ још "+e},noEventsMessage:"Нема догађаја за приказ"},{code:"sr",week:{dow:1,doy:7},buttonText:{prev:"Prethodna",next:"Sledeći",today:"Danas",month:"Mеsеc",week:"Nеdеlja",day:"Dan",list:"Planеr"},weekLabel:"Sed",allDayText:"Cеo dan",eventLimitText:function(e){return"+ još "+e},noEventsMessage:"Nеma događaja za prikaz"},{code:"sv",week:{dow:1,doy:4},buttonText:{prev:"Förra",next:"Nästa",today:"Idag",month:"Månad",week:"Vecka",day:"Dag",list:"Program"},weekLabel:"v.",allDayText:"Heldag",eventLimitText:"till",noEventsMessage:"Inga händelser att visa"},{code:"th",buttonText:{prev:"ย้อน",next:"ถัดไป",today:"วันนี้",month:"เดือน",week:"สัปดาห์",day:"วัน",list:"แผนงาน"},allDayText:"ตลอดวัน",eventLimitText:"เพิ่มเติม",noEventsMessage:"ไม่มีกิจกรรมที่จะแสดง"},{code:"tr",week:{dow:1,doy:7},buttonText:{prev:"geri",next:"ileri",today:"bugün",month:"Ay",week:"Hafta",day:"Gün",list:"Ajanda"},weekLabel:"Hf",allDayText:"Tüm gün",eventLimitText:"daha fazla",noEventsMessage:"Gösterilecek etkinlik yok"},{code:"uk",week:{dow:1,doy:7},buttonText:{prev:"Попередній",next:"далі",today:"Сьогодні",month:"Місяць",week:"Тиждень",day:"День",list:"Порядок денний"},weekLabel:"Тиж",allDayText:"Увесь день",eventLimitText:function(e){return"+ще "+e+"..."},noEventsMessage:"Немає подій для відображення"},{code:"vi",week:{dow:1,doy:4},buttonText:{prev:"Trước",next:"Tiếp",today:"Hôm nay",month:"Tháng",week:"Tuần",day:"Ngày",list:"Lịch biểu"},weekLabel:"Tu",allDayText:"Cả ngày",eventLimitText:function(e){return"+ thêm "+e},noEventsMessage:"Không có sự kiện để hiển thị"},{code:"zh-cn",week:{dow:1,doy:4},buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"周",day:"日",list:"日程"},weekLabel:"周",allDayText:"全天",eventLimitText:function(e){return"另外 "+e+" 个"},noEventsMessage:"没有事件显示"},{code:"zh-tw",buttonText:{prev:"上月",next:"下月",today:"今天",month:"月",week:"週",day:"天",list:"活動列表"},weekLabel:"周",allDayText:"整天",eventLimitText:"顯示更多",noEventsMessage:"没有任何活動"}]}); \ No newline at end of file diff --git a/public/resource/assets/libs/fullcalendar/core/locales/af.js b/public/resource/assets/libs/fullcalendar/core/locales/af.js new file mode 100644 index 0000000..ee9f9f7 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/af.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.af = factory())); +}(this, function () { 'use strict'; + + var af = { + code: "af", + week: { + dow: 1, + doy: 4 // Die week wat die 4de Januarie bevat is die eerste week van die jaar. + }, + buttonText: { + prev: "Vorige", + next: "Volgende", + today: "Vandag", + year: "Jaar", + month: "Maand", + week: "Week", + day: "Dag", + list: "Agenda" + }, + allDayHtml: "Heeldag", + eventLimitText: "Addisionele", + noEventsMessage: "Daar is geen gebeurtenisse nie" + }; + + return af; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ar-dz.js b/public/resource/assets/libs/fullcalendar/core/locales/ar-dz.js new file mode 100644 index 0000000..201eb17 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ar-dz.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-dz'] = factory())); +}(this, function () { 'use strict'; + + var arDz = { + code: "ar-dz", + week: { + dow: 0, + doy: 4 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arDz; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ar-kw.js b/public/resource/assets/libs/fullcalendar/core/locales/ar-kw.js new file mode 100644 index 0000000..94c6900 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ar-kw.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-kw'] = factory())); +}(this, function () { 'use strict'; + + var arKw = { + code: "ar-kw", + week: { + dow: 0, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arKw; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ar-ly.js b/public/resource/assets/libs/fullcalendar/core/locales/ar-ly.js new file mode 100644 index 0000000..e1c8aeb --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ar-ly.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ly'] = factory())); +}(this, function () { 'use strict'; + + var arLy = { + code: "ar-ly", + week: { + dow: 6, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arLy; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ar-ma.js b/public/resource/assets/libs/fullcalendar/core/locales/ar-ma.js new file mode 100644 index 0000000..00cc7c6 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ar-ma.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-ma'] = factory())); +}(this, function () { 'use strict'; + + var arMa = { + code: "ar-ma", + week: { + dow: 6, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arMa; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ar-sa.js b/public/resource/assets/libs/fullcalendar/core/locales/ar-sa.js new file mode 100644 index 0000000..0361f6d --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ar-sa.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-sa'] = factory())); +}(this, function () { 'use strict'; + + var arSa = { + code: "ar-sa", + week: { + dow: 0, + doy: 6 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arSa; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ar-tn.js b/public/resource/assets/libs/fullcalendar/core/locales/ar-tn.js new file mode 100644 index 0000000..57a07f8 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ar-tn.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['ar-tn'] = factory())); +}(this, function () { 'use strict'; + + var arTn = { + code: "ar-tn", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return arTn; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ar.js b/public/resource/assets/libs/fullcalendar/core/locales/ar.js new file mode 100644 index 0000000..f789afd --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ar.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ar = factory())); +}(this, function () { 'use strict'; + + var ar = { + code: "ar", + week: { + dow: 6, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "السابق", + next: "التالي", + today: "اليوم", + month: "شهر", + week: "أسبوع", + day: "يوم", + list: "أجندة" + }, + weekLabel: "أسبوع", + allDayText: "اليوم كله", + eventLimitText: "أخرى", + noEventsMessage: "أي أحداث لعرض" + }; + + return ar; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/bg.js b/public/resource/assets/libs/fullcalendar/core/locales/bg.js new file mode 100644 index 0000000..e7343a6 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/bg.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bg = factory())); +}(this, function () { 'use strict'; + + var bg = { + code: "bg", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "назад", + next: "напред", + today: "днес", + month: "Месец", + week: "Седмица", + day: "Ден", + list: "График" + }, + allDayText: "Цял ден", + eventLimitText: function (n) { + return "+още " + n; + }, + noEventsMessage: "Няма събития за показване" + }; + + return bg; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/bs.js b/public/resource/assets/libs/fullcalendar/core/locales/bs.js new file mode 100644 index 0000000..d96b8ad --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/bs.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.bs = factory())); +}(this, function () { 'use strict'; + + var bs = { + code: "bs", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prošli", + next: "Sljedeći", + today: "Danas", + month: "Mjesec", + week: "Sedmica", + day: "Dan", + list: "Raspored" + }, + weekLabel: "Sed", + allDayText: "Cijeli dan", + eventLimitText: function (n) { + return "+ još " + n; + }, + noEventsMessage: "Nema događaja za prikazivanje" + }; + + return bs; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ca.js b/public/resource/assets/libs/fullcalendar/core/locales/ca.js new file mode 100644 index 0000000..d2d3e2a --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ca.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ca = factory())); +}(this, function () { 'use strict'; + + var ca = { + code: "ca", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Anterior", + next: "Següent", + today: "Avui", + month: "Mes", + week: "Setmana", + day: "Dia", + list: "Agenda" + }, + weekLabel: "Set", + allDayText: "Tot el dia", + eventLimitText: "més", + noEventsMessage: "No hi ha esdeveniments per mostrar" + }; + + return ca; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/cs.js b/public/resource/assets/libs/fullcalendar/core/locales/cs.js new file mode 100644 index 0000000..2624e36 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/cs.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.cs = factory())); +}(this, function () { 'use strict'; + + var cs = { + code: "cs", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Dříve", + next: "Později", + today: "Nyní", + month: "Měsíc", + week: "Týden", + day: "Den", + list: "Agenda" + }, + weekLabel: "Týd", + allDayText: "Celý den", + eventLimitText: function (n) { + return "+další: " + n; + }, + noEventsMessage: "Žádné akce k zobrazení" + }; + + return cs; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/da.js b/public/resource/assets/libs/fullcalendar/core/locales/da.js new file mode 100644 index 0000000..73d1559 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/da.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.da = factory())); +}(this, function () { 'use strict'; + + var da = { + code: "da", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Forrige", + next: "Næste", + today: "I dag", + month: "Måned", + week: "Uge", + day: "Dag", + list: "Agenda" + }, + weekLabel: "Uge", + allDayText: "Hele dagen", + eventLimitText: "flere", + noEventsMessage: "Ingen arrangementer at vise" + }; + + return da; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/de.js b/public/resource/assets/libs/fullcalendar/core/locales/de.js new file mode 100644 index 0000000..ab5a815 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/de.js @@ -0,0 +1,33 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.de = factory())); +}(this, function () { 'use strict'; + + var de = { + code: "de", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Zurück", + next: "Vor", + today: "Heute", + year: "Jahr", + month: "Monat", + week: "Woche", + day: "Tag", + list: "Terminübersicht" + }, + weekLabel: "KW", + allDayText: "Ganztägig", + eventLimitText: function (n) { + return "+ weitere " + n; + }, + noEventsMessage: "Keine Ereignisse anzuzeigen" + }; + + return de; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/el.js b/public/resource/assets/libs/fullcalendar/core/locales/el.js new file mode 100644 index 0000000..9f59e36 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/el.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.el = factory())); +}(this, function () { 'use strict'; + + var el = { + code: "el", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4st is the first week of the year. + }, + buttonText: { + prev: "Προηγούμενος", + next: "Επόμενος", + today: "Σήμερα", + month: "Μήνας", + week: "Εβδομάδα", + day: "Ημέρα", + list: "Ατζέντα" + }, + weekLabel: "Εβδ", + allDayText: "Ολοήμερο", + eventLimitText: "περισσότερα", + noEventsMessage: "Δεν υπάρχουν γεγονότα για να εμφανιστεί" + }; + + return el; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/en-au.js b/public/resource/assets/libs/fullcalendar/core/locales/en-au.js new file mode 100644 index 0000000..be10bfb --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/en-au.js @@ -0,0 +1,17 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-au'] = factory())); +}(this, function () { 'use strict'; + + var enAu = { + code: "en-au", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }; + + return enAu; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/en-gb.js b/public/resource/assets/libs/fullcalendar/core/locales/en-gb.js new file mode 100644 index 0000000..8a4a84e --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/en-gb.js @@ -0,0 +1,17 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-gb'] = factory())); +}(this, function () { 'use strict'; + + var enGb = { + code: "en-gb", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }; + + return enGb; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/en-nz.js b/public/resource/assets/libs/fullcalendar/core/locales/en-nz.js new file mode 100644 index 0000000..df56c14 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/en-nz.js @@ -0,0 +1,17 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['en-nz'] = factory())); +}(this, function () { 'use strict'; + + var enNz = { + code: "en-nz", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + } + }; + + return enNz; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/es-us.js b/public/resource/assets/libs/fullcalendar/core/locales/es-us.js new file mode 100644 index 0000000..1efa89a --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/es-us.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['es-us'] = factory())); +}(this, function () { 'use strict'; + + var esUs = { + code: "es", + week: { + dow: 0, + doy: 6 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Ant", + next: "Sig", + today: "Hoy", + month: "Mes", + week: "Semana", + day: "Día", + list: "Agenda" + }, + weekLabel: "Sm", + allDayHtml: "Todo
el día", + eventLimitText: "más", + noEventsMessage: "No hay eventos para mostrar" + }; + + return esUs; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/es.js b/public/resource/assets/libs/fullcalendar/core/locales/es.js new file mode 100644 index 0000000..bfd9af4 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/es.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.es = factory())); +}(this, function () { 'use strict'; + + var es = { + code: "es", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Ant", + next: "Sig", + today: "Hoy", + month: "Mes", + week: "Semana", + day: "Día", + list: "Agenda" + }, + weekLabel: "Sm", + allDayHtml: "Todo
el día", + eventLimitText: "más", + noEventsMessage: "No hay eventos para mostrar" + }; + + return es; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/et.js b/public/resource/assets/libs/fullcalendar/core/locales/et.js new file mode 100644 index 0000000..c44fcae --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/et.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.et = factory())); +}(this, function () { 'use strict'; + + var et = { + code: "et", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Eelnev", + next: "Järgnev", + today: "Täna", + month: "Kuu", + week: "Nädal", + day: "Päev", + list: "Päevakord" + }, + weekLabel: "näd", + allDayText: "Kogu päev", + eventLimitText: function (n) { + return "+ veel " + n; + }, + noEventsMessage: "Kuvamiseks puuduvad sündmused" + }; + + return et; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/eu.js b/public/resource/assets/libs/fullcalendar/core/locales/eu.js new file mode 100644 index 0000000..91903aa --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/eu.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.eu = factory())); +}(this, function () { 'use strict'; + + var eu = { + code: "eu", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Aur", + next: "Hur", + today: "Gaur", + month: "Hilabetea", + week: "Astea", + day: "Eguna", + list: "Agenda" + }, + weekLabel: "As", + allDayHtml: "Egun
osoa", + eventLimitText: "gehiago", + noEventsMessage: "Ez dago ekitaldirik erakusteko" + }; + + return eu; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/fa.js b/public/resource/assets/libs/fullcalendar/core/locales/fa.js new file mode 100644 index 0000000..031fc7b --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/fa.js @@ -0,0 +1,33 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fa = factory())); +}(this, function () { 'use strict'; + + var fa = { + code: "fa", + week: { + dow: 6, + doy: 12 // The week that contains Jan 1st is the first week of the year. + }, + dir: 'rtl', + buttonText: { + prev: "قبلی", + next: "بعدی", + today: "امروز", + month: "ماه", + week: "هفته", + day: "روز", + list: "برنامه" + }, + weekLabel: "هف", + allDayText: "تمام روز", + eventLimitText: function (n) { + return "بیش از " + n; + }, + noEventsMessage: "هیچ رویدادی به نمایش" + }; + + return fa; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/fi.js b/public/resource/assets/libs/fullcalendar/core/locales/fi.js new file mode 100644 index 0000000..3912845 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/fi.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fi = factory())); +}(this, function () { 'use strict'; + + var fi = { + code: "fi", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Edellinen", + next: "Seuraava", + today: "Tänään", + month: "Kuukausi", + week: "Viikko", + day: "Päivä", + list: "Tapahtumat" + }, + weekLabel: "Vk", + allDayText: "Koko päivä", + eventLimitText: "lisää", + noEventsMessage: "Ei näytettäviä tapahtumia" + }; + + return fi; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/fr-ca.js b/public/resource/assets/libs/fullcalendar/core/locales/fr-ca.js new file mode 100644 index 0000000..d554c14 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/fr-ca.js @@ -0,0 +1,27 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ca'] = factory())); +}(this, function () { 'use strict'; + + var frCa = { + code: "fr", + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Aujourd'hui", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sem.", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + return frCa; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/fr-ch.js b/public/resource/assets/libs/fullcalendar/core/locales/fr-ch.js new file mode 100644 index 0000000..358b8bf --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/fr-ch.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['fr-ch'] = factory())); +}(this, function () { 'use strict'; + + var frCh = { + code: "fr-ch", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Courant", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sm", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + return frCh; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/fr.js b/public/resource/assets/libs/fullcalendar/core/locales/fr.js new file mode 100644 index 0000000..b679cef --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/fr.js @@ -0,0 +1,31 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.fr = factory())); +}(this, function () { 'use strict'; + + var fr = { + code: "fr", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Précédent", + next: "Suivant", + today: "Aujourd'hui", + year: "Année", + month: "Mois", + week: "Semaine", + day: "Jour", + list: "Mon planning" + }, + weekLabel: "Sem.", + allDayHtml: "Toute la
journée", + eventLimitText: "en plus", + noEventsMessage: "Aucun événement à afficher" + }; + + return fr; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/gl.js b/public/resource/assets/libs/fullcalendar/core/locales/gl.js new file mode 100644 index 0000000..721a6a8 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/gl.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.gl = factory())); +}(this, function () { 'use strict'; + + var gl = { + code: "gl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Ant", + next: "Seg", + today: "Hoxe", + month: "Mes", + week: "Semana", + day: "Día", + list: "Axenda" + }, + weekLabel: "Sm", + allDayHtml: "Todo
o día", + eventLimitText: "máis", + noEventsMessage: "Non hai eventos para amosar" + }; + + return gl; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/he.js b/public/resource/assets/libs/fullcalendar/core/locales/he.js new file mode 100644 index 0000000..3521d9e --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/he.js @@ -0,0 +1,27 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.he = factory())); +}(this, function () { 'use strict'; + + var he = { + code: "he", + dir: 'rtl', + buttonText: { + prev: "הקודם", + next: "הבא", + today: "היום", + month: "חודש", + week: "שבוע", + day: "יום", + list: "סדר יום" + }, + allDayText: "כל היום", + eventLimitText: "אחר", + noEventsMessage: "אין אירועים להצגה", + weekLabel: "שבוע" + }; + + return he; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/hi.js b/public/resource/assets/libs/fullcalendar/core/locales/hi.js new file mode 100644 index 0000000..15348e6 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/hi.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hi = factory())); +}(this, function () { 'use strict'; + + var hi = { + code: "hi", + week: { + dow: 0, + doy: 6 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "पिछला", + next: "अगला", + today: "आज", + month: "महीना", + week: "सप्ताह", + day: "दिन", + list: "कार्यसूची" + }, + weekLabel: "हफ्ता", + allDayText: "सभी दिन", + eventLimitText: function (n) { + return "+अधिक " + n; + }, + noEventsMessage: "कोई घटनाओं को प्रदर्शित करने के लिए" + }; + + return hi; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/hr.js b/public/resource/assets/libs/fullcalendar/core/locales/hr.js new file mode 100644 index 0000000..295b485 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/hr.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hr = factory())); +}(this, function () { 'use strict'; + + var hr = { + code: "hr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prijašnji", + next: "Sljedeći", + today: "Danas", + month: "Mjesec", + week: "Tjedan", + day: "Dan", + list: "Raspored" + }, + weekLabel: "Tje", + allDayText: "Cijeli dan", + eventLimitText: function (n) { + return "+ još " + n; + }, + noEventsMessage: "Nema događaja za prikaz" + }; + + return hr; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/hu.js b/public/resource/assets/libs/fullcalendar/core/locales/hu.js new file mode 100644 index 0000000..2f0fe8a --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/hu.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.hu = factory())); +}(this, function () { 'use strict'; + + var hu = { + code: "hu", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "vissza", + next: "előre", + today: "ma", + month: "Hónap", + week: "Hét", + day: "Nap", + list: "Napló" + }, + weekLabel: "Hét", + allDayText: "Egész nap", + eventLimitText: "további", + noEventsMessage: "Nincs megjeleníthető esemény" + }; + + return hu; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/id.js b/public/resource/assets/libs/fullcalendar/core/locales/id.js new file mode 100644 index 0000000..b742e80 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/id.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.id = factory())); +}(this, function () { 'use strict'; + + var id = { + code: "id", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "mundur", + next: "maju", + today: "hari ini", + month: "Bulan", + week: "Minggu", + day: "Hari", + list: "Agenda" + }, + weekLabel: "Mg", + allDayHtml: "Sehari
penuh", + eventLimitText: "lebih", + noEventsMessage: "Tidak ada acara untuk ditampilkan" + }; + + return id; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/is.js b/public/resource/assets/libs/fullcalendar/core/locales/is.js new file mode 100644 index 0000000..dd569bc --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/is.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.is = factory())); +}(this, function () { 'use strict'; + + var is = { + code: "is", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Fyrri", + next: "Næsti", + today: "Í dag", + month: "Mánuður", + week: "Vika", + day: "Dagur", + list: "Dagskrá" + }, + weekLabel: "Vika", + allDayHtml: "Allan
daginn", + eventLimitText: "meira", + noEventsMessage: "Engir viðburðir til að sýna" + }; + + return is; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/it.js b/public/resource/assets/libs/fullcalendar/core/locales/it.js new file mode 100644 index 0000000..39a2829 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/it.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.it = factory())); +}(this, function () { 'use strict'; + + var it = { + code: "it", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Prec", + next: "Succ", + today: "Oggi", + month: "Mese", + week: "Settimana", + day: "Giorno", + list: "Agenda" + }, + weekLabel: "Sm", + allDayHtml: "Tutto il
giorno", + eventLimitText: function (n) { + return "+altri " + n; + }, + noEventsMessage: "Non ci sono eventi da visualizzare" + }; + + return it; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ja.js b/public/resource/assets/libs/fullcalendar/core/locales/ja.js new file mode 100644 index 0000000..eb4245b --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ja.js @@ -0,0 +1,28 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ja = factory())); +}(this, function () { 'use strict'; + + var ja = { + code: "ja", + buttonText: { + prev: "前", + next: "次", + today: "今日", + month: "月", + week: "週", + day: "日", + list: "予定リスト" + }, + weekLabel: "週", + allDayText: "終日", + eventLimitText: function (n) { + return "他 " + n + " 件"; + }, + noEventsMessage: "表示する予定はありません" + }; + + return ja; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ka.js b/public/resource/assets/libs/fullcalendar/core/locales/ka.js new file mode 100644 index 0000000..b971c03 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ka.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ka = factory())); +}(this, function () { 'use strict'; + + var ka = { + code: "ka", + week: { + dow: 1, + doy: 7 + }, + buttonText: { + prev: "წინა", + next: "შემდეგი", + today: "დღეს", + month: "თვე", + week: "კვირა", + day: "დღე", + list: "დღის წესრიგი" + }, + weekLabel: "კვ", + allDayText: "მთელი დღე", + eventLimitText: function (n) { + return "+ კიდევ " + n; + }, + noEventsMessage: "ღონისძიებები არ არის" + }; + + return ka; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/kk.js b/public/resource/assets/libs/fullcalendar/core/locales/kk.js new file mode 100644 index 0000000..5b19b99 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/kk.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.kk = factory())); +}(this, function () { 'use strict'; + + var kk = { + code: "kk", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Алдыңғы", + next: "Келесі", + today: "Бүгін", + month: "Ай", + week: "Апта", + day: "Күн", + list: "Күн тәртібі" + }, + weekLabel: "Не", + allDayText: "Күні бойы", + eventLimitText: function (n) { + return "+ тағы " + n; + }, + noEventsMessage: "Көрсету үшін оқиғалар жоқ" + }; + + return kk; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ko.js b/public/resource/assets/libs/fullcalendar/core/locales/ko.js new file mode 100644 index 0000000..ffe985d --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ko.js @@ -0,0 +1,26 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ko = factory())); +}(this, function () { 'use strict'; + + var ko = { + code: "ko", + buttonText: { + prev: "이전달", + next: "다음달", + today: "오늘", + month: "월", + week: "주", + day: "일", + list: "일정목록" + }, + weekLabel: "주", + allDayText: "종일", + eventLimitText: "개", + noEventsMessage: "일정이 없습니다" + }; + + return ko; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/lb.js b/public/resource/assets/libs/fullcalendar/core/locales/lb.js new file mode 100644 index 0000000..b9b17e3 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/lb.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lb = factory())); +}(this, function () { 'use strict'; + + var lb = { + code: "lb", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Zréck", + next: "Weider", + today: "Haut", + month: "Mount", + week: "Woch", + day: "Dag", + list: "Terminiwwersiicht" + }, + weekLabel: "W", + allDayText: "Ganzen Dag", + eventLimitText: "méi", + noEventsMessage: "Nee Evenementer ze affichéieren" + }; + + return lb; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/lt.js b/public/resource/assets/libs/fullcalendar/core/locales/lt.js new file mode 100644 index 0000000..ec641b7 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/lt.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lt = factory())); +}(this, function () { 'use strict'; + + var lt = { + code: "lt", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Atgal", + next: "Pirmyn", + today: "Šiandien", + month: "Mėnuo", + week: "Savaitė", + day: "Diena", + list: "Darbotvarkė" + }, + weekLabel: "SAV", + allDayText: "Visą dieną", + eventLimitText: "daugiau", + noEventsMessage: "Nėra įvykių rodyti" + }; + + return lt; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/lv.js b/public/resource/assets/libs/fullcalendar/core/locales/lv.js new file mode 100644 index 0000000..5453630 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/lv.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.lv = factory())); +}(this, function () { 'use strict'; + + var lv = { + code: "lv", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Iepr.", + next: "Nāk.", + today: "Šodien", + month: "Mēnesis", + week: "Nedēļa", + day: "Diena", + list: "Dienas kārtība" + }, + weekLabel: "Ned.", + allDayText: "Visu dienu", + eventLimitText: function (n) { + return "+vēl " + n; + }, + noEventsMessage: "Nav notikumu" + }; + + return lv; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/mk.js b/public/resource/assets/libs/fullcalendar/core/locales/mk.js new file mode 100644 index 0000000..6729fa6 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/mk.js @@ -0,0 +1,28 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.mk = factory())); +}(this, function () { 'use strict'; + + var mk = { + code: "mk", + buttonText: { + prev: "претходно", + next: "следно", + today: "Денес", + month: "Месец", + week: "Недела", + day: "Ден", + list: "График" + }, + weekLabel: "Сед", + allDayText: "Цел ден", + eventLimitText: function (n) { + return "+повеќе " + n; + }, + noEventsMessage: "Нема настани за прикажување" + }; + + return mk; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ms.js b/public/resource/assets/libs/fullcalendar/core/locales/ms.js new file mode 100644 index 0000000..7205ecc --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ms.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ms = factory())); +}(this, function () { 'use strict'; + + var ms = { + code: "ms", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Sebelum", + next: "Selepas", + today: "hari ini", + month: "Bulan", + week: "Minggu", + day: "Hari", + list: "Agenda" + }, + weekLabel: "Mg", + allDayText: "Sepanjang hari", + eventLimitText: function (n) { + return "masih ada " + n + " acara"; + }, + noEventsMessage: "Tiada peristiwa untuk dipaparkan" + }; + + return ms; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/nb.js b/public/resource/assets/libs/fullcalendar/core/locales/nb.js new file mode 100644 index 0000000..6464461 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/nb.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nb = factory())); +}(this, function () { 'use strict'; + + var nb = { + code: "nb", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Forrige", + next: "Neste", + today: "I dag", + month: "Måned", + week: "Uke", + day: "Dag", + list: "Agenda" + }, + weekLabel: "Uke", + allDayText: "Hele dagen", + eventLimitText: "til", + noEventsMessage: "Ingen hendelser å vise" + }; + + return nb; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/nl.js b/public/resource/assets/libs/fullcalendar/core/locales/nl.js new file mode 100644 index 0000000..c91b5e5 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/nl.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nl = factory())); +}(this, function () { 'use strict'; + + var nl = { + code: "nl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Voorgaand", + next: "Volgende", + today: "Vandaag", + year: "Jaar", + month: "Maand", + week: "Week", + day: "Dag", + list: "Agenda" + }, + allDayText: "Hele dag", + eventLimitText: "extra", + noEventsMessage: "Geen evenementen om te laten zien" + }; + + return nl; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/nn.js b/public/resource/assets/libs/fullcalendar/core/locales/nn.js new file mode 100644 index 0000000..a5cdd16 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/nn.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.nn = factory())); +}(this, function () { 'use strict'; + + var nn = { + code: "nn", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Førre", + next: "Neste", + today: "I dag", + month: "Månad", + week: "Veke", + day: "Dag", + list: "Agenda" + }, + weekLabel: "Veke", + allDayText: "Heile dagen", + eventLimitText: "til", + noEventsMessage: "Ingen hendelser å vise" + }; + + return nn; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/pl.js b/public/resource/assets/libs/fullcalendar/core/locales/pl.js new file mode 100644 index 0000000..0a22e69 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/pl.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pl = factory())); +}(this, function () { 'use strict'; + + var pl = { + code: "pl", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Poprzedni", + next: "Następny", + today: "Dziś", + month: "Miesiąc", + week: "Tydzień", + day: "Dzień", + list: "Plan dnia" + }, + weekLabel: "Tydz", + allDayText: "Cały dzień", + eventLimitText: "więcej", + noEventsMessage: "Brak wydarzeń do wyświetlenia" + }; + + return pl; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/pt-br.js b/public/resource/assets/libs/fullcalendar/core/locales/pt-br.js new file mode 100644 index 0000000..0133cd6 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/pt-br.js @@ -0,0 +1,28 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['pt-br'] = factory())); +}(this, function () { 'use strict'; + + var ptBr = { + code: "pt-br", + buttonText: { + prev: "Anterior", + next: "Próximo", + today: "Hoje", + month: "Mês", + week: "Semana", + day: "Dia", + list: "Compromissos" + }, + weekLabel: "Sm", + allDayText: "dia inteiro", + eventLimitText: function (n) { + return "mais +" + n; + }, + noEventsMessage: "Não há eventos para mostrar" + }; + + return ptBr; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/pt.js b/public/resource/assets/libs/fullcalendar/core/locales/pt.js new file mode 100644 index 0000000..5c54d8d --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/pt.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.pt = factory())); +}(this, function () { 'use strict'; + + var pt = { + code: "pt", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Anterior", + next: "Seguinte", + today: "Hoje", + month: "Mês", + week: "Semana", + day: "Dia", + list: "Agenda" + }, + weekLabel: "Sem", + allDayText: "Todo o dia", + eventLimitText: "mais", + noEventsMessage: "Não há eventos para mostrar" + }; + + return pt; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ro.js b/public/resource/assets/libs/fullcalendar/core/locales/ro.js new file mode 100644 index 0000000..e8992f2 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ro.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ro = factory())); +}(this, function () { 'use strict'; + + var ro = { + code: "ro", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "precedentă", + next: "următoare", + today: "Azi", + month: "Lună", + week: "Săptămână", + day: "Zi", + list: "Agendă" + }, + weekLabel: "Săpt", + allDayText: "Toată ziua", + eventLimitText: function (n) { + return "+alte " + n; + }, + noEventsMessage: "Nu există evenimente de afișat" + }; + + return ro; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/ru.js b/public/resource/assets/libs/fullcalendar/core/locales/ru.js new file mode 100644 index 0000000..77e0308 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/ru.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.ru = factory())); +}(this, function () { 'use strict'; + + var ru = { + code: "ru", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Пред", + next: "След", + today: "Сегодня", + month: "Месяц", + week: "Неделя", + day: "День", + list: "Повестка дня" + }, + weekLabel: "Нед", + allDayText: "Весь день", + eventLimitText: function (n) { + return "+ ещё " + n; + }, + noEventsMessage: "Нет событий для отображения" + }; + + return ru; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/sk.js b/public/resource/assets/libs/fullcalendar/core/locales/sk.js new file mode 100644 index 0000000..3513a64 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/sk.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sk = factory())); +}(this, function () { 'use strict'; + + var sk = { + code: "sk", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Predchádzajúci", + next: "Nasledujúci", + today: "Dnes", + month: "Mesiac", + week: "Týždeň", + day: "Deň", + list: "Rozvrh" + }, + weekLabel: "Ty", + allDayText: "Celý deň", + eventLimitText: function (n) { + return "+ďalšie: " + n; + }, + noEventsMessage: "Žiadne akcie na zobrazenie" + }; + + return sk; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/sl.js b/public/resource/assets/libs/fullcalendar/core/locales/sl.js new file mode 100644 index 0000000..3233553 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/sl.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sl = factory())); +}(this, function () { 'use strict'; + + var sl = { + code: "sl", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prejšnji", + next: "Naslednji", + today: "Trenutni", + month: "Mesec", + week: "Teden", + day: "Dan", + list: "Dnevni red" + }, + weekLabel: "Teden", + allDayText: "Ves dan", + eventLimitText: "več", + noEventsMessage: "Ni dogodkov za prikaz" + }; + + return sl; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/sq.js b/public/resource/assets/libs/fullcalendar/core/locales/sq.js new file mode 100644 index 0000000..0d43a52 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/sq.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sq = factory())); +}(this, function () { 'use strict'; + + var sq = { + code: "sq", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "mbrapa", + next: "Përpara", + today: "sot", + month: "Muaj", + week: "Javë", + day: "Ditë", + list: "Listë" + }, + weekLabel: "Ja", + allDayHtml: "Gjithë
ditën", + eventLimitText: function (n) { + return "+më tepër " + n; + }, + noEventsMessage: "Nuk ka evente për të shfaqur" + }; + + return sq; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/sr-cyrl.js b/public/resource/assets/libs/fullcalendar/core/locales/sr-cyrl.js new file mode 100644 index 0000000..ba0d0df --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/sr-cyrl.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['sr-cyrl'] = factory())); +}(this, function () { 'use strict'; + + var srCyrl = { + code: "sr-cyrl", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Претходна", + next: "следећи", + today: "Данас", + month: "Месец", + week: "Недеља", + day: "Дан", + list: "Планер" + }, + weekLabel: "Сед", + allDayText: "Цео дан", + eventLimitText: function (n) { + return "+ још " + n; + }, + noEventsMessage: "Нема догађаја за приказ" + }; + + return srCyrl; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/sr.js b/public/resource/assets/libs/fullcalendar/core/locales/sr.js new file mode 100644 index 0000000..23e5c9b --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/sr.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sr = factory())); +}(this, function () { 'use strict'; + + var sr = { + code: "sr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Prethodna", + next: "Sledeći", + today: "Danas", + month: "Mеsеc", + week: "Nеdеlja", + day: "Dan", + list: "Planеr" + }, + weekLabel: "Sed", + allDayText: "Cеo dan", + eventLimitText: function (n) { + return "+ još " + n; + }, + noEventsMessage: "Nеma događaja za prikaz" + }; + + return sr; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/sv.js b/public/resource/assets/libs/fullcalendar/core/locales/sv.js new file mode 100644 index 0000000..a887060 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/sv.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.sv = factory())); +}(this, function () { 'use strict'; + + var sv = { + code: "sv", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Förra", + next: "Nästa", + today: "Idag", + month: "Månad", + week: "Vecka", + day: "Dag", + list: "Program" + }, + weekLabel: "v.", + allDayText: "Heldag", + eventLimitText: "till", + noEventsMessage: "Inga händelser att visa" + }; + + return sv; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/th.js b/public/resource/assets/libs/fullcalendar/core/locales/th.js new file mode 100644 index 0000000..caa3fe9 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/th.js @@ -0,0 +1,25 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.th = factory())); +}(this, function () { 'use strict'; + + var th = { + code: "th", + buttonText: { + prev: "ย้อน", + next: "ถัดไป", + today: "วันนี้", + month: "เดือน", + week: "สัปดาห์", + day: "วัน", + list: "แผนงาน" + }, + allDayText: "ตลอดวัน", + eventLimitText: "เพิ่มเติม", + noEventsMessage: "ไม่มีกิจกรรมที่จะแสดง" + }; + + return th; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/tr.js b/public/resource/assets/libs/fullcalendar/core/locales/tr.js new file mode 100644 index 0000000..4845898 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/tr.js @@ -0,0 +1,30 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.tr = factory())); +}(this, function () { 'use strict'; + + var tr = { + code: "tr", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "geri", + next: "ileri", + today: "bugün", + month: "Ay", + week: "Hafta", + day: "Gün", + list: "Ajanda" + }, + weekLabel: "Hf", + allDayText: "Tüm gün", + eventLimitText: "daha fazla", + noEventsMessage: "Gösterilecek etkinlik yok" + }; + + return tr; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/uk.js b/public/resource/assets/libs/fullcalendar/core/locales/uk.js new file mode 100644 index 0000000..de33f25 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/uk.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.uk = factory())); +}(this, function () { 'use strict'; + + var uk = { + code: "uk", + week: { + dow: 1, + doy: 7 // The week that contains Jan 1st is the first week of the year. + }, + buttonText: { + prev: "Попередній", + next: "далі", + today: "Сьогодні", + month: "Місяць", + week: "Тиждень", + day: "День", + list: "Порядок денний" + }, + weekLabel: "Тиж", + allDayText: "Увесь день", + eventLimitText: function (n) { + return "+ще " + n + "..."; + }, + noEventsMessage: "Немає подій для відображення" + }; + + return uk; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/vi.js b/public/resource/assets/libs/fullcalendar/core/locales/vi.js new file mode 100644 index 0000000..167ce11 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/vi.js @@ -0,0 +1,32 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales.vi = factory())); +}(this, function () { 'use strict'; + + var vi = { + code: "vi", + week: { + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "Trước", + next: "Tiếp", + today: "Hôm nay", + month: "Tháng", + week: "Tuần", + day: "Ngày", + list: "Lịch biểu" + }, + weekLabel: "Tu", + allDayText: "Cả ngày", + eventLimitText: function (n) { + return "+ thêm " + n; + }, + noEventsMessage: "Không có sự kiện để hiển thị" + }; + + return vi; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/zh-cn.js b/public/resource/assets/libs/fullcalendar/core/locales/zh-cn.js new file mode 100644 index 0000000..4debbb9 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/zh-cn.js @@ -0,0 +1,33 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-cn'] = factory())); +}(this, function () { 'use strict'; + + var zhCn = { + code: "zh-cn", + week: { + // GB/T 7408-1994《数据元和交换格式·信息交换·日期和时间表示法》与ISO 8601:1988等效 + dow: 1, + doy: 4 // The week that contains Jan 4th is the first week of the year. + }, + buttonText: { + prev: "上月", + next: "下月", + today: "今天", + month: "月", + week: "周", + day: "日", + list: "日程" + }, + weekLabel: "周", + allDayText: "全天", + eventLimitText: function (n) { + return "另外 " + n + " 个"; + }, + noEventsMessage: "没有事件显示" + }; + + return zhCn; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/locales/zh-tw.js b/public/resource/assets/libs/fullcalendar/core/locales/zh-tw.js new file mode 100644 index 0000000..bc14dcd --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/locales/zh-tw.js @@ -0,0 +1,26 @@ +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global = global || self, (global.FullCalendarLocales = global.FullCalendarLocales || {}, global.FullCalendarLocales['zh-tw'] = factory())); +}(this, function () { 'use strict'; + + var zhTw = { + code: "zh-tw", + buttonText: { + prev: "上月", + next: "下月", + today: "今天", + month: "月", + week: "週", + day: "天", + list: "活動列表" + }, + weekLabel: "周", + allDayText: "整天", + eventLimitText: '顯示更多', + noEventsMessage: "没有任何活動" + }; + + return zhTw; + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/main.css b/public/resource/assets/libs/fullcalendar/core/main.css new file mode 100644 index 0000000..4412a18 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/main.css @@ -0,0 +1,1052 @@ +@charset "UTF-8"; +.fc { + direction: ltr; + text-align: left; +} + +.fc-rtl { + text-align: right; +} + +body .fc { + /* extra precedence to overcome jqui */ + font-size: 1em; +} + +/* Colors +--------------------------------------------------------------------------------------------------*/ +.fc-highlight { + /* when user is selecting cells */ + background: #bce8f1; + opacity: 0.3; +} + +.fc-bgevent { + /* default look for background events */ + background: #8fdf82; + opacity: 0.3; +} + +.fc-nonbusiness { + /* default look for non-business-hours areas */ + /* will inherit .fc-bgevent's styles */ + background: #d7d7d7; +} + +/* Popover +--------------------------------------------------------------------------------------------------*/ +.fc-popover { + position: absolute; + box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15); +} + +.fc-popover .fc-header { + /* TODO: be more consistent with fc-head/fc-body */ + display: flex; + flex-direction: row; + justify-content: space-between; + align-items: center; + padding: 2px 4px; +} + +.fc-rtl .fc-popover .fc-header { + flex-direction: row-reverse; +} + +.fc-popover .fc-header .fc-title { + margin: 0 2px; +} + +.fc-popover .fc-header .fc-close { + cursor: pointer; + opacity: 0.65; + font-size: 1.1em; +} + +/* Misc Reusable Components +--------------------------------------------------------------------------------------------------*/ +.fc-divider { + border-style: solid; + border-width: 1px; +} + +hr.fc-divider { + height: 0; + margin: 0; + padding: 0 0 2px; + /* height is unreliable across browsers, so use padding */ + border-width: 1px 0; +} + +.fc-bg, +.fc-bgevent-skeleton, +.fc-highlight-skeleton, +.fc-mirror-skeleton { + /* these element should always cling to top-left/right corners */ + position: absolute; + top: 0; + left: 0; + right: 0; +} + +.fc-bg { + bottom: 0; + /* strech bg to bottom edge */ +} + +.fc-bg table { + height: 100%; + /* strech bg to bottom edge */ +} + +/* Tables +--------------------------------------------------------------------------------------------------*/ +.fc table { + width: 100%; + box-sizing: border-box; + /* fix scrollbar issue in firefox */ + table-layout: fixed; + border-collapse: collapse; + border-spacing: 0; + font-size: 1em; + /* normalize cross-browser */ +} + +.fc th { + text-align: center; +} + +.fc th, +.fc td { + border-style: solid; + border-width: 1px; + padding: 0; + vertical-align: top; +} + +.fc td.fc-today { + border-style: double; + /* overcome neighboring borders */ +} + +/* Internal Nav Links +--------------------------------------------------------------------------------------------------*/ +a[data-goto] { + cursor: pointer; +} + +a[data-goto]:hover { + text-decoration: underline; +} + +/* Fake Table Rows +--------------------------------------------------------------------------------------------------*/ +.fc .fc-row { + /* extra precedence to overcome themes forcing a 1px border */ + /* no visible border by default. but make available if need be (scrollbar width compensation) */ + border-style: solid; + border-width: 0; +} + +.fc-row table { + /* don't put left/right border on anything within a fake row. + the outer tbody will worry about this */ + border-left: 0 hidden transparent; + border-right: 0 hidden transparent; + /* no bottom borders on rows */ + border-bottom: 0 hidden transparent; +} + +.fc-row:first-child table { + border-top: 0 hidden transparent; + /* no top border on first row */ +} + +/* Day Row (used within the header and the DayGrid) +--------------------------------------------------------------------------------------------------*/ +.fc-row { + position: relative; +} + +.fc-row .fc-bg { + z-index: 1; +} + +/* highlighting cells & background event skeleton */ +.fc-row .fc-bgevent-skeleton, +.fc-row .fc-highlight-skeleton { + bottom: 0; + /* stretch skeleton to bottom of row */ +} + +.fc-row .fc-bgevent-skeleton table, +.fc-row .fc-highlight-skeleton table { + height: 100%; + /* stretch skeleton to bottom of row */ +} + +.fc-row .fc-highlight-skeleton td, +.fc-row .fc-bgevent-skeleton td { + border-color: transparent; +} + +.fc-row .fc-bgevent-skeleton { + z-index: 2; +} + +.fc-row .fc-highlight-skeleton { + z-index: 3; +} + +/* +row content (which contains day/week numbers and events) as well as "mirror" (which contains +temporary rendered events). +*/ +.fc-row .fc-content-skeleton { + position: relative; + z-index: 4; + padding-bottom: 2px; + /* matches the space above the events */ +} + +.fc-row .fc-mirror-skeleton { + z-index: 5; +} + +.fc .fc-row .fc-content-skeleton table, +.fc .fc-row .fc-content-skeleton td, +.fc .fc-row .fc-mirror-skeleton td { + /* see-through to the background below */ + /* extra precedence to prevent theme-provided backgrounds */ + background: none; + /* in case s are globally styled */ + border-color: transparent; +} + +.fc-row .fc-content-skeleton td, +.fc-row .fc-mirror-skeleton td { + /* don't put a border between events and/or the day number */ + border-bottom: 0; +} + +.fc-row .fc-content-skeleton tbody td, +.fc-row .fc-mirror-skeleton tbody td { + /* don't put a border between event cells */ + border-top: 0; +} + +/* Scrolling Container +--------------------------------------------------------------------------------------------------*/ +.fc-scroller { + -webkit-overflow-scrolling: touch; +} + +/* TODO: move to timegrid/daygrid */ +.fc-scroller > .fc-day-grid, +.fc-scroller > .fc-time-grid { + position: relative; + /* re-scope all positions */ + width: 100%; + /* hack to force re-sizing this inner element when scrollbars appear/disappear */ +} + +/* Global Event Styles +--------------------------------------------------------------------------------------------------*/ +.fc-event { + position: relative; + /* for resize handle and other inner positioning */ + display: block; + /* make the tag block */ + font-size: 0.85em; + line-height: 1.4; + border-radius: 3px; + border: 1px solid #3788d8; +} + +.fc-event, +.fc-event-dot { + background-color: #3788d8; + /* default BACKGROUND color */ +} + +.fc-event, +.fc-event:hover { + color: #fff; + /* default TEXT color */ + text-decoration: none; + /* if has an href */ +} + +.fc-event[href], +.fc-event.fc-draggable { + cursor: pointer; + /* give events with links and draggable events a hand mouse pointer */ +} + +.fc-not-allowed, +.fc-not-allowed .fc-event { + /* to override an event's custom cursor */ + cursor: not-allowed; +} + +.fc-event .fc-content { + position: relative; + z-index: 2; +} + +/* resizer (cursor AND touch devices) */ +.fc-event .fc-resizer { + position: absolute; + z-index: 4; +} + +/* resizer (touch devices) */ +.fc-event .fc-resizer { + display: none; +} + +.fc-event.fc-allow-mouse-resize .fc-resizer, +.fc-event.fc-selected .fc-resizer { + /* only show when hovering or selected (with touch) */ + display: block; +} + +/* hit area */ +.fc-event.fc-selected .fc-resizer:before { + /* 40x40 touch area */ + content: ""; + position: absolute; + z-index: 9999; + /* user of this util can scope within a lower z-index */ + top: 50%; + left: 50%; + width: 40px; + height: 40px; + margin-left: -20px; + margin-top: -20px; +} + +/* Event Selection (only for touch devices) +--------------------------------------------------------------------------------------------------*/ +.fc-event.fc-selected { + z-index: 9999 !important; + /* overcomes inline z-index */ + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2); +} + +.fc-event.fc-selected:after { + content: ""; + position: absolute; + z-index: 1; + /* same z-index as fc-bg, behind text */ + /* overcome the borders */ + top: -1px; + right: -1px; + bottom: -1px; + left: -1px; + /* darkening effect */ + background: #000; + opacity: 0.25; +} + +/* Event Dragging +--------------------------------------------------------------------------------------------------*/ +.fc-event.fc-dragging.fc-selected { + box-shadow: 0 2px 7px rgba(0, 0, 0, 0.3); +} + +.fc-event.fc-dragging:not(.fc-selected) { + opacity: 0.75; +} + +/* Horizontal Events +--------------------------------------------------------------------------------------------------*/ +/* bigger touch area when selected */ +.fc-h-event.fc-selected:before { + content: ""; + position: absolute; + z-index: 3; + /* below resizers */ + top: -10px; + bottom: -10px; + left: 0; + right: 0; +} + +/* events that are continuing to/from another week. kill rounded corners and butt up against edge */ +.fc-ltr .fc-h-event.fc-not-start, +.fc-rtl .fc-h-event.fc-not-end { + margin-left: 0; + border-left-width: 0; + padding-left: 1px; + /* replace the border with padding */ + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.fc-ltr .fc-h-event.fc-not-end, +.fc-rtl .fc-h-event.fc-not-start { + margin-right: 0; + border-right-width: 0; + padding-right: 1px; + /* replace the border with padding */ + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +/* resizer (cursor AND touch devices) */ +/* left resizer */ +.fc-ltr .fc-h-event .fc-start-resizer, +.fc-rtl .fc-h-event .fc-end-resizer { + cursor: w-resize; + left: -1px; + /* overcome border */ +} + +/* right resizer */ +.fc-ltr .fc-h-event .fc-end-resizer, +.fc-rtl .fc-h-event .fc-start-resizer { + cursor: e-resize; + right: -1px; + /* overcome border */ +} + +/* resizer (mouse devices) */ +.fc-h-event.fc-allow-mouse-resize .fc-resizer { + width: 7px; + top: -1px; + /* overcome top border */ + bottom: -1px; + /* overcome bottom border */ +} + +/* resizer (touch devices) */ +.fc-h-event.fc-selected .fc-resizer { + /* 8x8 little dot */ + border-radius: 4px; + border-width: 1px; + width: 6px; + height: 6px; + border-style: solid; + border-color: inherit; + background: #fff; + /* vertically center */ + top: 50%; + margin-top: -4px; +} + +/* left resizer */ +.fc-ltr .fc-h-event.fc-selected .fc-start-resizer, +.fc-rtl .fc-h-event.fc-selected .fc-end-resizer { + margin-left: -4px; + /* centers the 8x8 dot on the left edge */ +} + +/* right resizer */ +.fc-ltr .fc-h-event.fc-selected .fc-end-resizer, +.fc-rtl .fc-h-event.fc-selected .fc-start-resizer { + margin-right: -4px; + /* centers the 8x8 dot on the right edge */ +} + +/* DayGrid events +---------------------------------------------------------------------------------------------------- +We use the full "fc-day-grid-event" class instead of using descendants because the event won't +be a descendant of the grid when it is being dragged. +*/ +.fc-day-grid-event { + margin: 1px 2px 0; + /* spacing between events and edges */ + padding: 0 1px; +} + +tr:first-child > td > .fc-day-grid-event { + margin-top: 2px; + /* a little bit more space before the first event */ +} + +.fc-mirror-skeleton tr:first-child > td > .fc-day-grid-event { + margin-top: 0; + /* except for mirror skeleton */ +} + +.fc-day-grid-event .fc-content { + /* force events to be one-line tall */ + white-space: nowrap; + overflow: hidden; +} + +.fc-day-grid-event .fc-time { + font-weight: bold; +} + +/* resizer (cursor devices) */ +/* left resizer */ +.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer, +.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer { + margin-left: -2px; + /* to the day cell's edge */ +} + +/* right resizer */ +.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer, +.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer { + margin-right: -2px; + /* to the day cell's edge */ +} + +/* Event Limiting +--------------------------------------------------------------------------------------------------*/ +/* "more" link that represents hidden events */ +a.fc-more { + margin: 1px 3px; + font-size: 0.85em; + cursor: pointer; + text-decoration: none; +} + +a.fc-more:hover { + text-decoration: underline; +} + +.fc-limited { + /* rows and cells that are hidden because of a "more" link */ + display: none; +} + +/* popover that appears when "more" link is clicked */ +.fc-day-grid .fc-row { + z-index: 1; + /* make the "more" popover one higher than this */ +} + +.fc-more-popover { + z-index: 2; + width: 220px; +} + +.fc-more-popover .fc-event-container { + padding: 10px; +} + +/* Now Indicator +--------------------------------------------------------------------------------------------------*/ +.fc-now-indicator { + position: absolute; + border: 0 solid red; +} + +/* Utilities +--------------------------------------------------------------------------------------------------*/ +.fc-unselectable { + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -webkit-touch-callout: none; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +/* +TODO: more distinction between this file and common.css +*/ +/* Colors +--------------------------------------------------------------------------------------------------*/ +.fc-unthemed th, +.fc-unthemed td, +.fc-unthemed thead, +.fc-unthemed tbody, +.fc-unthemed .fc-divider, +.fc-unthemed .fc-row, +.fc-unthemed .fc-content, +.fc-unthemed .fc-popover, +.fc-unthemed .fc-list-view, +.fc-unthemed .fc-list-heading td { + border-color: #ddd; +} + +.fc-unthemed .fc-popover { + background-color: #fff; +} + +.fc-unthemed .fc-divider, +.fc-unthemed .fc-popover .fc-header, +.fc-unthemed .fc-list-heading td { + background: #eee; +} + +.fc-unthemed td.fc-today { + background: #fcf8e3; +} + +.fc-unthemed .fc-disabled-day { + background: #d7d7d7; + opacity: 0.3; +} + +/* Icons +-------------------------------------------------------------------------------------------------- +from https://feathericons.com/ and built with IcoMoon +*/ +@font-face { + font-family: "fcicons"; + src: url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype"); + font-weight: normal; + font-style: normal; +} +.fc-icon { + /* use !important to prevent issues with browser extensions that change fonts */ + font-family: "fcicons" !important; + speak: none; + font-style: normal; + font-weight: normal; + font-variant: normal; + text-transform: none; + line-height: 1; + /* Better Font Rendering =========== */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.fc-icon-chevron-left:before { + content: ""; +} + +.fc-icon-chevron-right:before { + content: ""; +} + +.fc-icon-chevrons-left:before { + content: ""; +} + +.fc-icon-chevrons-right:before { + content: ""; +} + +.fc-icon-minus-square:before { + content: ""; +} + +.fc-icon-plus-square:before { + content: ""; +} + +.fc-icon-x:before { + content: ""; +} + +.fc-icon { + display: inline-block; + width: 1em; + height: 1em; + text-align: center; +} + +/* Buttons +-------------------------------------------------------------------------------------------------- +Lots taken from Flatly (MIT): https://bootswatch.com/4/flatly/bootstrap.css +*/ +/* reset */ +.fc-button { + border-radius: 0; + overflow: visible; + text-transform: none; + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +.fc-button:focus { + outline: 1px dotted; + outline: 5px auto -webkit-focus-ring-color; +} + +.fc-button { + -webkit-appearance: button; +} + +.fc-button:not(:disabled) { + cursor: pointer; +} + +.fc-button::-moz-focus-inner { + padding: 0; + border-style: none; +} + +/* theme */ +.fc-button { + display: inline-block; + font-weight: 400; + color: #212529; + text-align: center; + vertical-align: middle; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-color: transparent; + border: 1px solid transparent; + padding: 0.4em 0.65em; + font-size: 1em; + line-height: 1.5; + border-radius: 0.25em; +} + +.fc-button:hover { + color: #212529; + text-decoration: none; +} + +.fc-button:focus { + outline: 0; + -webkit-box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25); + box-shadow: 0 0 0 0.2rem rgba(44, 62, 80, 0.25); +} + +.fc-button:disabled { + opacity: 0.65; +} + +/* "primary" coloring */ +.fc-button-primary { + color: #fff; + background-color: #2C3E50; + border-color: #2C3E50; +} + +.fc-button-primary:hover { + color: #fff; + background-color: #1e2b37; + border-color: #1a252f; +} + +.fc-button-primary:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5); + box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5); +} + +.fc-button-primary:disabled { + color: #fff; + background-color: #2C3E50; + border-color: #2C3E50; +} + +.fc-button-primary:not(:disabled):active, +.fc-button-primary:not(:disabled).fc-button-active { + color: #fff; + background-color: #1a252f; + border-color: #151e27; +} + +.fc-button-primary:not(:disabled):active:focus, +.fc-button-primary:not(:disabled).fc-button-active:focus { + -webkit-box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5); + box-shadow: 0 0 0 0.2rem rgba(76, 91, 106, 0.5); +} + +/* icons within buttons */ +.fc-button .fc-icon { + vertical-align: middle; + font-size: 1.5em; +} + +/* Buttons Groups +--------------------------------------------------------------------------------------------------*/ +.fc-button-group { + position: relative; + display: -webkit-inline-box; + display: -ms-inline-flexbox; + display: inline-flex; + vertical-align: middle; +} + +.fc-button-group > .fc-button { + position: relative; + -webkit-box-flex: 1; + -ms-flex: 1 1 auto; + flex: 1 1 auto; +} + +.fc-button-group > .fc-button:hover { + z-index: 1; +} + +.fc-button-group > .fc-button:focus, +.fc-button-group > .fc-button:active, +.fc-button-group > .fc-button.fc-button-active { + z-index: 1; +} + +.fc-button-group > .fc-button:not(:first-child) { + margin-left: -1px; +} + +.fc-button-group > .fc-button:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} + +.fc-button-group > .fc-button:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +/* Popover +--------------------------------------------------------------------------------------------------*/ +.fc-unthemed .fc-popover { + border-width: 1px; + border-style: solid; +} + +/* List View +--------------------------------------------------------------------------------------------------*/ +.fc-unthemed .fc-list-item:hover td { + background-color: #f5f5f5; +} + +/* Toolbar +--------------------------------------------------------------------------------------------------*/ +.fc-toolbar { + display: flex; + justify-content: space-between; + align-items: center; +} + +.fc-toolbar.fc-header-toolbar { + margin-bottom: 1.5em; +} + +.fc-toolbar.fc-footer-toolbar { + margin-top: 1.5em; +} + +/* inner content */ +.fc-toolbar > * > :not(:first-child) { + margin-left: 0.75em; +} + +.fc-toolbar h2 { + font-size: 1.75em; + margin: 0; +} + +/* View Structure +--------------------------------------------------------------------------------------------------*/ +.fc-view-container { + position: relative; +} + +/* undo twitter bootstrap's box-sizing rules. normalizes positioning techniques */ +/* don't do this for the toolbar because we'll want bootstrap to style those buttons as some pt */ +.fc-view-container *, +.fc-view-container *:before, +.fc-view-container *:after { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.fc-view, +.fc-view > table { + /* so dragged elements can be above the view's main element */ + position: relative; + z-index: 1; +} + +@media print { + .fc { + max-width: 100% !important; + } + + /* Global Event Restyling + --------------------------------------------------------------------------------------------------*/ + .fc-event { + background: #fff !important; + color: #000 !important; + page-break-inside: avoid; + } + + .fc-event .fc-resizer { + display: none; + } + + /* Table & Day-Row Restyling + --------------------------------------------------------------------------------------------------*/ + .fc th, +.fc td, +.fc hr, +.fc thead, +.fc tbody, +.fc-row { + border-color: #ccc !important; + background: #fff !important; + } + + /* kill the overlaid, absolutely-positioned components */ + /* common... */ + .fc-bg, +.fc-bgevent-skeleton, +.fc-highlight-skeleton, +.fc-mirror-skeleton, +.fc-bgevent-container, +.fc-business-container, +.fc-highlight-container, +.fc-mirror-container { + display: none; + } + + /* don't force a min-height on rows (for DayGrid) */ + .fc tbody .fc-row { + height: auto !important; + /* undo height that JS set in distributeHeight */ + min-height: 0 !important; + /* undo the min-height from each view's specific stylesheet */ + } + + .fc tbody .fc-row .fc-content-skeleton { + position: static; + /* undo .fc-rigid */ + padding-bottom: 0 !important; + /* use a more border-friendly method for this... */ + } + + .fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td { + /* only works in newer browsers */ + padding-bottom: 1em; + /* ...gives space within the skeleton. also ensures min height in a way */ + } + + .fc tbody .fc-row .fc-content-skeleton table { + /* provides a min-height for the row, but only effective for IE, which exaggerates this value, + making it look more like 3em. for other browers, it will already be this tall */ + height: 1em; + } + + /* Undo month-view event limiting. Display all events and hide the "more" links + --------------------------------------------------------------------------------------------------*/ + .fc-more-cell, +.fc-more { + display: none !important; + } + + .fc tr.fc-limited { + display: table-row !important; + } + + .fc td.fc-limited { + display: table-cell !important; + } + + .fc-popover { + display: none; + /* never display the "more.." popover in print mode */ + } + + /* TimeGrid Restyling + --------------------------------------------------------------------------------------------------*/ + /* undo the min-height 100% trick used to fill the container's height */ + .fc-time-grid { + min-height: 0 !important; + } + + /* don't display the side axis at all ("all-day" and time cells) */ + .fc-timeGrid-view .fc-axis { + display: none; + } + + /* don't display the horizontal lines */ + .fc-slats, +.fc-time-grid hr { + /* this hr is used when height is underused and needs to be filled */ + display: none !important; + /* important overrides inline declaration */ + } + + /* let the container that holds the events be naturally positioned and create real height */ + .fc-time-grid .fc-content-skeleton { + position: static; + } + + /* in case there are no events, we still want some height */ + .fc-time-grid .fc-content-skeleton table { + height: 4em; + } + + /* kill the horizontal spacing made by the event container. event margins will be done below */ + .fc-time-grid .fc-event-container { + margin: 0 !important; + } + + /* TimeGrid *Event* Restyling + --------------------------------------------------------------------------------------------------*/ + /* naturally position events, vertically stacking them */ + .fc-time-grid .fc-event { + position: static !important; + margin: 3px 2px !important; + } + + /* for events that continue to a future day, give the bottom border back */ + .fc-time-grid .fc-event.fc-not-end { + border-bottom-width: 1px !important; + } + + /* indicate the event continues via "..." text */ + .fc-time-grid .fc-event.fc-not-end:after { + content: "..."; + } + + /* for events that are continuations from previous days, give the top border back */ + .fc-time-grid .fc-event.fc-not-start { + border-top-width: 1px !important; + } + + /* indicate the event is a continuation via "..." text */ + .fc-time-grid .fc-event.fc-not-start:before { + content: "..."; + } + + /* time */ + /* undo a previous declaration and let the time text span to a second line */ + .fc-time-grid .fc-event .fc-time { + white-space: normal !important; + } + + /* hide the the time that is normally displayed... */ + .fc-time-grid .fc-event .fc-time span { + display: none; + } + + /* ...replace it with a more verbose version (includes AM/PM) stored in an html attribute */ + .fc-time-grid .fc-event .fc-time:after { + content: attr(data-full); + } + + /* Vertical Scroller & Containers + --------------------------------------------------------------------------------------------------*/ + /* kill the scrollbars and allow natural height */ + .fc-scroller, +.fc-day-grid-container, +.fc-time-grid-container { + /* */ + overflow: visible !important; + height: auto !important; + } + + /* kill the horizontal border/padding used to compensate for scrollbars */ + .fc-row { + border: 0 !important; + margin: 0 !important; + } + + /* Button Controls + --------------------------------------------------------------------------------------------------*/ + .fc-button-group, +.fc button { + display: none; + /* don't display any button-related controls */ + } +} diff --git a/public/resource/assets/libs/fullcalendar/core/main.js b/public/resource/assets/libs/fullcalendar/core/main.js new file mode 100644 index 0000000..ec0808d --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/main.js @@ -0,0 +1,8717 @@ +/*! +FullCalendar Core Package v4.3.1 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (global = global || self, factory(global.FullCalendar = {})); +}(this, function (exports) { 'use strict'; + + // Creating + // ---------------------------------------------------------------------------------------------------------------- + var elementPropHash = { + className: true, + colSpan: true, + rowSpan: true + }; + var containerTagHash = { + '= rect.left && + point.left < rect.right && + point.top >= rect.top && + point.top < rect.bottom; + } + // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false + function intersectRects(rect1, rect2) { + var res = { + left: Math.max(rect1.left, rect2.left), + right: Math.min(rect1.right, rect2.right), + top: Math.max(rect1.top, rect2.top), + bottom: Math.min(rect1.bottom, rect2.bottom) + }; + if (res.left < res.right && res.top < res.bottom) { + return res; + } + return false; + } + function translateRect(rect, deltaX, deltaY) { + return { + left: rect.left + deltaX, + right: rect.right + deltaX, + top: rect.top + deltaY, + bottom: rect.bottom + deltaY + }; + } + // Returns a new point that will have been moved to reside within the given rectangle + function constrainPoint(point, rect) { + return { + left: Math.min(Math.max(point.left, rect.left), rect.right), + top: Math.min(Math.max(point.top, rect.top), rect.bottom) + }; + } + // Returns a point that is the center of the given rectangle + function getRectCenter(rect) { + return { + left: (rect.left + rect.right) / 2, + top: (rect.top + rect.bottom) / 2 + }; + } + // Subtracts point2's coordinates from point1's coordinates, returning a delta + function diffPoints(point1, point2) { + return { + left: point1.left - point2.left, + top: point1.top - point2.top + }; + } + + // Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side + var isRtlScrollbarOnLeft = null; + function getIsRtlScrollbarOnLeft() { + if (isRtlScrollbarOnLeft === null) { + isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft(); + } + return isRtlScrollbarOnLeft; + } + function computeIsRtlScrollbarOnLeft() { + var outerEl = createElement('div', { + style: { + position: 'absolute', + top: -1000, + left: 0, + border: 0, + padding: 0, + overflow: 'scroll', + direction: 'rtl' + } + }, '
'); + document.body.appendChild(outerEl); + var innerEl = outerEl.firstChild; + var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left; + removeElement(outerEl); + return res; + } + // The scrollbar width computations in computeEdges are sometimes flawed when it comes to + // retina displays, rounding, and IE11. Massage them into a usable value. + function sanitizeScrollbarWidth(width) { + width = Math.max(0, width); // no negatives + width = Math.round(width); + return width; + } + + function computeEdges(el, getPadding) { + if (getPadding === void 0) { getPadding = false; } + var computedStyle = window.getComputedStyle(el); + var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0; + var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0; + var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0; + var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0; + // must use offset(Width|Height) because compatible with client(Width|Height) + var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight); + var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom); + var res = { + borderLeft: borderLeft, + borderRight: borderRight, + borderTop: borderTop, + borderBottom: borderBottom, + scrollbarBottom: scrollbarBottom, + scrollbarLeft: 0, + scrollbarRight: 0 + }; + if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side? + res.scrollbarLeft = scrollbarLeftRight; + } + else { + res.scrollbarRight = scrollbarLeftRight; + } + if (getPadding) { + res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0; + res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0; + res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0; + res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0; + } + return res; + } + function computeInnerRect(el, goWithinPadding) { + if (goWithinPadding === void 0) { goWithinPadding = false; } + var outerRect = computeRect(el); + var edges = computeEdges(el, goWithinPadding); + var res = { + left: outerRect.left + edges.borderLeft + edges.scrollbarLeft, + right: outerRect.right - edges.borderRight - edges.scrollbarRight, + top: outerRect.top + edges.borderTop, + bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom + }; + if (goWithinPadding) { + res.left += edges.paddingLeft; + res.right -= edges.paddingRight; + res.top += edges.paddingTop; + res.bottom -= edges.paddingBottom; + } + return res; + } + function computeRect(el) { + var rect = el.getBoundingClientRect(); + return { + left: rect.left + window.pageXOffset, + top: rect.top + window.pageYOffset, + right: rect.right + window.pageXOffset, + bottom: rect.bottom + window.pageYOffset + }; + } + function computeViewportRect() { + return { + left: window.pageXOffset, + right: window.pageXOffset + document.documentElement.clientWidth, + top: window.pageYOffset, + bottom: window.pageYOffset + document.documentElement.clientHeight + }; + } + function computeHeightAndMargins(el) { + return el.getBoundingClientRect().height + computeVMargins(el); + } + function computeVMargins(el) { + var computed = window.getComputedStyle(el); + return parseInt(computed.marginTop, 10) + + parseInt(computed.marginBottom, 10); + } + // does not return window + function getClippingParents(el) { + var parents = []; + while (el instanceof HTMLElement) { // will stop when gets to document or null + var computedStyle = window.getComputedStyle(el); + if (computedStyle.position === 'fixed') { + break; + } + if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) { + parents.push(el); + } + el = el.parentNode; + } + return parents; + } + function computeClippingRect(el) { + return getClippingParents(el) + .map(function (el) { + return computeInnerRect(el); + }) + .concat(computeViewportRect()) + .reduce(function (rect0, rect1) { + return intersectRects(rect0, rect1) || rect1; // should always intersect + }); + } + + // Stops a mouse/touch event from doing it's native browser action + function preventDefault(ev) { + ev.preventDefault(); + } + // Event Delegation + // ---------------------------------------------------------------------------------------------------------------- + function listenBySelector(container, eventType, selector, handler) { + function realHandler(ev) { + var matchedChild = elementClosest(ev.target, selector); + if (matchedChild) { + handler.call(matchedChild, ev, matchedChild); + } + } + container.addEventListener(eventType, realHandler); + return function () { + container.removeEventListener(eventType, realHandler); + }; + } + function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) { + var currentMatchedChild; + return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) { + if (matchedChild !== currentMatchedChild) { + currentMatchedChild = matchedChild; + onMouseEnter(ev, matchedChild); + var realOnMouseLeave_1 = function (ev) { + currentMatchedChild = null; + onMouseLeave(ev, matchedChild); + matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1); + }; + // listen to the next mouseleave, and then unattach + matchedChild.addEventListener('mouseleave', realOnMouseLeave_1); + } + }); + } + // Animation + // ---------------------------------------------------------------------------------------------------------------- + var transitionEventNames = [ + 'webkitTransitionEnd', + 'otransitionend', + 'oTransitionEnd', + 'msTransitionEnd', + 'transitionend' + ]; + // triggered only when the next single subsequent transition finishes + function whenTransitionDone(el, callback) { + var realCallback = function (ev) { + callback(ev); + transitionEventNames.forEach(function (eventName) { + el.removeEventListener(eventName, realCallback); + }); + }; + transitionEventNames.forEach(function (eventName) { + el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes + }); + } + + var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat']; + // Adding + function addWeeks(m, n) { + var a = dateToUtcArray(m); + a[2] += n * 7; + return arrayToUtcDate(a); + } + function addDays(m, n) { + var a = dateToUtcArray(m); + a[2] += n; + return arrayToUtcDate(a); + } + function addMs(m, n) { + var a = dateToUtcArray(m); + a[6] += n; + return arrayToUtcDate(a); + } + // Diffing (all return floats) + function diffWeeks(m0, m1) { + return diffDays(m0, m1) / 7; + } + function diffDays(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24); + } + function diffHours(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60); + } + function diffMinutes(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / (1000 * 60); + } + function diffSeconds(m0, m1) { + return (m1.valueOf() - m0.valueOf()) / 1000; + } + function diffDayAndTime(m0, m1) { + var m0day = startOfDay(m0); + var m1day = startOfDay(m1); + return { + years: 0, + months: 0, + days: Math.round(diffDays(m0day, m1day)), + milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf()) + }; + } + // Diffing Whole Units + function diffWholeWeeks(m0, m1) { + var d = diffWholeDays(m0, m1); + if (d !== null && d % 7 === 0) { + return d / 7; + } + return null; + } + function diffWholeDays(m0, m1) { + if (timeAsMs(m0) === timeAsMs(m1)) { + return Math.round(diffDays(m0, m1)); + } + return null; + } + // Start-Of + function startOfDay(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate() + ]); + } + function startOfHour(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate(), + m.getUTCHours() + ]); + } + function startOfMinute(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate(), + m.getUTCHours(), + m.getUTCMinutes() + ]); + } + function startOfSecond(m) { + return arrayToUtcDate([ + m.getUTCFullYear(), + m.getUTCMonth(), + m.getUTCDate(), + m.getUTCHours(), + m.getUTCMinutes(), + m.getUTCSeconds() + ]); + } + // Week Computation + function weekOfYear(marker, dow, doy) { + var y = marker.getUTCFullYear(); + var w = weekOfGivenYear(marker, y, dow, doy); + if (w < 1) { + return weekOfGivenYear(marker, y - 1, dow, doy); + } + var nextW = weekOfGivenYear(marker, y + 1, dow, doy); + if (nextW >= 1) { + return Math.min(w, nextW); + } + return w; + } + function weekOfGivenYear(marker, year, dow, doy) { + var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]); + var dayStart = startOfDay(marker); + var days = Math.round(diffDays(firstWeekStart, dayStart)); + return Math.floor(days / 7) + 1; // zero-indexed + } + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + // first-week day -- which january is always in the first week (4 for iso, 1 for other) + var fwd = 7 + dow - doy; + // first-week day local weekday -- which local weekday is fwd + var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7; + return -fwdlw + fwd - 1; + } + // Array Conversion + function dateToLocalArray(date) { + return [ + date.getFullYear(), + date.getMonth(), + date.getDate(), + date.getHours(), + date.getMinutes(), + date.getSeconds(), + date.getMilliseconds() + ]; + } + function arrayToLocalDate(a) { + return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month + a[3] || 0, a[4] || 0, a[5] || 0); + } + function dateToUtcArray(date) { + return [ + date.getUTCFullYear(), + date.getUTCMonth(), + date.getUTCDate(), + date.getUTCHours(), + date.getUTCMinutes(), + date.getUTCSeconds(), + date.getUTCMilliseconds() + ]; + } + function arrayToUtcDate(a) { + // according to web standards (and Safari), a month index is required. + // massage if only given a year. + if (a.length === 1) { + a = a.concat([0]); + } + return new Date(Date.UTC.apply(Date, a)); + } + // Other Utils + function isValidDate(m) { + return !isNaN(m.valueOf()); + } + function timeAsMs(m) { + return m.getUTCHours() * 1000 * 60 * 60 + + m.getUTCMinutes() * 1000 * 60 + + m.getUTCSeconds() * 1000 + + m.getUTCMilliseconds(); + } + + var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds']; + var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/; + // Parsing and Creation + function createDuration(input, unit) { + var _a; + if (typeof input === 'string') { + return parseString(input); + } + else if (typeof input === 'object' && input) { // non-null object + return normalizeObject(input); + } + else if (typeof input === 'number') { + return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a)); + } + else { + return null; + } + } + function parseString(s) { + var m = PARSE_RE.exec(s); + if (m) { + var sign = m[1] ? -1 : 1; + return { + years: 0, + months: 0, + days: sign * (m[2] ? parseInt(m[2], 10) : 0), + milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours + (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes + (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds + (m[6] ? parseInt(m[6], 10) : 0) // ms + ) + }; + } + return null; + } + function normalizeObject(obj) { + return { + years: obj.years || obj.year || 0, + months: obj.months || obj.month || 0, + days: (obj.days || obj.day || 0) + + getWeeksFromInput(obj) * 7, + milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours + (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes + (obj.seconds || obj.second || 0) * 1000 + // seconds + (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms + }; + } + function getWeeksFromInput(obj) { + return obj.weeks || obj.week || 0; + } + // Equality + function durationsEqual(d0, d1) { + return d0.years === d1.years && + d0.months === d1.months && + d0.days === d1.days && + d0.milliseconds === d1.milliseconds; + } + function isSingleDay(dur) { + return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0; + } + // Simple Math + function addDurations(d0, d1) { + return { + years: d0.years + d1.years, + months: d0.months + d1.months, + days: d0.days + d1.days, + milliseconds: d0.milliseconds + d1.milliseconds + }; + } + function subtractDurations(d1, d0) { + return { + years: d1.years - d0.years, + months: d1.months - d0.months, + days: d1.days - d0.days, + milliseconds: d1.milliseconds - d0.milliseconds + }; + } + function multiplyDuration(d, n) { + return { + years: d.years * n, + months: d.months * n, + days: d.days * n, + milliseconds: d.milliseconds * n + }; + } + // Conversions + // "Rough" because they are based on average-case Gregorian months/years + function asRoughYears(dur) { + return asRoughDays(dur) / 365; + } + function asRoughMonths(dur) { + return asRoughDays(dur) / 30; + } + function asRoughDays(dur) { + return asRoughMs(dur) / 864e5; + } + function asRoughMinutes(dur) { + return asRoughMs(dur) / (1000 * 60); + } + function asRoughSeconds(dur) { + return asRoughMs(dur) / 1000; + } + function asRoughMs(dur) { + return dur.years * (365 * 864e5) + + dur.months * (30 * 864e5) + + dur.days * 864e5 + + dur.milliseconds; + } + // Advanced Math + function wholeDivideDurations(numerator, denominator) { + var res = null; + for (var i = 0; i < INTERNAL_UNITS.length; i++) { + var unit = INTERNAL_UNITS[i]; + if (denominator[unit]) { + var localRes = numerator[unit] / denominator[unit]; + if (!isInt(localRes) || (res !== null && res !== localRes)) { + return null; + } + res = localRes; + } + else if (numerator[unit]) { + // needs to divide by something but can't! + return null; + } + } + return res; + } + function greatestDurationDenominator(dur, dontReturnWeeks) { + var ms = dur.milliseconds; + if (ms) { + if (ms % 1000 !== 0) { + return { unit: 'millisecond', value: ms }; + } + if (ms % (1000 * 60) !== 0) { + return { unit: 'second', value: ms / 1000 }; + } + if (ms % (1000 * 60 * 60) !== 0) { + return { unit: 'minute', value: ms / (1000 * 60) }; + } + if (ms) { + return { unit: 'hour', value: ms / (1000 * 60 * 60) }; + } + } + if (dur.days) { + if (!dontReturnWeeks && dur.days % 7 === 0) { + return { unit: 'week', value: dur.days / 7 }; + } + return { unit: 'day', value: dur.days }; + } + if (dur.months) { + return { unit: 'month', value: dur.months }; + } + if (dur.years) { + return { unit: 'year', value: dur.years }; + } + return { unit: 'millisecond', value: 0 }; + } + + /* FullCalendar-specific DOM Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + // Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left + // and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that. + function compensateScroll(rowEl, scrollbarWidths) { + if (scrollbarWidths.left) { + applyStyle(rowEl, { + borderLeftWidth: 1, + marginLeft: scrollbarWidths.left - 1 + }); + } + if (scrollbarWidths.right) { + applyStyle(rowEl, { + borderRightWidth: 1, + marginRight: scrollbarWidths.right - 1 + }); + } + } + // Undoes compensateScroll and restores all borders/margins + function uncompensateScroll(rowEl) { + applyStyle(rowEl, { + marginLeft: '', + marginRight: '', + borderLeftWidth: '', + borderRightWidth: '' + }); + } + // Make the mouse cursor express that an event is not allowed in the current area + function disableCursor() { + document.body.classList.add('fc-not-allowed'); + } + // Returns the mouse cursor to its original look + function enableCursor() { + document.body.classList.remove('fc-not-allowed'); + } + // Given a total available height to fill, have `els` (essentially child rows) expand to accomodate. + // By default, all elements that are shorter than the recommended height are expanded uniformly, not considering + // any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and + // reduces the available height. + function distributeHeight(els, availableHeight, shouldRedistribute) { + // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions, + // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars. + var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element + var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE* + var flexEls = []; // elements that are allowed to expand. array of DOM nodes + var flexOffsets = []; // amount of vertical space it takes up + var flexHeights = []; // actual css height + var usedHeight = 0; + undistributeHeight(els); // give all elements their natural height + // find elements that are below the recommended height (expandable). + // important to query for heights in a single first pass (to avoid reflow oscillation). + els.forEach(function (el, i) { + var minOffset = i === els.length - 1 ? minOffset2 : minOffset1; + var naturalHeight = el.getBoundingClientRect().height; + var naturalOffset = naturalHeight + computeVMargins(el); + if (naturalOffset < minOffset) { + flexEls.push(el); + flexOffsets.push(naturalOffset); + flexHeights.push(naturalHeight); + } + else { + // this element stretches past recommended height (non-expandable). mark the space as occupied. + usedHeight += naturalOffset; + } + }); + // readjust the recommended height to only consider the height available to non-maxed-out rows. + if (shouldRedistribute) { + availableHeight -= usedHeight; + minOffset1 = Math.floor(availableHeight / flexEls.length); + minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE* + } + // assign heights to all expandable elements + flexEls.forEach(function (el, i) { + var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1; + var naturalOffset = flexOffsets[i]; + var naturalHeight = flexHeights[i]; + var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding + if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things + el.style.height = newHeight + 'px'; + } + }); + } + // Undoes distrubuteHeight, restoring all els to their natural height + function undistributeHeight(els) { + els.forEach(function (el) { + el.style.height = ''; + }); + } + // Given `els`, a set of cells, find the cell with the largest natural width and set the widths of all the + // cells to be that width. + // PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline + function matchCellWidths(els) { + var maxInnerWidth = 0; + els.forEach(function (el) { + var innerEl = el.firstChild; // hopefully an element + if (innerEl instanceof HTMLElement) { + var innerWidth_1 = innerEl.getBoundingClientRect().width; + if (innerWidth_1 > maxInnerWidth) { + maxInnerWidth = innerWidth_1; + } + } + }); + maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance + els.forEach(function (el) { + el.style.width = maxInnerWidth + 'px'; + }); + return maxInnerWidth; + } + // Given one element that resides inside another, + // Subtracts the height of the inner element from the outer element. + function subtractInnerElHeight(outerEl, innerEl) { + // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked + var reflowStyleProps = { + position: 'relative', + left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll + }; + applyStyle(outerEl, reflowStyleProps); + applyStyle(innerEl, reflowStyleProps); + var diff = // grab the dimensions + outerEl.getBoundingClientRect().height - + innerEl.getBoundingClientRect().height; + // undo hack + var resetStyleProps = { position: '', left: '' }; + applyStyle(outerEl, resetStyleProps); + applyStyle(innerEl, resetStyleProps); + return diff; + } + /* Selection + ----------------------------------------------------------------------------------------------------------------------*/ + function preventSelection(el) { + el.classList.add('fc-unselectable'); + el.addEventListener('selectstart', preventDefault); + } + function allowSelection(el) { + el.classList.remove('fc-unselectable'); + el.removeEventListener('selectstart', preventDefault); + } + /* Context Menu + ----------------------------------------------------------------------------------------------------------------------*/ + function preventContextMenu(el) { + el.addEventListener('contextmenu', preventDefault); + } + function allowContextMenu(el) { + el.removeEventListener('contextmenu', preventDefault); + } + /* Object Ordering by Field + ----------------------------------------------------------------------------------------------------------------------*/ + function parseFieldSpecs(input) { + var specs = []; + var tokens = []; + var i; + var token; + if (typeof input === 'string') { + tokens = input.split(/\s*,\s*/); + } + else if (typeof input === 'function') { + tokens = [input]; + } + else if (Array.isArray(input)) { + tokens = input; + } + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + if (typeof token === 'string') { + specs.push(token.charAt(0) === '-' ? + { field: token.substring(1), order: -1 } : + { field: token, order: 1 }); + } + else if (typeof token === 'function') { + specs.push({ func: token }); + } + } + return specs; + } + function compareByFieldSpecs(obj0, obj1, fieldSpecs) { + var i; + var cmp; + for (i = 0; i < fieldSpecs.length; i++) { + cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]); + if (cmp) { + return cmp; + } + } + return 0; + } + function compareByFieldSpec(obj0, obj1, fieldSpec) { + if (fieldSpec.func) { + return fieldSpec.func(obj0, obj1); + } + return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field]) + * (fieldSpec.order || 1); + } + function flexibleCompare(a, b) { + if (!a && !b) { + return 0; + } + if (b == null) { + return -1; + } + if (a == null) { + return 1; + } + if (typeof a === 'string' || typeof b === 'string') { + return String(a).localeCompare(String(b)); + } + return a - b; + } + /* String Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + function capitaliseFirstLetter(str) { + return str.charAt(0).toUpperCase() + str.slice(1); + } + function padStart(val, len) { + var s = String(val); + return '000'.substr(0, len - s.length) + s; + } + /* Number Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + function compareNumbers(a, b) { + return a - b; + } + function isInt(n) { + return n % 1 === 0; + } + /* Weird Utilities + ----------------------------------------------------------------------------------------------------------------------*/ + function applyAll(functions, thisObj, args) { + if (typeof functions === 'function') { // supplied a single function + functions = [functions]; + } + if (functions) { + var i = void 0; + var ret = void 0; + for (i = 0; i < functions.length; i++) { + ret = functions[i].apply(thisObj, args) || ret; + } + return ret; + } + } + function firstDefined() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + for (var i = 0; i < args.length; i++) { + if (args[i] !== undefined) { + return args[i]; + } + } + } + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + // https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714 + function debounce(func, wait) { + var timeout; + var args; + var context; + var timestamp; + var result; + var later = function () { + var last = new Date().valueOf() - timestamp; + if (last < wait) { + timeout = setTimeout(later, wait - last); + } + else { + timeout = null; + result = func.apply(context, args); + context = args = null; + } + }; + return function () { + context = this; + args = arguments; + timestamp = new Date().valueOf(); + if (!timeout) { + timeout = setTimeout(later, wait); + } + return result; + }; + } + // Number and Boolean are only types that defaults or not computed for + // TODO: write more comments + function refineProps(rawProps, processors, defaults, leftoverProps) { + if (defaults === void 0) { defaults = {}; } + var refined = {}; + for (var key in processors) { + var processor = processors[key]; + if (rawProps[key] !== undefined) { + // found + if (processor === Function) { + refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null; + } + else if (processor) { // a refining function? + refined[key] = processor(rawProps[key]); + } + else { + refined[key] = rawProps[key]; + } + } + else if (defaults[key] !== undefined) { + // there's an explicit default + refined[key] = defaults[key]; + } + else { + // must compute a default + if (processor === String) { + refined[key] = ''; // empty string is default for String + } + else if (!processor || processor === Number || processor === Boolean || processor === Function) { + refined[key] = null; // assign null for other non-custom processor funcs + } + else { + refined[key] = processor(null); // run the custom processor func + } + } + } + if (leftoverProps) { + for (var key in rawProps) { + if (processors[key] === undefined) { + leftoverProps[key] = rawProps[key]; + } + } + } + return refined; + } + /* Date stuff that doesn't belong in datelib core + ----------------------------------------------------------------------------------------------------------------------*/ + // given a timed range, computes an all-day range that has the same exact duration, + // but whose start time is aligned with the start of the day. + function computeAlignedDayRange(timedRange) { + var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1; + var start = startOfDay(timedRange.start); + var end = addDays(start, dayCnt); + return { start: start, end: end }; + } + // given a timed range, computes an all-day range based on how for the end date bleeds into the next day + // TODO: give nextDayThreshold a default arg + function computeVisibleDayRange(timedRange, nextDayThreshold) { + if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); } + var startDay = null; + var endDay = null; + if (timedRange.end) { + endDay = startOfDay(timedRange.end); + var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay` + // If the end time is actually inclusively part of the next day and is equal to or + // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`. + // Otherwise, leaving it as inclusive will cause it to exclude `endDay`. + if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) { + endDay = addDays(endDay, 1); + } + } + if (timedRange.start) { + startDay = startOfDay(timedRange.start); // the beginning of the day the range starts + // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day. + if (endDay && endDay <= startDay) { + endDay = addDays(startDay, 1); + } + } + return { start: startDay, end: endDay }; + } + // spans from one day into another? + function isMultiDayRange(range) { + var visibleRange = computeVisibleDayRange(range); + return diffDays(visibleRange.start, visibleRange.end) > 1; + } + function diffDates(date0, date1, dateEnv, largeUnit) { + if (largeUnit === 'year') { + return createDuration(dateEnv.diffWholeYears(date0, date1), 'year'); + } + else if (largeUnit === 'month') { + return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month'); + } + else { + return diffDayAndTime(date0, date1); // returns a duration + } + } + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) { + for (var i = 0; i < recurringTypes.length; i++) { + var localLeftovers = {}; + var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv); + if (parsed) { + var allDay = localLeftovers.allDay; + delete localLeftovers.allDay; // remove from leftovers + if (allDay == null) { + allDay = allDayDefault; + if (allDay == null) { + allDay = parsed.allDayGuess; + if (allDay == null) { + allDay = false; + } + } + } + __assign(leftovers, localLeftovers); + return { + allDay: allDay, + duration: parsed.duration, + typeData: parsed.typeData, + typeId: i + }; + } + } + return null; + } + /* + Event MUST have a recurringDef + */ + function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) { + var typeDef = recurringTypes[eventDef.recurringDef.typeId]; + var markers = typeDef.expand(eventDef.recurringDef.typeData, { + start: dateEnv.subtract(framingRange.start, duration), + end: framingRange.end + }, dateEnv); + // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to + if (eventDef.allDay) { + markers = markers.map(startOfDay); + } + return markers; + } + + var hasOwnProperty = Object.prototype.hasOwnProperty; + // Merges an array of objects into a single object. + // The second argument allows for an array of property names who's object values will be merged together. + function mergeProps(propObjs, complexProps) { + var dest = {}; + var i; + var name; + var complexObjs; + var j; + var val; + var props; + if (complexProps) { + for (i = 0; i < complexProps.length; i++) { + name = complexProps[i]; + complexObjs = []; + // collect the trailing object values, stopping when a non-object is discovered + for (j = propObjs.length - 1; j >= 0; j--) { + val = propObjs[j][name]; + if (typeof val === 'object' && val) { // non-null object + complexObjs.unshift(val); + } + else if (val !== undefined) { + dest[name] = val; // if there were no objects, this value will be used + break; + } + } + // if the trailing values were objects, use the merged value + if (complexObjs.length) { + dest[name] = mergeProps(complexObjs); + } + } + } + // copy values into the destination, going from last to first + for (i = propObjs.length - 1; i >= 0; i--) { + props = propObjs[i]; + for (name in props) { + if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign + dest[name] = props[name]; + } + } + } + return dest; + } + function filterHash(hash, func) { + var filtered = {}; + for (var key in hash) { + if (func(hash[key], key)) { + filtered[key] = hash[key]; + } + } + return filtered; + } + function mapHash(hash, func) { + var newHash = {}; + for (var key in hash) { + newHash[key] = func(hash[key], key); + } + return newHash; + } + function arrayToHash(a) { + var hash = {}; + for (var _i = 0, a_1 = a; _i < a_1.length; _i++) { + var item = a_1[_i]; + hash[item] = true; + } + return hash; + } + function hashValuesToArray(obj) { + var a = []; + for (var key in obj) { + a.push(obj[key]); + } + return a; + } + function isPropsEqual(obj0, obj1) { + for (var key in obj0) { + if (hasOwnProperty.call(obj0, key)) { + if (!(key in obj1)) { + return false; + } + } + } + for (var key in obj1) { + if (hasOwnProperty.call(obj1, key)) { + if (obj0[key] !== obj1[key]) { + return false; + } + } + } + return true; + } + + function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) { + var eventStore = createEmptyEventStore(); + for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) { + var rawEvent = rawEvents_1[_i]; + var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange); + if (tuple) { + eventTupleToStore(tuple, eventStore); + } + } + return eventStore; + } + function eventTupleToStore(tuple, eventStore) { + if (eventStore === void 0) { eventStore = createEmptyEventStore(); } + eventStore.defs[tuple.def.defId] = tuple.def; + if (tuple.instance) { + eventStore.instances[tuple.instance.instanceId] = tuple.instance; + } + return eventStore; + } + function expandRecurring(eventStore, framingRange, calendar) { + var dateEnv = calendar.dateEnv; + var defs = eventStore.defs, instances = eventStore.instances; + // remove existing recurring instances + instances = filterHash(instances, function (instance) { + return !defs[instance.defId].recurringDef; + }); + for (var defId in defs) { + var def = defs[defId]; + if (def.recurringDef) { + var duration = def.recurringDef.duration; + if (!duration) { + duration = def.allDay ? + calendar.defaultAllDayEventDuration : + calendar.defaultTimedEventDuration; + } + var starts = expandRecurringRanges(def, duration, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes); + for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) { + var start = starts_1[_i]; + var instance = createEventInstance(defId, { + start: start, + end: dateEnv.add(start, duration) + }); + instances[instance.instanceId] = instance; + } + } + } + return { defs: defs, instances: instances }; + } + // retrieves events that have the same groupId as the instance specified by `instanceId` + // or they are the same as the instance. + // why might instanceId not be in the store? an event from another calendar? + function getRelevantEvents(eventStore, instanceId) { + var instance = eventStore.instances[instanceId]; + if (instance) { + var def_1 = eventStore.defs[instance.defId]; + // get events/instances with same group + var newStore = filterEventStoreDefs(eventStore, function (lookDef) { + return isEventDefsGrouped(def_1, lookDef); + }); + // add the original + // TODO: wish we could use eventTupleToStore or something like it + newStore.defs[def_1.defId] = def_1; + newStore.instances[instance.instanceId] = instance; + return newStore; + } + return createEmptyEventStore(); + } + function isEventDefsGrouped(def0, def1) { + return Boolean(def0.groupId && def0.groupId === def1.groupId); + } + function transformRawEvents(rawEvents, eventSource, calendar) { + var calEachTransform = calendar.opt('eventDataTransform'); + var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null; + if (sourceEachTransform) { + rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform); + } + if (calEachTransform) { + rawEvents = transformEachRawEvent(rawEvents, calEachTransform); + } + return rawEvents; + } + function transformEachRawEvent(rawEvents, func) { + var refinedEvents; + if (!func) { + refinedEvents = rawEvents; + } + else { + refinedEvents = []; + for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) { + var rawEvent = rawEvents_2[_i]; + var refinedEvent = func(rawEvent); + if (refinedEvent) { + refinedEvents.push(refinedEvent); + } + else if (refinedEvent == null) { + refinedEvents.push(rawEvent); + } // if a different falsy value, do nothing + } + } + return refinedEvents; + } + function createEmptyEventStore() { + return { defs: {}, instances: {} }; + } + function mergeEventStores(store0, store1) { + return { + defs: __assign({}, store0.defs, store1.defs), + instances: __assign({}, store0.instances, store1.instances) + }; + } + function filterEventStoreDefs(eventStore, filterFunc) { + var defs = filterHash(eventStore.defs, filterFunc); + var instances = filterHash(eventStore.instances, function (instance) { + return defs[instance.defId]; // still exists? + }); + return { defs: defs, instances: instances }; + } + + function parseRange(input, dateEnv) { + var start = null; + var end = null; + if (input.start) { + start = dateEnv.createMarker(input.start); + } + if (input.end) { + end = dateEnv.createMarker(input.end); + } + if (!start && !end) { + return null; + } + if (start && end && end < start) { + return null; + } + return { start: start, end: end }; + } + // SIDE-EFFECT: will mutate ranges. + // Will return a new array result. + function invertRanges(ranges, constraintRange) { + var invertedRanges = []; + var start = constraintRange.start; // the end of the previous range. the start of the new range + var i; + var dateRange; + // ranges need to be in order. required for our date-walking algorithm + ranges.sort(compareRanges); + for (i = 0; i < ranges.length; i++) { + dateRange = ranges[i]; + // add the span of time before the event (if there is any) + if (dateRange.start > start) { // compare millisecond time (skip any ambig logic) + invertedRanges.push({ start: start, end: dateRange.start }); + } + if (dateRange.end > start) { + start = dateRange.end; + } + } + // add the span of time after the last event (if there is any) + if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic) + invertedRanges.push({ start: start, end: constraintRange.end }); + } + return invertedRanges; + } + function compareRanges(range0, range1) { + return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first + } + function intersectRanges(range0, range1) { + var start = range0.start; + var end = range0.end; + var newRange = null; + if (range1.start !== null) { + if (start === null) { + start = range1.start; + } + else { + start = new Date(Math.max(start.valueOf(), range1.start.valueOf())); + } + } + if (range1.end != null) { + if (end === null) { + end = range1.end; + } + else { + end = new Date(Math.min(end.valueOf(), range1.end.valueOf())); + } + } + if (start === null || end === null || start < end) { + newRange = { start: start, end: end }; + } + return newRange; + } + function rangesEqual(range0, range1) { + return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) && + (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf()); + } + function rangesIntersect(range0, range1) { + return (range0.end === null || range1.start === null || range0.end > range1.start) && + (range0.start === null || range1.end === null || range0.start < range1.end); + } + function rangeContainsRange(outerRange, innerRange) { + return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) && + (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end)); + } + function rangeContainsMarker(range, date) { + return (range.start === null || date >= range.start) && + (range.end === null || date < range.end); + } + // If the given date is not within the given range, move it inside. + // (If it's past the end, make it one millisecond before the end). + function constrainMarkerToRange(date, range) { + if (range.start != null && date < range.start) { + return range.start; + } + if (range.end != null && date >= range.end) { + return new Date(range.end.valueOf() - 1); + } + return date; + } + + function removeExact(array, exactVal) { + var removeCnt = 0; + var i = 0; + while (i < array.length) { + if (array[i] === exactVal) { + array.splice(i, 1); + removeCnt++; + } + else { + i++; + } + } + return removeCnt; + } + function isArraysEqual(a0, a1) { + var len = a0.length; + var i; + if (len !== a1.length) { // not array? or not same length? + return false; + } + for (i = 0; i < len; i++) { + if (a0[i] !== a1[i]) { + return false; + } + } + return true; + } + + function memoize(workerFunc) { + var args; + var res; + return function () { + if (!args || !isArraysEqual(args, arguments)) { + args = arguments; + res = workerFunc.apply(this, arguments); + } + return res; + }; + } + /* + always executes the workerFunc, but if the result is equal to the previous result, + return the previous result instead. + */ + function memoizeOutput(workerFunc, equalityFunc) { + var cachedRes = null; + return function () { + var newRes = workerFunc.apply(this, arguments); + if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) { + cachedRes = newRes; + } + return cachedRes; + }; + } + + var EXTENDED_SETTINGS_AND_SEVERITIES = { + week: 3, + separator: 0, + omitZeroMinute: 0, + meridiem: 0, + omitCommas: 0 + }; + var STANDARD_DATE_PROP_SEVERITIES = { + timeZoneName: 7, + era: 6, + year: 5, + month: 4, + day: 2, + weekday: 2, + hour: 1, + minute: 1, + second: 1 + }; + var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too + var COMMA_RE = /,/g; // we need re for globalness + var MULTI_SPACE_RE = /\s+/g; + var LTR_RE = /\u200e/g; // control character + var UTC_RE = /UTC|GMT/; + var NativeFormatter = /** @class */ (function () { + function NativeFormatter(formatSettings) { + var standardDateProps = {}; + var extendedSettings = {}; + var severity = 0; + for (var name_1 in formatSettings) { + if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) { + extendedSettings[name_1] = formatSettings[name_1]; + severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity); + } + else { + standardDateProps[name_1] = formatSettings[name_1]; + if (name_1 in STANDARD_DATE_PROP_SEVERITIES) { + severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity); + } + } + } + this.standardDateProps = standardDateProps; + this.extendedSettings = extendedSettings; + this.severity = severity; + this.buildFormattingFunc = memoize(buildFormattingFunc); + } + NativeFormatter.prototype.format = function (date, context) { + return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date); + }; + NativeFormatter.prototype.formatRange = function (start, end, context) { + var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings; + var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem); + if (!diffSeverity) { + return this.format(start, context); + } + var biggestUnitForPartial = diffSeverity; + if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time + (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') && + (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') && + (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) { + biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time + } + var full0 = this.format(start, context); + var full1 = this.format(end, context); + if (full0 === full1) { + return full0; + } + var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial); + var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context); + var partial0 = partialFormattingFunc(start); + var partial1 = partialFormattingFunc(end); + var insertion = findCommonInsertion(full0, partial0, full1, partial1); + var separator = extendedSettings.separator || ''; + if (insertion) { + return insertion.before + partial0 + separator + partial1 + insertion.after; + } + return full0 + separator + full1; + }; + NativeFormatter.prototype.getLargestUnit = function () { + switch (this.severity) { + case 7: + case 6: + case 5: + return 'year'; + case 4: + return 'month'; + case 3: + return 'week'; + default: + return 'day'; + } + }; + return NativeFormatter; + }()); + function buildFormattingFunc(standardDateProps, extendedSettings, context) { + var standardDatePropCnt = Object.keys(standardDateProps).length; + if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') { + return function (date) { + return formatTimeZoneOffset(date.timeZoneOffset); + }; + } + if (standardDatePropCnt === 0 && extendedSettings.week) { + return function (date) { + return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week); + }; + } + return buildNativeFormattingFunc(standardDateProps, extendedSettings, context); + } + function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) { + standardDateProps = __assign({}, standardDateProps); // copy + extendedSettings = __assign({}, extendedSettings); // copy + sanitizeSettings(standardDateProps, extendedSettings); + standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers + var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps); + var zeroFormat; // needed? + if (extendedSettings.omitZeroMinute) { + var zeroProps = __assign({}, standardDateProps); + delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings + zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps); + } + return function (date) { + var marker = date.marker; + var format; + if (zeroFormat && !marker.getUTCMinutes()) { + format = zeroFormat; + } + else { + format = normalFormat; + } + var s = format.format(marker); + return postProcess(s, date, standardDateProps, extendedSettings, context); + }; + } + function sanitizeSettings(standardDateProps, extendedSettings) { + // deal with a browser inconsistency where formatting the timezone + // requires that the hour/minute be present. + if (standardDateProps.timeZoneName) { + if (!standardDateProps.hour) { + standardDateProps.hour = '2-digit'; + } + if (!standardDateProps.minute) { + standardDateProps.minute = '2-digit'; + } + } + // only support short timezone names + if (standardDateProps.timeZoneName === 'long') { + standardDateProps.timeZoneName = 'short'; + } + // if requesting to display seconds, MUST display minutes + if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) { + delete extendedSettings.omitZeroMinute; + } + } + function postProcess(s, date, standardDateProps, extendedSettings, context) { + s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes + if (standardDateProps.timeZoneName === 'short') { + s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ? + 'UTC' : // important to normalize for IE, which does "GMT" + formatTimeZoneOffset(date.timeZoneOffset)); + } + if (extendedSettings.omitCommas) { + s = s.replace(COMMA_RE, '').trim(); + } + if (extendedSettings.omitZeroMinute) { + s = s.replace(':00', ''); // zeroFormat doesn't always achieve this + } + // ^ do anything that might create adjacent spaces before this point, + // because MERIDIEM_RE likes to eat up loading spaces + if (extendedSettings.meridiem === false) { + s = s.replace(MERIDIEM_RE, '').trim(); + } + else if (extendedSettings.meridiem === 'narrow') { // a/p + s = s.replace(MERIDIEM_RE, function (m0, m1) { + return m1.toLocaleLowerCase(); + }); + } + else if (extendedSettings.meridiem === 'short') { // am/pm + s = s.replace(MERIDIEM_RE, function (m0, m1) { + return m1.toLocaleLowerCase() + 'm'; + }); + } + else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase + s = s.replace(MERIDIEM_RE, function (m0) { + return m0.toLocaleLowerCase(); + }); + } + s = s.replace(MULTI_SPACE_RE, ' '); + s = s.trim(); + return s; + } + function injectTzoStr(s, tzoStr) { + var replaced = false; + s = s.replace(UTC_RE, function () { + replaced = true; + return tzoStr; + }); + // IE11 doesn't include UTC/GMT in the original string, so append to end + if (!replaced) { + s += ' ' + tzoStr; + } + return s; + } + function formatWeekNumber(num, weekLabel, locale, display) { + var parts = []; + if (display === 'narrow') { + parts.push(weekLabel); + } + else if (display === 'short') { + parts.push(weekLabel, ' '); + } + // otherwise, considered 'numeric' + parts.push(locale.simpleNumberFormat.format(num)); + if (locale.options.isRtl) { // TODO: use control characters instead? + parts.reverse(); + } + return parts.join(''); + } + // Range Formatting Utils + // 0 = exactly the same + // 1 = different by time + // and bigger + function computeMarkerDiffSeverity(d0, d1, ca) { + if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) { + return 5; + } + if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) { + return 4; + } + if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) { + return 2; + } + if (timeAsMs(d0) !== timeAsMs(d1)) { + return 1; + } + return 0; + } + function computePartialFormattingOptions(options, biggestUnit) { + var partialOptions = {}; + for (var name_2 in options) { + if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone) + STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) { + partialOptions[name_2] = options[name_2]; + } + } + return partialOptions; + } + function findCommonInsertion(full0, partial0, full1, partial1) { + var i0 = 0; + while (i0 < full0.length) { + var found0 = full0.indexOf(partial0, i0); + if (found0 === -1) { + break; + } + var before0 = full0.substr(0, found0); + i0 = found0 + partial0.length; + var after0 = full0.substr(i0); + var i1 = 0; + while (i1 < full1.length) { + var found1 = full1.indexOf(partial1, i1); + if (found1 === -1) { + break; + } + var before1 = full1.substr(0, found1); + i1 = found1 + partial1.length; + var after1 = full1.substr(i1); + if (before0 === before1 && after0 === after1) { + return { + before: before0, + after: after0 + }; + } + } + } + return null; + } + + /* + TODO: fix the terminology of "formatter" vs "formatting func" + */ + /* + At the time of instantiation, this object does not know which cmd-formatting system it will use. + It receives this at the time of formatting, as a setting. + */ + var CmdFormatter = /** @class */ (function () { + function CmdFormatter(cmdStr, separator) { + this.cmdStr = cmdStr; + this.separator = separator; + } + CmdFormatter.prototype.format = function (date, context) { + return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator)); + }; + CmdFormatter.prototype.formatRange = function (start, end, context) { + return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator)); + }; + return CmdFormatter; + }()); + + var FuncFormatter = /** @class */ (function () { + function FuncFormatter(func) { + this.func = func; + } + FuncFormatter.prototype.format = function (date, context) { + return this.func(createVerboseFormattingArg(date, null, context)); + }; + FuncFormatter.prototype.formatRange = function (start, end, context) { + return this.func(createVerboseFormattingArg(start, end, context)); + }; + return FuncFormatter; + }()); + + // Formatter Object Creation + function createFormatter(input, defaultSeparator) { + if (typeof input === 'object' && input) { // non-null object + if (typeof defaultSeparator === 'string') { + input = __assign({ separator: defaultSeparator }, input); + } + return new NativeFormatter(input); + } + else if (typeof input === 'string') { + return new CmdFormatter(input, defaultSeparator); + } + else if (typeof input === 'function') { + return new FuncFormatter(input); + } + } + // String Utils + // timeZoneOffset is in minutes + function buildIsoString(marker, timeZoneOffset, stripZeroTime) { + if (stripZeroTime === void 0) { stripZeroTime = false; } + var s = marker.toISOString(); + s = s.replace('.000', ''); + if (stripZeroTime) { + s = s.replace('T00:00:00Z', ''); + } + if (s.length > 10) { // time part wasn't stripped, can add timezone info + if (timeZoneOffset == null) { + s = s.replace('Z', ''); + } + else if (timeZoneOffset !== 0) { + s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true)); + } + // otherwise, its UTC-0 and we want to keep the Z + } + return s; + } + function formatIsoTimeString(marker) { + return padStart(marker.getUTCHours(), 2) + ':' + + padStart(marker.getUTCMinutes(), 2) + ':' + + padStart(marker.getUTCSeconds(), 2); + } + function formatTimeZoneOffset(minutes, doIso) { + if (doIso === void 0) { doIso = false; } + var sign = minutes < 0 ? '-' : '+'; + var abs = Math.abs(minutes); + var hours = Math.floor(abs / 60); + var mins = Math.round(abs % 60); + if (doIso) { + return sign + padStart(hours, 2) + ':' + padStart(mins, 2); + } + else { + return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : ''); + } + } + // Arg Utils + function createVerboseFormattingArg(start, end, context, separator) { + var startInfo = expandZonedMarker(start, context.calendarSystem); + var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null; + return { + date: startInfo, + start: startInfo, + end: endInfo, + timeZone: context.timeZone, + localeCodes: context.locale.codes, + separator: separator + }; + } + function expandZonedMarker(dateInfo, calendarSystem) { + var a = calendarSystem.markerToArray(dateInfo.marker); + return { + marker: dateInfo.marker, + timeZoneOffset: dateInfo.timeZoneOffset, + array: a, + year: a[0], + month: a[1], + day: a[2], + hour: a[3], + minute: a[4], + second: a[5], + millisecond: a[6] + }; + } + + var EventSourceApi = /** @class */ (function () { + function EventSourceApi(calendar, internalEventSource) { + this.calendar = calendar; + this.internalEventSource = internalEventSource; + } + EventSourceApi.prototype.remove = function () { + this.calendar.dispatch({ + type: 'REMOVE_EVENT_SOURCE', + sourceId: this.internalEventSource.sourceId + }); + }; + EventSourceApi.prototype.refetch = function () { + this.calendar.dispatch({ + type: 'FETCH_EVENT_SOURCES', + sourceIds: [this.internalEventSource.sourceId] + }); + }; + Object.defineProperty(EventSourceApi.prototype, "id", { + get: function () { + return this.internalEventSource.publicId; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventSourceApi.prototype, "url", { + // only relevant to json-feed event sources + get: function () { + return this.internalEventSource.meta.url; + }, + enumerable: true, + configurable: true + }); + return EventSourceApi; + }()); + + var EventApi = /** @class */ (function () { + function EventApi(calendar, def, instance) { + this._calendar = calendar; + this._def = def; + this._instance = instance || null; + } + /* + TODO: make event struct more responsible for this + */ + EventApi.prototype.setProp = function (name, val) { + var _a, _b; + if (name in DATE_PROPS) ; + else if (name in NON_DATE_PROPS) { + if (typeof NON_DATE_PROPS[name] === 'function') { + val = NON_DATE_PROPS[name](val); + } + this.mutate({ + standardProps: (_a = {}, _a[name] = val, _a) + }); + } + else if (name in UNSCOPED_EVENT_UI_PROPS) { + var ui = void 0; + if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') { + val = UNSCOPED_EVENT_UI_PROPS[name](val); + } + if (name === 'color') { + ui = { backgroundColor: val, borderColor: val }; + } + else if (name === 'editable') { + ui = { startEditable: val, durationEditable: val }; + } + else { + ui = (_b = {}, _b[name] = val, _b); + } + this.mutate({ + standardProps: { ui: ui } + }); + } + }; + EventApi.prototype.setExtendedProp = function (name, val) { + var _a; + this.mutate({ + extendedProps: (_a = {}, _a[name] = val, _a) + }); + }; + EventApi.prototype.setStart = function (startInput, options) { + if (options === void 0) { options = {}; } + var dateEnv = this._calendar.dateEnv; + var start = dateEnv.createMarker(startInput); + if (start && this._instance) { // TODO: warning if parsed bad + var instanceRange = this._instance.range; + var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!? + if (options.maintainDuration) { + this.mutate({ datesDelta: startDelta }); + } + else { + this.mutate({ startDelta: startDelta }); + } + } + }; + EventApi.prototype.setEnd = function (endInput, options) { + if (options === void 0) { options = {}; } + var dateEnv = this._calendar.dateEnv; + var end; + if (endInput != null) { + end = dateEnv.createMarker(endInput); + if (!end) { + return; // TODO: warning if parsed bad + } + } + if (this._instance) { + if (end) { + var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity); + this.mutate({ endDelta: endDelta }); + } + else { + this.mutate({ standardProps: { hasEnd: false } }); + } + } + }; + EventApi.prototype.setDates = function (startInput, endInput, options) { + if (options === void 0) { options = {}; } + var dateEnv = this._calendar.dateEnv; + var standardProps = { allDay: options.allDay }; + var start = dateEnv.createMarker(startInput); + var end; + if (!start) { + return; // TODO: warning if parsed bad + } + if (endInput != null) { + end = dateEnv.createMarker(endInput); + if (!end) { // TODO: warning if parsed bad + return; + } + } + if (this._instance) { + var instanceRange = this._instance.range; + // when computing the diff for an event being converted to all-day, + // compute diff off of the all-day values the way event-mutation does. + if (options.allDay === true) { + instanceRange = computeAlignedDayRange(instanceRange); + } + var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); + if (end) { + var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity); + if (durationsEqual(startDelta, endDelta)) { + this.mutate({ datesDelta: startDelta, standardProps: standardProps }); + } + else { + this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps }); + } + } + else { // means "clear the end" + standardProps.hasEnd = false; + this.mutate({ datesDelta: startDelta, standardProps: standardProps }); + } + } + }; + EventApi.prototype.moveStart = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // TODO: warning if parsed bad + this.mutate({ startDelta: delta }); + } + }; + EventApi.prototype.moveEnd = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // TODO: warning if parsed bad + this.mutate({ endDelta: delta }); + } + }; + EventApi.prototype.moveDates = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // TODO: warning if parsed bad + this.mutate({ datesDelta: delta }); + } + }; + EventApi.prototype.setAllDay = function (allDay, options) { + if (options === void 0) { options = {}; } + var standardProps = { allDay: allDay }; + var maintainDuration = options.maintainDuration; + if (maintainDuration == null) { + maintainDuration = this._calendar.opt('allDayMaintainDuration'); + } + if (this._def.allDay !== allDay) { + standardProps.hasEnd = maintainDuration; + } + this.mutate({ standardProps: standardProps }); + }; + EventApi.prototype.formatRange = function (formatInput) { + var dateEnv = this._calendar.dateEnv; + var instance = this._instance; + var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator')); + if (this._def.hasEnd) { + return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, { + forcedStartTzo: instance.forcedStartTzo, + forcedEndTzo: instance.forcedEndTzo + }); + } + else { + return dateEnv.format(instance.range.start, formatter, { + forcedTzo: instance.forcedStartTzo + }); + } + }; + EventApi.prototype.mutate = function (mutation) { + var def = this._def; + var instance = this._instance; + if (instance) { + this._calendar.dispatch({ + type: 'MUTATE_EVENTS', + instanceId: instance.instanceId, + mutation: mutation, + fromApi: true + }); + var eventStore = this._calendar.state.eventStore; + this._def = eventStore.defs[def.defId]; + this._instance = eventStore.instances[instance.instanceId]; + } + }; + EventApi.prototype.remove = function () { + this._calendar.dispatch({ + type: 'REMOVE_EVENT_DEF', + defId: this._def.defId + }); + }; + Object.defineProperty(EventApi.prototype, "source", { + get: function () { + var sourceId = this._def.sourceId; + if (sourceId) { + return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]); + } + return null; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "start", { + get: function () { + return this._instance ? + this._calendar.dateEnv.toDate(this._instance.range.start) : + null; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "end", { + get: function () { + return (this._instance && this._def.hasEnd) ? + this._calendar.dateEnv.toDate(this._instance.range.end) : + null; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "id", { + // computable props that all access the def + // TODO: find a TypeScript-compatible way to do this at scale + get: function () { return this._def.publicId; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "groupId", { + get: function () { return this._def.groupId; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "allDay", { + get: function () { return this._def.allDay; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "title", { + get: function () { return this._def.title; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "url", { + get: function () { return this._def.url; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "rendering", { + get: function () { return this._def.rendering; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "startEditable", { + get: function () { return this._def.ui.startEditable; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "durationEditable", { + get: function () { return this._def.ui.durationEditable; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "constraint", { + get: function () { return this._def.ui.constraints[0] || null; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "overlap", { + get: function () { return this._def.ui.overlap; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "allow", { + get: function () { return this._def.ui.allows[0] || null; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "backgroundColor", { + get: function () { return this._def.ui.backgroundColor; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "borderColor", { + get: function () { return this._def.ui.borderColor; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "textColor", { + get: function () { return this._def.ui.textColor; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "classNames", { + // NOTE: user can't modify these because Object.freeze was called in event-def parsing + get: function () { return this._def.ui.classNames; }, + enumerable: true, + configurable: true + }); + Object.defineProperty(EventApi.prototype, "extendedProps", { + get: function () { return this._def.extendedProps; }, + enumerable: true, + configurable: true + }); + return EventApi; + }()); + + /* + Specifying nextDayThreshold signals that all-day ranges should be sliced. + */ + function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) { + var inverseBgByGroupId = {}; + var inverseBgByDefId = {}; + var defByGroupId = {}; + var bgRanges = []; + var fgRanges = []; + var eventUis = compileEventUis(eventStore.defs, eventUiBases); + for (var defId in eventStore.defs) { + var def = eventStore.defs[defId]; + if (def.rendering === 'inverse-background') { + if (def.groupId) { + inverseBgByGroupId[def.groupId] = []; + if (!defByGroupId[def.groupId]) { + defByGroupId[def.groupId] = def; + } + } + else { + inverseBgByDefId[defId] = []; + } + } + } + for (var instanceId in eventStore.instances) { + var instance = eventStore.instances[instanceId]; + var def = eventStore.defs[instance.defId]; + var ui = eventUis[def.defId]; + var origRange = instance.range; + var normalRange = (!def.allDay && nextDayThreshold) ? + computeVisibleDayRange(origRange, nextDayThreshold) : + origRange; + var slicedRange = intersectRanges(normalRange, framingRange); + if (slicedRange) { + if (def.rendering === 'inverse-background') { + if (def.groupId) { + inverseBgByGroupId[def.groupId].push(slicedRange); + } + else { + inverseBgByDefId[instance.defId].push(slicedRange); + } + } + else { + (def.rendering === 'background' ? bgRanges : fgRanges).push({ + def: def, + ui: ui, + instance: instance, + range: slicedRange, + isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(), + isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf() + }); + } + } + } + for (var groupId in inverseBgByGroupId) { // BY GROUP + var ranges = inverseBgByGroupId[groupId]; + var invertedRanges = invertRanges(ranges, framingRange); + for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) { + var invertedRange = invertedRanges_1[_i]; + var def = defByGroupId[groupId]; + var ui = eventUis[def.defId]; + bgRanges.push({ + def: def, + ui: ui, + instance: null, + range: invertedRange, + isStart: false, + isEnd: false + }); + } + } + for (var defId in inverseBgByDefId) { + var ranges = inverseBgByDefId[defId]; + var invertedRanges = invertRanges(ranges, framingRange); + for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) { + var invertedRange = invertedRanges_2[_a]; + bgRanges.push({ + def: eventStore.defs[defId], + ui: eventUis[defId], + instance: null, + range: invertedRange, + isStart: false, + isEnd: false + }); + } + } + return { bg: bgRanges, fg: fgRanges }; + } + function hasBgRendering(def) { + return def.rendering === 'background' || def.rendering === 'inverse-background'; + } + function filterSegsViaEls(view, segs, isMirror) { + if (view.hasPublicHandlers('eventRender')) { + segs = segs.filter(function (seg) { + var custom = view.publiclyTrigger('eventRender', [ + { + event: new EventApi(view.calendar, seg.eventRange.def, seg.eventRange.instance), + isMirror: isMirror, + isStart: seg.isStart, + isEnd: seg.isEnd, + // TODO: include seg.range once all components consistently generate it + el: seg.el, + view: view + } + ]); + if (custom === false) { // means don't render at all + return false; + } + else if (custom && custom !== true) { + seg.el = custom; + } + return true; + }); + } + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + setElSeg(seg.el, seg); + } + return segs; + } + function setElSeg(el, seg) { + el.fcSeg = seg; + } + function getElSeg(el) { + return el.fcSeg || null; + } + // event ui computation + function compileEventUis(eventDefs, eventUiBases) { + return mapHash(eventDefs, function (eventDef) { + return compileEventUi(eventDef, eventUiBases); + }); + } + function compileEventUi(eventDef, eventUiBases) { + var uis = []; + if (eventUiBases['']) { + uis.push(eventUiBases['']); + } + if (eventUiBases[eventDef.defId]) { + uis.push(eventUiBases[eventDef.defId]); + } + uis.push(eventDef.ui); + return combineEventUis(uis); + } + + // applies the mutation to ALL defs/instances within the event store + function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) { + var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase); + var dest = createEmptyEventStore(); + for (var defId in eventStore.defs) { + var def = eventStore.defs[defId]; + dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar); + } + for (var instanceId in eventStore.instances) { + var instance = eventStore.instances[instanceId]; + var def = dest.defs[instance.defId]; // important to grab the newly modified def + dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar); + } + return dest; + } + function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) { + var standardProps = mutation.standardProps || {}; + // if hasEnd has not been specified, guess a good value based on deltas. + // if duration will change, there's no way the default duration will persist, + // and thus, we need to mark the event as having a real end + if (standardProps.hasEnd == null && + eventConfig.durationEditable && + (mutation.startDelta || mutation.endDelta)) { + standardProps.hasEnd = true; // TODO: is this mutation okay? + } + var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) }); + if (mutation.extendedProps) { + copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps); + } + for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) { + var applier = appliers_1[_i]; + applier(copy, mutation, calendar); + } + if (!copy.hasEnd && calendar.opt('forceEventDuration')) { + copy.hasEnd = true; + } + return copy; + } + function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef + eventConfig, mutation, calendar) { + var dateEnv = calendar.dateEnv; + var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true; + var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false; + var copy = __assign({}, eventInstance); + if (forceAllDay) { + copy.range = computeAlignedDayRange(copy.range); + } + if (mutation.datesDelta && eventConfig.startEditable) { + copy.range = { + start: dateEnv.add(copy.range.start, mutation.datesDelta), + end: dateEnv.add(copy.range.end, mutation.datesDelta) + }; + } + if (mutation.startDelta && eventConfig.durationEditable) { + copy.range = { + start: dateEnv.add(copy.range.start, mutation.startDelta), + end: copy.range.end + }; + } + if (mutation.endDelta && eventConfig.durationEditable) { + copy.range = { + start: copy.range.start, + end: dateEnv.add(copy.range.end, mutation.endDelta) + }; + } + if (clearEnd) { + copy.range = { + start: copy.range.start, + end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start) + }; + } + // in case event was all-day but the supplied deltas were not + // better util for this? + if (eventDef.allDay) { + copy.range = { + start: startOfDay(copy.range.start), + end: startOfDay(copy.range.end) + }; + } + // handle invalid durations + if (copy.range.end < copy.range.start) { + copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start); + } + return copy; + } + + function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) { + switch (action.type) { + case 'RECEIVE_EVENTS': // raw + return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar); + case 'ADD_EVENTS': // already parsed, but not expanded + return addEvent(eventStore, action.eventStore, // new ones + dateProfile ? dateProfile.activeRange : null, calendar); + case 'MERGE_EVENTS': // already parsed and expanded + return mergeEventStores(eventStore, action.eventStore); + case 'PREV': // TODO: how do we track all actions that affect dateProfile :( + case 'NEXT': + case 'SET_DATE': + case 'SET_VIEW_TYPE': + if (dateProfile) { + return expandRecurring(eventStore, dateProfile.activeRange, calendar); + } + else { + return eventStore; + } + case 'CHANGE_TIMEZONE': + return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv); + case 'MUTATE_EVENTS': + return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar); + case 'REMOVE_EVENT_INSTANCES': + return excludeInstances(eventStore, action.instances); + case 'REMOVE_EVENT_DEF': + return filterEventStoreDefs(eventStore, function (eventDef) { + return eventDef.defId !== action.defId; + }); + case 'REMOVE_EVENT_SOURCE': + return excludeEventsBySourceId(eventStore, action.sourceId); + case 'REMOVE_ALL_EVENT_SOURCES': + return filterEventStoreDefs(eventStore, function (eventDef) { + return !eventDef.sourceId; // only keep events with no source id + }); + case 'REMOVE_ALL_EVENTS': + return createEmptyEventStore(); + case 'RESET_EVENTS': + return { + defs: eventStore.defs, + instances: eventStore.instances + }; + default: + return eventStore; + } + } + function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) { + if (eventSource && // not already removed + fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources + ) { + var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar); + if (fetchRange) { + subset = expandRecurring(subset, fetchRange, calendar); + } + return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset); + } + return eventStore; + } + function addEvent(eventStore, subset, expandRange, calendar) { + if (expandRange) { + subset = expandRecurring(subset, expandRange, calendar); + } + return mergeEventStores(eventStore, subset); + } + function rezoneDates(eventStore, oldDateEnv, newDateEnv) { + var defs = eventStore.defs; + var instances = mapHash(eventStore.instances, function (instance) { + var def = defs[instance.defId]; + if (def.allDay || def.recurringDef) { + return instance; // isn't dependent on timezone + } + else { + return __assign({}, instance, { range: { + start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)), + end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo)) + }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo }); + } + }); + return { defs: defs, instances: instances }; + } + function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) { + var relevant = getRelevantEvents(eventStore, instanceId); + var eventConfigBase = fromApi ? + { '': { + startEditable: true, + durationEditable: true, + constraints: [], + overlap: null, + allows: [], + backgroundColor: '', + borderColor: '', + textColor: '', + classNames: [] + } } : + calendar.eventUiBases; + relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar); + return mergeEventStores(eventStore, relevant); + } + function excludeEventsBySourceId(eventStore, sourceId) { + return filterEventStoreDefs(eventStore, function (eventDef) { + return eventDef.sourceId !== sourceId; + }); + } + // QUESTION: why not just return instances? do a general object-property-exclusion util + function excludeInstances(eventStore, removals) { + return { + defs: eventStore.defs, + instances: filterHash(eventStore.instances, function (instance) { + return !removals[instance.instanceId]; + }) + }; + } + + // high-level segmenting-aware tester functions + // ------------------------------------------------------------------------------------------------------------------------ + function isInteractionValid(interaction, calendar) { + return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions + } + function isDateSelectionValid(dateSelection, calendar) { + return isNewPropsValid({ dateSelection: dateSelection }, calendar); + } + function isNewPropsValid(newProps, calendar) { + var view = calendar.view; + var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps); + return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar); + } + function isPropsValid(state, calendar, dateSpanMeta, filterConfig) { + if (dateSpanMeta === void 0) { dateSpanMeta = {}; } + if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) { + return false; + } + if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) { + return false; + } + return true; + } + // Moving Event Validation + // ------------------------------------------------------------------------------------------------------------------------ + function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) { + var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions + var subjectEventStore = interaction.mutatedEvents; + var subjectDefs = subjectEventStore.defs; + var subjectInstances = subjectEventStore.instances; + var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ? + state.eventUiBases : + { '': calendar.selectionConfig } // if not a real event, validate as a selection + ); + if (filterConfig) { + subjectConfigs = mapHash(subjectConfigs, filterConfig); + } + var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too? + var otherDefs = otherEventStore.defs; + var otherInstances = otherEventStore.instances; + var otherConfigs = compileEventUis(otherDefs, state.eventUiBases); + for (var subjectInstanceId in subjectInstances) { + var subjectInstance = subjectInstances[subjectInstanceId]; + var subjectRange = subjectInstance.range; + var subjectConfig = subjectConfigs[subjectInstance.defId]; + var subjectDef = subjectDefs[subjectInstance.defId]; + // constraint + if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) { + return false; + } + // overlap + var overlapFunc = calendar.opt('eventOverlap'); + if (typeof overlapFunc !== 'function') { + overlapFunc = null; + } + for (var otherInstanceId in otherInstances) { + var otherInstance = otherInstances[otherInstanceId]; + // intersect! evaluate + if (rangesIntersect(subjectRange, otherInstance.range)) { + var otherOverlap = otherConfigs[otherInstance.defId].overlap; + // consider the other event's overlap. only do this if the subject event is a "real" event + if (otherOverlap === false && interaction.isEvent) { + return false; + } + if (subjectConfig.overlap === false) { + return false; + } + if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event + new EventApi(calendar, subjectDef, subjectInstance) // moving event + )) { + return false; + } + } + } + // allow (a function) + var calendarEventStore = calendar.state.eventStore; // need global-to-calendar, not local to component (splittable)state + for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) { + var subjectAllow = _a[_i]; + var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay }); + var origDef = calendarEventStore.defs[subjectDef.defId]; + var origInstance = calendarEventStore.instances[subjectInstanceId]; + var eventApi = void 0; + if (origDef) { // was previously in the calendar + eventApi = new EventApi(calendar, origDef, origInstance); + } + else { // was an external event + eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates + } + if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) { + return false; + } + } + } + return true; + } + // Date Selection Validation + // ------------------------------------------------------------------------------------------------------------------------ + function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) { + var relevantEventStore = state.eventStore; + var relevantDefs = relevantEventStore.defs; + var relevantInstances = relevantEventStore.instances; + var selection = state.dateSelection; + var selectionRange = selection.range; + var selectionConfig = calendar.selectionConfig; + if (filterConfig) { + selectionConfig = filterConfig(selectionConfig); + } + // constraint + if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) { + return false; + } + // overlap + var overlapFunc = calendar.opt('selectOverlap'); + if (typeof overlapFunc !== 'function') { + overlapFunc = null; + } + for (var relevantInstanceId in relevantInstances) { + var relevantInstance = relevantInstances[relevantInstanceId]; + // intersect! evaluate + if (rangesIntersect(selectionRange, relevantInstance.range)) { + if (selectionConfig.overlap === false) { + return false; + } + if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) { + return false; + } + } + } + // allow (a function) + for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) { + var selectionAllow = _a[_i]; + var fullDateSpan = __assign({}, dateSpanMeta, selection); + if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) { + return false; + } + } + return true; + } + // Constraint Utils + // ------------------------------------------------------------------------------------------------------------------------ + function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) { + for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) { + var constraint = constraints_1[_i]; + if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) { + return false; + } + } + return true; + } + function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours + otherEventStore, // for if constraint is an even group ID + businessHoursUnexpanded, // for if constraint is 'businessHours' + calendar // for expanding businesshours + ) { + if (constraint === 'businessHours') { + return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar)); + } + else if (typeof constraint === 'string') { // an group ID + return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) { + return eventDef.groupId === constraint; + })); + } + else if (typeof constraint === 'object' && constraint) { // non-null object + return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar)); + } + return []; // if it's false + } + // TODO: move to event-store file? + function eventStoreToRanges(eventStore) { + var instances = eventStore.instances; + var ranges = []; + for (var instanceId in instances) { + ranges.push(instances[instanceId].range); + } + return ranges; + } + // TODO: move to geom file? + function anyRangesContainRange(outerRanges, innerRange) { + for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) { + var outerRange = outerRanges_1[_i]; + if (rangeContainsRange(outerRange, innerRange)) { + return true; + } + } + return false; + } + // Parsing + // ------------------------------------------------------------------------------------------------------------------------ + function normalizeConstraint(input, calendar) { + if (Array.isArray(input)) { + return parseEvents(input, '', calendar, true); // allowOpenRange=true + } + else if (typeof input === 'object' && input) { // non-null object + return parseEvents([input], '', calendar, true); // allowOpenRange=true + } + else if (input != null) { + return String(input); + } + else { + return null; + } + } + + function htmlEscape(s) { + return (s + '').replace(/&/g, '&') + .replace(//g, '>') + .replace(/'/g, ''') + .replace(/"/g, '"') + .replace(/\n/g, '
'); + } + // Given a hash of CSS properties, returns a string of CSS. + // Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values. + function cssToStr(cssProps) { + var statements = []; + for (var name_1 in cssProps) { + var val = cssProps[name_1]; + if (val != null && val !== '') { + statements.push(name_1 + ':' + val); + } + } + return statements.join(';'); + } + // Given an object hash of HTML attribute names to values, + // generates a string that can be injected between < > in HTML + function attrsToStr(attrs) { + var parts = []; + for (var name_2 in attrs) { + var val = attrs[name_2]; + if (val != null) { + parts.push(name_2 + '="' + htmlEscape(val) + '"'); + } + } + return parts.join(' '); + } + function parseClassName(raw) { + if (Array.isArray(raw)) { + return raw; + } + else if (typeof raw === 'string') { + return raw.split(/\s+/); + } + else { + return []; + } + } + + var UNSCOPED_EVENT_UI_PROPS = { + editable: Boolean, + startEditable: Boolean, + durationEditable: Boolean, + constraint: null, + overlap: null, + allow: null, + className: parseClassName, + classNames: parseClassName, + color: String, + backgroundColor: String, + borderColor: String, + textColor: String + }; + function processUnscopedUiProps(rawProps, calendar, leftovers) { + var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers); + var constraint = normalizeConstraint(props.constraint, calendar); + return { + startEditable: props.startEditable != null ? props.startEditable : props.editable, + durationEditable: props.durationEditable != null ? props.durationEditable : props.editable, + constraints: constraint != null ? [constraint] : [], + overlap: props.overlap, + allows: props.allow != null ? [props.allow] : [], + backgroundColor: props.backgroundColor || props.color, + borderColor: props.borderColor || props.color, + textColor: props.textColor, + classNames: props.classNames.concat(props.className) + }; + } + function processScopedUiProps(prefix, rawScoped, calendar, leftovers) { + var rawUnscoped = {}; + var wasFound = {}; + for (var key in UNSCOPED_EVENT_UI_PROPS) { + var scopedKey = prefix + capitaliseFirstLetter(key); + rawUnscoped[key] = rawScoped[scopedKey]; + wasFound[scopedKey] = true; + } + if (prefix === 'event') { + rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable' + } + if (leftovers) { + for (var key in rawScoped) { + if (!wasFound[key]) { + leftovers[key] = rawScoped[key]; + } + } + } + return processUnscopedUiProps(rawUnscoped, calendar); + } + var EMPTY_EVENT_UI = { + startEditable: null, + durationEditable: null, + constraints: [], + overlap: null, + allows: [], + backgroundColor: '', + borderColor: '', + textColor: '', + classNames: [] + }; + // prevent against problems with <2 args! + function combineEventUis(uis) { + return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI); + } + function combineTwoEventUis(item0, item1) { + return { + startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable, + durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable, + constraints: item0.constraints.concat(item1.constraints), + overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap, + allows: item0.allows.concat(item1.allows), + backgroundColor: item1.backgroundColor || item0.backgroundColor, + borderColor: item1.borderColor || item0.borderColor, + textColor: item1.textColor || item0.textColor, + classNames: item0.classNames.concat(item1.classNames) + }; + } + + var NON_DATE_PROPS = { + id: String, + groupId: String, + title: String, + url: String, + rendering: String, + extendedProps: null + }; + var DATE_PROPS = { + start: null, + date: null, + end: null, + allDay: null + }; + var uid = 0; + function parseEvent(raw, sourceId, calendar, allowOpenRange) { + var allDayDefault = computeIsAllDayDefault(sourceId, calendar); + var leftovers0 = {}; + var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out + allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props + ); + if (recurringRes) { + var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar); + def.recurringDef = { + typeId: recurringRes.typeId, + typeData: recurringRes.typeData, + duration: recurringRes.duration + }; + return { def: def, instance: null }; + } + else { + var leftovers1 = {}; + var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange); + if (singleRes) { + var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar); + var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo); + return { def: def, instance: instance }; + } + } + return null; + } + /* + Will NOT populate extendedProps with the leftover properties. + Will NOT populate date-related props. + The EventNonDateInput has been normalized (id => publicId, etc). + */ + function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) { + var leftovers = {}; + var def = pluckNonDateProps(raw, calendar, leftovers); + def.defId = String(uid++); + def.sourceId = sourceId; + def.allDay = allDay; + def.hasEnd = hasEnd; + for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) { + var eventDefParser = _a[_i]; + var newLeftovers = {}; + eventDefParser(def, leftovers, newLeftovers); + leftovers = newLeftovers; + } + def.extendedProps = __assign(leftovers, def.extendedProps || {}); + // help out EventApi from having user modify props + Object.freeze(def.ui.classNames); + Object.freeze(def.extendedProps); + return def; + } + function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) { + return { + instanceId: String(uid++), + defId: defId, + range: range, + forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo, + forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo + }; + } + function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) { + var props = pluckDateProps(raw, leftovers); + var allDay = props.allDay; + var startMeta; + var startMarker = null; + var hasEnd = false; + var endMeta; + var endMarker = null; + startMeta = calendar.dateEnv.createMarkerMeta(props.start); + if (startMeta) { + startMarker = startMeta.marker; + } + else if (!allowOpenRange) { + return null; + } + if (props.end != null) { + endMeta = calendar.dateEnv.createMarkerMeta(props.end); + } + if (allDay == null) { + if (allDayDefault != null) { + allDay = allDayDefault; + } + else { + // fall back to the date props LAST + allDay = (!startMeta || startMeta.isTimeUnspecified) && + (!endMeta || endMeta.isTimeUnspecified); + } + } + if (allDay && startMarker) { + startMarker = startOfDay(startMarker); + } + if (endMeta) { + endMarker = endMeta.marker; + if (allDay) { + endMarker = startOfDay(endMarker); + } + if (startMarker && endMarker <= startMarker) { + endMarker = null; + } + } + if (endMarker) { + hasEnd = true; + } + else if (!allowOpenRange) { + hasEnd = calendar.opt('forceEventDuration') || false; + endMarker = calendar.dateEnv.add(startMarker, allDay ? + calendar.defaultAllDayEventDuration : + calendar.defaultTimedEventDuration); + } + return { + allDay: allDay, + hasEnd: hasEnd, + range: { start: startMarker, end: endMarker }, + forcedStartTzo: startMeta ? startMeta.forcedTzo : null, + forcedEndTzo: endMeta ? endMeta.forcedTzo : null + }; + } + function pluckDateProps(raw, leftovers) { + var props = refineProps(raw, DATE_PROPS, {}, leftovers); + props.start = (props.start !== null) ? props.start : props.date; + delete props.date; + return props; + } + function pluckNonDateProps(raw, calendar, leftovers) { + var preLeftovers = {}; + var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers); + var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers); + props.publicId = props.id; + delete props.id; + props.ui = ui; + return props; + } + function computeIsAllDayDefault(sourceId, calendar) { + var res = null; + if (sourceId) { + var source = calendar.state.eventSources[sourceId]; + res = source.allDayDefault; + } + if (res == null) { + res = calendar.opt('allDayDefault'); + } + return res; + } + + var DEF_DEFAULTS = { + startTime: '09:00', + endTime: '17:00', + daysOfWeek: [1, 2, 3, 4, 5], + rendering: 'inverse-background', + classNames: 'fc-nonbusiness', + groupId: '_businessHours' // so multiple defs get grouped + }; + /* + TODO: pass around as EventDefHash!!! + */ + function parseBusinessHours(input, calendar) { + return parseEvents(refineInputs(input), '', calendar); + } + function refineInputs(input) { + var rawDefs; + if (input === true) { + rawDefs = [{}]; // will get DEF_DEFAULTS verbatim + } + else if (Array.isArray(input)) { + // if specifying an array, every sub-definition NEEDS a day-of-week + rawDefs = input.filter(function (rawDef) { + return rawDef.daysOfWeek; + }); + } + else if (typeof input === 'object' && input) { // non-null object + rawDefs = [input]; + } + else { // is probably false + rawDefs = []; + } + rawDefs = rawDefs.map(function (rawDef) { + return __assign({}, DEF_DEFAULTS, rawDef); + }); + return rawDefs; + } + + function memoizeRendering(renderFunc, unrenderFunc, dependencies) { + if (dependencies === void 0) { dependencies = []; } + var dependents = []; + var thisContext; + var prevArgs; + function unrender() { + if (prevArgs) { + for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) { + var dependent = dependents_1[_i]; + dependent.unrender(); + } + if (unrenderFunc) { + unrenderFunc.apply(thisContext, prevArgs); + } + prevArgs = null; + } + } + function res() { + if (!prevArgs || !isArraysEqual(prevArgs, arguments)) { + unrender(); + thisContext = this; + prevArgs = arguments; + renderFunc.apply(this, arguments); + } + } + res.dependents = dependents; + res.unrender = unrender; + for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) { + var dependency = dependencies_1[_i]; + dependency.dependents.push(res); + } + return res; + } + + var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere + var Splitter = /** @class */ (function () { + function Splitter() { + this.getKeysForEventDefs = memoize(this._getKeysForEventDefs); + this.splitDateSelection = memoize(this._splitDateSpan); + this.splitEventStore = memoize(this._splitEventStore); + this.splitIndividualUi = memoize(this._splitIndividualUi); + this.splitEventDrag = memoize(this._splitInteraction); + this.splitEventResize = memoize(this._splitInteraction); + this.eventUiBuilders = {}; // TODO: typescript protection + } + Splitter.prototype.splitProps = function (props) { + var _this = this; + var keyInfos = this.getKeyInfo(props); + var defKeys = this.getKeysForEventDefs(props.eventStore); + var dateSelections = this.splitDateSelection(props.dateSelection); + var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases* + var eventStores = this.splitEventStore(props.eventStore, defKeys); + var eventDrags = this.splitEventDrag(props.eventDrag); + var eventResizes = this.splitEventResize(props.eventResize); + var splitProps = {}; + this.eventUiBuilders = mapHash(keyInfos, function (info, key) { + return _this.eventUiBuilders[key] || memoize(buildEventUiForKey); + }); + for (var key in keyInfos) { + var keyInfo = keyInfos[key]; + var eventStore = eventStores[key] || EMPTY_EVENT_STORE; + var buildEventUi = this.eventUiBuilders[key]; + splitProps[key] = { + businessHours: keyInfo.businessHours || props.businessHours, + dateSelection: dateSelections[key] || null, + eventStore: eventStore, + eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]), + eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '', + eventDrag: eventDrags[key] || null, + eventResize: eventResizes[key] || null + }; + } + return splitProps; + }; + Splitter.prototype._splitDateSpan = function (dateSpan) { + var dateSpans = {}; + if (dateSpan) { + var keys = this.getKeysForDateSpan(dateSpan); + for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) { + var key = keys_1[_i]; + dateSpans[key] = dateSpan; + } + } + return dateSpans; + }; + Splitter.prototype._getKeysForEventDefs = function (eventStore) { + var _this = this; + return mapHash(eventStore.defs, function (eventDef) { + return _this.getKeysForEventDef(eventDef); + }); + }; + Splitter.prototype._splitEventStore = function (eventStore, defKeys) { + var defs = eventStore.defs, instances = eventStore.instances; + var splitStores = {}; + for (var defId in defs) { + for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) { + var key = _a[_i]; + if (!splitStores[key]) { + splitStores[key] = createEmptyEventStore(); + } + splitStores[key].defs[defId] = defs[defId]; + } + } + for (var instanceId in instances) { + var instance = instances[instanceId]; + for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) { + var key = _c[_b]; + if (splitStores[key]) { // must have already been created + splitStores[key].instances[instanceId] = instance; + } + } + } + return splitStores; + }; + Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) { + var splitHashes = {}; + for (var defId in eventUiBases) { + if (defId) { // not the '' key + for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) { + var key = _a[_i]; + if (!splitHashes[key]) { + splitHashes[key] = {}; + } + splitHashes[key][defId] = eventUiBases[defId]; + } + } + } + return splitHashes; + }; + Splitter.prototype._splitInteraction = function (interaction) { + var splitStates = {}; + if (interaction) { + var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar + ); + // can't rely on defKeys because event data is mutated + var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents); + var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId); + var populate = function (key) { + if (!splitStates[key]) { + splitStates[key] = { + affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE, + mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE, + isEvent: interaction.isEvent, + origSeg: interaction.origSeg + }; + } + }; + for (var key in affectedStores_1) { + populate(key); + } + for (var key in mutatedStores_1) { + populate(key); + } + } + return splitStates; + }; + return Splitter; + }()); + function buildEventUiForKey(allUi, eventUiForKey, individualUi) { + var baseParts = []; + if (allUi) { + baseParts.push(allUi); + } + if (eventUiForKey) { + baseParts.push(eventUiForKey); + } + var stuff = { + '': combineEventUis(baseParts) + }; + if (individualUi) { + __assign(stuff, individualUi); + } + return stuff; + } + + // Generates HTML for an anchor to another view into the calendar. + // Will either generate an
tag or a non-clickable tag, depending on enabled settings. + // `gotoOptions` can either be a DateMarker, or an object with the form: + // { date, type, forceOff } + // `type` is a view-type like "day" or "week". default value is "day". + // `attrs` and `innerHtml` are use to generate the rest of the HTML tag. + function buildGotoAnchorHtml(component, gotoOptions, attrs, innerHtml) { + var dateEnv = component.dateEnv; + var date; + var type; + var forceOff; + var finalOptions; + if (gotoOptions instanceof Date) { + date = gotoOptions; // a single date-like input + } + else { + date = gotoOptions.date; + type = gotoOptions.type; + forceOff = gotoOptions.forceOff; + } + finalOptions = { + date: dateEnv.formatIso(date, { omitTime: true }), + type: type || 'day' + }; + if (typeof attrs === 'string') { + innerHtml = attrs; + attrs = null; + } + attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space + innerHtml = innerHtml || ''; + if (!forceOff && component.opt('navLinks')) { + return '' + + innerHtml + + ''; + } + else { + return '' + + innerHtml + + ''; + } + } + function getAllDayHtml(component) { + return component.opt('allDayHtml') || htmlEscape(component.opt('allDayText')); + } + // Computes HTML classNames for a single-day element + function getDayClasses(date, dateProfile, context, noThemeHighlight) { + var calendar = context.calendar, view = context.view, theme = context.theme, dateEnv = context.dateEnv; + var classes = []; + var todayStart; + var todayEnd; + if (!rangeContainsMarker(dateProfile.activeRange, date)) { + classes.push('fc-disabled-day'); + } + else { + classes.push('fc-' + DAY_IDS[date.getUTCDay()]); + if (view.opt('monthMode') && + dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) { + classes.push('fc-other-month'); + } + todayStart = startOfDay(calendar.getNow()); + todayEnd = addDays(todayStart, 1); + if (date < todayStart) { + classes.push('fc-past'); + } + else if (date >= todayEnd) { + classes.push('fc-future'); + } + else { + classes.push('fc-today'); + if (noThemeHighlight !== true) { + classes.push(theme.getClass('today')); + } + } + } + return classes; + } + + // given a function that resolves a result asynchronously. + // the function can either call passed-in success and failure callbacks, + // or it can return a promise. + // if you need to pass additional params to func, bind them first. + function unpromisify(func, success, failure) { + // guard against success/failure callbacks being called more than once + // and guard against a promise AND callback being used together. + var isResolved = false; + var wrappedSuccess = function () { + if (!isResolved) { + isResolved = true; + success.apply(this, arguments); + } + }; + var wrappedFailure = function () { + if (!isResolved) { + isResolved = true; + if (failure) { + failure.apply(this, arguments); + } + } + }; + var res = func(wrappedSuccess, wrappedFailure); + if (res && typeof res.then === 'function') { + res.then(wrappedSuccess, wrappedFailure); + } + } + + var Mixin = /** @class */ (function () { + function Mixin() { + } + // mix into a CLASS + Mixin.mixInto = function (destClass) { + this.mixIntoObj(destClass.prototype); + }; + // mix into ANY object + Mixin.mixIntoObj = function (destObj) { + var _this = this; + Object.getOwnPropertyNames(this.prototype).forEach(function (name) { + if (!destObj[name]) { // if destination doesn't already define it + destObj[name] = _this.prototype[name]; + } + }); + }; + /* + will override existing methods + TODO: remove! not used anymore + */ + Mixin.mixOver = function (destClass) { + var _this = this; + Object.getOwnPropertyNames(this.prototype).forEach(function (name) { + destClass.prototype[name] = _this.prototype[name]; + }); + }; + return Mixin; + }()); + + /* + USAGE: + import { default as EmitterMixin, EmitterInterface } from './EmitterMixin' + in class: + on: EmitterInterface['on'] + one: EmitterInterface['one'] + off: EmitterInterface['off'] + trigger: EmitterInterface['trigger'] + triggerWith: EmitterInterface['triggerWith'] + hasHandlers: EmitterInterface['hasHandlers'] + after class: + EmitterMixin.mixInto(TheClass) + */ + var EmitterMixin = /** @class */ (function (_super) { + __extends(EmitterMixin, _super); + function EmitterMixin() { + return _super !== null && _super.apply(this, arguments) || this; + } + EmitterMixin.prototype.on = function (type, handler) { + addToHash(this._handlers || (this._handlers = {}), type, handler); + return this; // for chaining + }; + // todo: add comments + EmitterMixin.prototype.one = function (type, handler) { + addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler); + return this; // for chaining + }; + EmitterMixin.prototype.off = function (type, handler) { + if (this._handlers) { + removeFromHash(this._handlers, type, handler); + } + if (this._oneHandlers) { + removeFromHash(this._oneHandlers, type, handler); + } + return this; // for chaining + }; + EmitterMixin.prototype.trigger = function (type) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + this.triggerWith(type, this, args); + return this; // for chaining + }; + EmitterMixin.prototype.triggerWith = function (type, context, args) { + if (this._handlers) { + applyAll(this._handlers[type], context, args); + } + if (this._oneHandlers) { + applyAll(this._oneHandlers[type], context, args); + delete this._oneHandlers[type]; // will never fire again + } + return this; // for chaining + }; + EmitterMixin.prototype.hasHandlers = function (type) { + return (this._handlers && this._handlers[type] && this._handlers[type].length) || + (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length); + }; + return EmitterMixin; + }(Mixin)); + function addToHash(hash, type, handler) { + (hash[type] || (hash[type] = [])) + .push(handler); + } + function removeFromHash(hash, type, handler) { + if (handler) { + if (hash[type]) { + hash[type] = hash[type].filter(function (func) { + return func !== handler; + }); + } + } + else { + delete hash[type]; // remove all handler funcs for this type + } + } + + /* + Records offset information for a set of elements, relative to an origin element. + Can record the left/right OR the top/bottom OR both. + Provides methods for querying the cache by position. + */ + var PositionCache = /** @class */ (function () { + function PositionCache(originEl, els, isHorizontal, isVertical) { + this.originEl = originEl; + this.els = els; + this.isHorizontal = isHorizontal; + this.isVertical = isVertical; + } + // Queries the els for coordinates and stores them. + // Call this method before using and of the get* methods below. + PositionCache.prototype.build = function () { + var originEl = this.originEl; + var originClientRect = this.originClientRect = + originEl.getBoundingClientRect(); // relative to viewport top-left + if (this.isHorizontal) { + this.buildElHorizontals(originClientRect.left); + } + if (this.isVertical) { + this.buildElVerticals(originClientRect.top); + } + }; + // Populates the left/right internal coordinate arrays + PositionCache.prototype.buildElHorizontals = function (originClientLeft) { + var lefts = []; + var rights = []; + for (var _i = 0, _a = this.els; _i < _a.length; _i++) { + var el = _a[_i]; + var rect = el.getBoundingClientRect(); + lefts.push(rect.left - originClientLeft); + rights.push(rect.right - originClientLeft); + } + this.lefts = lefts; + this.rights = rights; + }; + // Populates the top/bottom internal coordinate arrays + PositionCache.prototype.buildElVerticals = function (originClientTop) { + var tops = []; + var bottoms = []; + for (var _i = 0, _a = this.els; _i < _a.length; _i++) { + var el = _a[_i]; + var rect = el.getBoundingClientRect(); + tops.push(rect.top - originClientTop); + bottoms.push(rect.bottom - originClientTop); + } + this.tops = tops; + this.bottoms = bottoms; + }; + // Given a left offset (from document left), returns the index of the el that it horizontally intersects. + // If no intersection is made, returns undefined. + PositionCache.prototype.leftToIndex = function (leftPosition) { + var lefts = this.lefts; + var rights = this.rights; + var len = lefts.length; + var i; + for (i = 0; i < len; i++) { + if (leftPosition >= lefts[i] && leftPosition < rights[i]) { + return i; + } + } + }; + // Given a top offset (from document top), returns the index of the el that it vertically intersects. + // If no intersection is made, returns undefined. + PositionCache.prototype.topToIndex = function (topPosition) { + var tops = this.tops; + var bottoms = this.bottoms; + var len = tops.length; + var i; + for (i = 0; i < len; i++) { + if (topPosition >= tops[i] && topPosition < bottoms[i]) { + return i; + } + } + }; + // Gets the width of the element at the given index + PositionCache.prototype.getWidth = function (leftIndex) { + return this.rights[leftIndex] - this.lefts[leftIndex]; + }; + // Gets the height of the element at the given index + PositionCache.prototype.getHeight = function (topIndex) { + return this.bottoms[topIndex] - this.tops[topIndex]; + }; + return PositionCache; + }()); + + /* + An object for getting/setting scroll-related information for an element. + Internally, this is done very differently for window versus DOM element, + so this object serves as a common interface. + */ + var ScrollController = /** @class */ (function () { + function ScrollController() { + } + ScrollController.prototype.getMaxScrollTop = function () { + return this.getScrollHeight() - this.getClientHeight(); + }; + ScrollController.prototype.getMaxScrollLeft = function () { + return this.getScrollWidth() - this.getClientWidth(); + }; + ScrollController.prototype.canScrollVertically = function () { + return this.getMaxScrollTop() > 0; + }; + ScrollController.prototype.canScrollHorizontally = function () { + return this.getMaxScrollLeft() > 0; + }; + ScrollController.prototype.canScrollUp = function () { + return this.getScrollTop() > 0; + }; + ScrollController.prototype.canScrollDown = function () { + return this.getScrollTop() < this.getMaxScrollTop(); + }; + ScrollController.prototype.canScrollLeft = function () { + return this.getScrollLeft() > 0; + }; + ScrollController.prototype.canScrollRight = function () { + return this.getScrollLeft() < this.getMaxScrollLeft(); + }; + return ScrollController; + }()); + var ElementScrollController = /** @class */ (function (_super) { + __extends(ElementScrollController, _super); + function ElementScrollController(el) { + var _this = _super.call(this) || this; + _this.el = el; + return _this; + } + ElementScrollController.prototype.getScrollTop = function () { + return this.el.scrollTop; + }; + ElementScrollController.prototype.getScrollLeft = function () { + return this.el.scrollLeft; + }; + ElementScrollController.prototype.setScrollTop = function (top) { + this.el.scrollTop = top; + }; + ElementScrollController.prototype.setScrollLeft = function (left) { + this.el.scrollLeft = left; + }; + ElementScrollController.prototype.getScrollWidth = function () { + return this.el.scrollWidth; + }; + ElementScrollController.prototype.getScrollHeight = function () { + return this.el.scrollHeight; + }; + ElementScrollController.prototype.getClientHeight = function () { + return this.el.clientHeight; + }; + ElementScrollController.prototype.getClientWidth = function () { + return this.el.clientWidth; + }; + return ElementScrollController; + }(ScrollController)); + var WindowScrollController = /** @class */ (function (_super) { + __extends(WindowScrollController, _super); + function WindowScrollController() { + return _super !== null && _super.apply(this, arguments) || this; + } + WindowScrollController.prototype.getScrollTop = function () { + return window.pageYOffset; + }; + WindowScrollController.prototype.getScrollLeft = function () { + return window.pageXOffset; + }; + WindowScrollController.prototype.setScrollTop = function (n) { + window.scroll(window.pageXOffset, n); + }; + WindowScrollController.prototype.setScrollLeft = function (n) { + window.scroll(n, window.pageYOffset); + }; + WindowScrollController.prototype.getScrollWidth = function () { + return document.documentElement.scrollWidth; + }; + WindowScrollController.prototype.getScrollHeight = function () { + return document.documentElement.scrollHeight; + }; + WindowScrollController.prototype.getClientHeight = function () { + return document.documentElement.clientHeight; + }; + WindowScrollController.prototype.getClientWidth = function () { + return document.documentElement.clientWidth; + }; + return WindowScrollController; + }(ScrollController)); + + /* + Embodies a div that has potential scrollbars + */ + var ScrollComponent = /** @class */ (function (_super) { + __extends(ScrollComponent, _super); + function ScrollComponent(overflowX, overflowY) { + var _this = _super.call(this, createElement('div', { + className: 'fc-scroller' + })) || this; + _this.overflowX = overflowX; + _this.overflowY = overflowY; + _this.applyOverflow(); + return _this; + } + // sets to natural height, unlocks overflow + ScrollComponent.prototype.clear = function () { + this.setHeight('auto'); + this.applyOverflow(); + }; + ScrollComponent.prototype.destroy = function () { + removeElement(this.el); + }; + // Overflow + // ----------------------------------------------------------------------------------------------------------------- + ScrollComponent.prototype.applyOverflow = function () { + applyStyle(this.el, { + overflowX: this.overflowX, + overflowY: this.overflowY + }); + }; + // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'. + // Useful for preserving scrollbar widths regardless of future resizes. + // Can pass in scrollbarWidths for optimization. + ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) { + var overflowX = this.overflowX; + var overflowY = this.overflowY; + scrollbarWidths = scrollbarWidths || this.getScrollbarWidths(); + if (overflowX === 'auto') { + overflowX = (scrollbarWidths.bottom || // horizontal scrollbars? + this.canScrollHorizontally() // OR scrolling pane with massless scrollbars? + ) ? 'scroll' : 'hidden'; + } + if (overflowY === 'auto') { + overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars? + this.canScrollVertically() // OR scrolling pane with massless scrollbars? + ) ? 'scroll' : 'hidden'; + } + applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY }); + }; + ScrollComponent.prototype.setHeight = function (height) { + applyStyleProp(this.el, 'height', height); + }; + ScrollComponent.prototype.getScrollbarWidths = function () { + var edges = computeEdges(this.el); + return { + left: edges.scrollbarLeft, + right: edges.scrollbarRight, + bottom: edges.scrollbarBottom + }; + }; + return ScrollComponent; + }(ElementScrollController)); + + var Theme = /** @class */ (function () { + function Theme(calendarOptions) { + this.calendarOptions = calendarOptions; + this.processIconOverride(); + } + Theme.prototype.processIconOverride = function () { + if (this.iconOverrideOption) { + this.setIconOverride(this.calendarOptions[this.iconOverrideOption]); + } + }; + Theme.prototype.setIconOverride = function (iconOverrideHash) { + var iconClassesCopy; + var buttonName; + if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object + iconClassesCopy = __assign({}, this.iconClasses); + for (buttonName in iconOverrideHash) { + iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]); + } + this.iconClasses = iconClassesCopy; + } + else if (iconOverrideHash === false) { + this.iconClasses = {}; + } + }; + Theme.prototype.applyIconOverridePrefix = function (className) { + var prefix = this.iconOverridePrefix; + if (prefix && className.indexOf(prefix) !== 0) { // if not already present + className = prefix + className; + } + return className; + }; + Theme.prototype.getClass = function (key) { + return this.classes[key] || ''; + }; + Theme.prototype.getIconClass = function (buttonName) { + var className = this.iconClasses[buttonName]; + if (className) { + return this.baseIconClass + ' ' + className; + } + return ''; + }; + Theme.prototype.getCustomButtonIconClass = function (customButtonProps) { + var className; + if (this.iconOverrideCustomButtonOption) { + className = customButtonProps[this.iconOverrideCustomButtonOption]; + if (className) { + return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className); + } + } + return ''; + }; + return Theme; + }()); + Theme.prototype.classes = {}; + Theme.prototype.iconClasses = {}; + Theme.prototype.baseIconClass = ''; + Theme.prototype.iconOverridePrefix = ''; + + var guid = 0; + var Component = /** @class */ (function () { + function Component(context, isView) { + // HACK to populate view at top of component instantiation call chain + if (isView) { + context.view = this; + } + this.uid = String(guid++); + this.context = context; + this.dateEnv = context.dateEnv; + this.theme = context.theme; + this.view = context.view; + this.calendar = context.calendar; + this.isRtl = this.opt('dir') === 'rtl'; + } + Component.addEqualityFuncs = function (newFuncs) { + this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs); + }; + Component.prototype.opt = function (name) { + return this.context.options[name]; + }; + Component.prototype.receiveProps = function (props) { + var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps; + this.props = comboProps; + if (anyChanges) { + this.render(comboProps); + } + }; + Component.prototype.render = function (props) { + }; + // after destroy is called, this component won't ever be used again + Component.prototype.destroy = function () { + }; + return Component; + }()); + Component.prototype.equalityFuncs = {}; + /* + Reuses old values when equal. If anything is unequal, returns newProps as-is. + Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing. + */ + function recycleProps(oldProps, newProps, equalityFuncs) { + var comboProps = {}; // some old, some new + var anyChanges = false; + for (var key in newProps) { + if (key in oldProps && (oldProps[key] === newProps[key] || + (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) { + // equal to old? use old prop + comboProps[key] = oldProps[key]; + } + else { + comboProps[key] = newProps[key]; + anyChanges = true; + } + } + for (var key in oldProps) { + if (!(key in newProps)) { + anyChanges = true; + break; + } + } + return { anyChanges: anyChanges, comboProps: comboProps }; + } + + /* + PURPOSES: + - hook up to fg, fill, and mirror renderers + - interface for dragging and hits + */ + var DateComponent = /** @class */ (function (_super) { + __extends(DateComponent, _super); + function DateComponent(context, el, isView) { + var _this = _super.call(this, context, isView) || this; + _this.el = el; + return _this; + } + DateComponent.prototype.destroy = function () { + _super.prototype.destroy.call(this); + removeElement(this.el); + }; + // TODO: WHAT ABOUT (sourceSeg && sourceSeg.component.doesDragMirror) + // + // Event Drag-n-Drop Rendering (for both events and external elements) + // --------------------------------------------------------------------------------------------------------------- + /* + renderEventDragSegs(state: EventSegUiInteractionState) { + if (state) { + let { isEvent, segs, sourceSeg } = state + + if (this.eventRenderer) { + this.eventRenderer.hideByHash(state.affectedInstances) + } + + // if the user is dragging something that is considered an event with real event data, + // and this component likes to do drag mirrors OR the component where the seg came from + // likes to do drag mirrors, then render a drag mirror. + if (isEvent && (this.doesDragMirror || sourceSeg && sourceSeg.component.doesDragMirror)) { + if (this.mirrorRenderer) { + this.mirrorRenderer.renderSegs(segs, { isDragging: true, sourceSeg }) + } + } + + // if it would be impossible to render a drag mirror OR this component likes to render + // highlights, then render a highlight. + if (!isEvent || this.doesDragHighlight) { + if (this.fillRenderer) { + this.fillRenderer.renderSegs('highlight', segs) + } + } + } + } + */ + // Hit System + // ----------------------------------------------------------------------------------------------------------------- + DateComponent.prototype.buildPositionCaches = function () { + }; + DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { + return null; // this should be abstract + }; + // Validation + // ----------------------------------------------------------------------------------------------------------------- + DateComponent.prototype.isInteractionValid = function (interaction) { + var calendar = this.calendar; + var dateProfile = this.props.dateProfile; // HACK + var instances = interaction.mutatedEvents.instances; + if (dateProfile) { // HACK for DayTile + for (var instanceId in instances) { + if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) { + return false; + } + } + } + return isInteractionValid(interaction, calendar); + }; + DateComponent.prototype.isDateSelectionValid = function (selection) { + var dateProfile = this.props.dateProfile; // HACK + if (dateProfile && // HACK for DayTile + !rangeContainsRange(dateProfile.validRange, selection.range)) { + return false; + } + return isDateSelectionValid(selection, this.calendar); + }; + // Triggering + // ----------------------------------------------------------------------------------------------------------------- + // TODO: move to Calendar + DateComponent.prototype.publiclyTrigger = function (name, args) { + var calendar = this.calendar; + return calendar.publiclyTrigger(name, args); + }; + DateComponent.prototype.publiclyTriggerAfterSizing = function (name, args) { + var calendar = this.calendar; + return calendar.publiclyTriggerAfterSizing(name, args); + }; + DateComponent.prototype.hasPublicHandlers = function (name) { + var calendar = this.calendar; + return calendar.hasPublicHandlers(name); + }; + DateComponent.prototype.triggerRenderedSegs = function (segs, isMirrors) { + var calendar = this.calendar; + if (this.hasPublicHandlers('eventPositioned')) { + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + this.publiclyTriggerAfterSizing('eventPositioned', [ + { + event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance), + isMirror: isMirrors, + isStart: seg.isStart, + isEnd: seg.isEnd, + el: seg.el, + view: this // safe to cast because this method is only called on context.view + } + ]); + } + } + if (!calendar.state.loadingLevel) { // avoid initial empty state while pending + calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once + } + }; + DateComponent.prototype.triggerWillRemoveSegs = function (segs, isMirrors) { + var calendar = this.calendar; + for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { + var seg = segs_2[_i]; + calendar.trigger('eventElRemove', seg.el); + } + if (this.hasPublicHandlers('eventDestroy')) { + for (var _a = 0, segs_3 = segs; _a < segs_3.length; _a++) { + var seg = segs_3[_a]; + this.publiclyTrigger('eventDestroy', [ + { + event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance), + isMirror: isMirrors, + el: seg.el, + view: this // safe to cast because this method is only called on context.view + } + ]); + } + } + }; + // Pointer Interaction Utils + // ----------------------------------------------------------------------------------------------------------------- + DateComponent.prototype.isValidSegDownEl = function (el) { + return !this.props.eventDrag && // HACK + !this.props.eventResize && // HACK + !elementClosest(el, '.fc-mirror') && + (this.isPopover() || !this.isInPopover(el)); + // ^above line ensures we don't detect a seg interaction within a nested component. + // it's a HACK because it only supports a popover as the nested component. + }; + DateComponent.prototype.isValidDateDownEl = function (el) { + var segEl = elementClosest(el, this.fgSegSelector); + return (!segEl || segEl.classList.contains('fc-mirror')) && + !elementClosest(el, '.fc-more') && // a "more.." link + !elementClosest(el, 'a[data-goto]') && // a clickable nav link + !this.isInPopover(el); + }; + DateComponent.prototype.isPopover = function () { + return this.el.classList.contains('fc-popover'); + }; + DateComponent.prototype.isInPopover = function (el) { + return Boolean(elementClosest(el, '.fc-popover')); + }; + return DateComponent; + }(Component)); + DateComponent.prototype.fgSegSelector = '.fc-event-container > *'; + DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)'; + + var uid$1 = 0; + function createPlugin(input) { + return { + id: String(uid$1++), + deps: input.deps || [], + reducers: input.reducers || [], + eventDefParsers: input.eventDefParsers || [], + isDraggableTransformers: input.isDraggableTransformers || [], + eventDragMutationMassagers: input.eventDragMutationMassagers || [], + eventDefMutationAppliers: input.eventDefMutationAppliers || [], + dateSelectionTransformers: input.dateSelectionTransformers || [], + datePointTransforms: input.datePointTransforms || [], + dateSpanTransforms: input.dateSpanTransforms || [], + views: input.views || {}, + viewPropsTransformers: input.viewPropsTransformers || [], + isPropsValid: input.isPropsValid || null, + externalDefTransforms: input.externalDefTransforms || [], + eventResizeJoinTransforms: input.eventResizeJoinTransforms || [], + viewContainerModifiers: input.viewContainerModifiers || [], + eventDropTransformers: input.eventDropTransformers || [], + componentInteractions: input.componentInteractions || [], + calendarInteractions: input.calendarInteractions || [], + themeClasses: input.themeClasses || {}, + eventSourceDefs: input.eventSourceDefs || [], + cmdFormatter: input.cmdFormatter, + recurringTypes: input.recurringTypes || [], + namedTimeZonedImpl: input.namedTimeZonedImpl, + defaultView: input.defaultView || '', + elementDraggingImpl: input.elementDraggingImpl, + optionChangeHandlers: input.optionChangeHandlers || {} + }; + } + var PluginSystem = /** @class */ (function () { + function PluginSystem() { + this.hooks = { + reducers: [], + eventDefParsers: [], + isDraggableTransformers: [], + eventDragMutationMassagers: [], + eventDefMutationAppliers: [], + dateSelectionTransformers: [], + datePointTransforms: [], + dateSpanTransforms: [], + views: {}, + viewPropsTransformers: [], + isPropsValid: null, + externalDefTransforms: [], + eventResizeJoinTransforms: [], + viewContainerModifiers: [], + eventDropTransformers: [], + componentInteractions: [], + calendarInteractions: [], + themeClasses: {}, + eventSourceDefs: [], + cmdFormatter: null, + recurringTypes: [], + namedTimeZonedImpl: null, + defaultView: '', + elementDraggingImpl: null, + optionChangeHandlers: {} + }; + this.addedHash = {}; + } + PluginSystem.prototype.add = function (plugin) { + if (!this.addedHash[plugin.id]) { + this.addedHash[plugin.id] = true; + for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) { + var dep = _a[_i]; + this.add(dep); + } + this.hooks = combineHooks(this.hooks, plugin); + } + }; + return PluginSystem; + }()); + function combineHooks(hooks0, hooks1) { + return { + reducers: hooks0.reducers.concat(hooks1.reducers), + eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers), + isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers), + eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers), + eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers), + dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers), + datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms), + dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms), + views: __assign({}, hooks0.views, hooks1.views), + viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers), + isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid, + externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms), + eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms), + viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers), + eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers), + calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions), + componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions), + themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses), + eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs), + cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter, + recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes), + namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl, + defaultView: hooks0.defaultView || hooks1.defaultView, + elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl, + optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers) + }; + } + + var eventSourceDef = { + ignoreRange: true, + parseMeta: function (raw) { + if (Array.isArray(raw)) { // short form + return raw; + } + else if (Array.isArray(raw.events)) { + return raw.events; + } + return null; + }, + fetch: function (arg, success) { + success({ + rawEvents: arg.eventSource.meta + }); + } + }; + var ArrayEventSourcePlugin = createPlugin({ + eventSourceDefs: [eventSourceDef] + }); + + var eventSourceDef$1 = { + parseMeta: function (raw) { + if (typeof raw === 'function') { // short form + return raw; + } + else if (typeof raw.events === 'function') { + return raw.events; + } + return null; + }, + fetch: function (arg, success, failure) { + var dateEnv = arg.calendar.dateEnv; + var func = arg.eventSource.meta; + unpromisify(func.bind(null, { + start: dateEnv.toDate(arg.range.start), + end: dateEnv.toDate(arg.range.end), + startStr: dateEnv.formatIso(arg.range.start), + endStr: dateEnv.formatIso(arg.range.end), + timeZone: dateEnv.timeZone + }), function (rawEvents) { + success({ rawEvents: rawEvents }); // needs an object response + }, failure // send errorObj directly to failure callback + ); + } + }; + var FuncEventSourcePlugin = createPlugin({ + eventSourceDefs: [eventSourceDef$1] + }); + + function requestJson(method, url, params, successCallback, failureCallback) { + method = method.toUpperCase(); + var body = null; + if (method === 'GET') { + url = injectQueryStringParams(url, params); + } + else { + body = encodeParams(params); + } + var xhr = new XMLHttpRequest(); + xhr.open(method, url, true); + if (method !== 'GET') { + xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); + } + xhr.onload = function () { + if (xhr.status >= 200 && xhr.status < 400) { + try { + var res = JSON.parse(xhr.responseText); + successCallback(res, xhr); + } + catch (err) { + failureCallback('Failure parsing JSON', xhr); + } + } + else { + failureCallback('Request failed', xhr); + } + }; + xhr.onerror = function () { + failureCallback('Request failed', xhr); + }; + xhr.send(body); + } + function injectQueryStringParams(url, params) { + return url + + (url.indexOf('?') === -1 ? '?' : '&') + + encodeParams(params); + } + function encodeParams(params) { + var parts = []; + for (var key in params) { + parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key])); + } + return parts.join('&'); + } + + var eventSourceDef$2 = { + parseMeta: function (raw) { + if (typeof raw === 'string') { // short form + raw = { url: raw }; + } + else if (!raw || typeof raw !== 'object' || !raw.url) { + return null; + } + return { + url: raw.url, + method: (raw.method || 'GET').toUpperCase(), + extraParams: raw.extraParams, + startParam: raw.startParam, + endParam: raw.endParam, + timeZoneParam: raw.timeZoneParam + }; + }, + fetch: function (arg, success, failure) { + var meta = arg.eventSource.meta; + var requestParams = buildRequestParams(meta, arg.range, arg.calendar); + requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) { + success({ rawEvents: rawEvents, xhr: xhr }); + }, function (errorMessage, xhr) { + failure({ message: errorMessage, xhr: xhr }); + }); + } + }; + var JsonFeedEventSourcePlugin = createPlugin({ + eventSourceDefs: [eventSourceDef$2] + }); + function buildRequestParams(meta, range, calendar) { + var dateEnv = calendar.dateEnv; + var startParam; + var endParam; + var timeZoneParam; + var customRequestParams; + var params = {}; + startParam = meta.startParam; + if (startParam == null) { + startParam = calendar.opt('startParam'); + } + endParam = meta.endParam; + if (endParam == null) { + endParam = calendar.opt('endParam'); + } + timeZoneParam = meta.timeZoneParam; + if (timeZoneParam == null) { + timeZoneParam = calendar.opt('timeZoneParam'); + } + // retrieve any outbound GET/POST data from the options + if (typeof meta.extraParams === 'function') { + // supplied as a function that returns a key/value object + customRequestParams = meta.extraParams(); + } + else { + // probably supplied as a straight key/value object + customRequestParams = meta.extraParams || {}; + } + __assign(params, customRequestParams); + params[startParam] = dateEnv.formatIso(range.start); + params[endParam] = dateEnv.formatIso(range.end); + if (dateEnv.timeZone !== 'local') { + params[timeZoneParam] = dateEnv.timeZone; + } + return params; + } + + var recurring = { + parse: function (rawEvent, leftoverProps, dateEnv) { + var createMarker = dateEnv.createMarker.bind(dateEnv); + var processors = { + daysOfWeek: null, + startTime: createDuration, + endTime: createDuration, + startRecur: createMarker, + endRecur: createMarker + }; + var props = refineProps(rawEvent, processors, {}, leftoverProps); + var anyValid = false; + for (var propName in props) { + if (props[propName] != null) { + anyValid = true; + break; + } + } + if (anyValid) { + var duration = null; + if ('duration' in leftoverProps) { + duration = createDuration(leftoverProps.duration); + delete leftoverProps.duration; + } + if (!duration && props.startTime && props.endTime) { + duration = subtractDurations(props.endTime, props.startTime); + } + return { + allDayGuess: Boolean(!props.startTime && !props.endTime), + duration: duration, + typeData: props // doesn't need endTime anymore but oh well + }; + } + return null; + }, + expand: function (typeData, framingRange, dateEnv) { + var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur }); + if (clippedFramingRange) { + return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv); + } + else { + return []; + } + } + }; + var SimpleRecurrencePlugin = createPlugin({ + recurringTypes: [recurring] + }); + function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) { + var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null; + var dayMarker = startOfDay(framingRange.start); + var endMarker = framingRange.end; + var instanceStarts = []; + while (dayMarker < endMarker) { + var instanceStart + // if everyday, or this particular day-of-week + = void 0; + // if everyday, or this particular day-of-week + if (!dowHash || dowHash[dayMarker.getUTCDay()]) { + if (startTime) { + instanceStart = dateEnv.add(dayMarker, startTime); + } + else { + instanceStart = dayMarker; + } + instanceStarts.push(instanceStart); + } + dayMarker = addDays(dayMarker, 1); + } + return instanceStarts; + } + + var DefaultOptionChangeHandlers = createPlugin({ + optionChangeHandlers: { + events: function (events, calendar, deepEqual) { + handleEventSources([events], calendar, deepEqual); + }, + eventSources: handleEventSources, + plugins: handlePlugins + } + }); + function handleEventSources(inputs, calendar, deepEqual) { + var unfoundSources = hashValuesToArray(calendar.state.eventSources); + var newInputs = []; + for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) { + var input = inputs_1[_i]; + var inputFound = false; + for (var i = 0; i < unfoundSources.length; i++) { + if (deepEqual(unfoundSources[i]._raw, input)) { + unfoundSources.splice(i, 1); // delete + inputFound = true; + break; + } + } + if (!inputFound) { + newInputs.push(input); + } + } + for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) { + var unfoundSource = unfoundSources_1[_a]; + calendar.dispatch({ + type: 'REMOVE_EVENT_SOURCE', + sourceId: unfoundSource.sourceId + }); + } + for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) { + var newInput = newInputs_1[_b]; + calendar.addEventSource(newInput); + } + } + // shortcoming: won't remove plugins + function handlePlugins(inputs, calendar) { + calendar.addPluginInputs(inputs); // will gracefully handle duplicates + } + + var config = {}; // TODO: make these options + var globalDefaults = { + defaultRangeSeparator: ' - ', + titleRangeSeparator: ' \u2013 ', + defaultTimedEventDuration: '01:00:00', + defaultAllDayEventDuration: { day: 1 }, + forceEventDuration: false, + nextDayThreshold: '00:00:00', + // display + columnHeader: true, + defaultView: '', + aspectRatio: 1.35, + header: { + left: 'title', + center: '', + right: 'today prev,next' + }, + weekends: true, + weekNumbers: false, + weekNumberCalculation: 'local', + editable: false, + // nowIndicator: false, + scrollTime: '06:00:00', + minTime: '00:00:00', + maxTime: '24:00:00', + showNonCurrentDates: true, + // event ajax + lazyFetching: true, + startParam: 'start', + endParam: 'end', + timeZoneParam: 'timeZone', + timeZone: 'local', + // allDayDefault: undefined, + // locale + locales: [], + locale: '', + // dir: will get this from the default locale + // buttonIcons: null, + // allows setting a min-height to the event segment to prevent short events overlapping each other + timeGridEventMinHeight: 0, + themeSystem: 'standard', + // eventResizableFromStart: false, + dragRevertDuration: 500, + dragScroll: true, + allDayMaintainDuration: false, + // selectable: false, + unselectAuto: true, + // selectMinDistance: 0, + dropAccept: '*', + eventOrder: 'start,-duration,allDay,title', + // ^ if start tie, longer events go before shorter. final tie-breaker is title text + // rerenderDelay: null, + eventLimit: false, + eventLimitClick: 'popover', + dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' }, + handleWindowResize: true, + windowResizeDelay: 100, + longPressDelay: 1000, + eventDragMinDistance: 5 // only applies to mouse + }; + var rtlDefaults = { + header: { + left: 'next,prev today', + center: '', + right: 'title' + }, + buttonIcons: { + // TODO: make RTL support the responibility of the theme + prev: 'fc-icon-chevron-right', + next: 'fc-icon-chevron-left', + prevYear: 'fc-icon-chevrons-right', + nextYear: 'fc-icon-chevrons-left' + } + }; + var complexOptions = [ + 'header', + 'footer', + 'buttonText', + 'buttonIcons' + ]; + // Merges an array of option objects into a single object + function mergeOptions(optionObjs) { + return mergeProps(optionObjs, complexOptions); + } + // TODO: move this stuff to a "plugin"-related file... + var INTERNAL_PLUGINS = [ + ArrayEventSourcePlugin, + FuncEventSourcePlugin, + JsonFeedEventSourcePlugin, + SimpleRecurrencePlugin, + DefaultOptionChangeHandlers + ]; + function refinePluginDefs(pluginInputs) { + var plugins = []; + for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) { + var pluginInput = pluginInputs_1[_i]; + if (typeof pluginInput === 'string') { + var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput); + if (!window[globalName]) { + console.warn('Plugin file not loaded for ' + pluginInput); + } + else { + plugins.push(window[globalName].default); // is an ES6 module + } + } + else { + plugins.push(pluginInput); + } + } + return INTERNAL_PLUGINS.concat(plugins); + } + + var RAW_EN_LOCALE = { + code: 'en', + week: { + dow: 0, + doy: 4 // 4 days need to be within the year to be considered the first week + }, + dir: 'ltr', + buttonText: { + prev: 'prev', + next: 'next', + prevYear: 'prev year', + nextYear: 'next year', + year: 'year', + today: 'today', + month: 'month', + week: 'week', + day: 'day', + list: 'list' + }, + weekLabel: 'W', + allDayText: 'all-day', + eventLimitText: 'more', + noEventsMessage: 'No events to display' + }; + function parseRawLocales(explicitRawLocales) { + var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en'; + var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js + var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless + var allRawLocales = globalArray.concat(// globalArray is low prio + hashValuesToArray(globalObject), // medium prio + explicitRawLocales // highest prio + ); + var rawLocaleMap = { + en: RAW_EN_LOCALE // necessary? + }; + for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) { + var rawLocale = allRawLocales_1[_i]; + rawLocaleMap[rawLocale.code] = rawLocale; + } + return { + map: rawLocaleMap, + defaultCode: defaultCode + }; + } + function buildLocale(inputSingular, available) { + if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) { + return parseLocale(inputSingular.code, [inputSingular.code], inputSingular); + } + else { + return queryLocale(inputSingular, available); + } + } + function queryLocale(codeArg, available) { + var codes = [].concat(codeArg || []); // will convert to array + var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE; + return parseLocale(codeArg, codes, raw); + } + function queryRawLocale(codes, available) { + for (var i = 0; i < codes.length; i++) { + var parts = codes[i].toLocaleLowerCase().split('-'); + for (var j = parts.length; j > 0; j--) { + var simpleId = parts.slice(0, j).join('-'); + if (available[simpleId]) { + return available[simpleId]; + } + } + } + return null; + } + function parseLocale(codeArg, codes, raw) { + var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']); + delete merged.code; // don't want this part of the options + var week = merged.week; + delete merged.week; + return { + codeArg: codeArg, + codes: codes, + week: week, + simpleNumberFormat: new Intl.NumberFormat(codeArg), + options: merged + }; + } + + var OptionsManager = /** @class */ (function () { + function OptionsManager(overrides) { + this.overrides = __assign({}, overrides); // make a copy + this.dynamicOverrides = {}; + this.compute(); + } + OptionsManager.prototype.mutate = function (updates, removals, isDynamic) { + var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides; + __assign(overrideHash, updates); + for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) { + var propName = removals_1[_i]; + delete overrideHash[propName]; + } + this.compute(); + }; + // Computes the flattened options hash for the calendar and assigns to `this.options`. + // Assumes this.overrides and this.dynamicOverrides have already been initialized. + OptionsManager.prototype.compute = function () { + // TODO: not a very efficient system + var locales = firstDefined(// explicit locale option given? + this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales); + var locale = firstDefined(// explicit locales option given? + this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale); + var available = parseRawLocales(locales); + var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options; + var dir = firstDefined(// based on options computed so far, is direction RTL? + this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir); + var dirDefaults = dir === 'rtl' ? rtlDefaults : {}; + this.dirDefaults = dirDefaults; + this.localeDefaults = localeDefaults; + this.computed = mergeOptions([ + globalDefaults, + dirDefaults, + localeDefaults, + this.overrides, + this.dynamicOverrides + ]); + }; + return OptionsManager; + }()); + + var calendarSystemClassMap = {}; + function registerCalendarSystem(name, theClass) { + calendarSystemClassMap[name] = theClass; + } + function createCalendarSystem(name) { + return new calendarSystemClassMap[name](); + } + var GregorianCalendarSystem = /** @class */ (function () { + function GregorianCalendarSystem() { + } + GregorianCalendarSystem.prototype.getMarkerYear = function (d) { + return d.getUTCFullYear(); + }; + GregorianCalendarSystem.prototype.getMarkerMonth = function (d) { + return d.getUTCMonth(); + }; + GregorianCalendarSystem.prototype.getMarkerDay = function (d) { + return d.getUTCDate(); + }; + GregorianCalendarSystem.prototype.arrayToMarker = function (arr) { + return arrayToUtcDate(arr); + }; + GregorianCalendarSystem.prototype.markerToArray = function (marker) { + return dateToUtcArray(marker); + }; + return GregorianCalendarSystem; + }()); + registerCalendarSystem('gregory', GregorianCalendarSystem); + + var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/; + function parse(str) { + var m = ISO_RE.exec(str); + if (m) { + var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0)); + if (isValidDate(marker)) { + var timeZoneOffset = null; + if (m[13]) { + timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 + + Number(m[18] || 0)); + } + return { + marker: marker, + isTimeUnspecified: !m[6], + timeZoneOffset: timeZoneOffset + }; + } + } + return null; + } + + var DateEnv = /** @class */ (function () { + function DateEnv(settings) { + var timeZone = this.timeZone = settings.timeZone; + var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC'; + if (settings.namedTimeZoneImpl && isNamedTimeZone) { + this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone); + } + this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl); + this.calendarSystem = createCalendarSystem(settings.calendarSystem); + this.locale = settings.locale; + this.weekDow = settings.locale.week.dow; + this.weekDoy = settings.locale.week.doy; + if (settings.weekNumberCalculation === 'ISO') { + this.weekDow = 1; + this.weekDoy = 4; + } + if (typeof settings.firstDay === 'number') { + this.weekDow = settings.firstDay; + } + if (typeof settings.weekNumberCalculation === 'function') { + this.weekNumberFunc = settings.weekNumberCalculation; + } + this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel; + this.cmdFormatter = settings.cmdFormatter; + } + // Creating / Parsing + DateEnv.prototype.createMarker = function (input) { + var meta = this.createMarkerMeta(input); + if (meta === null) { + return null; + } + return meta.marker; + }; + DateEnv.prototype.createNowMarker = function () { + if (this.canComputeOffset) { + return this.timestampToMarker(new Date().valueOf()); + } + else { + // if we can't compute the current date val for a timezone, + // better to give the current local date vals than UTC + return arrayToUtcDate(dateToLocalArray(new Date())); + } + }; + DateEnv.prototype.createMarkerMeta = function (input) { + if (typeof input === 'string') { + return this.parse(input); + } + var marker = null; + if (typeof input === 'number') { + marker = this.timestampToMarker(input); + } + else if (input instanceof Date) { + input = input.valueOf(); + if (!isNaN(input)) { + marker = this.timestampToMarker(input); + } + } + else if (Array.isArray(input)) { + marker = arrayToUtcDate(input); + } + if (marker === null || !isValidDate(marker)) { + return null; + } + return { marker: marker, isTimeUnspecified: false, forcedTzo: null }; + }; + DateEnv.prototype.parse = function (s) { + var parts = parse(s); + if (parts === null) { + return null; + } + var marker = parts.marker; + var forcedTzo = null; + if (parts.timeZoneOffset !== null) { + if (this.canComputeOffset) { + marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000); + } + else { + forcedTzo = parts.timeZoneOffset; + } + } + return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo }; + }; + // Accessors + DateEnv.prototype.getYear = function (marker) { + return this.calendarSystem.getMarkerYear(marker); + }; + DateEnv.prototype.getMonth = function (marker) { + return this.calendarSystem.getMarkerMonth(marker); + }; + // Adding / Subtracting + DateEnv.prototype.add = function (marker, dur) { + var a = this.calendarSystem.markerToArray(marker); + a[0] += dur.years; + a[1] += dur.months; + a[2] += dur.days; + a[6] += dur.milliseconds; + return this.calendarSystem.arrayToMarker(a); + }; + DateEnv.prototype.subtract = function (marker, dur) { + var a = this.calendarSystem.markerToArray(marker); + a[0] -= dur.years; + a[1] -= dur.months; + a[2] -= dur.days; + a[6] -= dur.milliseconds; + return this.calendarSystem.arrayToMarker(a); + }; + DateEnv.prototype.addYears = function (marker, n) { + var a = this.calendarSystem.markerToArray(marker); + a[0] += n; + return this.calendarSystem.arrayToMarker(a); + }; + DateEnv.prototype.addMonths = function (marker, n) { + var a = this.calendarSystem.markerToArray(marker); + a[1] += n; + return this.calendarSystem.arrayToMarker(a); + }; + // Diffing Whole Units + DateEnv.prototype.diffWholeYears = function (m0, m1) { + var calendarSystem = this.calendarSystem; + if (timeAsMs(m0) === timeAsMs(m1) && + calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) && + calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) { + return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0); + } + return null; + }; + DateEnv.prototype.diffWholeMonths = function (m0, m1) { + var calendarSystem = this.calendarSystem; + if (timeAsMs(m0) === timeAsMs(m1) && + calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) { + return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) + + (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12; + } + return null; + }; + // Range / Duration + DateEnv.prototype.greatestWholeUnit = function (m0, m1) { + var n = this.diffWholeYears(m0, m1); + if (n !== null) { + return { unit: 'year', value: n }; + } + n = this.diffWholeMonths(m0, m1); + if (n !== null) { + return { unit: 'month', value: n }; + } + n = diffWholeWeeks(m0, m1); + if (n !== null) { + return { unit: 'week', value: n }; + } + n = diffWholeDays(m0, m1); + if (n !== null) { + return { unit: 'day', value: n }; + } + n = diffHours(m0, m1); + if (isInt(n)) { + return { unit: 'hour', value: n }; + } + n = diffMinutes(m0, m1); + if (isInt(n)) { + return { unit: 'minute', value: n }; + } + n = diffSeconds(m0, m1); + if (isInt(n)) { + return { unit: 'second', value: n }; + } + return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() }; + }; + DateEnv.prototype.countDurationsBetween = function (m0, m1, d) { + // TODO: can use greatestWholeUnit + var diff; + if (d.years) { + diff = this.diffWholeYears(m0, m1); + if (diff !== null) { + return diff / asRoughYears(d); + } + } + if (d.months) { + diff = this.diffWholeMonths(m0, m1); + if (diff !== null) { + return diff / asRoughMonths(d); + } + } + if (d.days) { + diff = diffWholeDays(m0, m1); + if (diff !== null) { + return diff / asRoughDays(d); + } + } + return (m1.valueOf() - m0.valueOf()) / asRoughMs(d); + }; + // Start-Of + DateEnv.prototype.startOf = function (m, unit) { + if (unit === 'year') { + return this.startOfYear(m); + } + else if (unit === 'month') { + return this.startOfMonth(m); + } + else if (unit === 'week') { + return this.startOfWeek(m); + } + else if (unit === 'day') { + return startOfDay(m); + } + else if (unit === 'hour') { + return startOfHour(m); + } + else if (unit === 'minute') { + return startOfMinute(m); + } + else if (unit === 'second') { + return startOfSecond(m); + } + }; + DateEnv.prototype.startOfYear = function (m) { + return this.calendarSystem.arrayToMarker([ + this.calendarSystem.getMarkerYear(m) + ]); + }; + DateEnv.prototype.startOfMonth = function (m) { + return this.calendarSystem.arrayToMarker([ + this.calendarSystem.getMarkerYear(m), + this.calendarSystem.getMarkerMonth(m) + ]); + }; + DateEnv.prototype.startOfWeek = function (m) { + return this.calendarSystem.arrayToMarker([ + this.calendarSystem.getMarkerYear(m), + this.calendarSystem.getMarkerMonth(m), + m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7) + ]); + }; + // Week Number + DateEnv.prototype.computeWeekNumber = function (marker) { + if (this.weekNumberFunc) { + return this.weekNumberFunc(this.toDate(marker)); + } + else { + return weekOfYear(marker, this.weekDow, this.weekDoy); + } + }; + // TODO: choke on timeZoneName: long + DateEnv.prototype.format = function (marker, formatter, dateOptions) { + if (dateOptions === void 0) { dateOptions = {}; } + return formatter.format({ + marker: marker, + timeZoneOffset: dateOptions.forcedTzo != null ? + dateOptions.forcedTzo : + this.offsetForMarker(marker) + }, this); + }; + DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) { + if (dateOptions === void 0) { dateOptions = {}; } + if (dateOptions.isEndExclusive) { + end = addMs(end, -1); + } + return formatter.formatRange({ + marker: start, + timeZoneOffset: dateOptions.forcedStartTzo != null ? + dateOptions.forcedStartTzo : + this.offsetForMarker(start) + }, { + marker: end, + timeZoneOffset: dateOptions.forcedEndTzo != null ? + dateOptions.forcedEndTzo : + this.offsetForMarker(end) + }, this); + }; + DateEnv.prototype.formatIso = function (marker, extraOptions) { + if (extraOptions === void 0) { extraOptions = {}; } + var timeZoneOffset = null; + if (!extraOptions.omitTimeZoneOffset) { + if (extraOptions.forcedTzo != null) { + timeZoneOffset = extraOptions.forcedTzo; + } + else { + timeZoneOffset = this.offsetForMarker(marker); + } + } + return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime); + }; + // TimeZone + DateEnv.prototype.timestampToMarker = function (ms) { + if (this.timeZone === 'local') { + return arrayToUtcDate(dateToLocalArray(new Date(ms))); + } + else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) { + return new Date(ms); + } + else { + return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms)); + } + }; + DateEnv.prototype.offsetForMarker = function (m) { + if (this.timeZone === 'local') { + return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset + } + else if (this.timeZone === 'UTC') { + return 0; + } + else if (this.namedTimeZoneImpl) { + return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)); + } + return null; + }; + // Conversion + DateEnv.prototype.toDate = function (m, forcedTzo) { + if (this.timeZone === 'local') { + return arrayToLocalDate(dateToUtcArray(m)); + } + else if (this.timeZone === 'UTC') { + return new Date(m.valueOf()); // make sure it's a copy + } + else if (!this.namedTimeZoneImpl) { + return new Date(m.valueOf() - (forcedTzo || 0)); + } + else { + return new Date(m.valueOf() - + this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms + ); + } + }; + return DateEnv; + }()); + + var SIMPLE_SOURCE_PROPS = { + id: String, + allDayDefault: Boolean, + eventDataTransform: Function, + success: Function, + failure: Function + }; + var uid$2 = 0; + function doesSourceNeedRange(eventSource, calendar) { + var defs = calendar.pluginSystem.hooks.eventSourceDefs; + return !defs[eventSource.sourceDefId].ignoreRange; + } + function parseEventSource(raw, calendar) { + var defs = calendar.pluginSystem.hooks.eventSourceDefs; + for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence + var def = defs[i]; + var meta = def.parseMeta(raw); + if (meta) { + var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar); + res._raw = raw; + return res; + } + } + return null; + } + function parseEventSourceProps(raw, meta, sourceDefId, calendar) { + var leftovers0 = {}; + var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0); + var leftovers1 = {}; + var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1); + props.isFetching = false; + props.latestFetchId = ''; + props.fetchRange = null; + props.publicId = String(raw.id || ''); + props.sourceId = String(uid$2++); + props.sourceDefId = sourceDefId; + props.meta = meta; + props.ui = ui; + props.extendedProps = leftovers1; + return props; + } + + function reduceEventSources (eventSources, action, dateProfile, calendar) { + switch (action.type) { + case 'ADD_EVENT_SOURCES': // already parsed + return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar); + case 'REMOVE_EVENT_SOURCE': + return removeSource(eventSources, action.sourceId); + case 'PREV': // TODO: how do we track all actions that affect dateProfile :( + case 'NEXT': + case 'SET_DATE': + case 'SET_VIEW_TYPE': + if (dateProfile) { + return fetchDirtySources(eventSources, dateProfile.activeRange, calendar); + } + else { + return eventSources; + } + case 'FETCH_EVENT_SOURCES': + case 'CHANGE_TIMEZONE': + return fetchSourcesByIds(eventSources, action.sourceIds ? + arrayToHash(action.sourceIds) : + excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar); + case 'RECEIVE_EVENTS': + case 'RECEIVE_EVENT_ERROR': + return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange); + case 'REMOVE_ALL_EVENT_SOURCES': + return {}; + default: + return eventSources; + } + } + var uid$3 = 0; + function addSources(eventSourceHash, sources, fetchRange, calendar) { + var hash = {}; + for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) { + var source = sources_1[_i]; + hash[source.sourceId] = source; + } + if (fetchRange) { + hash = fetchDirtySources(hash, fetchRange, calendar); + } + return __assign({}, eventSourceHash, hash); + } + function removeSource(eventSourceHash, sourceId) { + return filterHash(eventSourceHash, function (eventSource) { + return eventSource.sourceId !== sourceId; + }); + } + function fetchDirtySources(sourceHash, fetchRange, calendar) { + return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) { + return isSourceDirty(eventSource, fetchRange, calendar); + }), fetchRange, calendar); + } + function isSourceDirty(eventSource, fetchRange, calendar) { + if (!doesSourceNeedRange(eventSource, calendar)) { + return !eventSource.latestFetchId; + } + else { + return !calendar.opt('lazyFetching') || + !eventSource.fetchRange || + fetchRange.start < eventSource.fetchRange.start || + fetchRange.end > eventSource.fetchRange.end; + } + } + function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) { + var nextSources = {}; + for (var sourceId in prevSources) { + var source = prevSources[sourceId]; + if (sourceIdHash[sourceId]) { + nextSources[sourceId] = fetchSource(source, fetchRange, calendar); + } + else { + nextSources[sourceId] = source; + } + } + return nextSources; + } + function fetchSource(eventSource, fetchRange, calendar) { + var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId]; + var fetchId = String(uid$3++); + sourceDef.fetch({ + eventSource: eventSource, + calendar: calendar, + range: fetchRange + }, function (res) { + var rawEvents = res.rawEvents; + var calSuccess = calendar.opt('eventSourceSuccess'); + var calSuccessRes; + var sourceSuccessRes; + if (eventSource.success) { + sourceSuccessRes = eventSource.success(rawEvents, res.xhr); + } + if (calSuccess) { + calSuccessRes = calSuccess(rawEvents, res.xhr); + } + rawEvents = sourceSuccessRes || calSuccessRes || rawEvents; + calendar.dispatch({ + type: 'RECEIVE_EVENTS', + sourceId: eventSource.sourceId, + fetchId: fetchId, + fetchRange: fetchRange, + rawEvents: rawEvents + }); + }, function (error) { + var callFailure = calendar.opt('eventSourceFailure'); + console.warn(error.message, error); + if (eventSource.failure) { + eventSource.failure(error); + } + if (callFailure) { + callFailure(error); + } + calendar.dispatch({ + type: 'RECEIVE_EVENT_ERROR', + sourceId: eventSource.sourceId, + fetchId: fetchId, + fetchRange: fetchRange, + error: error + }); + }); + return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId }); + } + function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) { + var _a; + var eventSource = sourceHash[sourceId]; + if (eventSource && // not already removed + fetchId === eventSource.latestFetchId) { + return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange }), _a)); + } + return sourceHash; + } + function excludeStaticSources(eventSources, calendar) { + return filterHash(eventSources, function (eventSource) { + return doesSourceNeedRange(eventSource, calendar); + }); + } + + var DateProfileGenerator = /** @class */ (function () { + function DateProfileGenerator(viewSpec, calendar) { + this.viewSpec = viewSpec; + this.options = viewSpec.options; + this.dateEnv = calendar.dateEnv; + this.calendar = calendar; + this.initHiddenDays(); + } + /* Date Range Computation + ------------------------------------------------------------------------------------------------------------------*/ + // Builds a structure with info about what the dates/ranges will be for the "prev" view. + DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) { + var dateEnv = this.dateEnv; + var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month + currentDateProfile.dateIncrement); + return this.build(prevDate, -1); + }; + // Builds a structure with info about what the dates/ranges will be for the "next" view. + DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) { + var dateEnv = this.dateEnv; + var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month + currentDateProfile.dateIncrement); + return this.build(nextDate, 1); + }; + // Builds a structure holding dates/ranges for rendering around the given date. + // Optional direction param indicates whether the date is being incremented/decremented + // from its previous value. decremented = -1, incremented = 1 (default). + DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) { + if (forceToValid === void 0) { forceToValid = false; } + var validRange; + var minTime = null; + var maxTime = null; + var currentInfo; + var isRangeAllDay; + var renderRange; + var activeRange; + var isValid; + validRange = this.buildValidRange(); + validRange = this.trimHiddenDays(validRange); + if (forceToValid) { + currentDate = constrainMarkerToRange(currentDate, validRange); + } + currentInfo = this.buildCurrentRangeInfo(currentDate, direction); + isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit); + renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay); + renderRange = this.trimHiddenDays(renderRange); + activeRange = renderRange; + if (!this.options.showNonCurrentDates) { + activeRange = intersectRanges(activeRange, currentInfo.range); + } + minTime = createDuration(this.options.minTime); + maxTime = createDuration(this.options.maxTime); + activeRange = this.adjustActiveRange(activeRange, minTime, maxTime); + activeRange = intersectRanges(activeRange, validRange); // might return null + // it's invalid if the originally requested date is not contained, + // or if the range is completely outside of the valid range. + isValid = rangesIntersect(currentInfo.range, validRange); + return { + // constraint for where prev/next operations can go and where events can be dragged/resized to. + // an object with optional start and end properties. + validRange: validRange, + // range the view is formally responsible for. + // for example, a month view might have 1st-31st, excluding padded dates + currentRange: currentInfo.range, + // name of largest unit being displayed, like "month" or "week" + currentRangeUnit: currentInfo.unit, + isRangeAllDay: isRangeAllDay, + // dates that display events and accept drag-n-drop + // will be `null` if no dates accept events + activeRange: activeRange, + // date range with a rendered skeleton + // includes not-active days that need some sort of DOM + renderRange: renderRange, + // Duration object that denotes the first visible time of any given day + minTime: minTime, + // Duration object that denotes the exclusive visible end time of any given day + maxTime: maxTime, + isValid: isValid, + // how far the current date will move for a prev/next operation + dateIncrement: this.buildDateIncrement(currentInfo.duration) + // pass a fallback (might be null) ^ + }; + }; + // Builds an object with optional start/end properties. + // Indicates the minimum/maximum dates to display. + // not responsible for trimming hidden days. + DateProfileGenerator.prototype.buildValidRange = function () { + return this.getRangeOption('validRange', this.calendar.getNow()) || + { start: null, end: null }; // completely open-ended + }; + // Builds a structure with info about the "current" range, the range that is + // highlighted as being the current month for example. + // See build() for a description of `direction`. + // Guaranteed to have `range` and `unit` properties. `duration` is optional. + DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) { + var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv; + var duration = null; + var unit = null; + var range = null; + var dayCount; + if (viewSpec.duration) { + duration = viewSpec.duration; + unit = viewSpec.durationUnit; + range = this.buildRangeFromDuration(date, direction, duration, unit); + } + else if ((dayCount = this.options.dayCount)) { + unit = 'day'; + range = this.buildRangeFromDayCount(date, direction, dayCount); + } + else if ((range = this.buildCustomVisibleRange(date))) { + unit = dateEnv.greatestWholeUnit(range.start, range.end).unit; + } + else { + duration = this.getFallbackDuration(); + unit = greatestDurationDenominator(duration).unit; + range = this.buildRangeFromDuration(date, direction, duration, unit); + } + return { duration: duration, unit: unit, range: range }; + }; + DateProfileGenerator.prototype.getFallbackDuration = function () { + return createDuration({ day: 1 }); + }; + // Returns a new activeRange to have time values (un-ambiguate) + // minTime or maxTime causes the range to expand. + DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) { + var dateEnv = this.dateEnv; + var start = range.start; + var end = range.end; + if (this.viewSpec.class.prototype.usesMinMaxTime) { + // expand active range if minTime is negative (why not when positive?) + if (asRoughDays(minTime) < 0) { + start = startOfDay(start); // necessary? + start = dateEnv.add(start, minTime); + } + // expand active range if maxTime is beyond one day (why not when positive?) + if (asRoughDays(maxTime) > 1) { + end = startOfDay(end); // necessary? + end = addDays(end, -1); + end = dateEnv.add(end, maxTime); + } + } + return { start: start, end: end }; + }; + // Builds the "current" range when it is specified as an explicit duration. + // `unit` is the already-computed greatestDurationDenominator unit of duration. + DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) { + var dateEnv = this.dateEnv; + var alignment = this.options.dateAlignment; + var dateIncrementInput; + var dateIncrementDuration; + var start; + var end; + var res; + // compute what the alignment should be + if (!alignment) { + dateIncrementInput = this.options.dateIncrement; + if (dateIncrementInput) { + dateIncrementDuration = createDuration(dateIncrementInput); + // use the smaller of the two units + if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) { + alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit; + } + else { + alignment = unit; + } + } + else { + alignment = unit; + } + } + // if the view displays a single day or smaller + if (asRoughDays(duration) <= 1) { + if (this.isHiddenDay(start)) { + start = this.skipHiddenDays(start, direction); + start = startOfDay(start); + } + } + function computeRes() { + start = dateEnv.startOf(date, alignment); + end = dateEnv.add(start, duration); + res = { start: start, end: end }; + } + computeRes(); + // if range is completely enveloped by hidden days, go past the hidden days + if (!this.trimHiddenDays(res)) { + date = this.skipHiddenDays(date, direction); + computeRes(); + } + return res; + }; + // Builds the "current" range when a dayCount is specified. + DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) { + var dateEnv = this.dateEnv; + var customAlignment = this.options.dateAlignment; + var runningCount = 0; + var start = date; + var end; + if (customAlignment) { + start = dateEnv.startOf(start, customAlignment); + } + start = startOfDay(start); + start = this.skipHiddenDays(start, direction); + end = start; + do { + end = addDays(end, 1); + if (!this.isHiddenDay(end)) { + runningCount++; + } + } while (runningCount < dayCount); + return { start: start, end: end }; + }; + // Builds a normalized range object for the "visible" range, + // which is a way to define the currentRange and activeRange at the same time. + DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) { + var dateEnv = this.dateEnv; + var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date)); + if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) { + return null; + } + return visibleRange; + }; + // Computes the range that will represent the element/cells for *rendering*, + // but which may have voided days/times. + // not responsible for trimming hidden days. + DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) { + return currentRange; + }; + // Compute the duration value that should be added/substracted to the current date + // when a prev/next operation happens. + DateProfileGenerator.prototype.buildDateIncrement = function (fallback) { + var dateIncrementInput = this.options.dateIncrement; + var customAlignment; + if (dateIncrementInput) { + return createDuration(dateIncrementInput); + } + else if ((customAlignment = this.options.dateAlignment)) { + return createDuration(1, customAlignment); + } + else if (fallback) { + return fallback; + } + else { + return createDuration({ days: 1 }); + } + }; + // Arguments after name will be forwarded to a hypothetical function value + // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects. + // Always clone your objects if you fear mutation. + DateProfileGenerator.prototype.getRangeOption = function (name) { + var otherArgs = []; + for (var _i = 1; _i < arguments.length; _i++) { + otherArgs[_i - 1] = arguments[_i]; + } + var val = this.options[name]; + if (typeof val === 'function') { + val = val.apply(null, otherArgs); + } + if (val) { + val = parseRange(val, this.dateEnv); + } + if (val) { + val = computeVisibleDayRange(val); + } + return val; + }; + /* Hidden Days + ------------------------------------------------------------------------------------------------------------------*/ + // Initializes internal variables related to calculating hidden days-of-week + DateProfileGenerator.prototype.initHiddenDays = function () { + var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden + var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool) + var dayCnt = 0; + var i; + if (this.options.weekends === false) { + hiddenDays.push(0, 6); // 0=sunday, 6=saturday + } + for (i = 0; i < 7; i++) { + if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) { + dayCnt++; + } + } + if (!dayCnt) { + throw new Error('invalid hiddenDays'); // all days were hidden? bad. + } + this.isHiddenDayHash = isHiddenDayHash; + }; + // Remove days from the beginning and end of the range that are computed as hidden. + // If the whole range is trimmed off, returns null + DateProfileGenerator.prototype.trimHiddenDays = function (range) { + var start = range.start; + var end = range.end; + if (start) { + start = this.skipHiddenDays(start); + } + if (end) { + end = this.skipHiddenDays(end, -1, true); + } + if (start == null || end == null || start < end) { + return { start: start, end: end }; + } + return null; + }; + // Is the current day hidden? + // `day` is a day-of-week index (0-6), or a Date (used for UTC) + DateProfileGenerator.prototype.isHiddenDay = function (day) { + if (day instanceof Date) { + day = day.getUTCDay(); + } + return this.isHiddenDayHash[day]; + }; + // Incrementing the current day until it is no longer a hidden day, returning a copy. + // DOES NOT CONSIDER validRange! + // If the initial value of `date` is not a hidden day, don't do anything. + // Pass `isExclusive` as `true` if you are dealing with an end date. + // `inc` defaults to `1` (increment one day forward each time) + DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) { + if (inc === void 0) { inc = 1; } + if (isExclusive === void 0) { isExclusive = false; } + while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) { + date = addDays(date, inc); + } + return date; + }; + return DateProfileGenerator; + }()); + // TODO: find a way to avoid comparing DateProfiles. it's tedious + function isDateProfilesEqual(p0, p1) { + return rangesEqual(p0.validRange, p1.validRange) && + rangesEqual(p0.activeRange, p1.activeRange) && + rangesEqual(p0.renderRange, p1.renderRange) && + durationsEqual(p0.minTime, p1.minTime) && + durationsEqual(p0.maxTime, p1.maxTime); + /* + TODO: compare more? + currentRange: DateRange + currentRangeUnit: string + isRangeAllDay: boolean + isValid: boolean + dateIncrement: Duration + */ + } + + function reduce (state, action, calendar) { + var viewType = reduceViewType(state.viewType, action); + var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar); + var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar); + var nextState = __assign({}, state, { viewType: viewType, + dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) }); + for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) { + var reducerFunc = _a[_i]; + nextState = reducerFunc(nextState, action, calendar); + } + // console.log(action.type, nextState) + return nextState; + } + function reduceViewType(currentViewType, action) { + switch (action.type) { + case 'SET_VIEW_TYPE': + return action.viewType; + default: + return currentViewType; + } + } + function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) { + var newDateProfile; + switch (action.type) { + case 'PREV': + newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate); + break; + case 'NEXT': + newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate); + break; + case 'SET_DATE': + if (!currentDateProfile.activeRange || + !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) { + newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid + ); + } + break; + case 'SET_VIEW_TYPE': + var generator = calendar.dateProfileGenerators[viewType]; + if (!generator) { + throw new Error(viewType ? + 'The FullCalendar view "' + viewType + '" does not exist. Make sure your plugins are loaded correctly.' : + 'No available FullCalendar view plugins.'); + } + newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid + ); + break; + } + if (newDateProfile && + newDateProfile.isValid && + !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) { + return newDateProfile; + } + else { + return currentDateProfile; + } + } + function reduceCurrentDate(currentDate, action, dateProfile) { + switch (action.type) { + case 'PREV': + case 'NEXT': + if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) { + return dateProfile.currentRange.start; + } + else { + return currentDate; + } + case 'SET_DATE': + case 'SET_VIEW_TYPE': + var newDate = action.dateMarker || currentDate; + if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) { + return dateProfile.currentRange.start; + } + else { + return newDate; + } + default: + return currentDate; + } + } + function reduceDateSelection(currentSelection, action, calendar) { + switch (action.type) { + case 'SELECT_DATES': + return action.selection; + case 'UNSELECT_DATES': + return null; + default: + return currentSelection; + } + } + function reduceSelectedEvent(currentInstanceId, action) { + switch (action.type) { + case 'SELECT_EVENT': + return action.eventInstanceId; + case 'UNSELECT_EVENT': + return ''; + default: + return currentInstanceId; + } + } + function reduceEventDrag(currentDrag, action, sources, calendar) { + switch (action.type) { + case 'SET_EVENT_DRAG': + var newDrag = action.state; + return { + affectedEvents: newDrag.affectedEvents, + mutatedEvents: newDrag.mutatedEvents, + isEvent: newDrag.isEvent, + origSeg: newDrag.origSeg + }; + case 'UNSET_EVENT_DRAG': + return null; + default: + return currentDrag; + } + } + function reduceEventResize(currentResize, action, sources, calendar) { + switch (action.type) { + case 'SET_EVENT_RESIZE': + var newResize = action.state; + return { + affectedEvents: newResize.affectedEvents, + mutatedEvents: newResize.mutatedEvents, + isEvent: newResize.isEvent, + origSeg: newResize.origSeg + }; + case 'UNSET_EVENT_RESIZE': + return null; + default: + return currentResize; + } + } + function computeLoadingLevel(eventSources) { + var cnt = 0; + for (var sourceId in eventSources) { + if (eventSources[sourceId].isFetching) { + cnt++; + } + } + return cnt; + } + + var STANDARD_PROPS = { + start: null, + end: null, + allDay: Boolean + }; + function parseDateSpan(raw, dateEnv, defaultDuration) { + var span = parseOpenDateSpan(raw, dateEnv); + var range = span.range; + if (!range.start) { + return null; + } + if (!range.end) { + if (defaultDuration == null) { + return null; + } + else { + range.end = dateEnv.add(range.start, defaultDuration); + } + } + return span; + } + /* + TODO: somehow combine with parseRange? + Will return null if the start/end props were present but parsed invalidly. + */ + function parseOpenDateSpan(raw, dateEnv) { + var leftovers = {}; + var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers); + var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null; + var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null; + var allDay = standardProps.allDay; + if (allDay == null) { + allDay = (startMeta && startMeta.isTimeUnspecified) && + (!endMeta || endMeta.isTimeUnspecified); + } + // use this leftover object as the selection object + leftovers.range = { + start: startMeta ? startMeta.marker : null, + end: endMeta ? endMeta.marker : null + }; + leftovers.allDay = allDay; + return leftovers; + } + function isDateSpansEqual(span0, span1) { + return rangesEqual(span0.range, span1.range) && + span0.allDay === span1.allDay && + isSpanPropsEqual(span0, span1); + } + // the NON-DATE-RELATED props + function isSpanPropsEqual(span0, span1) { + for (var propName in span1) { + if (propName !== 'range' && propName !== 'allDay') { + if (span0[propName] !== span1[propName]) { + return false; + } + } + } + // are there any props that span0 has that span1 DOESN'T have? + // both have range/allDay, so no need to special-case. + for (var propName in span0) { + if (!(propName in span1)) { + return false; + } + } + return true; + } + function buildDateSpanApi(span, dateEnv) { + return { + start: dateEnv.toDate(span.range.start), + end: dateEnv.toDate(span.range.end), + startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }), + endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }), + allDay: span.allDay + }; + } + function buildDatePointApi(span, dateEnv) { + return { + date: dateEnv.toDate(span.range.start), + dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }), + allDay: span.allDay + }; + } + function fabricateEventRange(dateSpan, eventUiBases, calendar) { + var def = parseEventDef({ editable: false }, '', // sourceId + dateSpan.allDay, true, // hasEnd + calendar); + return { + def: def, + ui: compileEventUi(def, eventUiBases), + instance: createEventInstance(def.defId, dateSpan.range), + range: dateSpan.range, + isStart: true, + isEnd: true + }; + } + + function compileViewDefs(defaultConfigs, overrideConfigs) { + var hash = {}; + var viewType; + for (viewType in defaultConfigs) { + ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); + } + for (viewType in overrideConfigs) { + ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs); + } + return hash; + } + function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) { + if (hash[viewType]) { + return hash[viewType]; + } + var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs); + if (viewDef) { + hash[viewType] = viewDef; + } + return viewDef; + } + function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) { + var defaultConfig = defaultConfigs[viewType]; + var overrideConfig = overrideConfigs[viewType]; + var queryProp = function (name) { + return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] : + ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null); + }; + var theClass = queryProp('class'); + var superType = queryProp('superType'); + if (!superType && theClass) { + superType = + findViewNameBySubclass(theClass, overrideConfigs) || + findViewNameBySubclass(theClass, defaultConfigs); + } + var superDef = null; + if (superType) { + if (superType === viewType) { + throw new Error('Can\'t have a custom view type that references itself'); + } + superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs); + } + if (!theClass && superDef) { + theClass = superDef.class; + } + if (!theClass) { + return null; // don't throw a warning, might be settings for a single-unit view + } + return { + type: viewType, + class: theClass, + defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})), + overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {})) + }; + } + function findViewNameBySubclass(viewSubclass, configs) { + var superProto = Object.getPrototypeOf(viewSubclass.prototype); + for (var viewType in configs) { + var parsed = configs[viewType]; + // need DIRECT subclass, so instanceof won't do it + if (parsed.class && parsed.class.prototype === superProto) { + return viewType; + } + } + return ''; + } + + function parseViewConfigs(inputs) { + return mapHash(inputs, parseViewConfig); + } + var VIEW_DEF_PROPS = { + type: String, + class: null + }; + function parseViewConfig(input) { + if (typeof input === 'function') { + input = { class: input }; + } + var options = {}; + var props = refineProps(input, VIEW_DEF_PROPS, {}, options); + return { + superType: props.type, + class: props.class, + options: options + }; + } + + function buildViewSpecs(defaultInputs, optionsManager) { + var defaultConfigs = parseViewConfigs(defaultInputs); + var overrideConfigs = parseViewConfigs(optionsManager.overrides.views); + var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs); + return mapHash(viewDefs, function (viewDef) { + return buildViewSpec(viewDef, overrideConfigs, optionsManager); + }); + } + function buildViewSpec(viewDef, overrideConfigs, optionsManager) { + var durationInput = viewDef.overrides.duration || + viewDef.defaults.duration || + optionsManager.dynamicOverrides.duration || + optionsManager.overrides.duration; + var duration = null; + var durationUnit = ''; + var singleUnit = ''; + var singleUnitOverrides = {}; + if (durationInput) { + duration = createDuration(durationInput); + if (duration) { // valid? + var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput)); + durationUnit = denom.unit; + if (denom.value === 1) { + singleUnit = durationUnit; + singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {}; + } + } + } + var queryButtonText = function (options) { + var buttonTextMap = options.buttonText || {}; + var buttonTextKey = viewDef.defaults.buttonTextKey; + if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) { + return buttonTextMap[buttonTextKey]; + } + if (buttonTextMap[viewDef.type] != null) { + return buttonTextMap[viewDef.type]; + } + if (buttonTextMap[singleUnit] != null) { + return buttonTextMap[singleUnit]; + } + }; + return { + type: viewDef.type, + class: viewDef.class, + duration: duration, + durationUnit: durationUnit, + singleUnit: singleUnit, + options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides), + buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) || + queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence + viewDef.overrides.buttonText, + buttonTextDefault: queryButtonText(optionsManager.localeDefaults) || + queryButtonText(optionsManager.dirDefaults) || + viewDef.defaults.buttonText || + queryButtonText(globalDefaults) || + viewDef.type // fall back to given view name + }; + } + + var Toolbar = /** @class */ (function (_super) { + __extends(Toolbar, _super); + function Toolbar(context, extraClassName) { + var _this = _super.call(this, context) || this; + _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout); + _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]); + _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]); + _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]); + _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]); + _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]); + _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName }); + return _this; + } + Toolbar.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this._renderLayout.unrender(); // should unrender everything else + removeElement(this.el); + }; + Toolbar.prototype.render = function (props) { + this._renderLayout(props.layout); + this._updateTitle(props.title); + this._updateActiveButton(props.activeButton); + this._updateToday(props.isTodayEnabled); + this._updatePrev(props.isPrevEnabled); + this._updateNext(props.isNextEnabled); + }; + Toolbar.prototype.renderLayout = function (layout) { + var el = this.el; + this.viewsWithButtons = []; + appendToElement(el, this.renderSection('left', layout.left)); + appendToElement(el, this.renderSection('center', layout.center)); + appendToElement(el, this.renderSection('right', layout.right)); + }; + Toolbar.prototype.unrenderLayout = function () { + this.el.innerHTML = ''; + }; + Toolbar.prototype.renderSection = function (position, buttonStr) { + var _this = this; + var _a = this, theme = _a.theme, calendar = _a.calendar; + var optionsManager = calendar.optionsManager; + var viewSpecs = calendar.viewSpecs; + var sectionEl = createElement('div', { className: 'fc-' + position }); + var calendarCustomButtons = optionsManager.computed.customButtons || {}; + var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {}; + var calendarButtonText = optionsManager.computed.buttonText || {}; + if (buttonStr) { + buttonStr.split(' ').forEach(function (buttonGroupStr, i) { + var groupChildren = []; + var isOnlyButtons = true; + var groupEl; + buttonGroupStr.split(',').forEach(function (buttonName, j) { + var customButtonProps; + var viewSpec; + var buttonClick; + var buttonIcon; // only one of these will be set + var buttonText; // " + var buttonInnerHtml; + var buttonClasses; + var buttonEl; + var buttonAriaAttr; + if (buttonName === 'title') { + groupChildren.push(htmlToElement('

 

')); // we always want it to take up height + isOnlyButtons = false; + } + else { + if ((customButtonProps = calendarCustomButtons[buttonName])) { + buttonClick = function (ev) { + if (customButtonProps.click) { + customButtonProps.click.call(buttonEl, ev); + } + }; + (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) || + (buttonIcon = theme.getIconClass(buttonName)) || + (buttonText = customButtonProps.text); + } + else if ((viewSpec = viewSpecs[buttonName])) { + _this.viewsWithButtons.push(buttonName); + buttonClick = function () { + calendar.changeView(buttonName); + }; + (buttonText = viewSpec.buttonTextOverride) || + (buttonIcon = theme.getIconClass(buttonName)) || + (buttonText = viewSpec.buttonTextDefault); + } + else if (calendar[buttonName]) { // a calendar method + buttonClick = function () { + calendar[buttonName](); + }; + (buttonText = calendarButtonTextOverrides[buttonName]) || + (buttonIcon = theme.getIconClass(buttonName)) || + (buttonText = calendarButtonText[buttonName]); + // ^ everything else is considered default + } + if (buttonClick) { + buttonClasses = [ + 'fc-' + buttonName + '-button', + theme.getClass('button') + ]; + if (buttonText) { + buttonInnerHtml = htmlEscape(buttonText); + buttonAriaAttr = ''; + } + else if (buttonIcon) { + buttonInnerHtml = ""; + buttonAriaAttr = ' aria-label="' + buttonName + '"'; + } + buttonEl = htmlToElement(// type="button" so that it doesn't submit a form + ''); + buttonEl.addEventListener('click', buttonClick); + groupChildren.push(buttonEl); + } + } + }); + if (groupChildren.length > 1) { + groupEl = document.createElement('div'); + var buttonGroupClassName = theme.getClass('buttonGroup'); + if (isOnlyButtons && buttonGroupClassName) { + groupEl.classList.add(buttonGroupClassName); + } + appendToElement(groupEl, groupChildren); + sectionEl.appendChild(groupEl); + } + else { + appendToElement(sectionEl, groupChildren); // 1 or 0 children + } + }); + } + return sectionEl; + }; + Toolbar.prototype.updateToday = function (isTodayEnabled) { + this.toggleButtonEnabled('today', isTodayEnabled); + }; + Toolbar.prototype.updatePrev = function (isPrevEnabled) { + this.toggleButtonEnabled('prev', isPrevEnabled); + }; + Toolbar.prototype.updateNext = function (isNextEnabled) { + this.toggleButtonEnabled('next', isNextEnabled); + }; + Toolbar.prototype.updateTitle = function (text) { + findElements(this.el, 'h2').forEach(function (titleEl) { + titleEl.innerText = text; + }); + }; + Toolbar.prototype.updateActiveButton = function (buttonName) { + var className = this.theme.getClass('buttonActive'); + findElements(this.el, 'button').forEach(function (buttonEl) { + if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) { + buttonEl.classList.add(className); + } + else { + buttonEl.classList.remove(className); + } + }); + }; + Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) { + findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) { + buttonEl.disabled = !bool; + }); + }; + return Toolbar; + }(Component)); + + var CalendarComponent = /** @class */ (function (_super) { + __extends(CalendarComponent, _super); + function CalendarComponent(context, el) { + var _this = _super.call(this, context) || this; + _this._renderToolbars = memoizeRendering(_this.renderToolbars); + _this.buildViewPropTransformers = memoize(buildViewPropTransformers); + _this.el = el; + prependToElement(el, _this.contentEl = createElement('div', { className: 'fc-view-container' })); + var calendar = _this.calendar; + for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) { + var modifyViewContainer = _a[_i]; + modifyViewContainer(_this.contentEl, calendar); + } + _this.toggleElClassNames(true); + _this.computeTitle = memoize(computeTitle); + _this.parseBusinessHours = memoize(function (input) { + return parseBusinessHours(input, _this.calendar); + }); + return _this; + } + CalendarComponent.prototype.destroy = function () { + if (this.header) { + this.header.destroy(); + } + if (this.footer) { + this.footer.destroy(); + } + if (this.view) { + this.view.destroy(); + } + removeElement(this.contentEl); + this.toggleElClassNames(false); + _super.prototype.destroy.call(this); + }; + CalendarComponent.prototype.toggleElClassNames = function (bool) { + var classList = this.el.classList; + var dirClassName = 'fc-' + this.opt('dir'); + var themeClassName = this.theme.getClass('widget'); + if (bool) { + classList.add('fc'); + classList.add(dirClassName); + classList.add(themeClassName); + } + else { + classList.remove('fc'); + classList.remove(dirClassName); + classList.remove(themeClassName); + } + }; + CalendarComponent.prototype.render = function (props) { + this.freezeHeight(); + var title = this.computeTitle(props.dateProfile, props.viewSpec.options); + this._renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, props.dateProfileGenerator, title); + this.renderView(props, title); + this.updateSize(); + this.thawHeight(); + }; + CalendarComponent.prototype.renderToolbars = function (viewSpec, dateProfile, currentDate, dateProfileGenerator, title) { + var headerLayout = this.opt('header'); + var footerLayout = this.opt('footer'); + var now = this.calendar.getNow(); + var todayInfo = dateProfileGenerator.build(now); + var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate); + var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate); + var toolbarProps = { + title: title, + activeButton: viewSpec.type, + isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now), + isPrevEnabled: prevInfo.isValid, + isNextEnabled: nextInfo.isValid + }; + if (headerLayout) { + if (!this.header) { + this.header = new Toolbar(this.context, 'fc-header-toolbar'); + prependToElement(this.el, this.header.el); + } + this.header.receiveProps(__assign({ layout: headerLayout }, toolbarProps)); + } + else if (this.header) { + this.header.destroy(); + this.header = null; + } + if (footerLayout) { + if (!this.footer) { + this.footer = new Toolbar(this.context, 'fc-footer-toolbar'); + appendToElement(this.el, this.footer.el); + } + this.footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps)); + } + else if (this.footer) { + this.footer.destroy(); + this.footer = null; + } + }; + CalendarComponent.prototype.renderView = function (props, title) { + var view = this.view; + var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator; + if (!view || view.viewSpec !== viewSpec) { + if (view) { + view.destroy(); + } + view = this.view = new viewSpec['class']({ + calendar: this.calendar, + view: null, + dateEnv: this.dateEnv, + theme: this.theme, + options: viewSpec.options + }, viewSpec, dateProfileGenerator, this.contentEl); + } + else { + view.addScroll(view.queryScroll()); + } + view.title = title; // for the API + var viewProps = { + dateProfile: props.dateProfile, + businessHours: this.parseBusinessHours(viewSpec.options.businessHours), + eventStore: props.eventStore, + eventUiBases: props.eventUiBases, + dateSelection: props.dateSelection, + eventSelection: props.eventSelection, + eventDrag: props.eventDrag, + eventResize: props.eventResize + }; + var transformers = this.buildViewPropTransformers(this.calendar.pluginSystem.hooks.viewPropsTransformers); + for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) { + var transformer = transformers_1[_i]; + __assign(viewProps, transformer.transform(viewProps, viewSpec, props, view)); + } + view.receiveProps(viewProps); + }; + // Sizing + // ----------------------------------------------------------------------------------------------------------------- + CalendarComponent.prototype.updateSize = function (isResize) { + if (isResize === void 0) { isResize = false; } + var view = this.view; + if (isResize) { + view.addScroll(view.queryScroll()); + } + if (isResize || this.isHeightAuto == null) { + this.computeHeightVars(); + } + view.updateSize(isResize, this.viewHeight, this.isHeightAuto); + view.updateNowIndicator(); // we need to guarantee this will run after updateSize + view.popScroll(isResize); + }; + CalendarComponent.prototype.computeHeightVars = function () { + var calendar = this.calendar; // yuck. need to handle dynamic options + var heightInput = calendar.opt('height'); + var contentHeightInput = calendar.opt('contentHeight'); + this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto'; + if (typeof contentHeightInput === 'number') { // exists and not 'auto' + this.viewHeight = contentHeightInput; + } + else if (typeof contentHeightInput === 'function') { // exists and is a function + this.viewHeight = contentHeightInput(); + } + else if (typeof heightInput === 'number') { // exists and not 'auto' + this.viewHeight = heightInput - this.queryToolbarsHeight(); + } + else if (typeof heightInput === 'function') { // exists and is a function + this.viewHeight = heightInput() - this.queryToolbarsHeight(); + } + else if (heightInput === 'parent') { // set to height of parent element + var parentEl = this.el.parentNode; + this.viewHeight = parentEl.getBoundingClientRect().height - this.queryToolbarsHeight(); + } + else { + this.viewHeight = Math.round(this.contentEl.getBoundingClientRect().width / + Math.max(calendar.opt('aspectRatio'), .5)); + } + }; + CalendarComponent.prototype.queryToolbarsHeight = function () { + var height = 0; + if (this.header) { + height += computeHeightAndMargins(this.header.el); + } + if (this.footer) { + height += computeHeightAndMargins(this.footer.el); + } + return height; + }; + // Height "Freezing" + // ----------------------------------------------------------------------------------------------------------------- + CalendarComponent.prototype.freezeHeight = function () { + applyStyle(this.el, { + height: this.el.getBoundingClientRect().height, + overflow: 'hidden' + }); + }; + CalendarComponent.prototype.thawHeight = function () { + applyStyle(this.el, { + height: '', + overflow: '' + }); + }; + return CalendarComponent; + }(Component)); + // Title and Date Formatting + // ----------------------------------------------------------------------------------------------------------------- + // Computes what the title at the top of the calendar should be for this view + function computeTitle(dateProfile, viewOptions) { + var range; + // for views that span a large unit of time, show the proper interval, ignoring stray days before and after + if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) { + range = dateProfile.currentRange; + } + else { // for day units or smaller, use the actual day range + range = dateProfile.activeRange; + } + return this.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay }); + } + // Generates the format string that should be used to generate the title for the current date range. + // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`. + function computeTitleFormat(dateProfile) { + var currentRangeUnit = dateProfile.currentRangeUnit; + if (currentRangeUnit === 'year') { + return { year: 'numeric' }; + } + else if (currentRangeUnit === 'month') { + return { year: 'numeric', month: 'long' }; // like "September 2014" + } + else { + var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end); + if (days !== null && days > 1) { + // multi-day range. shorter, like "Sep 9 - 10 2014" + return { year: 'numeric', month: 'short', day: 'numeric' }; + } + else { + // one day. longer, like "September 9 2014" + return { year: 'numeric', month: 'long', day: 'numeric' }; + } + } + } + // Plugin + // ----------------------------------------------------------------------------------------------------------------- + function buildViewPropTransformers(theClasses) { + return theClasses.map(function (theClass) { + return new theClass(); + }); + } + + var Interaction = /** @class */ (function () { + function Interaction(settings) { + this.component = settings.component; + } + Interaction.prototype.destroy = function () { + }; + return Interaction; + }()); + function parseInteractionSettings(component, input) { + return { + component: component, + el: input.el, + useEventCenter: input.useEventCenter != null ? input.useEventCenter : true + }; + } + function interactionSettingsToStore(settings) { + var _a; + return _a = {}, + _a[settings.component.uid] = settings, + _a; + } + // global state + var interactionSettingsStore = {}; + + /* + Detects when the user clicks on an event within a DateComponent + */ + var EventClicking = /** @class */ (function (_super) { + __extends(EventClicking, _super); + function EventClicking(settings) { + var _this = _super.call(this, settings) || this; + _this.handleSegClick = function (ev, segEl) { + var component = _this.component; + var seg = getElSeg(segEl); + if (seg && // might be the
surrounding the more link + component.isValidSegDownEl(ev.target)) { + // our way to simulate a link click for elements that can't be tags + // grab before trigger fired in case trigger trashes DOM thru rerendering + var hasUrlContainer = elementClosest(ev.target, '.fc-has-url'); + var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : ''; + component.publiclyTrigger('eventClick', [ + { + el: segEl, + event: new EventApi(component.calendar, seg.eventRange.def, seg.eventRange.instance), + jsEvent: ev, + view: component.view + } + ]); + if (url && !ev.defaultPrevented) { + window.location.href = url; + } + } + }; + var component = settings.component; + _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick); + return _this; + } + return EventClicking; + }(Interaction)); + + /* + Triggers events and adds/removes core classNames when the user's pointer + enters/leaves event-elements of a component. + */ + var EventHovering = /** @class */ (function (_super) { + __extends(EventHovering, _super); + function EventHovering(settings) { + var _this = _super.call(this, settings) || this; + // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it + _this.handleEventElRemove = function (el) { + if (el === _this.currentSegEl) { + _this.handleSegLeave(null, _this.currentSegEl); + } + }; + _this.handleSegEnter = function (ev, segEl) { + if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper + segEl.classList.add('fc-allow-mouse-resize'); + _this.currentSegEl = segEl; + _this.triggerEvent('eventMouseEnter', ev, segEl); + } + }; + _this.handleSegLeave = function (ev, segEl) { + if (_this.currentSegEl) { + segEl.classList.remove('fc-allow-mouse-resize'); + _this.currentSegEl = null; + _this.triggerEvent('eventMouseLeave', ev, segEl); + } + }; + var component = settings.component; + _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave); + component.calendar.on('eventElRemove', _this.handleEventElRemove); + return _this; + } + EventHovering.prototype.destroy = function () { + this.removeHoverListeners(); + this.component.calendar.off('eventElRemove', this.handleEventElRemove); + }; + EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) { + var component = this.component; + var seg = getElSeg(segEl); + if (!ev || component.isValidSegDownEl(ev.target)) { + component.publiclyTrigger(publicEvName, [ + { + el: segEl, + event: new EventApi(this.component.calendar, seg.eventRange.def, seg.eventRange.instance), + jsEvent: ev, + view: component.view + } + ]); + } + }; + return EventHovering; + }(Interaction)); + + var StandardTheme = /** @class */ (function (_super) { + __extends(StandardTheme, _super); + function StandardTheme() { + return _super !== null && _super.apply(this, arguments) || this; + } + return StandardTheme; + }(Theme)); + StandardTheme.prototype.classes = { + widget: 'fc-unthemed', + widgetHeader: 'fc-widget-header', + widgetContent: 'fc-widget-content', + buttonGroup: 'fc-button-group', + button: 'fc-button fc-button-primary', + buttonActive: 'fc-button-active', + popoverHeader: 'fc-widget-header', + popoverContent: 'fc-widget-content', + // day grid + headerRow: 'fc-widget-header', + dayRow: 'fc-widget-content', + // list view + listView: 'fc-widget-content' + }; + StandardTheme.prototype.baseIconClass = 'fc-icon'; + StandardTheme.prototype.iconClasses = { + close: 'fc-icon-x', + prev: 'fc-icon-chevron-left', + next: 'fc-icon-chevron-right', + prevYear: 'fc-icon-chevrons-left', + nextYear: 'fc-icon-chevrons-right' + }; + StandardTheme.prototype.iconOverrideOption = 'buttonIcons'; + StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon'; + StandardTheme.prototype.iconOverridePrefix = 'fc-icon-'; + + var Calendar = /** @class */ (function () { + function Calendar(el, overrides) { + var _this = this; + this.parseRawLocales = memoize(parseRawLocales); + this.buildLocale = memoize(buildLocale); + this.buildDateEnv = memoize(buildDateEnv); + this.buildTheme = memoize(buildTheme); + this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase); + this.buildSelectionConfig = memoize(this._buildSelectionConfig); + this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isPropsEqual); + this.buildEventUiBases = memoize(buildEventUiBases); + this.interactionsStore = {}; + this.actionQueue = []; + this.isReducing = false; + // isDisplaying: boolean = false // installed in DOM? accepting renders? + this.needsRerender = false; // needs a render? + this.needsFullRerender = false; + this.isRendering = false; // currently in the executeRender function? + this.renderingPauseDepth = 0; + this.buildDelayedRerender = memoize(buildDelayedRerender); + this.afterSizingTriggers = {}; + this.isViewUpdated = false; + this.isDatesUpdated = false; + this.isEventsUpdated = false; + this.el = el; + this.optionsManager = new OptionsManager(overrides || {}); + this.pluginSystem = new PluginSystem(); + // only do once. don't do in handleOptions. because can't remove plugins + this.addPluginInputs(this.optionsManager.computed.plugins || []); + this.handleOptions(this.optionsManager.computed); + this.publiclyTrigger('_init'); // for tests + this.hydrate(); + this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions + .map(function (calendarInteractionClass) { + return new calendarInteractionClass(_this); + }); + } + Calendar.prototype.addPluginInputs = function (pluginInputs) { + var pluginDefs = refinePluginDefs(pluginInputs); + for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) { + var pluginDef = pluginDefs_1[_i]; + this.pluginSystem.add(pluginDef); + } + }; + Object.defineProperty(Calendar.prototype, "view", { + // public API + get: function () { + return this.component ? this.component.view : null; + }, + enumerable: true, + configurable: true + }); + // Public API for rendering + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.render = function () { + if (!this.component) { + this.renderableEventStore = createEmptyEventStore(); + this.bindHandlers(); + this.executeRender(); + } + else { + this.requestRerender(true); + } + }; + Calendar.prototype.destroy = function () { + if (this.component) { + this.unbindHandlers(); + this.component.destroy(); // don't null-out. in case API needs access + this.component = null; // umm ??? + for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) { + var interaction = _a[_i]; + interaction.destroy(); + } + this.publiclyTrigger('_destroyed'); + } + }; + // Handlers + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.bindHandlers = function () { + var _this = this; + // event delegation for nav links + this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) { + var gotoOptions = anchorEl.getAttribute('data-goto'); + gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {}; + var dateEnv = _this.dateEnv; + var dateMarker = dateEnv.createMarker(gotoOptions.date); + var viewType = gotoOptions.type; + // property like "navLinkDayClick". might be a string or a function + var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click'); + if (typeof customAction === 'function') { + customAction(dateEnv.toDate(dateMarker), ev); + } + else { + if (typeof customAction === 'string') { + viewType = customAction; + } + _this.zoomTo(dateMarker, viewType); + } + }); + if (this.opt('handleWindowResize')) { + window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls + this.windowResize.bind(this), this.opt('windowResizeDelay'))); + } + }; + Calendar.prototype.unbindHandlers = function () { + this.removeNavLinkListener(); + if (this.windowResizeProxy) { + window.removeEventListener('resize', this.windowResizeProxy); + this.windowResizeProxy = null; + } + }; + // Dispatcher + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.hydrate = function () { + var _this = this; + this.state = this.buildInitialState(); + var rawSources = this.opt('eventSources') || []; + var singleRawSource = this.opt('events'); + var sources = []; // parsed + if (singleRawSource) { + rawSources.unshift(singleRawSource); + } + for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) { + var rawSource = rawSources_1[_i]; + var source = parseEventSource(rawSource, this); + if (source) { + sources.push(source); + } + } + this.batchRendering(function () { + _this.dispatch({ type: 'INIT' }); // pass in sources here? + _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources }); + _this.dispatch({ + type: 'SET_VIEW_TYPE', + viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView + }); + }); + }; + Calendar.prototype.buildInitialState = function () { + return { + viewType: null, + loadingLevel: 0, + eventSourceLoadingLevel: 0, + currentDate: this.getInitialDate(), + dateProfile: null, + eventSources: {}, + eventStore: createEmptyEventStore(), + dateSelection: null, + eventSelection: '', + eventDrag: null, + eventResize: null + }; + }; + Calendar.prototype.dispatch = function (action) { + this.actionQueue.push(action); + if (!this.isReducing) { + this.isReducing = true; + var oldState = this.state; + while (this.actionQueue.length) { + this.state = this.reduce(this.state, this.actionQueue.shift(), this); + } + var newState = this.state; + this.isReducing = false; + if (!oldState.loadingLevel && newState.loadingLevel) { + this.publiclyTrigger('loading', [true]); + } + else if (oldState.loadingLevel && !newState.loadingLevel) { + this.publiclyTrigger('loading', [false]); + } + var view = this.component && this.component.view; + if (oldState.eventStore !== newState.eventStore || this.needsFullRerender) { + if (oldState.eventStore) { + this.isEventsUpdated = true; + } + } + if (oldState.dateProfile !== newState.dateProfile || this.needsFullRerender) { + if (oldState.dateProfile && view) { // why would view be null!? + this.publiclyTrigger('datesDestroy', [ + { + view: view, + el: view.el + } + ]); + } + this.isDatesUpdated = true; + } + if (oldState.viewType !== newState.viewType || this.needsFullRerender) { + if (oldState.viewType && view) { // why would view be null!? + this.publiclyTrigger('viewSkeletonDestroy', [ + { + view: view, + el: view.el + } + ]); + } + this.isViewUpdated = true; + } + this.requestRerender(); + } + }; + Calendar.prototype.reduce = function (state, action, calendar) { + return reduce(state, action, calendar); + }; + // Render Queue + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.requestRerender = function (needsFull) { + if (needsFull === void 0) { needsFull = false; } + this.needsRerender = true; + this.needsFullRerender = this.needsFullRerender || needsFull; + this.delayedRerender(); // will call a debounced-version of tryRerender + }; + Calendar.prototype.tryRerender = function () { + if (this.component && // must be accepting renders + this.needsRerender && // indicates that a rerender was requested + !this.renderingPauseDepth && // not paused + !this.isRendering // not currently in the render loop + ) { + this.executeRender(); + } + }; + Calendar.prototype.batchRendering = function (func) { + this.renderingPauseDepth++; + func(); + this.renderingPauseDepth--; + if (this.needsRerender) { + this.requestRerender(); + } + }; + // Rendering + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.executeRender = function () { + var needsFullRerender = this.needsFullRerender; // save before clearing + // clear these BEFORE the render so that new values will accumulate during render + this.needsRerender = false; + this.needsFullRerender = false; + this.isRendering = true; + this.renderComponent(needsFullRerender); + this.isRendering = false; + // received a rerender request while rendering + if (this.needsRerender) { + this.delayedRerender(); + } + }; + /* + don't call this directly. use executeRender instead + */ + Calendar.prototype.renderComponent = function (needsFull) { + var _a = this, state = _a.state, component = _a.component; + var viewType = state.viewType; + var viewSpec = this.viewSpecs[viewType]; + var savedScroll = (needsFull && component) ? component.view.queryScroll() : null; + if (!viewSpec) { + throw new Error("View type \"" + viewType + "\" is not valid"); + } + // if event sources are still loading and progressive rendering hasn't been enabled, + // keep rendering the last fully loaded set of events + var renderableEventStore = this.renderableEventStore = + (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ? + this.renderableEventStore : + state.eventStore; + var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options); + var eventUiBySource = this.buildEventUiBySource(state.eventSources); + var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource); + if (needsFull || !component) { + if (component) { + component.freezeHeight(); // next component will unfreeze it + component.destroy(); + } + component = this.component = new CalendarComponent({ + calendar: this, + view: null, + dateEnv: this.dateEnv, + theme: this.theme, + options: this.optionsManager.computed + }, this.el); + this.isViewUpdated = true; + this.isDatesUpdated = true; + this.isEventsUpdated = true; + } + component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfile: state.dateProfile, dateProfileGenerator: this.dateProfileGenerators[viewType], eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize })); + if (savedScroll) { + component.view.applyScroll(savedScroll, false); + } + if (this.isViewUpdated) { + this.isViewUpdated = false; + this.publiclyTrigger('viewSkeletonRender', [ + { + view: component.view, + el: component.view.el + } + ]); + } + if (this.isDatesUpdated) { + this.isDatesUpdated = false; + this.publiclyTrigger('datesRender', [ + { + view: component.view, + el: component.view.el + } + ]); + } + if (this.isEventsUpdated) { + this.isEventsUpdated = false; + } + this.releaseAfterSizingTriggers(); + }; + // Options + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.setOption = function (name, val) { + var _a; + this.mutateOptions((_a = {}, _a[name] = val, _a), [], true); + }; + Calendar.prototype.getOption = function (name) { + return this.optionsManager.computed[name]; + }; + Calendar.prototype.opt = function (name) { + return this.optionsManager.computed[name]; + }; + Calendar.prototype.viewOpt = function (name) { + return this.viewOpts()[name]; + }; + Calendar.prototype.viewOpts = function () { + return this.viewSpecs[this.state.viewType].options; + }; + /* + handles option changes (like a diff) + */ + Calendar.prototype.mutateOptions = function (updates, removals, isDynamic, deepEqual) { + var _this = this; + var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers; + var normalUpdates = {}; + var specialUpdates = {}; + var oldDateEnv = this.dateEnv; // do this before handleOptions + var isTimeZoneDirty = false; + var isSizeDirty = false; + var anyDifficultOptions = Boolean(removals.length); + for (var name_1 in updates) { + if (changeHandlers[name_1]) { + specialUpdates[name_1] = updates[name_1]; + } + else { + normalUpdates[name_1] = updates[name_1]; + } + } + for (var name_2 in normalUpdates) { + if (/^(height|contentHeight|aspectRatio)$/.test(name_2)) { + isSizeDirty = true; + } + else if (/^(defaultDate|defaultView)$/.test(name_2)) ; + else { + anyDifficultOptions = true; + if (name_2 === 'timeZone') { + isTimeZoneDirty = true; + } + } + } + this.optionsManager.mutate(normalUpdates, removals, isDynamic); + if (anyDifficultOptions) { + this.handleOptions(this.optionsManager.computed); + this.needsFullRerender = true; + } + this.batchRendering(function () { + if (anyDifficultOptions) { + if (isTimeZoneDirty) { + _this.dispatch({ + type: 'CHANGE_TIMEZONE', + oldDateEnv: oldDateEnv + }); + } + /* HACK + has the same effect as calling this.requestRerender(true) + but recomputes the state's dateProfile + */ + _this.dispatch({ + type: 'SET_VIEW_TYPE', + viewType: _this.state.viewType + }); + } + else if (isSizeDirty) { + _this.updateSize(); + } + // special updates + if (deepEqual) { + for (var name_3 in specialUpdates) { + changeHandlers[name_3](specialUpdates[name_3], _this, deepEqual); + } + } + }); + }; + /* + rebuilds things based off of a complete set of refined options + */ + Calendar.prototype.handleOptions = function (options) { + var _this = this; + var pluginHooks = this.pluginSystem.hooks; + this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration); + this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration); + this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay); + this.theme = this.buildTheme(options); + var available = this.parseRawLocales(options.locales); + this.availableRawLocales = available.map; + var locale = this.buildLocale(options.locale || available.defaultCode, available.map); + this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter); + this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :( + // ineffecient to do every time? + this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager); + // ineffecient to do every time? + this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) { + return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this); + }); + }; + Calendar.prototype.getAvailableLocaleCodes = function () { + return Object.keys(this.availableRawLocales); + }; + Calendar.prototype._buildSelectionConfig = function (rawOpts) { + return processScopedUiProps('select', rawOpts, this); + }; + Calendar.prototype._buildEventUiSingleBase = function (rawOpts) { + if (rawOpts.editable) { // so 'editable' affected events + rawOpts = __assign({}, rawOpts, { eventEditable: true }); + } + return processScopedUiProps('event', rawOpts, this); + }; + // Trigger + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.hasPublicHandlers = function (name) { + return this.hasHandlers(name) || + this.opt(name); // handler specified in options + }; + Calendar.prototype.publiclyTrigger = function (name, args) { + var optHandler = this.opt(name); + this.triggerWith(name, this, args); + if (optHandler) { + return optHandler.apply(this, args); + } + }; + Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) { + var afterSizingTriggers = this.afterSizingTriggers; + (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args); + }; + Calendar.prototype.releaseAfterSizingTriggers = function () { + var afterSizingTriggers = this.afterSizingTriggers; + for (var name_4 in afterSizingTriggers) { + for (var _i = 0, _a = afterSizingTriggers[name_4]; _i < _a.length; _i++) { + var args = _a[_i]; + this.publiclyTrigger(name_4, args); + } + } + this.afterSizingTriggers = {}; + }; + // View + // ----------------------------------------------------------------------------------------------------------------- + // Returns a boolean about whether the view is okay to instantiate at some point + Calendar.prototype.isValidViewType = function (viewType) { + return Boolean(this.viewSpecs[viewType]); + }; + Calendar.prototype.changeView = function (viewType, dateOrRange) { + var dateMarker = null; + if (dateOrRange) { + if (dateOrRange.start && dateOrRange.end) { // a range + this.optionsManager.mutate({ visibleRange: dateOrRange }, []); // will not rerender + this.handleOptions(this.optionsManager.computed); // ...but yuck + } + else { // a date + dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate + } + } + this.unselect(); + this.dispatch({ + type: 'SET_VIEW_TYPE', + viewType: viewType, + dateMarker: dateMarker + }); + }; + // Forces navigation to a view for the given date. + // `viewType` can be a specific view name or a generic one like "week" or "day". + // needs to change + Calendar.prototype.zoomTo = function (dateMarker, viewType) { + var spec; + viewType = viewType || 'day'; // day is default zoom + spec = this.viewSpecs[viewType] || + this.getUnitViewSpec(viewType); + this.unselect(); + if (spec) { + this.dispatch({ + type: 'SET_VIEW_TYPE', + viewType: spec.type, + dateMarker: dateMarker + }); + } + else { + this.dispatch({ + type: 'SET_DATE', + dateMarker: dateMarker + }); + } + }; + // Given a duration singular unit, like "week" or "day", finds a matching view spec. + // Preference is given to views that have corresponding buttons. + Calendar.prototype.getUnitViewSpec = function (unit) { + var component = this.component; + var viewTypes = []; + var i; + var spec; + // put views that have buttons first. there will be duplicates, but oh + if (component.header) { + viewTypes.push.apply(viewTypes, component.header.viewsWithButtons); + } + if (component.footer) { + viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons); + } + for (var viewType in this.viewSpecs) { + viewTypes.push(viewType); + } + for (i = 0; i < viewTypes.length; i++) { + spec = this.viewSpecs[viewTypes[i]]; + if (spec) { + if (spec.singleUnit === unit) { + return spec; + } + } + } + }; + // Current Date + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.getInitialDate = function () { + var defaultDateInput = this.opt('defaultDate'); + // compute the initial ambig-timezone date + if (defaultDateInput != null) { + return this.dateEnv.createMarker(defaultDateInput); + } + else { + return this.getNow(); // getNow already returns unzoned + } + }; + Calendar.prototype.prev = function () { + this.unselect(); + this.dispatch({ type: 'PREV' }); + }; + Calendar.prototype.next = function () { + this.unselect(); + this.dispatch({ type: 'NEXT' }); + }; + Calendar.prototype.prevYear = function () { + this.unselect(); + this.dispatch({ + type: 'SET_DATE', + dateMarker: this.dateEnv.addYears(this.state.currentDate, -1) + }); + }; + Calendar.prototype.nextYear = function () { + this.unselect(); + this.dispatch({ + type: 'SET_DATE', + dateMarker: this.dateEnv.addYears(this.state.currentDate, 1) + }); + }; + Calendar.prototype.today = function () { + this.unselect(); + this.dispatch({ + type: 'SET_DATE', + dateMarker: this.getNow() + }); + }; + Calendar.prototype.gotoDate = function (zonedDateInput) { + this.unselect(); + this.dispatch({ + type: 'SET_DATE', + dateMarker: this.dateEnv.createMarker(zonedDateInput) + }); + }; + Calendar.prototype.incrementDate = function (deltaInput) { + var delta = createDuration(deltaInput); + if (delta) { // else, warn about invalid input? + this.unselect(); + this.dispatch({ + type: 'SET_DATE', + dateMarker: this.dateEnv.add(this.state.currentDate, delta) + }); + } + }; + // for external API + Calendar.prototype.getDate = function () { + return this.dateEnv.toDate(this.state.currentDate); + }; + // Date Formatting Utils + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.formatDate = function (d, formatter) { + var dateEnv = this.dateEnv; + return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter)); + }; + // `settings` is for formatter AND isEndExclusive + Calendar.prototype.formatRange = function (d0, d1, settings) { + var dateEnv = this.dateEnv; + return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings); + }; + Calendar.prototype.formatIso = function (d, omitTime) { + var dateEnv = this.dateEnv; + return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime }); + }; + // Sizing + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.windowResize = function (ev) { + if (!this.isHandlingWindowResize && + this.component && // why? + ev.target === window // not a jqui resize event + ) { + this.isHandlingWindowResize = true; + this.updateSize(); + this.publiclyTrigger('windowResize', [this.view]); + this.isHandlingWindowResize = false; + } + }; + Calendar.prototype.updateSize = function () { + if (this.component) { // when? + this.component.updateSize(true); + } + }; + // Component Registration + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) { + var settings = parseInteractionSettings(component, settingsInput); + var DEFAULT_INTERACTIONS = [ + EventClicking, + EventHovering + ]; + var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions); + var interactions = interactionClasses.map(function (interactionClass) { + return new interactionClass(settings); + }); + this.interactionsStore[component.uid] = interactions; + interactionSettingsStore[component.uid] = settings; + }; + Calendar.prototype.unregisterInteractiveComponent = function (component) { + for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) { + var listener = _a[_i]; + listener.destroy(); + } + delete this.interactionsStore[component.uid]; + delete interactionSettingsStore[component.uid]; + }; + // Date Selection / Event Selection / DayClick + // ----------------------------------------------------------------------------------------------------------------- + // this public method receives start/end dates in any format, with any timezone + // NOTE: args were changed from v3 + Calendar.prototype.select = function (dateOrObj, endDate) { + var selectionInput; + if (endDate == null) { + if (dateOrObj.start != null) { + selectionInput = dateOrObj; + } + else { + selectionInput = { + start: dateOrObj, + end: null + }; + } + } + else { + selectionInput = { + start: dateOrObj, + end: endDate + }; + } + var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this? + ); + if (selection) { // throw parse error otherwise? + this.dispatch({ type: 'SELECT_DATES', selection: selection }); + this.triggerDateSelect(selection); + } + }; + // public method + Calendar.prototype.unselect = function (pev) { + if (this.state.dateSelection) { + this.dispatch({ type: 'UNSELECT_DATES' }); + this.triggerDateUnselect(pev); + } + }; + Calendar.prototype.triggerDateSelect = function (selection, pev) { + var arg = __assign({}, this.buildDateSpanApi(selection), { jsEvent: pev ? pev.origEvent : null, view: this.view }); + this.publiclyTrigger('select', [arg]); + }; + Calendar.prototype.triggerDateUnselect = function (pev) { + this.publiclyTrigger('unselect', [ + { + jsEvent: pev ? pev.origEvent : null, + view: this.view + } + ]); + }; + // TODO: receive pev? + Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) { + var arg = __assign({}, this.buildDatePointApi(dateSpan), { dayEl: dayEl, jsEvent: ev, // Is this always a mouse event? See #4655 + view: view }); + this.publiclyTrigger('dateClick', [arg]); + }; + Calendar.prototype.buildDatePointApi = function (dateSpan) { + var props = {}; + for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) { + var transform = _a[_i]; + __assign(props, transform(dateSpan, this)); + } + __assign(props, buildDatePointApi(dateSpan, this.dateEnv)); + return props; + }; + Calendar.prototype.buildDateSpanApi = function (dateSpan) { + var props = {}; + for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) { + var transform = _a[_i]; + __assign(props, transform(dateSpan, this)); + } + __assign(props, buildDateSpanApi(dateSpan, this.dateEnv)); + return props; + }; + // Date Utils + // ----------------------------------------------------------------------------------------------------------------- + // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option + Calendar.prototype.getNow = function () { + var now = this.opt('now'); + if (typeof now === 'function') { + now = now(); + } + if (now == null) { + return this.dateEnv.createNowMarker(); + } + return this.dateEnv.createMarker(now); + }; + // Event-Date Utilities + // ----------------------------------------------------------------------------------------------------------------- + // Given an event's allDay status and start date, return what its fallback end date should be. + // TODO: rename to computeDefaultEventEnd + Calendar.prototype.getDefaultEventEnd = function (allDay, marker) { + var end = marker; + if (allDay) { + end = startOfDay(end); + end = this.dateEnv.add(end, this.defaultAllDayEventDuration); + } + else { + end = this.dateEnv.add(end, this.defaultTimedEventDuration); + } + return end; + }; + // Public Events API + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.addEvent = function (eventInput, sourceInput) { + if (eventInput instanceof EventApi) { + var def = eventInput._def; + var instance = eventInput._instance; + // not already present? don't want to add an old snapshot + if (!this.state.eventStore.defs[def.defId]) { + this.dispatch({ + type: 'ADD_EVENTS', + eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args? + }); + } + return eventInput; + } + var sourceId; + if (sourceInput instanceof EventSourceApi) { + sourceId = sourceInput.internalEventSource.sourceId; + } + else if (sourceInput != null) { + var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function + if (!sourceApi) { + console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test + return null; + } + else { + sourceId = sourceApi.internalEventSource.sourceId; + } + } + var tuple = parseEvent(eventInput, sourceId, this); + if (tuple) { + this.dispatch({ + type: 'ADD_EVENTS', + eventStore: eventTupleToStore(tuple) + }); + return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance); + } + return null; + }; + // TODO: optimize + Calendar.prototype.getEventById = function (id) { + var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances; + id = String(id); + for (var defId in defs) { + var def = defs[defId]; + if (def.publicId === id) { + if (def.recurringDef) { + return new EventApi(this, def, null); + } + else { + for (var instanceId in instances) { + var instance = instances[instanceId]; + if (instance.defId === def.defId) { + return new EventApi(this, def, instance); + } + } + } + } + } + return null; + }; + Calendar.prototype.getEvents = function () { + var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances; + var eventApis = []; + for (var id in instances) { + var instance = instances[id]; + var def = defs[instance.defId]; + eventApis.push(new EventApi(this, def, instance)); + } + return eventApis; + }; + Calendar.prototype.removeAllEvents = function () { + this.dispatch({ type: 'REMOVE_ALL_EVENTS' }); + }; + Calendar.prototype.rerenderEvents = function () { + this.dispatch({ type: 'RESET_EVENTS' }); + }; + // Public Event Sources API + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.getEventSources = function () { + var sourceHash = this.state.eventSources; + var sourceApis = []; + for (var internalId in sourceHash) { + sourceApis.push(new EventSourceApi(this, sourceHash[internalId])); + } + return sourceApis; + }; + Calendar.prototype.getEventSourceById = function (id) { + var sourceHash = this.state.eventSources; + id = String(id); + for (var sourceId in sourceHash) { + if (sourceHash[sourceId].publicId === id) { + return new EventSourceApi(this, sourceHash[sourceId]); + } + } + return null; + }; + Calendar.prototype.addEventSource = function (sourceInput) { + if (sourceInput instanceof EventSourceApi) { + // not already present? don't want to add an old snapshot + if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) { + this.dispatch({ + type: 'ADD_EVENT_SOURCES', + sources: [sourceInput.internalEventSource] + }); + } + return sourceInput; + } + var eventSource = parseEventSource(sourceInput, this); + if (eventSource) { // TODO: error otherwise? + this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] }); + return new EventSourceApi(this, eventSource); + } + return null; + }; + Calendar.prototype.removeAllEventSources = function () { + this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' }); + }; + Calendar.prototype.refetchEvents = function () { + this.dispatch({ type: 'FETCH_EVENT_SOURCES' }); + }; + // Scroll + // ----------------------------------------------------------------------------------------------------------------- + Calendar.prototype.scrollToTime = function (timeInput) { + var duration = createDuration(timeInput); + if (duration) { + this.component.view.scrollToDuration(duration); + } + }; + return Calendar; + }()); + EmitterMixin.mixInto(Calendar); + // for memoizers + // ----------------------------------------------------------------------------------------------------------------- + function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) { + return new DateEnv({ + calendarSystem: 'gregory', + timeZone: timeZone, + namedTimeZoneImpl: namedTimeZoneImpl, + locale: locale, + weekNumberCalculation: weekNumberCalculation, + firstDay: firstDay, + weekLabel: weekLabel, + cmdFormatter: cmdFormatter + }); + } + function buildTheme(calendarOptions) { + var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme; + return new themeClass(calendarOptions); + } + function buildDelayedRerender(wait) { + var func = this.tryRerender.bind(this); + if (wait != null) { + func = debounce(func, wait); + } + return func; + } + function buildEventUiBySource(eventSources) { + return mapHash(eventSources, function (eventSource) { + return eventSource.ui; + }); + } + function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) { + var eventUiBases = { '': eventUiSingleBase }; + for (var defId in eventDefs) { + var def = eventDefs[defId]; + if (def.sourceId && eventUiBySource[def.sourceId]) { + eventUiBases[defId] = eventUiBySource[def.sourceId]; + } + } + return eventUiBases; + } + + var View = /** @class */ (function (_super) { + __extends(View, _super); + function View(context, viewSpec, dateProfileGenerator, parentEl) { + var _this = _super.call(this, context, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' }), true // isView (HACK) + ) || this; + _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap); + _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]); + _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]); + _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]); + _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]); + _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]); + _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]); + _this.viewSpec = viewSpec; + _this.dateProfileGenerator = dateProfileGenerator; + _this.type = viewSpec.type; + _this.eventOrderSpecs = parseFieldSpecs(_this.opt('eventOrder')); + _this.nextDayThreshold = createDuration(_this.opt('nextDayThreshold')); + parentEl.appendChild(_this.el); + _this.initialize(); + return _this; + } + View.prototype.initialize = function () { + }; + Object.defineProperty(View.prototype, "activeStart", { + // Date Setting/Unsetting + // ----------------------------------------------------------------------------------------------------------------- + get: function () { + return this.dateEnv.toDate(this.props.dateProfile.activeRange.start); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(View.prototype, "activeEnd", { + get: function () { + return this.dateEnv.toDate(this.props.dateProfile.activeRange.end); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(View.prototype, "currentStart", { + get: function () { + return this.dateEnv.toDate(this.props.dateProfile.currentRange.start); + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(View.prototype, "currentEnd", { + get: function () { + return this.dateEnv.toDate(this.props.dateProfile.currentRange.end); + }, + enumerable: true, + configurable: true + }); + // General Rendering + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.render = function (props) { + this.renderDatesMem(props.dateProfile); + this.renderBusinessHoursMem(props.businessHours); + this.renderDateSelectionMem(props.dateSelection); + this.renderEventsMem(props.eventStore); + this.renderEventSelectionMem(props.eventSelection); + this.renderEventDragMem(props.eventDrag); + this.renderEventResizeMem(props.eventResize); + }; + View.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.renderDatesMem.unrender(); // should unrender everything else + }; + // Sizing + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.updateSize = function (isResize, viewHeight, isAuto) { + var calendar = this.calendar; + if (isResize || // HACKS... + calendar.isViewUpdated || + calendar.isDatesUpdated || + calendar.isEventsUpdated) { + // sort of the catch-all sizing + // anything that might cause dimension changes + this.updateBaseSize(isResize, viewHeight, isAuto); + } + }; + View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) { + }; + // Date Rendering + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderDatesWrap = function (dateProfile) { + this.renderDates(dateProfile); + this.addScroll({ + duration: createDuration(this.opt('scrollTime')) + }); + this.startNowIndicator(dateProfile); // shouldn't render yet because updateSize will be called soon + }; + View.prototype.unrenderDatesWrap = function () { + this.stopNowIndicator(); + this.unrenderDates(); + }; + View.prototype.renderDates = function (dateProfile) { }; + View.prototype.unrenderDates = function () { }; + // Business Hours + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderBusinessHours = function (businessHours) { }; + View.prototype.unrenderBusinessHours = function () { }; + // Date Selection + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderDateSelectionWrap = function (selection) { + if (selection) { + this.renderDateSelection(selection); + } + }; + View.prototype.unrenderDateSelectionWrap = function (selection) { + if (selection) { + this.unrenderDateSelection(selection); + } + }; + View.prototype.renderDateSelection = function (selection) { }; + View.prototype.unrenderDateSelection = function (selection) { }; + // Event Rendering + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderEvents = function (eventStore) { }; + View.prototype.unrenderEvents = function () { }; + // util for subclasses + View.prototype.sliceEvents = function (eventStore, allDay) { + var props = this.props; + return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.nextDayThreshold : null).fg; + }; + View.prototype.computeEventDraggable = function (eventDef, eventUi) { + var transformers = this.calendar.pluginSystem.hooks.isDraggableTransformers; + var val = eventUi.startEditable; + for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) { + var transformer = transformers_1[_i]; + val = transformer(val, eventDef, eventUi, this); + } + return val; + }; + View.prototype.computeEventStartResizable = function (eventDef, eventUi) { + return eventUi.durationEditable && this.opt('eventResizableFromStart'); + }; + View.prototype.computeEventEndResizable = function (eventDef, eventUi) { + return eventUi.durationEditable; + }; + // Event Selection + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderEventSelectionWrap = function (instanceId) { + if (instanceId) { + this.renderEventSelection(instanceId); + } + }; + View.prototype.unrenderEventSelectionWrap = function (instanceId) { + if (instanceId) { + this.unrenderEventSelection(instanceId); + } + }; + View.prototype.renderEventSelection = function (instanceId) { }; + View.prototype.unrenderEventSelection = function (instanceId) { }; + // Event Drag + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderEventDragWrap = function (state) { + if (state) { + this.renderEventDrag(state); + } + }; + View.prototype.unrenderEventDragWrap = function (state) { + if (state) { + this.unrenderEventDrag(state); + } + }; + View.prototype.renderEventDrag = function (state) { }; + View.prototype.unrenderEventDrag = function (state) { }; + // Event Resize + // ----------------------------------------------------------------------------------------------------------------- + View.prototype.renderEventResizeWrap = function (state) { + if (state) { + this.renderEventResize(state); + } + }; + View.prototype.unrenderEventResizeWrap = function (state) { + if (state) { + this.unrenderEventResize(state); + } + }; + View.prototype.renderEventResize = function (state) { }; + View.prototype.unrenderEventResize = function (state) { }; + /* Now Indicator + ------------------------------------------------------------------------------------------------------------------*/ + // Immediately render the current time indicator and begins re-rendering it at an interval, + // which is defined by this.getNowIndicatorUnit(). + // TODO: somehow do this for the current whole day's background too + View.prototype.startNowIndicator = function (dateProfile) { + var _this = this; + var dateEnv = this.dateEnv; + var unit; + var update; + var delay; // ms wait value + if (this.opt('nowIndicator')) { + unit = this.getNowIndicatorUnit(dateProfile); + if (unit) { + update = this.updateNowIndicator.bind(this); + this.initialNowDate = this.calendar.getNow(); + this.initialNowQueriedMs = new Date().valueOf(); + // wait until the beginning of the next interval + delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf(); + // TODO: maybe always use setTimeout, waiting until start of next unit + this.nowIndicatorTimeoutID = setTimeout(function () { + _this.nowIndicatorTimeoutID = null; + update(); + if (unit === 'second') { + delay = 1000; // every second + } + else { + delay = 1000 * 60; // otherwise, every minute + } + _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval + }, delay); + } + // rendering will be initiated in updateSize + } + }; + // rerenders the now indicator, computing the new current time from the amount of time that has passed + // since the initial getNow call. + View.prototype.updateNowIndicator = function () { + if (this.props.dateProfile && // a way to determine if dates were rendered yet + this.initialNowDate // activated before? + ) { + this.unrenderNowIndicator(); // won't unrender if unnecessary + this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs)); + this.isNowIndicatorRendered = true; + } + }; + // Immediately unrenders the view's current time indicator and stops any re-rendering timers. + // Won't cause side effects if indicator isn't rendered. + View.prototype.stopNowIndicator = function () { + if (this.isNowIndicatorRendered) { + if (this.nowIndicatorTimeoutID) { + clearTimeout(this.nowIndicatorTimeoutID); + this.nowIndicatorTimeoutID = null; + } + if (this.nowIndicatorIntervalID) { + clearInterval(this.nowIndicatorIntervalID); + this.nowIndicatorIntervalID = null; + } + this.unrenderNowIndicator(); + this.isNowIndicatorRendered = false; + } + }; + View.prototype.getNowIndicatorUnit = function (dateProfile) { + // subclasses should implement + }; + // Renders a current time indicator at the given datetime + View.prototype.renderNowIndicator = function (date) { + // SUBCLASSES MUST PASS TO CHILDREN! + }; + // Undoes the rendering actions from renderNowIndicator + View.prototype.unrenderNowIndicator = function () { + // SUBCLASSES MUST PASS TO CHILDREN! + }; + /* Scroller + ------------------------------------------------------------------------------------------------------------------*/ + View.prototype.addScroll = function (scroll) { + var queuedScroll = this.queuedScroll || (this.queuedScroll = {}); + __assign(queuedScroll, scroll); + }; + View.prototype.popScroll = function (isResize) { + this.applyQueuedScroll(isResize); + this.queuedScroll = null; + }; + View.prototype.applyQueuedScroll = function (isResize) { + this.applyScroll(this.queuedScroll || {}, isResize); + }; + View.prototype.queryScroll = function () { + var scroll = {}; + if (this.props.dateProfile) { // dates rendered yet? + __assign(scroll, this.queryDateScroll()); + } + return scroll; + }; + View.prototype.applyScroll = function (scroll, isResize) { + var duration = scroll.duration; + if (duration != null) { + delete scroll.duration; + if (this.props.dateProfile) { // dates rendered yet? + __assign(scroll, this.computeDateScroll(duration)); + } + } + if (this.props.dateProfile) { // dates rendered yet? + this.applyDateScroll(scroll); + } + }; + View.prototype.computeDateScroll = function (duration) { + return {}; // subclasses must implement + }; + View.prototype.queryDateScroll = function () { + return {}; // subclasses must implement + }; + View.prototype.applyDateScroll = function (scroll) { + // subclasses must implement + }; + // for API + View.prototype.scrollToDuration = function (duration) { + this.applyScroll({ duration: duration }, false); + }; + return View; + }(DateComponent)); + EmitterMixin.mixInto(View); + View.prototype.usesMinMaxTime = false; + View.prototype.dateProfileGeneratorClass = DateProfileGenerator; + + var FgEventRenderer = /** @class */ (function () { + function FgEventRenderer(context) { + this.segs = []; + this.isSizeDirty = false; + this.context = context; + } + FgEventRenderer.prototype.renderSegs = function (segs, mirrorInfo) { + this.rangeUpdated(); // called too frequently :( + // render an `.el` on each seg + // returns a subset of the segs. segs that were actually rendered + segs = this.renderSegEls(segs, mirrorInfo); + this.segs = segs; + this.attachSegs(segs, mirrorInfo); + this.isSizeDirty = true; + this.context.view.triggerRenderedSegs(this.segs, Boolean(mirrorInfo)); + }; + FgEventRenderer.prototype.unrender = function (_segs, mirrorInfo) { + this.context.view.triggerWillRemoveSegs(this.segs, Boolean(mirrorInfo)); + this.detachSegs(this.segs); + this.segs = []; + }; + // Updates values that rely on options and also relate to range + FgEventRenderer.prototype.rangeUpdated = function () { + var options = this.context.options; + var displayEventTime; + var displayEventEnd; + this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator); + displayEventTime = options.displayEventTime; + if (displayEventTime == null) { + displayEventTime = this.computeDisplayEventTime(); // might be based off of range + } + displayEventEnd = options.displayEventEnd; + if (displayEventEnd == null) { + displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range + } + this.displayEventTime = displayEventTime; + this.displayEventEnd = displayEventEnd; + }; + // Renders and assigns an `el` property for each foreground event segment. + // Only returns segments that successfully rendered. + FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) { + var html = ''; + var i; + if (segs.length) { // don't build an empty html string + // build a large concatenation of event segment HTML + for (i = 0; i < segs.length; i++) { + html += this.renderSegHtml(segs[i], mirrorInfo); + } + // Grab individual elements from the combined HTML string. Use each as the default rendering. + // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false. + htmlToElements(html).forEach(function (el, i) { + var seg = segs[i]; + if (el) { + seg.el = el; + } + }); + segs = filterSegsViaEls(this.context.view, segs, Boolean(mirrorInfo)); + } + return segs; + }; + // Generic utility for generating the HTML classNames for an event segment's element + FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) { + var classes = [ + 'fc-event', + seg.isStart ? 'fc-start' : 'fc-not-start', + seg.isEnd ? 'fc-end' : 'fc-not-end' + ].concat(seg.eventRange.ui.classNames); + if (isDraggable) { + classes.push('fc-draggable'); + } + if (isResizable) { + classes.push('fc-resizable'); + } + if (mirrorInfo) { + classes.push('fc-mirror'); + if (mirrorInfo.isDragging) { + classes.push('fc-dragging'); + } + if (mirrorInfo.isResizing) { + classes.push('fc-resizing'); + } + } + return classes; + }; + // Compute the text that should be displayed on an event's element. + // `range` can be the Event object itself, or something range-like, with at least a `start`. + // If event times are disabled, or the event has no time, will return a blank string. + // If not specified, formatter will default to the eventTimeFormat setting, + // and displayEnd will default to the displayEventEnd setting. + FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) { + var def = eventRange.def, instance = eventRange.instance; + return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo); + }; + FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) { + var dateEnv = this.context.dateEnv; + if (formatter == null) { + formatter = this.eventTimeFormat; + } + if (displayEnd == null) { + displayEnd = this.displayEventEnd; + } + if (this.displayEventTime && !allDay) { + if (displayEnd && end) { + return dateEnv.formatRange(start, end, formatter, { + forcedStartTzo: forcedStartTzo, + forcedEndTzo: forcedEndTzo + }); + } + else { + return dateEnv.format(start, formatter, { + forcedTzo: forcedStartTzo + }); + } + } + return ''; + }; + FgEventRenderer.prototype.computeEventTimeFormat = function () { + return { + hour: 'numeric', + minute: '2-digit', + omitZeroMinute: true + }; + }; + FgEventRenderer.prototype.computeDisplayEventTime = function () { + return true; + }; + FgEventRenderer.prototype.computeDisplayEventEnd = function () { + return true; + }; + // Utility for generating event skin-related CSS properties + FgEventRenderer.prototype.getSkinCss = function (ui) { + return { + 'background-color': ui.backgroundColor, + 'border-color': ui.borderColor, + color: ui.textColor + }; + }; + FgEventRenderer.prototype.sortEventSegs = function (segs) { + var specs = this.context.view.eventOrderSpecs; + var objs = segs.map(buildSegCompareObj); + objs.sort(function (obj0, obj1) { + return compareByFieldSpecs(obj0, obj1, specs); + }); + return objs.map(function (c) { + return c._seg; + }); + }; + FgEventRenderer.prototype.computeSizes = function (force) { + if (force || this.isSizeDirty) { + this.computeSegSizes(this.segs); + } + }; + FgEventRenderer.prototype.assignSizes = function (force) { + if (force || this.isSizeDirty) { + this.assignSegSizes(this.segs); + this.isSizeDirty = false; + } + }; + FgEventRenderer.prototype.computeSegSizes = function (segs) { + }; + FgEventRenderer.prototype.assignSegSizes = function (segs) { + }; + // Manipulation on rendered segs + FgEventRenderer.prototype.hideByHash = function (hash) { + if (hash) { + for (var _i = 0, _a = this.segs; _i < _a.length; _i++) { + var seg = _a[_i]; + if (hash[seg.eventRange.instance.instanceId]) { + seg.el.style.visibility = 'hidden'; + } + } + } + }; + FgEventRenderer.prototype.showByHash = function (hash) { + if (hash) { + for (var _i = 0, _a = this.segs; _i < _a.length; _i++) { + var seg = _a[_i]; + if (hash[seg.eventRange.instance.instanceId]) { + seg.el.style.visibility = ''; + } + } + } + }; + FgEventRenderer.prototype.selectByInstanceId = function (instanceId) { + if (instanceId) { + for (var _i = 0, _a = this.segs; _i < _a.length; _i++) { + var seg = _a[_i]; + var eventInstance = seg.eventRange.instance; + if (eventInstance && eventInstance.instanceId === instanceId && + seg.el // necessary? + ) { + seg.el.classList.add('fc-selected'); + } + } + } + }; + FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) { + if (instanceId) { + for (var _i = 0, _a = this.segs; _i < _a.length; _i++) { + var seg = _a[_i]; + if (seg.el) { // necessary? + seg.el.classList.remove('fc-selected'); + } + } + } + }; + return FgEventRenderer; + }()); + // returns a object with all primitive props that can be compared + function buildSegCompareObj(seg) { + var eventDef = seg.eventRange.def; + var range = seg.eventRange.instance.range; + var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events + var end = range.end ? range.end.valueOf() : 0; // " + return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start, + end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval + }); + } + + var FillRenderer = /** @class */ (function () { + function FillRenderer(context) { + this.fillSegTag = 'div'; + this.dirtySizeFlags = {}; + this.context = context; + this.containerElsByType = {}; + this.segsByType = {}; + } + FillRenderer.prototype.getSegsByType = function (type) { + return this.segsByType[type] || []; + }; + FillRenderer.prototype.renderSegs = function (type, segs) { + var _a; + var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs + var containerEls = this.attachSegs(type, renderedSegs); + if (containerEls) { + (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls); + } + this.segsByType[type] = renderedSegs; + if (type === 'bgEvent') { + this.context.view.triggerRenderedSegs(renderedSegs, false); // isMirror=false + } + this.dirtySizeFlags[type] = true; + }; + // Unrenders a specific type of fill that is currently rendered on the grid + FillRenderer.prototype.unrender = function (type) { + var segs = this.segsByType[type]; + if (segs) { + if (type === 'bgEvent') { + this.context.view.triggerWillRemoveSegs(segs, false); // isMirror=false + } + this.detachSegs(type, segs); + } + }; + // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types. + // Only returns segments that successfully rendered. + FillRenderer.prototype.renderSegEls = function (type, segs) { + var _this = this; + var html = ''; + var i; + if (segs.length) { + // build a large concatenation of segment HTML + for (i = 0; i < segs.length; i++) { + html += this.renderSegHtml(type, segs[i]); + } + // Grab individual elements from the combined HTML string. Use each as the default rendering. + // Then, compute the 'el' for each segment. + htmlToElements(html).forEach(function (el, i) { + var seg = segs[i]; + if (el) { + seg.el = el; + } + }); + if (type === 'bgEvent') { + segs = filterSegsViaEls(this.context.view, segs, false // isMirror. background events can never be mirror elements + ); + } + // correct element type? (would be bad if a non-TD were inserted into a table for example) + segs = segs.filter(function (seg) { + return elementMatches(seg.el, _this.fillSegTag); + }); + } + return segs; + }; + // Builds the HTML needed for one fill segment. Generic enough to work with different types. + FillRenderer.prototype.renderSegHtml = function (type, seg) { + var css = null; + var classNames = []; + if (type !== 'highlight' && type !== 'businessHours') { + css = { + 'background-color': seg.eventRange.ui.backgroundColor + }; + } + if (type !== 'highlight') { + classNames = classNames.concat(seg.eventRange.ui.classNames); + } + if (type === 'businessHours') { + classNames.push('fc-bgevent'); + } + else { + classNames.push('fc-' + type.toLowerCase()); + } + return '<' + this.fillSegTag + + (classNames.length ? ' class="' + classNames.join(' ') + '"' : '') + + (css ? ' style="' + cssToStr(css) + '"' : '') + + '>'; + }; + FillRenderer.prototype.detachSegs = function (type, segs) { + var containerEls = this.containerElsByType[type]; + if (containerEls) { + containerEls.forEach(removeElement); + delete this.containerElsByType[type]; + } + }; + FillRenderer.prototype.computeSizes = function (force) { + for (var type in this.segsByType) { + if (force || this.dirtySizeFlags[type]) { + this.computeSegSizes(this.segsByType[type]); + } + } + }; + FillRenderer.prototype.assignSizes = function (force) { + for (var type in this.segsByType) { + if (force || this.dirtySizeFlags[type]) { + this.assignSegSizes(this.segsByType[type]); + } + } + this.dirtySizeFlags = {}; + }; + FillRenderer.prototype.computeSegSizes = function (segs) { + }; + FillRenderer.prototype.assignSegSizes = function (segs) { + }; + return FillRenderer; + }()); + + var NamedTimeZoneImpl = /** @class */ (function () { + function NamedTimeZoneImpl(timeZoneName) { + this.timeZoneName = timeZoneName; + } + return NamedTimeZoneImpl; + }()); + + /* + An abstraction for a dragging interaction originating on an event. + Does higher-level things than PointerDragger, such as possibly: + - a "mirror" that moves with the pointer + - a minimum number of pixels or other criteria for a true drag to begin + + subclasses must emit: + - pointerdown + - dragstart + - dragmove + - pointerup + - dragend + */ + var ElementDragging = /** @class */ (function () { + function ElementDragging(el) { + this.emitter = new EmitterMixin(); + } + ElementDragging.prototype.destroy = function () { + }; + ElementDragging.prototype.setMirrorIsVisible = function (bool) { + // optional if subclass doesn't want to support a mirror + }; + ElementDragging.prototype.setMirrorNeedsRevert = function (bool) { + // optional if subclass doesn't want to support a mirror + }; + ElementDragging.prototype.setAutoScrollEnabled = function (bool) { + // optional + }; + return ElementDragging; + }()); + + function formatDate(dateInput, settings) { + if (settings === void 0) { settings = {}; } + var dateEnv = buildDateEnv$1(settings); + var formatter = createFormatter(settings); + var dateMeta = dateEnv.createMarkerMeta(dateInput); + if (!dateMeta) { // TODO: warning? + return ''; + } + return dateEnv.format(dateMeta.marker, formatter, { + forcedTzo: dateMeta.forcedTzo + }); + } + function formatRange(startInput, endInput, settings // mixture of env and formatter settings + ) { + var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object + var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator); + var startMeta = dateEnv.createMarkerMeta(startInput); + var endMeta = dateEnv.createMarkerMeta(endInput); + if (!startMeta || !endMeta) { // TODO: warning? + return ''; + } + return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, { + forcedStartTzo: startMeta.forcedTzo, + forcedEndTzo: endMeta.forcedTzo, + isEndExclusive: settings.isEndExclusive + }); + } + // TODO: more DRY and optimized + function buildDateEnv$1(settings) { + var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere + // ensure required settings + settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale }); + return new DateEnv(settings); + } + + var DRAG_META_PROPS = { + startTime: createDuration, + duration: createDuration, + create: Boolean, + sourceId: String + }; + var DRAG_META_DEFAULTS = { + create: true + }; + function parseDragMeta(raw) { + var leftoverProps = {}; + var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps); + refined.leftoverProps = leftoverProps; + return refined; + } + + // Computes a default column header formatting string if `colFormat` is not explicitly defined + function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) { + // if more than one week row, or if there are a lot of columns with not much space, + // put just the day numbers will be in each cell + if (!datesRepDistinctDays || dayCnt > 10) { + return { weekday: 'short' }; // "Sat" + } + else if (dayCnt > 1) { + return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // "Sat 11/12" + } + else { + return { weekday: 'long' }; // "Saturday" + } + } + function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) { + var view = context.view, dateEnv = context.dateEnv, theme = context.theme, options = context.options; + var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow. + var classNames = [ + 'fc-day-header', + theme.getClass('widgetHeader') + ]; + var innerHtml; + if (typeof options.columnHeaderHtml === 'function') { + innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker)); + } + else if (typeof options.columnHeaderText === 'function') { + innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker))); + } + else { + innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat)); + } + // if only one row of days, the classNames on the header can represent the specific days beneath + if (datesRepDistinctDays) { + classNames = classNames.concat( + // includes the day-of-week class + // noThemeHighlight=true (don't highlight the header) + getDayClasses(dateMarker, dateProfile, context, true)); + } + else { + classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class + } + return '' + + ' 1 ? + ' colspan="' + colspan + '"' : + '') + + (otherAttrs ? + ' ' + otherAttrs : + '') + + '>' + + (isDateValid ? + // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff) + buildGotoAnchorHtml(view, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) : + // if not valid, display text, but no link + innerHtml) + + ''; + } + + var DayHeader = /** @class */ (function (_super) { + __extends(DayHeader, _super); + function DayHeader(context, parentEl) { + var _this = _super.call(this, context) || this; + parentEl.innerHTML = ''; // because might be nbsp + parentEl.appendChild(_this.el = htmlToElement('
' + + '' + + '' + + '
' + + '
')); + _this.thead = _this.el.querySelector('thead'); + return _this; + } + DayHeader.prototype.destroy = function () { + removeElement(this.el); + }; + DayHeader.prototype.render = function (props) { + var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays; + var parts = []; + if (props.renderIntroHtml) { + parts.push(props.renderIntroHtml()); + } + var colHeadFormat = createFormatter(this.opt('columnHeaderFormat') || + computeFallbackHeaderFormat(datesRepDistinctDays, dates.length)); + for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) { + var date = dates_1[_i]; + parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, this.context)); + } + if (this.isRtl) { + parts.reverse(); + } + this.thead.innerHTML = '' + parts.join('') + ''; + }; + return DayHeader; + }(Component)); + + var DaySeries = /** @class */ (function () { + function DaySeries(range, dateProfileGenerator) { + var date = range.start; + var end = range.end; + var indices = []; + var dates = []; + var dayIndex = -1; + while (date < end) { // loop each day from start to end + if (dateProfileGenerator.isHiddenDay(date)) { + indices.push(dayIndex + 0.5); // mark that it's between indices + } + else { + dayIndex++; + indices.push(dayIndex); + dates.push(date); + } + date = addDays(date, 1); + } + this.dates = dates; + this.indices = indices; + this.cnt = dates.length; + } + DaySeries.prototype.sliceRange = function (range) { + var firstIndex = this.getDateDayIndex(range.start); // inclusive first index + var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index + var clippedFirstIndex = Math.max(0, firstIndex); + var clippedLastIndex = Math.min(this.cnt - 1, lastIndex); + // deal with in-between indices + clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell + clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell + if (clippedFirstIndex <= clippedLastIndex) { + return { + firstIndex: clippedFirstIndex, + lastIndex: clippedLastIndex, + isStart: firstIndex === clippedFirstIndex, + isEnd: lastIndex === clippedLastIndex + }; + } + else { + return null; + } + }; + // Given a date, returns its chronolocial cell-index from the first cell of the grid. + // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets. + // If before the first offset, returns a negative number. + // If after the last offset, returns an offset past the last cell offset. + // Only works for *start* dates of cells. Will not work for exclusive end dates for cells. + DaySeries.prototype.getDateDayIndex = function (date) { + var indices = this.indices; + var dayOffset = Math.floor(diffDays(this.dates[0], date)); + if (dayOffset < 0) { + return indices[0] - 1; + } + else if (dayOffset >= indices.length) { + return indices[indices.length - 1] + 1; + } + else { + return indices[dayOffset]; + } + }; + return DaySeries; + }()); + + var DayTable = /** @class */ (function () { + function DayTable(daySeries, breakOnWeeks) { + var dates = daySeries.dates; + var daysPerRow; + var firstDay; + var rowCnt; + if (breakOnWeeks) { + // count columns until the day-of-week repeats + firstDay = dates[0].getUTCDay(); + for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) { + if (dates[daysPerRow].getUTCDay() === firstDay) { + break; + } + } + rowCnt = Math.ceil(dates.length / daysPerRow); + } + else { + rowCnt = 1; + daysPerRow = dates.length; + } + this.rowCnt = rowCnt; + this.colCnt = daysPerRow; + this.daySeries = daySeries; + this.cells = this.buildCells(); + this.headerDates = this.buildHeaderDates(); + } + DayTable.prototype.buildCells = function () { + var rows = []; + for (var row = 0; row < this.rowCnt; row++) { + var cells = []; + for (var col = 0; col < this.colCnt; col++) { + cells.push(this.buildCell(row, col)); + } + rows.push(cells); + } + return rows; + }; + DayTable.prototype.buildCell = function (row, col) { + return { + date: this.daySeries.dates[row * this.colCnt + col] + }; + }; + DayTable.prototype.buildHeaderDates = function () { + var dates = []; + for (var col = 0; col < this.colCnt; col++) { + dates.push(this.cells[0][col].date); + } + return dates; + }; + DayTable.prototype.sliceRange = function (range) { + var colCnt = this.colCnt; + var seriesSeg = this.daySeries.sliceRange(range); + var segs = []; + if (seriesSeg) { + var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex; + var index = firstIndex; + while (index <= lastIndex) { + var row = Math.floor(index / colCnt); + var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1); + segs.push({ + row: row, + firstCol: index % colCnt, + lastCol: (nextIndex - 1) % colCnt, + isStart: seriesSeg.isStart && index === firstIndex, + isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex + }); + index = nextIndex; + } + } + return segs; + }; + return DayTable; + }()); + + var Slicer = /** @class */ (function () { + function Slicer() { + this.sliceBusinessHours = memoize(this._sliceBusinessHours); + this.sliceDateSelection = memoize(this._sliceDateSpan); + this.sliceEventStore = memoize(this._sliceEventStore); + this.sliceEventDrag = memoize(this._sliceInteraction); + this.sliceEventResize = memoize(this._sliceInteraction); + } + Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, component) { + var extraArgs = []; + for (var _i = 4; _i < arguments.length; _i++) { + extraArgs[_i - 4] = arguments[_i]; + } + var eventUiBases = props.eventUiBases; + var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)); + return { + dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)), + businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, component].concat(extraArgs)), + fgEventSegs: eventSegs.fg, + bgEventSegs: eventSegs.bg, + eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)), + eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)), + eventSelection: props.eventSelection + }; // TODO: give interactionSegs? + }; + Slicer.prototype.sliceNowDate = function (// does not memoize + date, component) { + var extraArgs = []; + for (var _i = 2; _i < arguments.length; _i++) { + extraArgs[_i - 2] = arguments[_i]; + } + return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false }, + {}, + component].concat(extraArgs)); + }; + Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, component) { + var extraArgs = []; + for (var _i = 4; _i < arguments.length; _i++) { + extraArgs[_i - 4] = arguments[_i]; + } + if (!businessHours) { + return []; + } + return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), component.calendar), + {}, + dateProfile, + nextDayThreshold, + component].concat(extraArgs)).bg; + }; + Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) { + var extraArgs = []; + for (var _i = 5; _i < arguments.length; _i++) { + extraArgs[_i - 5] = arguments[_i]; + } + if (eventStore) { + var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); + return { + bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs), + fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs) + }; + } + else { + return { bg: [], fg: [] }; + } + }; + Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) { + var extraArgs = []; + for (var _i = 5; _i < arguments.length; _i++) { + extraArgs[_i - 5] = arguments[_i]; + } + if (!interaction) { + return null; + } + var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold); + return { + segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs), + affectedInstances: interaction.affectedEvents.instances, + isEvent: interaction.isEvent, + sourceSeg: interaction.origSeg + }; + }; + Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) { + var extraArgs = []; + for (var _i = 3; _i < arguments.length; _i++) { + extraArgs[_i - 3] = arguments[_i]; + } + if (!dateSpan) { + return []; + } + var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.calendar); + var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs)); + for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) { + var seg = segs_1[_a]; + seg.component = component; + seg.eventRange = eventRange; + } + return segs; + }; + /* + "complete" seg means it has component and eventRange + */ + Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill + extraArgs) { + var segs = []; + for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) { + var eventRange = eventRanges_1[_i]; + segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs)); + } + return segs; + }; + /* + "complete" seg means it has component and eventRange + */ + Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill + extraArgs) { + var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs)); + for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { + var seg = segs_2[_i]; + seg.component = component; + seg.eventRange = eventRange; + seg.isStart = eventRange.isStart && seg.isStart; + seg.isEnd = eventRange.isEnd && seg.isEnd; + } + return segs; + }; + return Slicer; + }()); + /* + for incorporating minTime/maxTime if appropriate + TODO: should be part of DateProfile! + TimelineDateProfile already does this btw + */ + function computeActiveRange(dateProfile, isComponentAllDay) { + var range = dateProfile.activeRange; + if (isComponentAllDay) { + return range; + } + return { + start: addMs(range.start, dateProfile.minTime.milliseconds), + end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day + }; + } + + // exports + // -------------------------------------------------------------------------------------------------- + var version = '4.3.1'; + + exports.Calendar = Calendar; + exports.Component = Component; + exports.DateComponent = DateComponent; + exports.DateEnv = DateEnv; + exports.DateProfileGenerator = DateProfileGenerator; + exports.DayHeader = DayHeader; + exports.DaySeries = DaySeries; + exports.DayTable = DayTable; + exports.ElementDragging = ElementDragging; + exports.ElementScrollController = ElementScrollController; + exports.EmitterMixin = EmitterMixin; + exports.EventApi = EventApi; + exports.FgEventRenderer = FgEventRenderer; + exports.FillRenderer = FillRenderer; + exports.Interaction = Interaction; + exports.Mixin = Mixin; + exports.NamedTimeZoneImpl = NamedTimeZoneImpl; + exports.PositionCache = PositionCache; + exports.ScrollComponent = ScrollComponent; + exports.ScrollController = ScrollController; + exports.Slicer = Slicer; + exports.Splitter = Splitter; + exports.Theme = Theme; + exports.View = View; + exports.WindowScrollController = WindowScrollController; + exports.addDays = addDays; + exports.addDurations = addDurations; + exports.addMs = addMs; + exports.addWeeks = addWeeks; + exports.allowContextMenu = allowContextMenu; + exports.allowSelection = allowSelection; + exports.appendToElement = appendToElement; + exports.applyAll = applyAll; + exports.applyMutationToEventStore = applyMutationToEventStore; + exports.applyStyle = applyStyle; + exports.applyStyleProp = applyStyleProp; + exports.asRoughMinutes = asRoughMinutes; + exports.asRoughMs = asRoughMs; + exports.asRoughSeconds = asRoughSeconds; + exports.buildGotoAnchorHtml = buildGotoAnchorHtml; + exports.buildSegCompareObj = buildSegCompareObj; + exports.capitaliseFirstLetter = capitaliseFirstLetter; + exports.combineEventUis = combineEventUis; + exports.compareByFieldSpec = compareByFieldSpec; + exports.compareByFieldSpecs = compareByFieldSpecs; + exports.compareNumbers = compareNumbers; + exports.compensateScroll = compensateScroll; + exports.computeClippingRect = computeClippingRect; + exports.computeEdges = computeEdges; + exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat; + exports.computeHeightAndMargins = computeHeightAndMargins; + exports.computeInnerRect = computeInnerRect; + exports.computeRect = computeRect; + exports.computeVisibleDayRange = computeVisibleDayRange; + exports.config = config; + exports.constrainPoint = constrainPoint; + exports.createDuration = createDuration; + exports.createElement = createElement; + exports.createEmptyEventStore = createEmptyEventStore; + exports.createEventInstance = createEventInstance; + exports.createFormatter = createFormatter; + exports.createPlugin = createPlugin; + exports.cssToStr = cssToStr; + exports.debounce = debounce; + exports.diffDates = diffDates; + exports.diffDayAndTime = diffDayAndTime; + exports.diffDays = diffDays; + exports.diffPoints = diffPoints; + exports.diffWeeks = diffWeeks; + exports.diffWholeDays = diffWholeDays; + exports.diffWholeWeeks = diffWholeWeeks; + exports.disableCursor = disableCursor; + exports.distributeHeight = distributeHeight; + exports.elementClosest = elementClosest; + exports.elementMatches = elementMatches; + exports.enableCursor = enableCursor; + exports.eventTupleToStore = eventTupleToStore; + exports.filterEventStoreDefs = filterEventStoreDefs; + exports.filterHash = filterHash; + exports.findChildren = findChildren; + exports.findElements = findElements; + exports.flexibleCompare = flexibleCompare; + exports.forceClassName = forceClassName; + exports.formatDate = formatDate; + exports.formatIsoTimeString = formatIsoTimeString; + exports.formatRange = formatRange; + exports.getAllDayHtml = getAllDayHtml; + exports.getClippingParents = getClippingParents; + exports.getDayClasses = getDayClasses; + exports.getElSeg = getElSeg; + exports.getRectCenter = getRectCenter; + exports.getRelevantEvents = getRelevantEvents; + exports.globalDefaults = globalDefaults; + exports.greatestDurationDenominator = greatestDurationDenominator; + exports.hasBgRendering = hasBgRendering; + exports.htmlEscape = htmlEscape; + exports.htmlToElement = htmlToElement; + exports.insertAfterElement = insertAfterElement; + exports.interactionSettingsStore = interactionSettingsStore; + exports.interactionSettingsToStore = interactionSettingsToStore; + exports.intersectRanges = intersectRanges; + exports.intersectRects = intersectRects; + exports.isArraysEqual = isArraysEqual; + exports.isDateSpansEqual = isDateSpansEqual; + exports.isInt = isInt; + exports.isInteractionValid = isInteractionValid; + exports.isMultiDayRange = isMultiDayRange; + exports.isPropsEqual = isPropsEqual; + exports.isPropsValid = isPropsValid; + exports.isSingleDay = isSingleDay; + exports.isValidDate = isValidDate; + exports.listenBySelector = listenBySelector; + exports.mapHash = mapHash; + exports.matchCellWidths = matchCellWidths; + exports.memoize = memoize; + exports.memoizeOutput = memoizeOutput; + exports.memoizeRendering = memoizeRendering; + exports.mergeEventStores = mergeEventStores; + exports.multiplyDuration = multiplyDuration; + exports.padStart = padStart; + exports.parseBusinessHours = parseBusinessHours; + exports.parseDragMeta = parseDragMeta; + exports.parseEventDef = parseEventDef; + exports.parseFieldSpecs = parseFieldSpecs; + exports.parseMarker = parse; + exports.pointInsideRect = pointInsideRect; + exports.prependToElement = prependToElement; + exports.preventContextMenu = preventContextMenu; + exports.preventDefault = preventDefault; + exports.preventSelection = preventSelection; + exports.processScopedUiProps = processScopedUiProps; + exports.rangeContainsMarker = rangeContainsMarker; + exports.rangeContainsRange = rangeContainsRange; + exports.rangesEqual = rangesEqual; + exports.rangesIntersect = rangesIntersect; + exports.refineProps = refineProps; + exports.removeElement = removeElement; + exports.removeExact = removeExact; + exports.renderDateCell = renderDateCell; + exports.requestJson = requestJson; + exports.sliceEventStore = sliceEventStore; + exports.startOfDay = startOfDay; + exports.subtractInnerElHeight = subtractInnerElHeight; + exports.translateRect = translateRect; + exports.uncompensateScroll = uncompensateScroll; + exports.undistributeHeight = undistributeHeight; + exports.unpromisify = unpromisify; + exports.version = version; + exports.whenTransitionDone = whenTransitionDone; + exports.wholeDivideDurations = wholeDivideDurations; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/public/resource/assets/libs/fullcalendar/core/main.min.css b/public/resource/assets/libs/fullcalendar/core/main.min.css new file mode 100644 index 0000000..8948b53 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/main.min.css @@ -0,0 +1 @@ +@charset "UTF-8";.fc-button:not(:disabled),.fc-event.fc-draggable,.fc-event[href],.fc-popover .fc-header .fc-close,a.fc-more,a[data-goto]{cursor:pointer}.fc-bg,.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:2px 4px}.fc-rtl .fc-popover .fc-header{flex-direction:row-reverse}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{opacity:.65;font-size:1.1em}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg table,.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-bg,.fc-bgevent-skeleton,.fc-highlight-skeleton,.fc-mirror-skeleton{position:absolute;top:0;left:0;right:0}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-mirror-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-mirror-skeleton td{background:0 0;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-mirror-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-mirror-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.4;border-radius:3px;border:1px solid #3788d8}.fc-event,.fc-event-dot{background-color:#3788d8}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4;display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-event.fc-dragging.fc-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event.fc-dragging:not(.fc-selected){opacity:.75}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-mirror-skeleton tr:first-child>td>.fc-day-grid-event{margin-top:0}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-button,.fc-icon{display:inline-block;font-weight:400;text-align:center}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");font-weight:400;font-style:normal}.fc-icon{font-family:fcicons!important;speak:none;font-style:normal;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;width:1em;height:1em}.fc-icon-chevron-left:before{content:""}.fc-icon-chevron-right:before{content:""}.fc-icon-chevrons-left:before{content:""}.fc-icon-chevrons-right:before{content:""}.fc-icon-minus-square:before{content:""}.fc-icon-plus-square:before{content:""}.fc-icon-x:before{content:""}.fc-button{overflow:visible;text-transform:none;margin:0;font-family:inherit}.fc-button::-moz-focus-inner{padding:0;border-style:none}.fc-button{-webkit-appearance:button;color:#212529;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc-button:hover{color:#212529;text-decoration:none}.fc-button:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(44,62,80,.25);box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc-button:disabled{opacity:.65}.fc-button-primary{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.fc-button-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:disabled{color:#fff;background-color:#2C3E50;border-color:#2C3E50}.fc-button-primary:not(:disabled).fc-button-active,.fc-button-primary:not(:disabled):active{color:#fff;background-color:#1a252f;border-color:#151e27}.fc-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc-button-group{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.fc-button-group>.fc-button{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus,.fc-button-group>.fc-button:hover{z-index:1}.fc-button-group>.fc-button:not(:first-child){margin-left:-1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-toolbar h2{font-size:1.75em;margin:0}.fc-view-container{position:relative}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}@media print{.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-event .fc-resizer,.fc-highlight-container,.fc-highlight-skeleton,.fc-mirror-container,.fc-mirror-skeleton{display:none}.fc tbody .fc-row,.fc-time-grid{min-height:0!important}.fc-time-grid .fc-event.fc-not-end:after,.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc tbody .fc-row{height:auto!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-popover,.fc-timeGrid-view .fc-axis{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc button,.fc-button-group,.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important}} \ No newline at end of file diff --git a/public/resource/assets/libs/fullcalendar/core/main.min.js b/public/resource/assets/libs/fullcalendar/core/main.min.js new file mode 100644 index 0000000..6b72fff --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/core/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Core Package v4.3.1 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e=e||self).FullCalendar={})}(this,function(e){"use strict";var t={className:!0,colSpan:!0,rowSpan:!0},n={"
");document.body.appendChild(e);var t=e.firstChild.getBoundingClientRect().left>e.getBoundingClientRect().left;return c(e),t}()),S}function D(e){return e=Math.max(0,e),e=Math.round(e)}function T(e,t){void 0===t&&(t=!1);var n=window.getComputedStyle(e),r=parseInt(n.borderLeftWidth,10)||0,i=parseInt(n.borderRightWidth,10)||0,o=parseInt(n.borderTopWidth,10)||0,a=parseInt(n.borderBottomWidth,10)||0,s=D(e.offsetWidth-e.clientWidth-r-i),u={borderLeft:r,borderRight:i,borderTop:o,borderBottom:a,scrollbarBottom:D(e.offsetHeight-e.clientHeight-o-a),scrollbarLeft:0,scrollbarRight:0};return b()&&"rtl"===n.direction?u.scrollbarLeft=s:u.scrollbarRight=s,t&&(u.paddingLeft=parseInt(n.paddingLeft,10)||0,u.paddingRight=parseInt(n.paddingRight,10)||0,u.paddingTop=parseInt(n.paddingTop,10)||0,u.paddingBottom=parseInt(n.paddingBottom,10)||0),u}function w(e,t){void 0===t&&(t=!1);var n=R(e),r=T(e,t),i={left:n.left+r.borderLeft+r.scrollbarLeft,right:n.right-r.borderRight-r.scrollbarRight,top:n.top+r.borderTop,bottom:n.bottom-r.borderBottom-r.scrollbarBottom};return t&&(i.left+=r.paddingLeft,i.right-=r.paddingRight,i.top+=r.paddingTop,i.bottom-=r.paddingBottom),i}function R(e){var t=e.getBoundingClientRect();return{left:t.left+window.pageXOffset,top:t.top+window.pageYOffset,right:t.right+window.pageXOffset,bottom:t.bottom+window.pageYOffset}}function I(e){return e.getBoundingClientRect().height+C(e)}function C(e){var t=window.getComputedStyle(e);return parseInt(t.marginTop,10)+parseInt(t.marginBottom,10)}function M(e){for(var t=[];e instanceof HTMLElement;){var n=window.getComputedStyle(e);if("fixed"===n.position)break;/(auto|scroll)/.test(n.overflow+n.overflowY+n.overflowX)&&t.push(e),e=e.parentNode}return t}function k(e){e.preventDefault()}function O(e,t,n,r){function i(e){var t=p(e.target,n);t&&r.call(t,e,t)}return e.addEventListener(t,i),function(){e.removeEventListener(t,i)}}var _=["webkitTransitionEnd","otransitionend","oTransitionEnd","msTransitionEnd","transitionend"];var P=["sun","mon","tue","wed","thu","fri","sat"];function x(e,t){var n=Z(e);return n[2]+=t,j(n)}function H(e,t){var n=Z(e);return n[6]+=t,j(n)}function N(e,t){return(t.valueOf()-e.valueOf())/864e5}function z(e,t){var n=B(e),r=B(t);return{years:0,months:0,days:Math.round(N(n,r)),milliseconds:t.valueOf()-r.valueOf()-(e.valueOf()-n.valueOf())}}function U(e,t){var n=L(e,t);return null!==n&&n%7==0?n/7:null}function L(e,t){return q(e)===q(t)?Math.round(N(e,t)):null}function B(e){return j([e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate()])}function V(e,t,n,r){var i=j([t,0,1+A(t,n,r)]),o=B(e),a=Math.round(N(i,o));return Math.floor(a/7)+1}function A(e,t,n){var r=7+t-n;return-((7+j([e,0,r]).getUTCDay()-t)%7)+r-1}function F(e){return[e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()]}function W(e){return new Date(e[0],e[1]||0,null==e[2]?1:e[2],e[3]||0,e[4]||0,e[5]||0)}function Z(e){return[e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds()]}function j(e){return 1===e.length&&(e=e.concat([0])),new Date(Date.UTC.apply(Date,e))}function Y(e){return!isNaN(e.valueOf())}function q(e){return 1e3*e.getUTCHours()*60*60+1e3*e.getUTCMinutes()*60+1e3*e.getUTCSeconds()+e.getUTCMilliseconds()}var G=["years","months","days","milliseconds"],X=/^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;function J(e,t){var n;return"string"==typeof e?function(e){var t=X.exec(e);if(t){var n=t[1]?-1:1;return{years:0,months:0,days:n*(t[2]?parseInt(t[2],10):0),milliseconds:n*(60*(t[3]?parseInt(t[3],10):0)*60*1e3+60*(t[4]?parseInt(t[4],10):0)*1e3+1e3*(t[5]?parseInt(t[5],10):0)+(t[6]?parseInt(t[6],10):0))}}return null}(e):"object"==typeof e&&e?K(e):"number"==typeof e?K(((n={})[t||"milliseconds"]=e,n)):null}function K(e){return{years:e.years||e.year||0,months:e.months||e.month||0,days:(e.days||e.day||0)+7*Q(e),milliseconds:60*(e.hours||e.hour||0)*60*1e3+60*(e.minutes||e.minute||0)*1e3+1e3*(e.seconds||e.second||0)+(e.milliseconds||e.millisecond||e.ms||0)}}function Q(e){return e.weeks||e.week||0}function $(e,t){return e.years===t.years&&e.months===t.months&&e.days===t.days&&e.milliseconds===t.milliseconds}function ee(e){return te(e)/864e5}function te(e){return 31536e6*e.years+2592e6*e.months+864e5*e.days+e.milliseconds}function ne(e,t){var n=e.milliseconds;if(n){if(n%1e3!=0)return{unit:"millisecond",value:n};if(n%6e4!=0)return{unit:"second",value:n/1e3};if(n%36e5!=0)return{unit:"minute",value:n/6e4};if(n)return{unit:"hour",value:n/36e5}}return e.days?t||e.days%7!=0?{unit:"day",value:e.days}:{unit:"week",value:e.days/7}:e.months?{unit:"month",value:e.months}:e.years?{unit:"year",value:e.years}:{unit:"millisecond",value:0}}function re(e){e.forEach(function(e){e.style.height=""})}function ie(e){var t,n,r=[],i=[];for("string"==typeof e?i=e.split(/\s*,\s*/):"function"==typeof e?i=[e]:Array.isArray(e)&&(i=e),t=0;t=te(t)&&(r=x(r,1))}return e.start&&(n=B(e.start),r&&r<=n&&(r=x(n,1))),{start:n,end:r}}function ye(e,t,n,r){return"year"===r?J(n.diffWholeYears(e,t),"year"):"month"===r?J(n.diffWholeMonths(e,t),"month"):z(e,t)}var me=function(e,t){return(me=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function Ee(e,t){function n(){this.constructor=e}me(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var Se=function(){return(Se=Object.assign||function(e){for(var t,n=1,r=arguments.length;n=0;o--)if("object"==typeof(a=e[o][r])&&a)i.unshift(a);else if(void 0!==a){u[r]=a;break}i.length&&(u[r]=Te(i))}for(n=e.length-1;n>=0;n--)for(r in s=e[n])r in u||(u[r]=s[r]);return u}function we(e,t){var n={};for(var r in e)t(e[r],r)&&(n[r]=e[r]);return n}function Re(e,t){var n={};for(var r in e)n[r]=t(e[r],r);return n}function Ie(e){for(var t={},n=0,r=e;no&&i.push({start:o,end:r.start}),r.end>o&&(o=r.end);return ot.start)&&(null===e.start||null===t.end||e.start=e.start)&&(null===e.end||null!==t.end&&t.end<=e.end)}function Ze(e,t){return(null===e.start||t>=e.start)&&(null===e.end||t1)||"numeric"!==r.year&&"2-digit"!==r.year||"numeric"!==r.month&&"2-digit"!==r.month||"numeric"!==r.day&&"2-digit"!==r.day||(a=1);var s=this.format(e,n),u=this.format(t,n);if(s===u)return s;var l=nt(function(e,t){var n={};for(var r in e)r in Xe&&!(Xe[r]<=t)||(n[r]=e[r]);return n}(r,a),i,n),c=l(e),d=l(t),f=function(e,t,n,r){var i=0;for(;i/g,">").replace(/'/g,"'").replace(/"/g,""").replace(/\n/g,"
")}function _t(e){var t=[];for(var n in e){var r=e[n];null!=r&&""!==r&&t.push(n+":"+r)}return t.join(";")}function Pt(e){return Array.isArray(e)?e:"string"==typeof e?e.split(/\s+/):[]}var xt={editable:Boolean,startEditable:Boolean,durationEditable:Boolean,constraint:null,overlap:null,allow:null,className:Pt,classNames:Pt,color:String,backgroundColor:String,borderColor:String,textColor:String};function Ht(e,t,n){var r=he(e,xt,{},n),i=function(e,t){return Array.isArray(e)?ke(e,"",t,!0):"object"==typeof e&&e?ke([e],"",t,!0):null!=e?String(e):null}(r.constraint,t);return{startEditable:null!=r.startEditable?r.startEditable:r.editable,durationEditable:null!=r.durationEditable?r.durationEditable:r.editable,constraints:null!=i?[i]:[],overlap:r.overlap,allows:null!=r.allow?[r.allow]:[],backgroundColor:r.backgroundColor||r.color,borderColor:r.borderColor||r.color,textColor:r.textColor,classNames:r.classNames.concat(r.className)}}function Nt(e,t,n,r){var i={},o={};for(var a in xt){var s=e+ue(a);i[a]=t[s],o[s]=!0}if("event"===e&&(i.editable=t.editable),r)for(var a in t)o[a]||(r[a]=t[a]);return Ht(i,n)}var zt={startEditable:null,durationEditable:null,constraints:[],overlap:null,allows:[],backgroundColor:"",borderColor:"",textColor:"",classNames:[]};function Ut(e){return e.reduce(Lt,zt)}function Lt(e,t){return{startEditable:null!=t.startEditable?t.startEditable:e.startEditable,durationEditable:null!=t.durationEditable?t.durationEditable:e.durationEditable,constraints:e.constraints.concat(t.constraints),overlap:"boolean"==typeof t.overlap?t.overlap:e.overlap,allows:e.allows.concat(t.allows),backgroundColor:t.backgroundColor||e.backgroundColor,borderColor:t.borderColor||e.borderColor,textColor:t.textColor||e.textColor,classNames:e.classNames.concat(t.classNames)}}var Bt={id:String,groupId:String,title:String,url:String,rendering:String,extendedProps:null},Vt={start:null,date:null,end:null,allDay:null},At=0;function Ft(e,t,n,r){var i=function(e,t){var n=null;if(e){var r=t.state.eventSources[e];n=r.allDayDefault}null==n&&(n=t.opt("allDayDefault"));return n}(t,n),o={},a=function(e,t,n,r,i){for(var o=0;o'+r+"
":""+r+""}function Qt(e,t,n,r){var i,o,a=n.calendar,s=n.view,u=n.theme,l=n.dateEnv,c=[];return Ze(t.activeRange,e)?(c.push("fc-"+P[e.getUTCDay()]),s.opt("monthMode")&&l.getMonth(e)!==l.getMonth(t.currentRange.start)&&c.push("fc-other-month"),o=x(i=B(a.getNow()),1),e=o?c.push("fc-future"):(c.push("fc-today"),!0!==r&&c.push(u.getClass("today")))):c.push("fc-disabled-day"),c}function $t(e,t,n){var r=!1,i=function(){r||(r=!0,t.apply(this,arguments))},o=function(){r||(r=!0,n&&n.apply(this,arguments))},a=e(i,o);a&&"function"==typeof a.then&&a.then(i,o)}var en=function(){function e(){}return e.mixInto=function(e){this.mixIntoObj(e.prototype)},e.mixIntoObj=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){e[n]||(e[n]=t.prototype[n])})},e.mixOver=function(e){var t=this;Object.getOwnPropertyNames(this.prototype).forEach(function(n){e.prototype[n]=t.prototype[n]})},e}(),tn=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t.prototype.on=function(e,t){return nn(this._handlers||(this._handlers={}),e,t),this},t.prototype.one=function(e,t){return nn(this._oneHandlers||(this._oneHandlers={}),e,t),this},t.prototype.off=function(e,t){return this._handlers&&rn(this._handlers,e,t),this._oneHandlers&&rn(this._oneHandlers,e,t),this},t.prototype.trigger=function(e){for(var t=[],n=1;n=n[t]&&e=n[t]&&e0},e.prototype.canScrollHorizontally=function(){return this.getMaxScrollLeft()>0},e.prototype.canScrollUp=function(){return this.getScrollTop()>0},e.prototype.canScrollDown=function(){return this.getScrollTop()0},e.prototype.canScrollRight=function(){return this.getScrollLeft()=200&&a.status<400)try{var e=JSON.parse(a.responseText);r(e,a)}catch(e){i("Failure parsing JSON",a)}else i("Request failed",a)},a.onerror=function(){i("Request failed",a)},a.send(o)}function Sn(e){var t=[];for(var n in e)t.push(encodeURIComponent(n)+"="+encodeURIComponent(e[n]));return t.join("&")}var bn=vn({eventSourceDefs:[{parseMeta:function(e){if("string"==typeof e)e={url:e};else if(!e||"object"!=typeof e||!e.url)return null;return{url:e.url,method:(e.method||"GET").toUpperCase(),extraParams:e.extraParams,startParam:e.startParam,endParam:e.endParam,timeZoneParam:e.timeZoneParam}},fetch:function(e,t,n){var r=e.eventSource.meta,i=function(e,t,n){var r,i,o,a,s=n.dateEnv,u={};null==(r=e.startParam)&&(r=n.opt("startParam"));null==(i=e.endParam)&&(i=n.opt("endParam"));null==(o=e.timeZoneParam)&&(o=n.opt("timeZoneParam"));a="function"==typeof e.extraParams?e.extraParams():e.extraParams||{};Se(u,a),u[r]=s.formatIso(t.start),u[i]=s.formatIso(t.end),"local"!==s.timeZone&&(u[o]=s.timeZone);return u}(r,e.range,e.calendar);En(r.method,r.url,i,function(e,n){t({rawEvents:e,xhr:n})},function(e,t){n({message:e,xhr:t})})}}]});var Dn=vn({recurringTypes:[{parse:function(e,t,n){var r,i,o=n.createMarker.bind(n),a=he(e,{daysOfWeek:null,startTime:J,endTime:J,startRecur:o,endRecur:o},{},t),s=!1;for(var u in a)if(null!=a[u]){s=!0;break}if(s){var l=null;return"duration"in t&&(l=J(t.duration),delete t.duration),!l&&a.startTime&&a.endTime&&(r=a.endTime,i=a.startTime,l={years:r.years-i.years,months:r.months-i.months,days:r.days-i.days,milliseconds:r.milliseconds-i.milliseconds}),{allDayGuess:Boolean(!a.startTime&&!a.endTime),duration:l,typeData:a}}return null},expand:function(e,t,n){var r=Ve(t,{start:e.startRecur,end:e.endRecur});return r?function(e,t,n,r){var i=e?Ie(e):null,o=B(n.start),a=n.end,s=[];for(;o0?e[0].code:"en",n=window.FullCalendarLocalesAll||[],r=window.FullCalendarLocales||{},i=n.concat(Ce(r),e),o={en:kn},a=0,s=i;a0;i--){var o=r.slice(0,i).join("-");if(t[o])return t[o]}return null}(n,t)||kn;return Pn(e,n,r)}(e,t):Pn(e.code,[e.code],e)}function Pn(e,t,n){var r=Te([kn,n],["buttonText"]);delete r.code;var i=r.week;return delete r.week,{codeArg:e,codes:t,week:i,simpleNumberFormat:new Intl.NumberFormat(e),options:r}}var xn=function(){function e(e){this.overrides=Se({},e),this.dynamicOverrides={},this.compute()}return e.prototype.mutate=function(e,t,n){var r=n?this.dynamicOverrides:this.overrides;Se(r,e);for(var i=0,o=t;i=1?Math.min(i,o):i}(e,this.weekDow,this.weekDoy)},e.prototype.format=function(e,t,n){return void 0===n&&(n={}),t.format({marker:e,timeZoneOffset:null!=n.forcedTzo?n.forcedTzo:this.offsetForMarker(e)},this)},e.prototype.formatRange=function(e,t,n,r){return void 0===r&&(r={}),r.isEndExclusive&&(t=H(t,-1)),n.formatRange({marker:e,timeZoneOffset:null!=r.forcedStartTzo?r.forcedStartTzo:this.offsetForMarker(e)},{marker:t,timeZoneOffset:null!=r.forcedEndTzo?r.forcedEndTzo:this.offsetForMarker(t)},this)},e.prototype.formatIso=function(e,t){void 0===t&&(t={});var n=null;return t.omitTimeZoneOffset||(n=null!=t.forcedTzo?t.forcedTzo:this.offsetForMarker(e)),function(e,t,n){void 0===n&&(n=!1);var r=e.toISOString();return r=r.replace(".000",""),n&&(r=r.replace("T00:00:00Z","")),r.length>10&&(null==t?r=r.replace("Z",""):0!==t&&(r=r.replace("Z",at(t,!0)))),r}(e,n,t.omitTime)},e.prototype.timestampToMarker=function(e){return"local"===this.timeZone?j(F(new Date(e))):"UTC"!==this.timeZone&&this.namedTimeZoneImpl?j(this.namedTimeZoneImpl.timestampToArray(e)):new Date(e)},e.prototype.offsetForMarker=function(e){return"local"===this.timeZone?-W(Z(e)).getTimezoneOffset():"UTC"===this.timeZone?0:this.namedTimeZoneImpl?this.namedTimeZoneImpl.offsetForArray(Z(e)):null},e.prototype.toDate=function(e,t){return"local"===this.timeZone?W(Z(e)):"UTC"===this.timeZone?new Date(e.valueOf()):this.namedTimeZoneImpl?new Date(e.valueOf()-1e3*this.namedTimeZoneImpl.offsetForArray(Z(e))*60):new Date(e.valueOf()-(t||0))},e}(),Vn={id:String,allDayDefault:Boolean,eventDataTransform:Function,success:Function,failure:Function},An=0;function Fn(e,t){return!t.pluginSystem.hooks.eventSourceDefs[e.sourceDefId].ignoreRange}function Wn(e,t){for(var n=t.pluginSystem.hooks.eventSourceDefs,r=n.length-1;r>=0;r--){var i=n[r].parseMeta(e);if(i){var o=Zn("object"==typeof e?e:{},i,r,t);return o._raw=e,o}}return null}function Zn(e,t,n,r){var i={},o=he(e,Vn,{},i),a={},s=Ht(i,r,a);return o.isFetching=!1,o.latestFetchId="",o.fetchRange=null,o.publicId=String(e.id||""),o.sourceId=String(An++),o.sourceDefId=n,o.meta=t,o.ui=s,o.extendedProps=a,o}function jn(e,t,n,r){switch(t.type){case"ADD_EVENT_SOURCES":return function(e,t,n,r){for(var i={},o=0,a=t;oe.fetchRange.end:!e.latestFetchId}(e,t,n)}),t,n)}function Gn(e,t,n,r){var i={};for(var o in e){var a=e[o];t[o]?i[o]=Xn(a,n,r):i[o]=a}return i}function Xn(e,t,n){var r=n.pluginSystem.hooks.eventSourceDefs[e.sourceDefId],i=String(Yn++);return r.fetch({eventSource:e,calendar:n,range:t},function(r){var o,a,s=r.rawEvents,u=n.opt("eventSourceSuccess");e.success&&(a=e.success(s,r.xhr)),u&&(o=u(s,r.xhr)),s=a||o||s,n.dispatch({type:"RECEIVE_EVENTS",sourceId:e.sourceId,fetchId:i,fetchRange:t,rawEvents:s})},function(r){var o=n.opt("eventSourceFailure");console.warn(r.message,r),e.failure&&e.failure(r),o&&o(r),n.dispatch({type:"RECEIVE_EVENT_ERROR",sourceId:e.sourceId,fetchId:i,fetchRange:t,error:r})}),Se({},e,{isFetching:!0,latestFetchId:i})}var Jn=function(){function e(e,t){this.viewSpec=e,this.options=e.options,this.dateEnv=t.dateEnv,this.calendar=t,this.initHiddenDays()}return e.prototype.buildPrev=function(e,t){var n=this.dateEnv,r=n.subtract(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,-1)},e.prototype.buildNext=function(e,t){var n=this.dateEnv,r=n.add(n.startOf(t,e.currentRangeUnit),e.dateIncrement);return this.build(r,1)},e.prototype.build=function(e,t,n){var r;void 0===n&&(n=!1);var i,o,a,s,u,l,c,d,f;return r=this.buildValidRange(),r=this.trimHiddenDays(r),n&&(d=e,e=null!=(f=r).start&&d=f.end?new Date(f.end.valueOf()-1):d),a=this.buildCurrentRangeInfo(e,t),s=/^(year|month|week|day)$/.test(a.unit),u=this.buildRenderRange(this.trimHiddenDays(a.range),a.unit,s),l=u=this.trimHiddenDays(u),this.options.showNonCurrentDates||(l=Ve(l,a.range)),i=J(this.options.minTime),o=J(this.options.maxTime),l=Ve(l=this.adjustActiveRange(l,i,o),r),c=Fe(a.range,r),{validRange:r,currentRange:a.range,currentRangeUnit:a.unit,isRangeAllDay:s,activeRange:l,renderRange:u,minTime:i,maxTime:o,isValid:c,dateIncrement:this.buildDateIncrement(a.duration)}},e.prototype.buildValidRange=function(){return this.getRangeOption("validRange",this.calendar.getNow())||{start:null,end:null}},e.prototype.buildCurrentRangeInfo=function(e,t){var n,r=this.viewSpec,i=this.dateEnv,o=null,a=null,s=null;return r.duration?(o=r.duration,a=r.durationUnit,s=this.buildRangeFromDuration(e,t,o,a)):(n=this.options.dayCount)?(a="day",s=this.buildRangeFromDayCount(e,t,n)):(s=this.buildCustomVisibleRange(e))?a=i.greatestWholeUnit(s.start,s.end).unit:(a=ne(o=this.getFallbackDuration()).unit,s=this.buildRangeFromDuration(e,t,o,a)),{duration:o,unit:a,range:s}},e.prototype.getFallbackDuration=function(){return J({day:1})},e.prototype.adjustActiveRange=function(e,t,n){var r=this.dateEnv,i=e.start,o=e.end;return this.viewSpec.class.prototype.usesMinMaxTime&&(ee(t)<0&&(i=B(i),i=r.add(i,t)),ee(n)>1&&(o=x(o=B(o),-1),o=r.add(o,n))),{start:i,end:o}},e.prototype.buildRangeFromDuration=function(e,t,n,r){var i,o,a,s,u,l=this.dateEnv,c=this.options.dateAlignment;function d(){a=l.startOf(e,c),s=l.add(a,n),u={start:a,end:s}}return c||((i=this.options.dateIncrement)?(o=J(i),c=te(o) ")),h=!1):((r=d[e])?(c=function(e){r.click&&r.click.call(E,e)},(v=o.getCustomButtonIconClass(r))||(v=o.getIconClass(e))||(g=r.text)):(s=l[e])?(n.viewsWithButtons.push(e),c=function(){a.changeView(e)},(g=s.buttonTextOverride)||(v=o.getIconClass(e))||(g=s.buttonTextDefault)):a[e]&&(c=function(){a[e]()},(g=f[e])||(v=o.getIconClass(e))||(g=p[e])),c&&(m=["fc-"+e+"-button",o.getClass("button")],g?(y=Ot(g),S=""):v&&(y="",S=' aria-label="'+e+'"'),(E=i('")).addEventListener("click",c),u.push(E)))}),u.length>1){r=document.createElement("div");var v=o.getClass("buttonGroup");h&&v&&r.classList.add(v),s(r,u),c.appendChild(r)}else s(c,u)}),c},t.prototype.updateToday=function(e){this.toggleButtonEnabled("today",e)},t.prototype.updatePrev=function(e){this.toggleButtonEnabled("prev",e)},t.prototype.updateNext=function(e){this.toggleButtonEnabled("next",e)},t.prototype.updateTitle=function(e){v(this.el,"h2").forEach(function(t){t.innerText=e})},t.prototype.updateActiveButton=function(e){var t=this.theme.getClass("buttonActive");v(this.el,"button").forEach(function(n){e&&n.classList.contains("fc-"+e+"-button")?n.classList.add(t):n.classList.remove(t)})},t.prototype.toggleButtonEnabled=function(e,t){v(this.el,".fc-"+e+"-button").forEach(function(e){e.disabled=!t})},t}(fn),hr=function(e){function t(t,n){var i=e.call(this,t)||this;i._renderToolbars=qt(i.renderToolbars),i.buildViewPropTransformers=Ye(gr),i.el=n,u(n,i.contentEl=r("div",{className:"fc-view-container"}));for(var o=i.calendar,a=0,s=o.pluginSystem.hooks.viewContainerModifiers;a1?{year:"numeric",month:"short",day:"numeric"}:{year:"numeric",month:"long",day:"numeric"}}(e),t.titleRangeSeparator),{isEndExclusive:e.isRangeAllDay})}function gr(e){return e.map(function(e){return new e})}var yr=function(){function e(e){this.component=e.component}return e.prototype.destroy=function(){},e}();var mr={},Er=function(e){function t(t){var n=e.call(this,t)||this;n.handleSegClick=function(e,t){var r=n.component,i=ht(t);if(i&&r.isValidSegDownEl(e.target)){var o=p(e.target,".fc-has-url"),a=o?o.querySelector("a[href]").href:"";r.publiclyTrigger("eventClick",[{el:t,event:new ct(r.calendar,i.eventRange.def,i.eventRange.instance),jsEvent:e,view:r.view}]),a&&!e.defaultPrevented&&(window.location.href=a)}};var r=t.component;return n.destroy=O(r.el,"click",r.fgSegSelector+","+r.bgSegSelector,n.handleSegClick),n}return Ee(t,e),t}(yr),Sr=function(e){function t(t){var n=e.call(this,t)||this;n.handleEventElRemove=function(e){e===n.currentSegEl&&n.handleSegLeave(null,n.currentSegEl)},n.handleSegEnter=function(e,t){ht(t)&&(t.classList.add("fc-allow-mouse-resize"),n.currentSegEl=t,n.triggerEvent("eventMouseEnter",e,t))},n.handleSegLeave=function(e,t){n.currentSegEl&&(t.classList.remove("fc-allow-mouse-resize"),n.currentSegEl=null,n.triggerEvent("eventMouseLeave",e,t))};var r,i,o,a,s,u=t.component;return n.removeHoverListeners=(r=u.el,i=u.fgSegSelector+","+u.bgSegSelector,o=n.handleSegEnter,a=n.handleSegLeave,O(r,"mouseover",i,function(e,t){if(t!==s){s=t,o(e,t);var n=function(e){s=null,a(e,t),t.removeEventListener("mouseleave",n)};t.addEventListener("mouseleave",n)}})),u.calendar.on("eventElRemove",n.handleEventElRemove),n}return Ee(t,e),t.prototype.destroy=function(){this.removeHoverListeners(),this.component.calendar.off("eventElRemove",this.handleEventElRemove)},t.prototype.triggerEvent=function(e,t,n){var r=this.component,i=ht(n);t&&!r.isValidSegDownEl(t.target)||r.publiclyTrigger(e,[{el:n,event:new ct(this.component.calendar,i.eventRange.def,i.eventRange.instance),jsEvent:t,view:r.view}])},t}(yr),br=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Ee(t,e),t}(cn);br.prototype.classes={widget:"fc-unthemed",widgetHeader:"fc-widget-header",widgetContent:"fc-widget-content",buttonGroup:"fc-button-group",button:"fc-button fc-button-primary",buttonActive:"fc-button-active",popoverHeader:"fc-widget-header",popoverContent:"fc-widget-content",headerRow:"fc-widget-header",dayRow:"fc-widget-content",listView:"fc-widget-content"},br.prototype.baseIconClass="fc-icon",br.prototype.iconClasses={close:"fc-icon-x",prev:"fc-icon-chevron-left",next:"fc-icon-chevron-right",prevYear:"fc-icon-chevrons-left",nextYear:"fc-icon-chevrons-right"},br.prototype.iconOverrideOption="buttonIcons",br.prototype.iconOverrideCustomButtonOption="icon",br.prototype.iconOverridePrefix="fc-icon-";var Dr=function(){function e(e,t){var n=this;this.parseRawLocales=Ye(On),this.buildLocale=Ye(_n),this.buildDateEnv=Ye(Tr),this.buildTheme=Ye(wr),this.buildEventUiSingleBase=Ye(this._buildEventUiSingleBase),this.buildSelectionConfig=Ye(this._buildSelectionConfig),this.buildEventUiBySource=qe(Ir,Me),this.buildEventUiBases=Ye(Cr),this.interactionsStore={},this.actionQueue=[],this.isReducing=!1,this.needsRerender=!1,this.needsFullRerender=!1,this.isRendering=!1,this.renderingPauseDepth=0,this.buildDelayedRerender=Ye(Rr),this.afterSizingTriggers={},this.isViewUpdated=!1,this.isDatesUpdated=!1,this.isEventsUpdated=!1,this.el=e,this.optionsManager=new xn(t||{}),this.pluginSystem=new gn,this.addPluginInputs(this.optionsManager.computed.plugins||[]),this.handleOptions(this.optionsManager.computed),this.publiclyTrigger("_init"),this.hydrate(),this.calendarInteractions=this.pluginSystem.hooks.calendarInteractions.map(function(e){return new e(n)})}return e.prototype.addPluginInputs=function(e){for(var t=function(e){for(var t=[],n=0,r=e;n"},e.prototype.detachSegs=function(e,t){var n=this.containerElsByType[e];n&&(n.forEach(c),delete this.containerElsByType[e])},e.prototype.computeSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.computeSegSizes(this.segsByType[t])},e.prototype.assignSizes=function(e){for(var t in this.segsByType)(e||this.dirtySizeFlags[t])&&this.assignSegSizes(this.segsByType[t]);this.dirtySizeFlags={}},e.prototype.computeSegSizes=function(e){},e.prototype.assignSegSizes=function(e){},e}(),Pr=function(e){this.timeZoneName=e},xr=function(){function e(e){this.emitter=new tn}return e.prototype.destroy=function(){},e.prototype.setMirrorIsVisible=function(e){},e.prototype.setMirrorNeedsRevert=function(e){},e.prototype.setAutoScrollEnabled=function(e){},e}();function Hr(e){var t=_n(e.locale||"en",On([]).map);return e=Se({timeZone:Rn.timeZone,calendarSystem:"gregory"},e,{locale:t}),new Bn(e)}var Nr={startTime:J,duration:J,create:Boolean,sourceId:String},zr={create:!0};function Ur(e,t){return!e||t>10?{weekday:"short"}:t>1?{weekday:"short",month:"numeric",day:"numeric",omitCommas:!0}:{weekday:"long"}}function Lr(e,t,n,r,i,o,a,s){var u,l=o.view,c=o.dateEnv,d=o.theme,f=o.options,p=Ze(t.activeRange,e),h=["fc-day-header",d.getClass("widgetHeader")];return u="function"==typeof f.columnHeaderHtml?f.columnHeaderHtml(c.toDate(e)):"function"==typeof f.columnHeaderText?Ot(f.columnHeaderText(c.toDate(e))):Ot(c.format(e,i)),n?h=h.concat(Qt(e,t,o,!0)):h.push("fc-"+P[e.getUTCDay()]),'1?' colspan="'+a+'"':"")+(s?" "+s:"")+">"+(p?Kt(l,{date:e,forceOff:!n||1===r},u):u)+""}var Br=function(e){function t(t,n){var r=e.call(this,t)||this;return n.innerHTML="",n.appendChild(r.el=i('
')),r.thead=r.el.querySelector("thead"),r}return Ee(t,e),t.prototype.destroy=function(){c(this.el)},t.prototype.render=function(e){var t=e.dates,n=e.datesRepDistinctDays,r=[];e.renderIntroHtml&&r.push(e.renderIntroHtml());for(var i=ot(this.opt("columnHeaderFormat")||Ur(n,t.length)),o=0,a=t;o"+r.join("")+""},t}(fn),Vr=function(){function e(e,t){for(var n=e.start,r=e.end,i=[],o=[],a=-1;n=t.length?t[t.length-1]+1:t[n]},e}(),Ar=function(){function e(e,t){var n,r,i,o=e.dates;if(t){for(r=o[0].getUTCDay(),n=1;n1},e.isPropsEqual=Me,e.isPropsValid=Rt,e.isSingleDay=function(e){return 0===e.years&&0===e.months&&1===e.days&&0===e.milliseconds},e.isValidDate=Y,e.listenBySelector=O,e.mapHash=Re,e.matchCellWidths=function(e){var t=0;return e.forEach(function(e){var n=e.firstChild;if(n instanceof HTMLElement){var r=n.getBoundingClientRect().width;r>t&&(t=r)}}),t++,e.forEach(function(e){e.style.width=t+"px"}),t},e.memoize=Ye,e.memoizeOutput=qe,e.memoizeRendering=qt,e.mergeEventStores=Ne,e.multiplyDuration=function(e,t){return{years:e.years*t,months:e.months*t,days:e.days*t,milliseconds:e.milliseconds*t}},e.padStart=le,e.parseBusinessHours=Yt,e.parseDragMeta=function(e){var t={},n=he(e,Nr,zr,t);return n.leftoverProps=t,n},e.parseEventDef=Wt,e.parseFieldSpecs=ie,e.parseMarker=Ln,e.pointInsideRect=function(e,t){return e.left>=t.left&&e.left=t.top&&e.top * { + /* work around the way we do column resizing and ensure a minimum width */ + display: inline-block; + min-width: 1.25em; +} diff --git a/public/resource/assets/libs/fullcalendar/daygrid/main.js b/public/resource/assets/libs/fullcalendar/daygrid/main.js new file mode 100644 index 0000000..d1cc407 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/daygrid/main.js @@ -0,0 +1,1641 @@ +/*! +FullCalendar Day Grid Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) : + typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) : + (global = global || self, factory(global.FullCalendarDayGrid = {}, global.FullCalendar)); +}(this, function (exports, core) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + var DayGridDateProfileGenerator = /** @class */ (function (_super) { + __extends(DayGridDateProfileGenerator, _super); + function DayGridDateProfileGenerator() { + return _super !== null && _super.apply(this, arguments) || this; + } + // Computes the date range that will be rendered. + DayGridDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) { + var dateEnv = this.dateEnv; + var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay); + var start = renderRange.start; + var end = renderRange.end; + var endOfWeek; + // year and month views should be aligned with weeks. this is already done for week + if (/^(year|month)$/.test(currentRangeUnit)) { + start = dateEnv.startOfWeek(start); + // make end-of-week if not already + endOfWeek = dateEnv.startOfWeek(end); + if (endOfWeek.valueOf() !== end.valueOf()) { + end = core.addWeeks(endOfWeek, 1); + } + } + // ensure 6 weeks + if (this.options.monthMode && + this.options.fixedWeekCount) { + var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays + core.diffWeeks(start, end)); + end = core.addWeeks(end, 6 - rowCnt); + } + return { start: start, end: end }; + }; + return DayGridDateProfileGenerator; + }(core.DateProfileGenerator)); + + /* A rectangular panel that is absolutely positioned over other content + ------------------------------------------------------------------------------------------------------------------------ + Options: + - className (string) + - content (HTML string, element, or element array) + - parentEl + - top + - left + - right (the x coord of where the right edge should be. not a "CSS" right) + - autoHide (boolean) + - show (callback) + - hide (callback) + */ + var Popover = /** @class */ (function () { + function Popover(options) { + var _this = this; + this.isHidden = true; + this.margin = 10; // the space required between the popover and the edges of the scroll container + // Triggered when the user clicks *anywhere* in the document, for the autoHide feature + this.documentMousedown = function (ev) { + // only hide the popover if the click happened outside the popover + if (_this.el && !_this.el.contains(ev.target)) { + _this.hide(); + } + }; + this.options = options; + } + // Shows the popover on the specified position. Renders it if not already + Popover.prototype.show = function () { + if (this.isHidden) { + if (!this.el) { + this.render(); + } + this.el.style.display = ''; + this.position(); + this.isHidden = false; + this.trigger('show'); + } + }; + // Hides the popover, through CSS, but does not remove it from the DOM + Popover.prototype.hide = function () { + if (!this.isHidden) { + this.el.style.display = 'none'; + this.isHidden = true; + this.trigger('hide'); + } + }; + // Creates `this.el` and renders content inside of it + Popover.prototype.render = function () { + var _this = this; + var options = this.options; + var el = this.el = core.createElement('div', { + className: 'fc-popover ' + (options.className || ''), + style: { + top: '0', + left: '0' + } + }); + if (typeof options.content === 'function') { + options.content(el); + } + options.parentEl.appendChild(el); + // when a click happens on anything inside with a 'fc-close' className, hide the popover + core.listenBySelector(el, 'click', '.fc-close', function (ev) { + _this.hide(); + }); + if (options.autoHide) { + document.addEventListener('mousedown', this.documentMousedown); + } + }; + // Hides and unregisters any handlers + Popover.prototype.destroy = function () { + this.hide(); + if (this.el) { + core.removeElement(this.el); + this.el = null; + } + document.removeEventListener('mousedown', this.documentMousedown); + }; + // Positions the popover optimally, using the top/left/right options + Popover.prototype.position = function () { + var options = this.options; + var el = this.el; + var elDims = el.getBoundingClientRect(); // only used for width,height + var origin = core.computeRect(el.offsetParent); + var clippingRect = core.computeClippingRect(options.parentEl); + var top; // the "position" (not "offset") values for the popover + var left; // + // compute top and left + top = options.top || 0; + if (options.left !== undefined) { + left = options.left; + } + else if (options.right !== undefined) { + left = options.right - elDims.width; // derive the left value from the right value + } + else { + left = 0; + } + // constrain to the view port. if constrained by two edges, give precedence to top/left + top = Math.min(top, clippingRect.bottom - elDims.height - this.margin); + top = Math.max(top, clippingRect.top + this.margin); + left = Math.min(left, clippingRect.right - elDims.width - this.margin); + left = Math.max(left, clippingRect.left + this.margin); + core.applyStyle(el, { + top: top - origin.top, + left: left - origin.left + }); + }; + // Triggers a callback. Calls a function in the option hash of the same name. + // Arguments beyond the first `name` are forwarded on. + // TODO: better code reuse for this. Repeat code + // can kill this??? + Popover.prototype.trigger = function (name) { + if (this.options[name]) { + this.options[name].apply(this, Array.prototype.slice.call(arguments, 1)); + } + }; + return Popover; + }()); + + /* Event-rendering methods for the DayGrid class + ----------------------------------------------------------------------------------------------------------------------*/ + // "Simple" is bad a name. has nothing to do with SimpleDayGrid + var SimpleDayGridEventRenderer = /** @class */ (function (_super) { + __extends(SimpleDayGridEventRenderer, _super); + function SimpleDayGridEventRenderer() { + return _super !== null && _super.apply(this, arguments) || this; + } + // Builds the HTML to be used for the default element for an individual segment + SimpleDayGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) { + var _a = this.context, view = _a.view, options = _a.options; + var eventRange = seg.eventRange; + var eventDef = eventRange.def; + var eventUi = eventRange.ui; + var allDay = eventDef.allDay; + var isDraggable = view.computeEventDraggable(eventDef, eventUi); + var isResizableFromStart = allDay && seg.isStart && view.computeEventStartResizable(eventDef, eventUi); + var isResizableFromEnd = allDay && seg.isEnd && view.computeEventEndResizable(eventDef, eventUi); + var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo); + var skinCss = core.cssToStr(this.getSkinCss(eventUi)); + var timeHtml = ''; + var timeText; + var titleHtml; + classes.unshift('fc-day-grid-event', 'fc-h-event'); + // Only display a timed events time if it is the starting segment + if (seg.isStart) { + timeText = this.getTimeText(eventRange); + if (timeText) { + timeHtml = '' + core.htmlEscape(timeText) + ''; + } + } + titleHtml = + '' + + (core.htmlEscape(eventDef.title || '') || ' ') + // we always want one line of height + ''; + return '' + + '
' + + (options.dir === 'rtl' ? + titleHtml + ' ' + timeHtml : // put a natural space in between + timeHtml + ' ' + titleHtml // + ) + + '
' + + (isResizableFromStart ? + '
' : + '') + + (isResizableFromEnd ? + '
' : + '') + + '
'; + }; + // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined + SimpleDayGridEventRenderer.prototype.computeEventTimeFormat = function () { + return { + hour: 'numeric', + minute: '2-digit', + omitZeroMinute: true, + meridiem: 'narrow' + }; + }; + SimpleDayGridEventRenderer.prototype.computeDisplayEventEnd = function () { + return false; // TODO: somehow consider the originating DayGrid's column count + }; + return SimpleDayGridEventRenderer; + }(core.FgEventRenderer)); + + /* Event-rendering methods for the DayGrid class + ----------------------------------------------------------------------------------------------------------------------*/ + var DayGridEventRenderer = /** @class */ (function (_super) { + __extends(DayGridEventRenderer, _super); + function DayGridEventRenderer(dayGrid) { + var _this = _super.call(this, dayGrid.context) || this; + _this.dayGrid = dayGrid; + return _this; + } + // Renders the given foreground event segments onto the grid + DayGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) { + var rowStructs = this.rowStructs = this.renderSegRows(segs); + // append to each row's content skeleton + this.dayGrid.rowEls.forEach(function (rowNode, i) { + rowNode.querySelector('.fc-content-skeleton > table').appendChild(rowStructs[i].tbodyEl); + }); + // removes the "more.." events popover + if (!mirrorInfo) { + this.dayGrid.removeSegPopover(); + } + }; + // Unrenders all currently rendered foreground event segments + DayGridEventRenderer.prototype.detachSegs = function () { + var rowStructs = this.rowStructs || []; + var rowStruct; + while ((rowStruct = rowStructs.pop())) { + core.removeElement(rowStruct.tbodyEl); + } + this.rowStructs = null; + }; + // Uses the given events array to generate elements that should be appended to each row's content skeleton. + // Returns an array of rowStruct objects (see the bottom of `renderSegRow`). + // PRECONDITION: each segment shoud already have a rendered and assigned `.el` + DayGridEventRenderer.prototype.renderSegRows = function (segs) { + var rowStructs = []; + var segRows; + var row; + segRows = this.groupSegRows(segs); // group into nested arrays + // iterate each row of segment groupings + for (row = 0; row < segRows.length; row++) { + rowStructs.push(this.renderSegRow(row, segRows[row])); + } + return rowStructs; + }; + // Given a row # and an array of segments all in the same row, render a element, a skeleton that contains + // the segments. Returns object with a bunch of internal data about how the render was calculated. + // NOTE: modifies rowSegs + DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) { + var dayGrid = this.dayGrid; + var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl; + var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels + var levelCnt = Math.max(1, segLevels.length); // ensure at least one level + var tbody = document.createElement('tbody'); + var segMatrix = []; // lookup for which segments are rendered into which level+col cells + var cellMatrix = []; // lookup for all elements of the level+col matrix + var loneCellMatrix = []; // lookup for elements that only take up a single column + var i; + var levelSegs; + var col; + var tr; + var j; + var seg; + var td; + // populates empty cells from the current column (`col`) to `endCol` + function emptyCellsUntil(endCol) { + while (col < endCol) { + // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell + td = (loneCellMatrix[i - 1] || [])[col]; + if (td) { + td.rowSpan = (td.rowSpan || 1) + 1; + } + else { + td = document.createElement('td'); + tr.appendChild(td); + } + cellMatrix[i][col] = td; + loneCellMatrix[i][col] = td; + col++; + } + } + for (i = 0; i < levelCnt; i++) { // iterate through all levels + levelSegs = segLevels[i]; + col = 0; + tr = document.createElement('tr'); + segMatrix.push([]); + cellMatrix.push([]); + loneCellMatrix.push([]); + // levelCnt might be 1 even though there are no actual levels. protect against this. + // this single empty row is useful for styling. + if (levelSegs) { + for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level + seg = levelSegs[j]; + var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; + var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol; + emptyCellsUntil(leftCol); + // create a container that occupies or more columns. append the event element. + td = core.createElement('td', { className: 'fc-event-container' }, seg.el); + if (leftCol !== rightCol) { + td.colSpan = rightCol - leftCol + 1; + } + else { // a single-column segment + loneCellMatrix[i][col] = td; + } + while (col <= rightCol) { + cellMatrix[i][col] = td; + segMatrix[i][col] = seg; + col++; + } + tr.appendChild(td); + } + } + emptyCellsUntil(colCnt); // finish off the row + var introHtml = dayGrid.renderProps.renderIntroHtml(); + if (introHtml) { + if (dayGrid.isRtl) { + core.appendToElement(tr, introHtml); + } + else { + core.prependToElement(tr, introHtml); + } + } + tbody.appendChild(tr); + } + return { + row: row, + tbodyEl: tbody, + cellMatrix: cellMatrix, + segMatrix: segMatrix, + segLevels: segLevels, + segs: rowSegs + }; + }; + // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels. + // NOTE: modifies segs + DayGridEventRenderer.prototype.buildSegLevels = function (segs) { + var _a = this.dayGrid, isRtl = _a.isRtl, colCnt = _a.colCnt; + var levels = []; + var i; + var seg; + var j; + // Give preference to elements with certain criteria, so they have + // a chance to be closer to the top. + segs = this.sortEventSegs(segs); + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + // loop through levels, starting with the topmost, until the segment doesn't collide with other segments + for (j = 0; j < levels.length; j++) { + if (!isDaySegCollision(seg, levels[j])) { + break; + } + } + // `j` now holds the desired subrow index + seg.level = j; + seg.leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; // for sorting only + seg.rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol // for sorting only + ; + (levels[j] || (levels[j] = [])).push(seg); + } + // order segments left-to-right. very important if calendar is RTL + for (j = 0; j < levels.length; j++) { + levels[j].sort(compareDaySegCols); + } + return levels; + }; + // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row + DayGridEventRenderer.prototype.groupSegRows = function (segs) { + var segRows = []; + var i; + for (i = 0; i < this.dayGrid.rowCnt; i++) { + segRows.push([]); + } + for (i = 0; i < segs.length; i++) { + segRows[segs[i].row].push(segs[i]); + } + return segRows; + }; + // Computes a default `displayEventEnd` value if one is not expliclty defined + DayGridEventRenderer.prototype.computeDisplayEventEnd = function () { + return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day + }; + return DayGridEventRenderer; + }(SimpleDayGridEventRenderer)); + // Computes whether two segments' columns collide. They are assumed to be in the same row. + function isDaySegCollision(seg, otherSegs) { + var i; + var otherSeg; + for (i = 0; i < otherSegs.length; i++) { + otherSeg = otherSegs[i]; + if (otherSeg.firstCol <= seg.lastCol && + otherSeg.lastCol >= seg.firstCol) { + return true; + } + } + return false; + } + // A cmp function for determining the leftmost event + function compareDaySegCols(a, b) { + return a.leftCol - b.leftCol; + } + + var DayGridMirrorRenderer = /** @class */ (function (_super) { + __extends(DayGridMirrorRenderer, _super); + function DayGridMirrorRenderer() { + return _super !== null && _super.apply(this, arguments) || this; + } + DayGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) { + var sourceSeg = mirrorInfo.sourceSeg; + var rowStructs = this.rowStructs = this.renderSegRows(segs); + // inject each new event skeleton into each associated row + this.dayGrid.rowEls.forEach(function (rowNode, row) { + var skeletonEl = core.htmlToElement('
'); // will be absolutely positioned + var skeletonTopEl; + var skeletonTop; + // If there is an original segment, match the top position. Otherwise, put it at the row's top level + if (sourceSeg && sourceSeg.row === row) { + skeletonTopEl = sourceSeg.el; + } + else { + skeletonTopEl = rowNode.querySelector('.fc-content-skeleton tbody'); + if (!skeletonTopEl) { // when no events + skeletonTopEl = rowNode.querySelector('.fc-content-skeleton table'); + } + } + skeletonTop = skeletonTopEl.getBoundingClientRect().top - + rowNode.getBoundingClientRect().top; // the offsetParent origin + skeletonEl.style.top = skeletonTop + 'px'; + skeletonEl.querySelector('table').appendChild(rowStructs[row].tbodyEl); + rowNode.appendChild(skeletonEl); + }); + }; + return DayGridMirrorRenderer; + }(DayGridEventRenderer)); + + var EMPTY_CELL_HTML = ''; + var DayGridFillRenderer = /** @class */ (function (_super) { + __extends(DayGridFillRenderer, _super); + function DayGridFillRenderer(dayGrid) { + var _this = _super.call(this, dayGrid.context) || this; + _this.fillSegTag = 'td'; // override the default tag name + _this.dayGrid = dayGrid; + return _this; + } + DayGridFillRenderer.prototype.renderSegs = function (type, segs) { + // don't render timed background events + if (type === 'bgEvent') { + segs = segs.filter(function (seg) { + return seg.eventRange.def.allDay; + }); + } + _super.prototype.renderSegs.call(this, type, segs); + }; + DayGridFillRenderer.prototype.attachSegs = function (type, segs) { + var els = []; + var i; + var seg; + var skeletonEl; + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + skeletonEl = this.renderFillRow(type, seg); + this.dayGrid.rowEls[seg.row].appendChild(skeletonEl); + els.push(skeletonEl); + } + return els; + }; + // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered. + DayGridFillRenderer.prototype.renderFillRow = function (type, seg) { + var dayGrid = this.dayGrid; + var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl; + var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; + var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol; + var startCol = leftCol; + var endCol = rightCol + 1; + var className; + var skeletonEl; + var trEl; + if (type === 'businessHours') { + className = 'bgevent'; + } + else { + className = type.toLowerCase(); + } + skeletonEl = core.htmlToElement('
' + + '
' + + '
'); + trEl = skeletonEl.getElementsByTagName('tr')[0]; + if (startCol > 0) { + core.appendToElement(trEl, + // will create (startCol + 1) td's + new Array(startCol + 1).join(EMPTY_CELL_HTML)); + } + seg.el.colSpan = endCol - startCol; + trEl.appendChild(seg.el); + if (endCol < colCnt) { + core.appendToElement(trEl, + // will create (colCnt - endCol) td's + new Array(colCnt - endCol + 1).join(EMPTY_CELL_HTML)); + } + var introHtml = dayGrid.renderProps.renderIntroHtml(); + if (introHtml) { + if (dayGrid.isRtl) { + core.appendToElement(trEl, introHtml); + } + else { + core.prependToElement(trEl, introHtml); + } + } + return skeletonEl; + }; + return DayGridFillRenderer; + }(core.FillRenderer)); + + var DayTile = /** @class */ (function (_super) { + __extends(DayTile, _super); + function DayTile(context, el) { + var _this = _super.call(this, context, el) || this; + var eventRenderer = _this.eventRenderer = new DayTileEventRenderer(_this); + var renderFrame = _this.renderFrame = core.memoizeRendering(_this._renderFrame); + _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderFrame]); + _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]); + _this.renderEventDrag = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]); + _this.renderEventResize = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]); + context.calendar.registerInteractiveComponent(_this, { + el: _this.el, + useEventCenter: false + }); + return _this; + } + DayTile.prototype.render = function (props) { + this.renderFrame(props.date); + this.renderFgEvents(props.fgSegs); + this.renderEventSelection(props.eventSelection); + this.renderEventDrag(props.eventDragInstances); + this.renderEventResize(props.eventResizeInstances); + }; + DayTile.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.renderFrame.unrender(); // should unrender everything else + this.calendar.unregisterInteractiveComponent(this); + }; + DayTile.prototype._renderFrame = function (date) { + var _a = this, theme = _a.theme, dateEnv = _a.dateEnv; + var title = dateEnv.format(date, core.createFormatter(this.opt('dayPopoverFormat')) // TODO: cache + ); + this.el.innerHTML = + '
' + + '' + + core.htmlEscape(title) + + '' + + '' + + '
' + + '
' + + '
' + + '
'; + this.segContainerEl = this.el.querySelector('.fc-event-container'); + }; + DayTile.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) { + var date = this.props.date; // HACK + if (positionLeft < elWidth && positionTop < elHeight) { + return { + component: this, + dateSpan: { + allDay: true, + range: { start: date, end: core.addDays(date, 1) } + }, + dayEl: this.el, + rect: { + left: 0, + top: 0, + right: elWidth, + bottom: elHeight + }, + layer: 1 + }; + } + }; + return DayTile; + }(core.DateComponent)); + var DayTileEventRenderer = /** @class */ (function (_super) { + __extends(DayTileEventRenderer, _super); + function DayTileEventRenderer(dayTile) { + var _this = _super.call(this, dayTile.context) || this; + _this.dayTile = dayTile; + return _this; + } + DayTileEventRenderer.prototype.attachSegs = function (segs) { + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + this.dayTile.segContainerEl.appendChild(seg.el); + } + }; + DayTileEventRenderer.prototype.detachSegs = function (segs) { + for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) { + var seg = segs_2[_i]; + core.removeElement(seg.el); + } + }; + return DayTileEventRenderer; + }(SimpleDayGridEventRenderer)); + + var DayBgRow = /** @class */ (function () { + function DayBgRow(context) { + this.context = context; + } + DayBgRow.prototype.renderHtml = function (props) { + var parts = []; + if (props.renderIntroHtml) { + parts.push(props.renderIntroHtml()); + } + for (var _i = 0, _a = props.cells; _i < _a.length; _i++) { + var cell = _a[_i]; + parts.push(renderCellHtml(cell.date, props.dateProfile, this.context, cell.htmlAttrs)); + } + if (!props.cells.length) { + parts.push(''); + } + if (this.context.options.dir === 'rtl') { + parts.reverse(); + } + return '' + parts.join('') + ''; + }; + return DayBgRow; + }()); + function renderCellHtml(date, dateProfile, context, otherAttrs) { + var dateEnv = context.dateEnv, theme = context.theme; + var isDateValid = core.rangeContainsMarker(dateProfile.activeRange, date); // TODO: called too frequently. cache somehow. + var classes = core.getDayClasses(date, dateProfile, context); + classes.unshift('fc-day', theme.getClass('widgetContent')); + return ''; + } + + var DAY_NUM_FORMAT = core.createFormatter({ day: 'numeric' }); + var WEEK_NUM_FORMAT = core.createFormatter({ week: 'numeric' }); + var DayGrid = /** @class */ (function (_super) { + __extends(DayGrid, _super); + function DayGrid(context, el, renderProps) { + var _this = _super.call(this, context, el) || this; + _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid + _this.isCellSizesDirty = false; + var eventRenderer = _this.eventRenderer = new DayGridEventRenderer(_this); + var fillRenderer = _this.fillRenderer = new DayGridFillRenderer(_this); + _this.mirrorRenderer = new DayGridMirrorRenderer(_this); + var renderCells = _this.renderCells = core.memoizeRendering(_this._renderCells, _this._unrenderCells); + _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderCells]); + _this.renderDateSelection = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'), [renderCells]); + _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderCells]); + _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderCells]); + _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]); + _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderCells]); + _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderCells]); + _this.renderProps = renderProps; + return _this; + } + DayGrid.prototype.render = function (props) { + var cells = props.cells; + this.rowCnt = cells.length; + this.colCnt = cells[0].length; + this.renderCells(cells, props.isRigid); + this.renderBusinessHours(props.businessHourSegs); + this.renderDateSelection(props.dateSelectionSegs); + this.renderBgEvents(props.bgEventSegs); + this.renderFgEvents(props.fgEventSegs); + this.renderEventSelection(props.eventSelection); + this.renderEventDrag(props.eventDrag); + this.renderEventResize(props.eventResize); + if (this.segPopoverTile) { + this.updateSegPopoverTile(); + } + }; + DayGrid.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.renderCells.unrender(); // will unrender everything else + }; + DayGrid.prototype.getCellRange = function (row, col) { + var start = this.props.cells[row][col].date; + var end = core.addDays(start, 1); + return { start: start, end: end }; + }; + DayGrid.prototype.updateSegPopoverTile = function (date, segs) { + var ownProps = this.props; + this.segPopoverTile.receiveProps({ + date: date || this.segPopoverTile.props.date, + fgSegs: segs || this.segPopoverTile.props.fgSegs, + eventSelection: ownProps.eventSelection, + eventDragInstances: ownProps.eventDrag ? ownProps.eventDrag.affectedInstances : null, + eventResizeInstances: ownProps.eventResize ? ownProps.eventResize.affectedInstances : null + }); + }; + /* Date Rendering + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype._renderCells = function (cells, isRigid) { + var _a = this, view = _a.view, dateEnv = _a.dateEnv; + var _b = this, rowCnt = _b.rowCnt, colCnt = _b.colCnt; + var html = ''; + var row; + var col; + for (row = 0; row < rowCnt; row++) { + html += this.renderDayRowHtml(row, isRigid); + } + this.el.innerHTML = html; + this.rowEls = core.findElements(this.el, '.fc-row'); + this.cellEls = core.findElements(this.el, '.fc-day, .fc-disabled-day'); + if (this.isRtl) { + this.cellEls.reverse(); + } + this.rowPositions = new core.PositionCache(this.el, this.rowEls, false, true // vertical + ); + this.colPositions = new core.PositionCache(this.el, this.cellEls.slice(0, colCnt), // only the first row + true, false // horizontal + ); + // trigger dayRender with each cell's element + for (row = 0; row < rowCnt; row++) { + for (col = 0; col < colCnt; col++) { + this.publiclyTrigger('dayRender', [ + { + date: dateEnv.toDate(cells[row][col].date), + el: this.getCellEl(row, col), + view: view + } + ]); + } + } + this.isCellSizesDirty = true; + }; + DayGrid.prototype._unrenderCells = function () { + this.removeSegPopover(); + }; + // Generates the HTML for a single row, which is a div that wraps a table. + // `row` is the row number. + DayGrid.prototype.renderDayRowHtml = function (row, isRigid) { + var theme = this.theme; + var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')]; + if (isRigid) { + classes.push('fc-rigid'); + } + var bgRow = new DayBgRow(this.context); + return '' + + '
' + + '
' + + '' + + bgRow.renderHtml({ + cells: this.props.cells[row], + dateProfile: this.props.dateProfile, + renderIntroHtml: this.renderProps.renderBgIntroHtml + }) + + '
' + + '
' + + '
' + + '' + + (this.getIsNumbersVisible() ? + '' + + this.renderNumberTrHtml(row) + + '' : + '') + + '
' + + '
' + + '
'; + }; + DayGrid.prototype.getIsNumbersVisible = function () { + return this.getIsDayNumbersVisible() || + this.renderProps.cellWeekNumbersVisible || + this.renderProps.colWeekNumbersVisible; + }; + DayGrid.prototype.getIsDayNumbersVisible = function () { + return this.rowCnt > 1; + }; + /* Grid Number Rendering + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype.renderNumberTrHtml = function (row) { + var intro = this.renderProps.renderNumberIntroHtml(row, this); + return '' + + '' + + (this.isRtl ? '' : intro) + + this.renderNumberCellsHtml(row) + + (this.isRtl ? intro : '') + + ''; + }; + DayGrid.prototype.renderNumberCellsHtml = function (row) { + var htmls = []; + var col; + var date; + for (col = 0; col < this.colCnt; col++) { + date = this.props.cells[row][col].date; + htmls.push(this.renderNumberCellHtml(date)); + } + if (this.isRtl) { + htmls.reverse(); + } + return htmls.join(''); + }; + // Generates the HTML for the s of the "number" row in the DayGrid's content skeleton. + // The number row will only exist if either day numbers or week numbers are turned on. + DayGrid.prototype.renderNumberCellHtml = function (date) { + var _a = this, view = _a.view, dateEnv = _a.dateEnv; + var html = ''; + var isDateValid = core.rangeContainsMarker(this.props.dateProfile.activeRange, date); // TODO: called too frequently. cache somehow. + var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid; + var classes; + var weekCalcFirstDow; + if (!isDayNumberVisible && !this.renderProps.cellWeekNumbersVisible) { + // no numbers in day cell (week number must be along the side) + return ''; // will create an empty space above events :( + } + classes = core.getDayClasses(date, this.props.dateProfile, this.context); + classes.unshift('fc-day-top'); + if (this.renderProps.cellWeekNumbersVisible) { + weekCalcFirstDow = dateEnv.weekDow; + } + html += ''; + if (this.renderProps.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) { + html += core.buildGotoAnchorHtml(view, { date: date, type: 'week' }, { 'class': 'fc-week-number' }, dateEnv.format(date, WEEK_NUM_FORMAT) // inner HTML + ); + } + if (isDayNumberVisible) { + html += core.buildGotoAnchorHtml(view, date, { 'class': 'fc-day-number' }, dateEnv.format(date, DAY_NUM_FORMAT) // inner HTML + ); + } + html += ''; + return html; + }; + /* Sizing + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype.updateSize = function (isResize) { + var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer; + if (isResize || + this.isCellSizesDirty || + this.view.calendar.isEventsUpdated // hack + ) { + this.buildPositionCaches(); + this.isCellSizesDirty = false; + } + fillRenderer.computeSizes(isResize); + eventRenderer.computeSizes(isResize); + mirrorRenderer.computeSizes(isResize); + fillRenderer.assignSizes(isResize); + eventRenderer.assignSizes(isResize); + mirrorRenderer.assignSizes(isResize); + }; + DayGrid.prototype.buildPositionCaches = function () { + this.buildColPositions(); + this.buildRowPositions(); + }; + DayGrid.prototype.buildColPositions = function () { + this.colPositions.build(); + }; + DayGrid.prototype.buildRowPositions = function () { + this.rowPositions.build(); + this.rowPositions.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack + }; + /* Hit System + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype.positionToHit = function (leftPosition, topPosition) { + var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions; + var col = colPositions.leftToIndex(leftPosition); + var row = rowPositions.topToIndex(topPosition); + if (row != null && col != null) { + return { + row: row, + col: col, + dateSpan: { + range: this.getCellRange(row, col), + allDay: true + }, + dayEl: this.getCellEl(row, col), + relativeRect: { + left: colPositions.lefts[col], + right: colPositions.rights[col], + top: rowPositions.tops[row], + bottom: rowPositions.bottoms[row] + } + }; + } + }; + /* Cell System + ------------------------------------------------------------------------------------------------------------------*/ + // FYI: the first column is the leftmost column, regardless of date + DayGrid.prototype.getCellEl = function (row, col) { + return this.cellEls[row * this.colCnt + col]; + }; + /* Event Drag Visualization + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype._renderEventDrag = function (state) { + if (state) { + this.eventRenderer.hideByHash(state.affectedInstances); + this.fillRenderer.renderSegs('highlight', state.segs); + } + }; + DayGrid.prototype._unrenderEventDrag = function (state) { + if (state) { + this.eventRenderer.showByHash(state.affectedInstances); + this.fillRenderer.unrender('highlight'); + } + }; + /* Event Resize Visualization + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype._renderEventResize = function (state) { + if (state) { + this.eventRenderer.hideByHash(state.affectedInstances); + this.fillRenderer.renderSegs('highlight', state.segs); + this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg }); + } + }; + DayGrid.prototype._unrenderEventResize = function (state) { + if (state) { + this.eventRenderer.showByHash(state.affectedInstances); + this.fillRenderer.unrender('highlight'); + this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg }); + } + }; + /* More+ Link Popover + ------------------------------------------------------------------------------------------------------------------*/ + DayGrid.prototype.removeSegPopover = function () { + if (this.segPopover) { + this.segPopover.hide(); // in handler, will call segPopover's removeElement + } + }; + // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid. + // `levelLimit` can be false (don't limit), a number, or true (should be computed). + DayGrid.prototype.limitRows = function (levelLimit) { + var rowStructs = this.eventRenderer.rowStructs || []; + var row; // row # + var rowLevelLimit; + for (row = 0; row < rowStructs.length; row++) { + this.unlimitRow(row); + if (!levelLimit) { + rowLevelLimit = false; + } + else if (typeof levelLimit === 'number') { + rowLevelLimit = levelLimit; + } + else { + rowLevelLimit = this.computeRowLevelLimit(row); + } + if (rowLevelLimit !== false) { + this.limitRow(row, rowLevelLimit); + } + } + }; + // Computes the number of levels a row will accomodate without going outside its bounds. + // Assumes the row is "rigid" (maintains a constant height regardless of what is inside). + // `row` is the row number. + DayGrid.prototype.computeRowLevelLimit = function (row) { + var rowEl = this.rowEls[row]; // the containing "fake" row div + var rowBottom = rowEl.getBoundingClientRect().bottom; // relative to viewport! + var trEls = core.findChildren(this.eventRenderer.rowStructs[row].tbodyEl); + var i; + var trEl; + // Reveal one level at a time and stop when we find one out of bounds + for (i = 0; i < trEls.length; i++) { + trEl = trEls[i]; + trEl.classList.remove('fc-limited'); // reset to original state (reveal) + if (trEl.getBoundingClientRect().bottom > rowBottom) { + return i; + } + } + return false; // should not limit at all + }; + // Limits the given grid row to the maximum number of levels and injects "more" links if necessary. + // `row` is the row number. + // `levelLimit` is a number for the maximum (inclusive) number of levels allowed. + DayGrid.prototype.limitRow = function (row, levelLimit) { + var _this = this; + var _a = this, colCnt = _a.colCnt, isRtl = _a.isRtl; + var rowStruct = this.eventRenderer.rowStructs[row]; + var moreNodes = []; // array of "more" links and DOM nodes + var col = 0; // col #, left-to-right (not chronologically) + var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right + var cellMatrix; // a matrix (by level, then column) of all elements in the row + var limitedNodes; // array of temporarily hidden level and segment DOM nodes + var i; + var seg; + var segsBelow; // array of segment objects below `seg` in the current `col` + var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies + var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column) + var td; + var rowSpan; + var segMoreNodes; // array of "more" cells that will stand-in for the current seg's cell + var j; + var moreTd; + var moreWrap; + var moreLink; + // Iterates through empty level cells and places "more" links inside if need be + var emptyCellsUntil = function (endCol) { + while (col < endCol) { + segsBelow = _this.getCellSegs(row, col, levelLimit); + if (segsBelow.length) { + td = cellMatrix[levelLimit - 1][col]; + moreLink = _this.renderMoreLink(row, col, segsBelow); + moreWrap = core.createElement('div', null, moreLink); + td.appendChild(moreWrap); + moreNodes.push(moreWrap); + } + col++; + } + }; + if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit? + levelSegs = rowStruct.segLevels[levelLimit - 1]; + cellMatrix = rowStruct.cellMatrix; + limitedNodes = core.findChildren(rowStruct.tbodyEl).slice(levelLimit); // get level elements past the limit + limitedNodes.forEach(function (node) { + node.classList.add('fc-limited'); // hide elements and get a simple DOM-nodes array + }); + // iterate though segments in the last allowable level + for (i = 0; i < levelSegs.length; i++) { + seg = levelSegs[i]; + var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; + var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol; + emptyCellsUntil(leftCol); // process empty cells before the segment + // determine *all* segments below `seg` that occupy the same columns + colSegsBelow = []; + totalSegsBelow = 0; + while (col <= rightCol) { + segsBelow = this.getCellSegs(row, col, levelLimit); + colSegsBelow.push(segsBelow); + totalSegsBelow += segsBelow.length; + col++; + } + if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links? + td = cellMatrix[levelLimit - 1][leftCol]; // the segment's parent cell + rowSpan = td.rowSpan || 1; + segMoreNodes = []; + // make a replacement for each column the segment occupies. will be one for each colspan + for (j = 0; j < colSegsBelow.length; j++) { + moreTd = core.createElement('td', { className: 'fc-more-cell', rowSpan: rowSpan }); + segsBelow = colSegsBelow[j]; + moreLink = this.renderMoreLink(row, leftCol + j, [seg].concat(segsBelow) // count seg as hidden too + ); + moreWrap = core.createElement('div', null, moreLink); + moreTd.appendChild(moreWrap); + segMoreNodes.push(moreTd); + moreNodes.push(moreTd); + } + td.classList.add('fc-limited'); + core.insertAfterElement(td, segMoreNodes); + limitedNodes.push(td); + } + } + emptyCellsUntil(this.colCnt); // finish off the level + rowStruct.moreEls = moreNodes; // for easy undoing later + rowStruct.limitedEls = limitedNodes; // for easy undoing later + } + }; + // Reveals all levels and removes all "more"-related elements for a grid's row. + // `row` is a row number. + DayGrid.prototype.unlimitRow = function (row) { + var rowStruct = this.eventRenderer.rowStructs[row]; + if (rowStruct.moreEls) { + rowStruct.moreEls.forEach(core.removeElement); + rowStruct.moreEls = null; + } + if (rowStruct.limitedEls) { + rowStruct.limitedEls.forEach(function (limitedEl) { + limitedEl.classList.remove('fc-limited'); + }); + rowStruct.limitedEls = null; + } + }; + // Renders an element that represents hidden event element for a cell. + // Responsible for attaching click handler as well. + DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) { + var _this = this; + var _a = this, view = _a.view, dateEnv = _a.dateEnv; + var a = core.createElement('a', { className: 'fc-more' }); + a.innerText = this.getMoreLinkText(hiddenSegs.length); + a.addEventListener('click', function (ev) { + var clickOption = _this.opt('eventLimitClick'); + var _col = _this.isRtl ? _this.colCnt - col - 1 : col; // HACK: props.cells has different dir system? + var date = _this.props.cells[row][_col].date; + var moreEl = ev.currentTarget; + var dayEl = _this.getCellEl(row, col); + var allSegs = _this.getCellSegs(row, col); + // rescope the segments to be within the cell's date + var reslicedAllSegs = _this.resliceDaySegs(allSegs, date); + var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date); + if (typeof clickOption === 'function') { + // the returned value can be an atomic option + clickOption = _this.publiclyTrigger('eventLimitClick', [ + { + date: dateEnv.toDate(date), + allDay: true, + dayEl: dayEl, + moreEl: moreEl, + segs: reslicedAllSegs, + hiddenSegs: reslicedHiddenSegs, + jsEvent: ev, + view: view + } + ]); + } + if (clickOption === 'popover') { + _this.showSegPopover(row, col, moreEl, reslicedAllSegs); + } + else if (typeof clickOption === 'string') { // a view name + view.calendar.zoomTo(date, clickOption); + } + }); + return a; + }; + // Reveals the popover that displays all events within a cell + DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) { + var _this = this; + var _a = this, calendar = _a.calendar, view = _a.view, theme = _a.theme; + var _col = this.isRtl ? this.colCnt - col - 1 : col; // HACK: props.cells has different dir system? + var moreWrap = moreLink.parentNode; // the
wrapper around the + var topEl; // the element we want to match the top coordinate of + var options; + if (this.rowCnt === 1) { + topEl = view.el; // will cause the popover to cover any sort of header + } + else { + topEl = this.rowEls[row]; // will align with top of row + } + options = { + className: 'fc-more-popover ' + theme.getClass('popover'), + parentEl: view.el, + top: core.computeRect(topEl).top, + autoHide: true, + content: function (el) { + _this.segPopoverTile = new DayTile(_this.context, el); + _this.updateSegPopoverTile(_this.props.cells[row][_col].date, segs); + }, + hide: function () { + _this.segPopoverTile.destroy(); + _this.segPopoverTile = null; + _this.segPopover.destroy(); + _this.segPopover = null; + } + }; + // Determine horizontal coordinate. + // We use the moreWrap instead of the to avoid border confusion. + if (this.isRtl) { + options.right = core.computeRect(moreWrap).right + 1; // +1 to be over cell border + } + else { + options.left = core.computeRect(moreWrap).left - 1; // -1 to be over cell border + } + this.segPopover = new Popover(options); + this.segPopover.show(); + calendar.releaseAfterSizingTriggers(); // hack for eventPositioned + }; + // Given the events within an array of segment objects, reslice them to be in a single day + DayGrid.prototype.resliceDaySegs = function (segs, dayDate) { + var dayStart = dayDate; + var dayEnd = core.addDays(dayStart, 1); + var dayRange = { start: dayStart, end: dayEnd }; + var newSegs = []; + for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) { + var seg = segs_1[_i]; + var eventRange = seg.eventRange; + var origRange = eventRange.range; + var slicedRange = core.intersectRanges(origRange, dayRange); + if (slicedRange) { + newSegs.push(__assign({}, seg, { eventRange: { + def: eventRange.def, + ui: __assign({}, eventRange.ui, { durationEditable: false }), + instance: eventRange.instance, + range: slicedRange + }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() })); + } + } + return newSegs; + }; + // Generates the text that should be inside a "more" link, given the number of events it represents + DayGrid.prototype.getMoreLinkText = function (num) { + var opt = this.opt('eventLimitText'); + if (typeof opt === 'function') { + return opt(num); + } + else { + return '+' + num + ' ' + opt; + } + }; + // Returns segments within a given cell. + // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs. + DayGrid.prototype.getCellSegs = function (row, col, startLevel) { + var segMatrix = this.eventRenderer.rowStructs[row].segMatrix; + var level = startLevel || 0; + var segs = []; + var seg; + while (level < segMatrix.length) { + seg = segMatrix[level][col]; + if (seg) { + segs.push(seg); + } + level++; + } + return segs; + }; + return DayGrid; + }(core.DateComponent)); + + var WEEK_NUM_FORMAT$1 = core.createFormatter({ week: 'numeric' }); + /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells. + ----------------------------------------------------------------------------------------------------------------------*/ + // It is a manager for a DayGrid subcomponent, which does most of the heavy lifting. + // It is responsible for managing width/height. + var DayGridView = /** @class */ (function (_super) { + __extends(DayGridView, _super); + function DayGridView(context, viewSpec, dateProfileGenerator, parentEl) { + var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this; + /* Header Rendering + ------------------------------------------------------------------------------------------------------------------*/ + // Generates the HTML that will go before the day-of week header cells + _this.renderHeadIntroHtml = function () { + var theme = _this.theme; + if (_this.colWeekNumbersVisible) { + return '' + + '' + + '' + // needed for matchCellWidths + core.htmlEscape(_this.opt('weekLabel')) + + '' + + ''; + } + return ''; + }; + /* Day Grid Rendering + ------------------------------------------------------------------------------------------------------------------*/ + // Generates the HTML that will go before content-skeleton cells that display the day/week numbers + _this.renderDayGridNumberIntroHtml = function (row, dayGrid) { + var dateEnv = _this.dateEnv; + var weekStart = dayGrid.props.cells[row][0].date; + if (_this.colWeekNumbersVisible) { + return '' + + '' + + core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths + _this, { date: weekStart, type: 'week', forceOff: dayGrid.colCnt === 1 }, dateEnv.format(weekStart, WEEK_NUM_FORMAT$1) // inner HTML + ) + + ''; + } + return ''; + }; + // Generates the HTML that goes before the day bg cells for each day-row + _this.renderDayGridBgIntroHtml = function () { + var theme = _this.theme; + if (_this.colWeekNumbersVisible) { + return ''; + } + return ''; + }; + // Generates the HTML that goes before every other type of row generated by DayGrid. + // Affects mirror-skeleton and highlight-skeleton rows. + _this.renderDayGridIntroHtml = function () { + if (_this.colWeekNumbersVisible) { + return ''; + } + return ''; + }; + _this.el.classList.add('fc-dayGrid-view'); + _this.el.innerHTML = _this.renderSkeletonHtml(); + _this.scroller = new core.ScrollComponent('hidden', // overflow x + 'auto' // overflow y + ); + var dayGridContainerEl = _this.scroller.el; + _this.el.querySelector('.fc-body > tr > td').appendChild(dayGridContainerEl); + dayGridContainerEl.classList.add('fc-day-grid-container'); + var dayGridEl = core.createElement('div', { className: 'fc-day-grid' }); + dayGridContainerEl.appendChild(dayGridEl); + var cellWeekNumbersVisible; + if (_this.opt('weekNumbers')) { + if (_this.opt('weekNumbersWithinDays')) { + cellWeekNumbersVisible = true; + _this.colWeekNumbersVisible = false; + } + else { + cellWeekNumbersVisible = false; + _this.colWeekNumbersVisible = true; + } + } + else { + _this.colWeekNumbersVisible = false; + cellWeekNumbersVisible = false; + } + _this.dayGrid = new DayGrid(_this.context, dayGridEl, { + renderNumberIntroHtml: _this.renderDayGridNumberIntroHtml, + renderBgIntroHtml: _this.renderDayGridBgIntroHtml, + renderIntroHtml: _this.renderDayGridIntroHtml, + colWeekNumbersVisible: _this.colWeekNumbersVisible, + cellWeekNumbersVisible: cellWeekNumbersVisible + }); + return _this; + } + DayGridView.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.dayGrid.destroy(); + this.scroller.destroy(); + }; + // Builds the HTML skeleton for the view. + // The day-grid component will render inside of a container defined by this HTML. + DayGridView.prototype.renderSkeletonHtml = function () { + var theme = this.theme; + return '' + + '' + + (this.opt('columnHeader') ? + '' + + '' + + '' + + '' + + '' : + '') + + '' + + '' + + '' + + '' + + '' + + '
 
'; + }; + // Generates an HTML attribute string for setting the width of the week number column, if it is known + DayGridView.prototype.weekNumberStyleAttr = function () { + if (this.weekNumberWidth != null) { + return 'style="width:' + this.weekNumberWidth + 'px"'; + } + return ''; + }; + // Determines whether each row should have a constant height + DayGridView.prototype.hasRigidRows = function () { + var eventLimit = this.opt('eventLimit'); + return eventLimit && typeof eventLimit !== 'number'; + }; + /* Dimensions + ------------------------------------------------------------------------------------------------------------------*/ + DayGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) { + _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first + this.dayGrid.updateSize(isResize); + }; + // Refreshes the horizontal dimensions of the view + DayGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) { + var dayGrid = this.dayGrid; + var eventLimit = this.opt('eventLimit'); + var headRowEl = this.header ? this.header.el : null; // HACK + var scrollerHeight; + var scrollbarWidths; + // hack to give the view some height prior to dayGrid's columns being rendered + // TODO: separate setting height from scroller VS dayGrid. + if (!dayGrid.rowEls) { + if (!isAuto) { + scrollerHeight = this.computeScrollerHeight(viewHeight); + this.scroller.setHeight(scrollerHeight); + } + return; + } + if (this.colWeekNumbersVisible) { + // Make sure all week number cells running down the side have the same width. + this.weekNumberWidth = core.matchCellWidths(core.findElements(this.el, '.fc-week-number')); + } + // reset all heights to be natural + this.scroller.clear(); + if (headRowEl) { + core.uncompensateScroll(headRowEl); + } + dayGrid.removeSegPopover(); // kill the "more" popover if displayed + // is the event limit a constant level number? + if (eventLimit && typeof eventLimit === 'number') { + dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after + } + // distribute the height to the rows + // (viewHeight is a "recommended" value if isAuto) + scrollerHeight = this.computeScrollerHeight(viewHeight); + this.setGridHeight(scrollerHeight, isAuto); + // is the event limit dynamically calculated? + if (eventLimit && typeof eventLimit !== 'number') { + dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set + } + if (!isAuto) { // should we force dimensions of the scroll container? + this.scroller.setHeight(scrollerHeight); + scrollbarWidths = this.scroller.getScrollbarWidths(); + if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars? + if (headRowEl) { + core.compensateScroll(headRowEl, scrollbarWidths); + } + // doing the scrollbar compensation might have created text overflow which created more height. redo + scrollerHeight = this.computeScrollerHeight(viewHeight); + this.scroller.setHeight(scrollerHeight); + } + // guarantees the same scrollbar widths + this.scroller.lockOverflow(scrollbarWidths); + } + }; + // given a desired total height of the view, returns what the height of the scroller should be + DayGridView.prototype.computeScrollerHeight = function (viewHeight) { + return viewHeight - + core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller + }; + // Sets the height of just the DayGrid component in this view + DayGridView.prototype.setGridHeight = function (height, isAuto) { + if (this.opt('monthMode')) { + // if auto, make the height of each row the height that it would be if there were 6 weeks + if (isAuto) { + height *= this.dayGrid.rowCnt / 6; + } + core.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows + } + else { + if (isAuto) { + core.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding + } + else { + core.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows + } + } + }; + /* Scroll + ------------------------------------------------------------------------------------------------------------------*/ + DayGridView.prototype.computeDateScroll = function (duration) { + return { top: 0 }; + }; + DayGridView.prototype.queryDateScroll = function () { + return { top: this.scroller.getScrollTop() }; + }; + DayGridView.prototype.applyDateScroll = function (scroll) { + if (scroll.top !== undefined) { + this.scroller.setScrollTop(scroll.top); + } + }; + return DayGridView; + }(core.View)); + DayGridView.prototype.dateProfileGeneratorClass = DayGridDateProfileGenerator; + + var SimpleDayGrid = /** @class */ (function (_super) { + __extends(SimpleDayGrid, _super); + function SimpleDayGrid(context, dayGrid) { + var _this = _super.call(this, context, dayGrid.el) || this; + _this.slicer = new DayGridSlicer(); + _this.dayGrid = dayGrid; + context.calendar.registerInteractiveComponent(_this, { el: _this.dayGrid.el }); + return _this; + } + SimpleDayGrid.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.calendar.unregisterInteractiveComponent(this); + }; + SimpleDayGrid.prototype.render = function (props) { + var dayGrid = this.dayGrid; + var dateProfile = props.dateProfile, dayTable = props.dayTable; + dayGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, props.nextDayThreshold, dayGrid, dayTable), { dateProfile: dateProfile, cells: dayTable.cells, isRigid: props.isRigid })); + }; + SimpleDayGrid.prototype.buildPositionCaches = function () { + this.dayGrid.buildPositionCaches(); + }; + SimpleDayGrid.prototype.queryHit = function (positionLeft, positionTop) { + var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop); + if (rawHit) { + return { + component: this.dayGrid, + dateSpan: rawHit.dateSpan, + dayEl: rawHit.dayEl, + rect: { + left: rawHit.relativeRect.left, + right: rawHit.relativeRect.right, + top: rawHit.relativeRect.top, + bottom: rawHit.relativeRect.bottom + }, + layer: 0 + }; + } + }; + return SimpleDayGrid; + }(core.DateComponent)); + var DayGridSlicer = /** @class */ (function (_super) { + __extends(DayGridSlicer, _super); + function DayGridSlicer() { + return _super !== null && _super.apply(this, arguments) || this; + } + DayGridSlicer.prototype.sliceRange = function (dateRange, dayTable) { + return dayTable.sliceRange(dateRange); + }; + return DayGridSlicer; + }(core.Slicer)); + + var DayGridView$1 = /** @class */ (function (_super) { + __extends(DayGridView, _super); + function DayGridView(_context, viewSpec, dateProfileGenerator, parentEl) { + var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this; + _this.buildDayTable = core.memoize(buildDayTable); + if (_this.opt('columnHeader')) { + _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container')); + } + _this.simpleDayGrid = new SimpleDayGrid(_this.context, _this.dayGrid); + return _this; + } + DayGridView.prototype.destroy = function () { + _super.prototype.destroy.call(this); + if (this.header) { + this.header.destroy(); + } + this.simpleDayGrid.destroy(); + }; + DayGridView.prototype.render = function (props) { + _super.prototype.render.call(this, props); + var dateProfile = this.props.dateProfile; + var dayTable = this.dayTable = + this.buildDayTable(dateProfile, this.dateProfileGenerator); + if (this.header) { + this.header.receiveProps({ + dateProfile: dateProfile, + dates: dayTable.headerDates, + datesRepDistinctDays: dayTable.rowCnt === 1, + renderIntroHtml: this.renderHeadIntroHtml + }); + } + this.simpleDayGrid.receiveProps({ + dateProfile: dateProfile, + dayTable: dayTable, + businessHours: props.businessHours, + dateSelection: props.dateSelection, + eventStore: props.eventStore, + eventUiBases: props.eventUiBases, + eventSelection: props.eventSelection, + eventDrag: props.eventDrag, + eventResize: props.eventResize, + isRigid: this.hasRigidRows(), + nextDayThreshold: this.nextDayThreshold + }); + }; + return DayGridView; + }(DayGridView)); + function buildDayTable(dateProfile, dateProfileGenerator) { + var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator); + return new core.DayTable(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit)); + } + + var main = core.createPlugin({ + defaultView: 'dayGridMonth', + views: { + dayGrid: DayGridView$1, + dayGridDay: { + type: 'dayGrid', + duration: { days: 1 } + }, + dayGridWeek: { + type: 'dayGrid', + duration: { weeks: 1 } + }, + dayGridMonth: { + type: 'dayGrid', + duration: { months: 1 }, + monthMode: true, + fixedWeekCount: true + } + } + }); + + exports.AbstractDayGridView = DayGridView; + exports.DayBgRow = DayBgRow; + exports.DayGrid = DayGrid; + exports.DayGridSlicer = DayGridSlicer; + exports.DayGridView = DayGridView$1; + exports.SimpleDayGrid = SimpleDayGrid; + exports.buildBasicDayTable = buildDayTable; + exports.default = main; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/public/resource/assets/libs/fullcalendar/daygrid/main.min.css b/public/resource/assets/libs/fullcalendar/daygrid/main.min.css new file mode 100644 index 0000000..55a5724 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/daygrid/main.min.css @@ -0,0 +1 @@ +.fc-dayGridDay-view .fc-content-skeleton,.fc-dayGridWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-dayGrid-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-dayGrid-view .fc-day-number,.fc-dayGrid-view .fc-week-number{padding:2px}.fc-dayGrid-view th.fc-day-number,.fc-dayGrid-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-dayGrid-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-dayGrid-view td.fc-week-number{text-align:center}.fc-dayGrid-view td.fc-week-number>*{display:inline-block;min-width:1.25em} \ No newline at end of file diff --git a/public/resource/assets/libs/fullcalendar/daygrid/main.min.js b/public/resource/assets/libs/fullcalendar/daygrid/main.min.js new file mode 100644 index 0000000..2f4c0d4 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/daygrid/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Day Grid Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarDayGrid={},e.FullCalendar)}(this,function(e,t){"use strict";var r=function(e,t){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)t.hasOwnProperty(r)&&(e[r]=t[r])})(e,t)};function n(e,t){function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var i=function(){return(i=Object.assign||function(e){for(var t,r=1,n=arguments.length;r'+t.htmlEscape(n)+""),i=''+(t.htmlEscape(d.title||"")||" ")+"",'
'+("rtl"===l.dir?i+" "+y:y+" "+i)+"
"+(u?'
':"")+(f?'
':"")+"
"},r.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",omitZeroMinute:!0,meridiem:"narrow"}},r.prototype.computeDisplayEventEnd=function(){return!1},r}(t.FgEventRenderer),a=function(e){function r(t){var r=e.call(this,t.context)||this;return r.dayGrid=t,r}return n(r,e),r.prototype.attachSegs=function(e,t){var r=this.rowStructs=this.renderSegRows(e);this.dayGrid.rowEls.forEach(function(e,t){e.querySelector(".fc-content-skeleton > table").appendChild(r[t].tbodyEl)}),t||this.dayGrid.removeSegPopover()},r.prototype.detachSegs=function(){for(var e,r=this.rowStructs||[];e=r.pop();)t.removeElement(e.tbodyEl);this.rowStructs=null},r.prototype.renderSegRows=function(e){var t,r,n=[];for(t=this.groupSegRows(e),r=0;r=e.firstCol)return!0;return!1}function c(e,t){return e.leftCol-t.leftCol}var h=function(e){function r(){return null!==e&&e.apply(this,arguments)||this}return n(r,e),r.prototype.attachSegs=function(e,r){var n=r.sourceSeg,i=this.rowStructs=this.renderSegRows(e);this.dayGrid.rowEls.forEach(function(e,r){var o,s,l=t.htmlToElement('
');n&&n.row===r?o=n.el:(o=e.querySelector(".fc-content-skeleton tbody"))||(o=e.querySelector(".fc-content-skeleton table")),s=o.getBoundingClientRect().top-e.getBoundingClientRect().top,l.style.top=s+"px",l.querySelector("table").appendChild(i[r].tbodyEl),e.appendChild(l)})},r}(a),p=function(e){function r(t){var r=e.call(this,t.context)||this;return r.fillSegTag="td",r.dayGrid=t,r}return n(r,e),r.prototype.renderSegs=function(t,r){"bgEvent"===t&&(r=r.filter(function(e){return e.eventRange.def.allDay})),e.prototype.renderSegs.call(this,t,r)},r.prototype.attachSegs=function(e,t){var r,n,i,o=[];for(r=0;r
')).getElementsByTagName("tr")[0],d>0&&t.appendToElement(o,new Array(d+1).join('')),r.el.colSpan=c-d,o.appendChild(r.el),c'));var h=s.renderProps.renderIntroHtml();return h&&(s.isRtl?t.appendToElement(o,h):t.prependToElement(o,h)),i},r}(t.FillRenderer),u=function(e){function r(r,n){var i=e.call(this,r,n)||this,o=i.eventRenderer=new f(i),s=i.renderFrame=t.memoizeRendering(i._renderFrame);return i.renderFgEvents=t.memoizeRendering(o.renderSegs.bind(o),o.unrender.bind(o),[s]),i.renderEventSelection=t.memoizeRendering(o.selectByInstanceId.bind(o),o.unselectByInstanceId.bind(o),[i.renderFgEvents]),i.renderEventDrag=t.memoizeRendering(o.hideByHash.bind(o),o.showByHash.bind(o),[s]),i.renderEventResize=t.memoizeRendering(o.hideByHash.bind(o),o.showByHash.bind(o),[s]),r.calendar.registerInteractiveComponent(i,{el:i.el,useEventCenter:!1}),i}return n(r,e),r.prototype.render=function(e){this.renderFrame(e.date),this.renderFgEvents(e.fgSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDragInstances),this.renderEventResize(e.eventResizeInstances)},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderFrame.unrender(),this.calendar.unregisterInteractiveComponent(this)},r.prototype._renderFrame=function(e){var r=this.theme,n=this.dateEnv.format(e,t.createFormatter(this.opt("dayPopoverFormat")));this.el.innerHTML='
'+t.htmlEscape(n)+'
',this.segContainerEl=this.el.querySelector(".fc-event-container")},r.prototype.queryHit=function(e,r,n,i){var o=this.props.date;if(e'),"rtl"===this.context.options.dir&&t.reverse(),""+t.join("")+""},e}();function m(e,r,n,i){var o=n.dateEnv,s=n.theme,l=t.rangeContainsMarker(r.activeRange,e),a=t.getDayClasses(e,r,n);return a.unshift("fc-day",s.getClass("widgetContent")),'"}var y=t.createFormatter({day:"numeric"}),v=t.createFormatter({week:"numeric"}),b=function(e){function r(r,n,i){var o=e.call(this,r,n)||this;o.bottomCoordPadding=0,o.isCellSizesDirty=!1;var s=o.eventRenderer=new a(o),l=o.fillRenderer=new p(o);o.mirrorRenderer=new h(o);var d=o.renderCells=t.memoizeRendering(o._renderCells,o._unrenderCells);return o.renderBusinessHours=t.memoizeRendering(l.renderSegs.bind(l,"businessHours"),l.unrender.bind(l,"businessHours"),[d]),o.renderDateSelection=t.memoizeRendering(l.renderSegs.bind(l,"highlight"),l.unrender.bind(l,"highlight"),[d]),o.renderBgEvents=t.memoizeRendering(l.renderSegs.bind(l,"bgEvent"),l.unrender.bind(l,"bgEvent"),[d]),o.renderFgEvents=t.memoizeRendering(s.renderSegs.bind(s),s.unrender.bind(s),[d]),o.renderEventSelection=t.memoizeRendering(s.selectByInstanceId.bind(s),s.unselectByInstanceId.bind(s),[o.renderFgEvents]),o.renderEventDrag=t.memoizeRendering(o._renderEventDrag,o._unrenderEventDrag,[d]),o.renderEventResize=t.memoizeRendering(o._renderEventResize,o._unrenderEventResize,[d]),o.renderProps=i,o}return n(r,e),r.prototype.render=function(e){var t=e.cells;this.rowCnt=t.length,this.colCnt=t[0].length,this.renderCells(t,e.isRigid),this.renderBusinessHours(e.businessHourSegs),this.renderDateSelection(e.dateSelectionSegs),this.renderBgEvents(e.bgEventSegs),this.renderFgEvents(e.fgEventSegs),this.renderEventSelection(e.eventSelection),this.renderEventDrag(e.eventDrag),this.renderEventResize(e.eventResize),this.segPopoverTile&&this.updateSegPopoverTile()},r.prototype.destroy=function(){e.prototype.destroy.call(this),this.renderCells.unrender()},r.prototype.getCellRange=function(e,r){var n=this.props.cells[e][r].date;return{start:n,end:t.addDays(n,1)}},r.prototype.updateSegPopoverTile=function(e,t){var r=this.props;this.segPopoverTile.receiveProps({date:e||this.segPopoverTile.props.date,fgSegs:t||this.segPopoverTile.props.fgSegs,eventSelection:r.eventSelection,eventDragInstances:r.eventDrag?r.eventDrag.affectedInstances:null,eventResizeInstances:r.eventResize?r.eventResize.affectedInstances:null})},r.prototype._renderCells=function(e,r){var n,i,o=this.view,s=this.dateEnv,l=this.rowCnt,a=this.colCnt,d="";for(n=0;n
'+i.renderHtml({cells:this.props.cells[e],dateProfile:this.props.dateProfile,renderIntroHtml:this.renderProps.renderBgIntroHtml})+'
'+(this.getIsNumbersVisible()?""+this.renderNumberTrHtml(e)+"":"")+"
"},r.prototype.getIsNumbersVisible=function(){return this.getIsDayNumbersVisible()||this.renderProps.cellWeekNumbersVisible||this.renderProps.colWeekNumbersVisible},r.prototype.getIsDayNumbersVisible=function(){return this.rowCnt>1},r.prototype.renderNumberTrHtml=function(e){var t=this.renderProps.renderNumberIntroHtml(e,this);return""+(this.isRtl?"":t)+this.renderNumberCellsHtml(e)+(this.isRtl?t:"")+""},r.prototype.renderNumberCellsHtml=function(e){var t,r,n=[];for(t=0;t",this.renderProps.cellWeekNumbersVisible&&e.getUTCDay()===n&&(s+=t.buildGotoAnchorHtml(i,{date:e,type:"week"},{class:"fc-week-number"},o.format(e,v))),a&&(s+=t.buildGotoAnchorHtml(i,e,{class:"fc-day-number"},o.format(e,y))),s+=""):""},r.prototype.updateSize=function(e){var t=this.fillRenderer,r=this.eventRenderer,n=this.mirrorRenderer;(e||this.isCellSizesDirty||this.view.calendar.isEventsUpdated)&&(this.buildPositionCaches(),this.isCellSizesDirty=!1),t.computeSizes(e),r.computeSizes(e),n.computeSizes(e),t.assignSizes(e),r.assignSizes(e),n.assignSizes(e)},r.prototype.buildPositionCaches=function(){this.buildColPositions(),this.buildRowPositions()},r.prototype.buildColPositions=function(){this.colPositions.build()},r.prototype.buildRowPositions=function(){this.rowPositions.build(),this.rowPositions.bottoms[this.rowCnt-1]+=this.bottomCoordPadding},r.prototype.positionToHit=function(e,t){var r=this.colPositions,n=this.rowPositions,i=r.leftToIndex(e),o=n.topToIndex(t);if(null!=o&&null!=i)return{row:o,col:i,dateSpan:{range:this.getCellRange(o,i),allDay:!0},dayEl:this.getCellEl(o,i),relativeRect:{left:r.lefts[i],right:r.rights[i],top:n.tops[o],bottom:n.bottoms[o]}}},r.prototype.getCellEl=function(e,t){return this.cellEls[e*this.colCnt+t]},r.prototype._renderEventDrag=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",e.segs))},r.prototype._unrenderEventDrag=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight"))},r.prototype._renderEventResize=function(e){e&&(this.eventRenderer.hideByHash(e.affectedInstances),this.fillRenderer.renderSegs("highlight",e.segs),this.mirrorRenderer.renderSegs(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},r.prototype._unrenderEventResize=function(e){e&&(this.eventRenderer.showByHash(e.affectedInstances),this.fillRenderer.unrender("highlight"),this.mirrorRenderer.unrender(e.segs,{isResizing:!0,sourceSeg:e.sourceSeg}))},r.prototype.removeSegPopover=function(){this.segPopover&&this.segPopover.hide()},r.prototype.limitRows=function(e){var t,r,n=this.eventRenderer.rowStructs||[];for(t=0;ti)return r;return!1},r.prototype.limitRow=function(e,r){var n,i,o,s,l,a,d,c,h,p,u,f,g,m,y,v=this,b=this.colCnt,w=this.isRtl,S=this.eventRenderer.rowStructs[e],C=[],E=0,R=function(n){for(;E"+t.htmlEscape(s.opt("weekLabel"))+"":""},s.renderDayGridNumberIntroHtml=function(e,r){var n=s.dateEnv,i=r.props.cells[e][0].date;return s.colWeekNumbersVisible?'"+t.buildGotoAnchorHtml(s,{date:i,type:"week",forceOff:1===r.colCnt},n.format(i,w))+"":""},s.renderDayGridBgIntroHtml=function(){var e=s.theme;return s.colWeekNumbersVisible?'":""},s.renderDayGridIntroHtml=function(){return s.colWeekNumbersVisible?'":""},s.el.classList.add("fc-dayGrid-view"),s.el.innerHTML=s.renderSkeletonHtml(),s.scroller=new t.ScrollComponent("hidden","auto");var l=s.scroller.el;s.el.querySelector(".fc-body > tr > td").appendChild(l),l.classList.add("fc-day-grid-container");var a,d=t.createElement("div",{className:"fc-day-grid"});return l.appendChild(d),s.opt("weekNumbers")?s.opt("weekNumbersWithinDays")?(a=!0,s.colWeekNumbersVisible=!1):(a=!1,s.colWeekNumbersVisible=!0):(s.colWeekNumbersVisible=!1,a=!1),s.dayGrid=new b(s.context,d,{renderNumberIntroHtml:s.renderDayGridNumberIntroHtml,renderBgIntroHtml:s.renderDayGridBgIntroHtml,renderIntroHtml:s.renderDayGridIntroHtml,colWeekNumbersVisible:s.colWeekNumbersVisible,cellWeekNumbersVisible:a}),s}return n(r,e),r.prototype.destroy=function(){e.prototype.destroy.call(this),this.dayGrid.destroy(),this.scroller.destroy()},r.prototype.renderSkeletonHtml=function(){var e=this.theme;return''+(this.opt("columnHeader")?'':"")+'
 
'},r.prototype.weekNumberStyleAttr=function(){return null!=this.weekNumberWidth?'style="width:'+this.weekNumberWidth+'px"':""},r.prototype.hasRigidRows=function(){var e=this.opt("eventLimit");return e&&"number"!=typeof e},r.prototype.updateSize=function(t,r,n){e.prototype.updateSize.call(this,t,r,n),this.dayGrid.updateSize(t)},r.prototype.updateBaseSize=function(e,r,n){var i,o,s=this.dayGrid,l=this.opt("eventLimit"),a=this.header?this.header.el:null;s.rowEls?(this.colWeekNumbersVisible&&(this.weekNumberWidth=t.matchCellWidths(t.findElements(this.el,".fc-week-number"))),this.scroller.clear(),a&&t.uncompensateScroll(a),s.removeSegPopover(),l&&"number"==typeof l&&s.limitRows(l),i=this.computeScrollerHeight(r),this.setGridHeight(i,n),l&&"number"!=typeof l&&s.limitRows(l),n||(this.scroller.setHeight(i),((o=this.scroller.getScrollbarWidths()).left||o.right)&&(a&&t.compensateScroll(a,o),i=this.computeScrollerHeight(r),this.scroller.setHeight(i)),this.scroller.lockOverflow(o))):n||(i=this.computeScrollerHeight(r),this.scroller.setHeight(i))},r.prototype.computeScrollerHeight=function(e){return e-t.subtractInnerElHeight(this.el,this.scroller.el)},r.prototype.setGridHeight=function(e,r){this.opt("monthMode")?(r&&(e*=this.dayGrid.rowCnt/6),t.distributeHeight(this.dayGrid.rowEls,e,!r)):r?t.undistributeHeight(this.dayGrid.rowEls):t.distributeHeight(this.dayGrid.rowEls,e,!0)},r.prototype.computeDateScroll=function(e){return{top:0}},r.prototype.queryDateScroll=function(){return{top:this.scroller.getScrollTop()}},r.prototype.applyDateScroll=function(e){void 0!==e.top&&this.scroller.setScrollTop(e.top)},r}(t.View);S.prototype.dateProfileGeneratorClass=o;var C=function(e){function t(t,r){var n=e.call(this,t,r.el)||this;return n.slicer=new E,n.dayGrid=r,t.calendar.registerInteractiveComponent(n,{el:n.dayGrid.el}),n}return n(t,e),t.prototype.destroy=function(){e.prototype.destroy.call(this),this.calendar.unregisterInteractiveComponent(this)},t.prototype.render=function(e){var t=this.dayGrid,r=e.dateProfile,n=e.dayTable;t.receiveProps(i({},this.slicer.sliceProps(e,r,e.nextDayThreshold,t,n),{dateProfile:r,cells:n.cells,isRigid:e.isRigid}))},t.prototype.buildPositionCaches=function(){this.dayGrid.buildPositionCaches()},t.prototype.queryHit=function(e,t){var r=this.dayGrid.positionToHit(e,t);if(r)return{component:this.dayGrid,dateSpan:r.dateSpan,dayEl:r.dayEl,rect:{left:r.relativeRect.left,right:r.relativeRect.right,top:r.relativeRect.top,bottom:r.relativeRect.bottom},layer:0}},t}(t.DateComponent),E=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return n(t,e),t.prototype.sliceRange=function(e,t){return t.sliceRange(e)},t}(t.Slicer),R=function(e){function r(r,n,i,o){var s=e.call(this,r,n,i,o)||this;return s.buildDayTable=t.memoize(H),s.opt("columnHeader")&&(s.header=new t.DayHeader(s.context,s.el.querySelector(".fc-head-container"))),s.simpleDayGrid=new C(s.context,s.dayGrid),s}return n(r,e),r.prototype.destroy=function(){e.prototype.destroy.call(this),this.header&&this.header.destroy(),this.simpleDayGrid.destroy()},r.prototype.render=function(t){e.prototype.render.call(this,t);var r=this.props.dateProfile,n=this.dayTable=this.buildDayTable(r,this.dateProfileGenerator);this.header&&this.header.receiveProps({dateProfile:r,dates:n.headerDates,datesRepDistinctDays:1===n.rowCnt,renderIntroHtml:this.renderHeadIntroHtml}),this.simpleDayGrid.receiveProps({dateProfile:r,dayTable:n,businessHours:t.businessHours,dateSelection:t.dateSelection,eventStore:t.eventStore,eventUiBases:t.eventUiBases,eventSelection:t.eventSelection,eventDrag:t.eventDrag,eventResize:t.eventResize,isRigid:this.hasRigidRows(),nextDayThreshold:this.nextDayThreshold})},r}(S);function H(e,r){var n=new t.DaySeries(e.renderRange,r);return new t.DayTable(n,/year|month|week/.test(e.currentRangeUnit))}var D=t.createPlugin({defaultView:"dayGridMonth",views:{dayGrid:R,dayGridDay:{type:"dayGrid",duration:{days:1}},dayGridWeek:{type:"dayGrid",duration:{weeks:1}},dayGridMonth:{type:"dayGrid",duration:{months:1},monthMode:!0,fixedWeekCount:!0}}});e.AbstractDayGridView=S,e.DayBgRow=g,e.DayGrid=b,e.DayGridSlicer=E,e.DayGridView=R,e.SimpleDayGrid=C,e.buildBasicDayTable=H,e.default=D,Object.defineProperty(e,"__esModule",{value:!0})}); \ No newline at end of file diff --git a/public/resource/assets/libs/fullcalendar/google-calendar/main.js b/public/resource/assets/libs/fullcalendar/google-calendar/main.js new file mode 100644 index 0000000..fca85d4 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/google-calendar/main.js @@ -0,0 +1,170 @@ +/*! +FullCalendar Google Calendar Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) : + typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) : + (global = global || self, factory(global.FullCalendarGoogleCalendar = {}, global.FullCalendar)); +}(this, function (exports, core) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + + var __assign = function() { + __assign = Object.assign || function __assign(t) { + for (var s, i = 1, n = arguments.length; i < n; i++) { + s = arguments[i]; + for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; + } + return t; + }; + return __assign.apply(this, arguments); + }; + + // TODO: expose somehow + var API_BASE = 'https://www.googleapis.com/calendar/v3/calendars'; + var STANDARD_PROPS = { + url: String, + googleCalendarApiKey: String, + googleCalendarId: String, + data: null + }; + var eventSourceDef = { + parseMeta: function (raw) { + if (typeof raw === 'string') { + raw = { url: raw }; + } + if (typeof raw === 'object') { + var standardProps = core.refineProps(raw, STANDARD_PROPS); + if (!standardProps.googleCalendarId && standardProps.url) { + standardProps.googleCalendarId = parseGoogleCalendarId(standardProps.url); + } + delete standardProps.url; + if (standardProps.googleCalendarId) { + return standardProps; + } + } + return null; + }, + fetch: function (arg, onSuccess, onFailure) { + var calendar = arg.calendar; + var meta = arg.eventSource.meta; + var apiKey = meta.googleCalendarApiKey || calendar.opt('googleCalendarApiKey'); + if (!apiKey) { + onFailure({ + message: 'Specify a googleCalendarApiKey. See http://fullcalendar.io/docs/google_calendar/' + }); + } + else { + var url = buildUrl(meta); + var requestParams_1 = buildRequestParams(arg.range, apiKey, meta.data, calendar.dateEnv); + core.requestJson('GET', url, requestParams_1, function (body, xhr) { + if (body.error) { + onFailure({ + message: 'Google Calendar API: ' + body.error.message, + errors: body.error.errors, + xhr: xhr + }); + } + else { + onSuccess({ + rawEvents: gcalItemsToRawEventDefs(body.items, requestParams_1.timeZone), + xhr: xhr + }); + } + }, function (message, xhr) { + onFailure({ message: message, xhr: xhr }); + }); + } + } + }; + function parseGoogleCalendarId(url) { + var match; + // detect if the ID was specified as a single string. + // will match calendars like "asdf1234@calendar.google.com" in addition to person email calendars. + if (/^[^\/]+@([^\/\.]+\.)*(google|googlemail|gmail)\.com$/.test(url)) { + return url; + } + else if ((match = /^https:\/\/www.googleapis.com\/calendar\/v3\/calendars\/([^\/]*)/.exec(url)) || + (match = /^https?:\/\/www.google.com\/calendar\/feeds\/([^\/]*)/.exec(url))) { + return decodeURIComponent(match[1]); + } + } + function buildUrl(meta) { + return API_BASE + '/' + encodeURIComponent(meta.googleCalendarId) + '/events'; + } + function buildRequestParams(range, apiKey, extraParams, dateEnv) { + var params; + var startStr; + var endStr; + if (dateEnv.canComputeOffset) { + // strings will naturally have offsets, which GCal needs + startStr = dateEnv.formatIso(range.start); + endStr = dateEnv.formatIso(range.end); + } + else { + // when timezone isn't known, we don't know what the UTC offset should be, so ask for +/- 1 day + // from the UTC day-start to guarantee we're getting all the events + // (start/end will be UTC-coerced dates, so toISOString is okay) + startStr = core.addDays(range.start, -1).toISOString(); + endStr = core.addDays(range.end, 1).toISOString(); + } + params = __assign({}, (extraParams || {}), { key: apiKey, timeMin: startStr, timeMax: endStr, singleEvents: true, maxResults: 9999 }); + if (dateEnv.timeZone !== 'local') { + params.timeZone = dateEnv.timeZone; + } + return params; + } + function gcalItemsToRawEventDefs(items, gcalTimezone) { + return items.map(function (item) { + return gcalItemToRawEventDef(item, gcalTimezone); + }); + } + function gcalItemToRawEventDef(item, gcalTimezone) { + var url = item.htmlLink || null; + // make the URLs for each event show times in the correct timezone + if (url && gcalTimezone) { + url = injectQsComponent(url, 'ctz=' + gcalTimezone); + } + return { + id: item.id, + title: item.summary, + start: item.start.dateTime || item.start.date, + end: item.end.dateTime || item.end.date, + url: url, + location: item.location, + description: item.description + }; + } + // Injects a string like "arg=value" into the querystring of a URL + // TODO: move to a general util file? + function injectQsComponent(url, component) { + // inject it after the querystring but before the fragment + return url.replace(/(\?.*?)?(#|$)/, function (whole, qs, hash) { + return (qs ? qs + '&' : '?') + component + hash; + }); + } + var main = core.createPlugin({ + eventSourceDefs: [eventSourceDef] + }); + + exports.default = main; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/public/resource/assets/libs/fullcalendar/google-calendar/main.min.js b/public/resource/assets/libs/fullcalendar/google-calendar/main.min.js new file mode 100644 index 0000000..e762612 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/google-calendar/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Google Calendar Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ +!function(e,r){"object"==typeof exports&&"undefined"!=typeof module?r(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],r):r((e=e||self).FullCalendarGoogleCalendar={},e.FullCalendar)}(this,function(e,r){"use strict";var t=function(){return(t=Object.assign||function(e){for(var r,t=1,n=arguments.length;t 0) { + this.everMovedDown = true; + } + if (xDelta < 0) { + this.everMovedLeft = true; + } + else if (xDelta > 0) { + this.everMovedRight = true; + } + this.pointerScreenX = pointerScreenX; + this.pointerScreenY = pointerScreenY; + if (!this.isAnimating) { + this.isAnimating = true; + this.requestAnimation(getTime()); + } + } + }; + AutoScroller.prototype.stop = function () { + if (this.isEnabled) { + this.isAnimating = false; // will stop animation + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + scrollCache.destroy(); + } + this.scrollCaches = null; + } + }; + AutoScroller.prototype.requestAnimation = function (now) { + this.msSinceRequest = now; + requestAnimationFrame(this.animate); + }; + AutoScroller.prototype.handleSide = function (edge, seconds) { + var scrollCache = edge.scrollCache; + var edgeThreshold = this.edgeThreshold; + var invDistance = edgeThreshold - edge.distance; + var velocity = // the closer to the edge, the faster we scroll + (invDistance * invDistance) / (edgeThreshold * edgeThreshold) * // quadratic + this.maxVelocity * seconds; + var sign = 1; + switch (edge.name) { + case 'left': + sign = -1; + // falls through + case 'right': + scrollCache.setScrollLeft(scrollCache.getScrollLeft() + velocity * sign); + break; + case 'top': + sign = -1; + // falls through + case 'bottom': + scrollCache.setScrollTop(scrollCache.getScrollTop() + velocity * sign); + break; + } + }; + // left/top are relative to document topleft + AutoScroller.prototype.computeBestEdge = function (left, top) { + var edgeThreshold = this.edgeThreshold; + var bestSide = null; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + var rect = scrollCache.clientRect; + var leftDist = left - rect.left; + var rightDist = rect.right - left; + var topDist = top - rect.top; + var bottomDist = rect.bottom - top; + // completely within the rect? + if (leftDist >= 0 && rightDist >= 0 && topDist >= 0 && bottomDist >= 0) { + if (topDist <= edgeThreshold && this.everMovedUp && scrollCache.canScrollUp() && + (!bestSide || bestSide.distance > topDist)) { + bestSide = { scrollCache: scrollCache, name: 'top', distance: topDist }; + } + if (bottomDist <= edgeThreshold && this.everMovedDown && scrollCache.canScrollDown() && + (!bestSide || bestSide.distance > bottomDist)) { + bestSide = { scrollCache: scrollCache, name: 'bottom', distance: bottomDist }; + } + if (leftDist <= edgeThreshold && this.everMovedLeft && scrollCache.canScrollLeft() && + (!bestSide || bestSide.distance > leftDist)) { + bestSide = { scrollCache: scrollCache, name: 'left', distance: leftDist }; + } + if (rightDist <= edgeThreshold && this.everMovedRight && scrollCache.canScrollRight() && + (!bestSide || bestSide.distance > rightDist)) { + bestSide = { scrollCache: scrollCache, name: 'right', distance: rightDist }; + } + } + } + return bestSide; + }; + AutoScroller.prototype.buildCaches = function () { + return this.queryScrollEls().map(function (el) { + if (el === window) { + return new WindowScrollGeomCache(false); // false = don't listen to user-generated scrolls + } + else { + return new ElementScrollGeomCache(el, false); // false = don't listen to user-generated scrolls + } + }); + }; + AutoScroller.prototype.queryScrollEls = function () { + var els = []; + for (var _i = 0, _a = this.scrollQuery; _i < _a.length; _i++) { + var query = _a[_i]; + if (typeof query === 'object') { + els.push(query); + } + else { + els.push.apply(els, Array.prototype.slice.call(document.querySelectorAll(query))); + } + } + return els; + }; + return AutoScroller; + }()); + + /* + Monitors dragging on an element. Has a number of high-level features: + - minimum distance required before dragging + - minimum wait time ("delay") before dragging + - a mirror element that follows the pointer + */ + var FeaturefulElementDragging = /** @class */ (function (_super) { + __extends(FeaturefulElementDragging, _super); + function FeaturefulElementDragging(containerEl) { + var _this = _super.call(this, containerEl) || this; + // options that can be directly set by caller + // the caller can also set the PointerDragging's options as well + _this.delay = null; + _this.minDistance = 0; + _this.touchScrollAllowed = true; // prevents drag from starting and blocks scrolling during drag + _this.mirrorNeedsRevert = false; + _this.isInteracting = false; // is the user validly moving the pointer? lasts until pointerup + _this.isDragging = false; // is it INTENTFULLY dragging? lasts until after revert animation + _this.isDelayEnded = false; + _this.isDistanceSurpassed = false; + _this.delayTimeoutId = null; + _this.onPointerDown = function (ev) { + if (!_this.isDragging) { // so new drag doesn't happen while revert animation is going + _this.isInteracting = true; + _this.isDelayEnded = false; + _this.isDistanceSurpassed = false; + core.preventSelection(document.body); + core.preventContextMenu(document.body); + // prevent links from being visited if there's an eventual drag. + // also prevents selection in older browsers (maybe?). + // not necessary for touch, besides, browser would complain about passiveness. + if (!ev.isTouch) { + ev.origEvent.preventDefault(); + } + _this.emitter.trigger('pointerdown', ev); + if (!_this.pointer.shouldIgnoreMove) { + // actions related to initiating dragstart+dragmove+dragend... + _this.mirror.setIsVisible(false); // reset. caller must set-visible + _this.mirror.start(ev.subjectEl, ev.pageX, ev.pageY); // must happen on first pointer down + _this.startDelay(ev); + if (!_this.minDistance) { + _this.handleDistanceSurpassed(ev); + } + } + } + }; + _this.onPointerMove = function (ev) { + if (_this.isInteracting) { // if false, still waiting for previous drag's revert + _this.emitter.trigger('pointermove', ev); + if (!_this.isDistanceSurpassed) { + var minDistance = _this.minDistance; + var distanceSq = void 0; // current distance from the origin, squared + var deltaX = ev.deltaX, deltaY = ev.deltaY; + distanceSq = deltaX * deltaX + deltaY * deltaY; + if (distanceSq >= minDistance * minDistance) { // use pythagorean theorem + _this.handleDistanceSurpassed(ev); + } + } + if (_this.isDragging) { + // a real pointer move? (not one simulated by scrolling) + if (ev.origEvent.type !== 'scroll') { + _this.mirror.handleMove(ev.pageX, ev.pageY); + _this.autoScroller.handleMove(ev.pageX, ev.pageY); + } + _this.emitter.trigger('dragmove', ev); + } + } + }; + _this.onPointerUp = function (ev) { + if (_this.isInteracting) { // if false, still waiting for previous drag's revert + _this.isInteracting = false; + core.allowSelection(document.body); + core.allowContextMenu(document.body); + _this.emitter.trigger('pointerup', ev); // can potentially set mirrorNeedsRevert + if (_this.isDragging) { + _this.autoScroller.stop(); + _this.tryStopDrag(ev); // which will stop the mirror + } + if (_this.delayTimeoutId) { + clearTimeout(_this.delayTimeoutId); + _this.delayTimeoutId = null; + } + } + }; + var pointer = _this.pointer = new PointerDragging(containerEl); + pointer.emitter.on('pointerdown', _this.onPointerDown); + pointer.emitter.on('pointermove', _this.onPointerMove); + pointer.emitter.on('pointerup', _this.onPointerUp); + _this.mirror = new ElementMirror(); + _this.autoScroller = new AutoScroller(); + return _this; + } + FeaturefulElementDragging.prototype.destroy = function () { + this.pointer.destroy(); + }; + FeaturefulElementDragging.prototype.startDelay = function (ev) { + var _this = this; + if (typeof this.delay === 'number') { + this.delayTimeoutId = setTimeout(function () { + _this.delayTimeoutId = null; + _this.handleDelayEnd(ev); + }, this.delay); // not assignable to number! + } + else { + this.handleDelayEnd(ev); + } + }; + FeaturefulElementDragging.prototype.handleDelayEnd = function (ev) { + this.isDelayEnded = true; + this.tryStartDrag(ev); + }; + FeaturefulElementDragging.prototype.handleDistanceSurpassed = function (ev) { + this.isDistanceSurpassed = true; + this.tryStartDrag(ev); + }; + FeaturefulElementDragging.prototype.tryStartDrag = function (ev) { + if (this.isDelayEnded && this.isDistanceSurpassed) { + if (!this.pointer.wasTouchScroll || this.touchScrollAllowed) { + this.isDragging = true; + this.mirrorNeedsRevert = false; + this.autoScroller.start(ev.pageX, ev.pageY); + this.emitter.trigger('dragstart', ev); + if (this.touchScrollAllowed === false) { + this.pointer.cancelTouchScroll(); + } + } + } + }; + FeaturefulElementDragging.prototype.tryStopDrag = function (ev) { + // .stop() is ALWAYS asynchronous, which we NEED because we want all pointerup events + // that come from the document to fire beforehand. much more convenient this way. + this.mirror.stop(this.mirrorNeedsRevert, this.stopDrag.bind(this, ev) // bound with args + ); + }; + FeaturefulElementDragging.prototype.stopDrag = function (ev) { + this.isDragging = false; + this.emitter.trigger('dragend', ev); + }; + // fill in the implementations... + FeaturefulElementDragging.prototype.setIgnoreMove = function (bool) { + this.pointer.shouldIgnoreMove = bool; + }; + FeaturefulElementDragging.prototype.setMirrorIsVisible = function (bool) { + this.mirror.setIsVisible(bool); + }; + FeaturefulElementDragging.prototype.setMirrorNeedsRevert = function (bool) { + this.mirrorNeedsRevert = bool; + }; + FeaturefulElementDragging.prototype.setAutoScrollEnabled = function (bool) { + this.autoScroller.isEnabled = bool; + }; + return FeaturefulElementDragging; + }(core.ElementDragging)); + + /* + When this class is instantiated, it records the offset of an element (relative to the document topleft), + and continues to monitor scrolling, updating the cached coordinates if it needs to. + Does not access the DOM after instantiation, so highly performant. + + Also keeps track of all scrolling/overflow:hidden containers that are parents of the given element + and an determine if a given point is inside the combined clipping rectangle. + */ + var OffsetTracker = /** @class */ (function () { + function OffsetTracker(el) { + this.origRect = core.computeRect(el); + // will work fine for divs that have overflow:hidden + this.scrollCaches = core.getClippingParents(el).map(function (el) { + return new ElementScrollGeomCache(el, true); // listen=true + }); + } + OffsetTracker.prototype.destroy = function () { + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + scrollCache.destroy(); + } + }; + OffsetTracker.prototype.computeLeft = function () { + var left = this.origRect.left; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + left += scrollCache.origScrollLeft - scrollCache.getScrollLeft(); + } + return left; + }; + OffsetTracker.prototype.computeTop = function () { + var top = this.origRect.top; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + top += scrollCache.origScrollTop - scrollCache.getScrollTop(); + } + return top; + }; + OffsetTracker.prototype.isWithinClipping = function (pageX, pageY) { + var point = { left: pageX, top: pageY }; + for (var _i = 0, _a = this.scrollCaches; _i < _a.length; _i++) { + var scrollCache = _a[_i]; + if (!isIgnoredClipping(scrollCache.getEventTarget()) && + !core.pointInsideRect(point, scrollCache.clientRect)) { + return false; + } + } + return true; + }; + return OffsetTracker; + }()); + // certain clipping containers should never constrain interactions, like and + // https://github.com/fullcalendar/fullcalendar/issues/3615 + function isIgnoredClipping(node) { + var tagName = node.tagName; + return tagName === 'HTML' || tagName === 'BODY'; + } + + /* + Tracks movement over multiple droppable areas (aka "hits") + that exist in one or more DateComponents. + Relies on an existing draggable. + + emits: + - pointerdown + - dragstart + - hitchange - fires initially, even if not over a hit + - pointerup + - (hitchange - again, to null, if ended over a hit) + - dragend + */ + var HitDragging = /** @class */ (function () { + function HitDragging(dragging, droppableStore) { + var _this = this; + // options that can be set by caller + this.useSubjectCenter = false; + this.requireInitial = true; // if doesn't start out on a hit, won't emit any events + this.initialHit = null; + this.movingHit = null; + this.finalHit = null; // won't ever be populated if shouldIgnoreMove + this.handlePointerDown = function (ev) { + var dragging = _this.dragging; + _this.initialHit = null; + _this.movingHit = null; + _this.finalHit = null; + _this.prepareHits(); + _this.processFirstCoord(ev); + if (_this.initialHit || !_this.requireInitial) { + dragging.setIgnoreMove(false); + _this.emitter.trigger('pointerdown', ev); // TODO: fire this before computing processFirstCoord, so listeners can cancel. this gets fired by almost every handler :( + } + else { + dragging.setIgnoreMove(true); + } + }; + this.handleDragStart = function (ev) { + _this.emitter.trigger('dragstart', ev); + _this.handleMove(ev, true); // force = fire even if initially null + }; + this.handleDragMove = function (ev) { + _this.emitter.trigger('dragmove', ev); + _this.handleMove(ev); + }; + this.handlePointerUp = function (ev) { + _this.releaseHits(); + _this.emitter.trigger('pointerup', ev); + }; + this.handleDragEnd = function (ev) { + if (_this.movingHit) { + _this.emitter.trigger('hitupdate', null, true, ev); + } + _this.finalHit = _this.movingHit; + _this.movingHit = null; + _this.emitter.trigger('dragend', ev); + }; + this.droppableStore = droppableStore; + dragging.emitter.on('pointerdown', this.handlePointerDown); + dragging.emitter.on('dragstart', this.handleDragStart); + dragging.emitter.on('dragmove', this.handleDragMove); + dragging.emitter.on('pointerup', this.handlePointerUp); + dragging.emitter.on('dragend', this.handleDragEnd); + this.dragging = dragging; + this.emitter = new core.EmitterMixin(); + } + // sets initialHit + // sets coordAdjust + HitDragging.prototype.processFirstCoord = function (ev) { + var origPoint = { left: ev.pageX, top: ev.pageY }; + var adjustedPoint = origPoint; + var subjectEl = ev.subjectEl; + var subjectRect; + if (subjectEl !== document) { + subjectRect = core.computeRect(subjectEl); + adjustedPoint = core.constrainPoint(adjustedPoint, subjectRect); + } + var initialHit = this.initialHit = this.queryHitForOffset(adjustedPoint.left, adjustedPoint.top); + if (initialHit) { + if (this.useSubjectCenter && subjectRect) { + var slicedSubjectRect = core.intersectRects(subjectRect, initialHit.rect); + if (slicedSubjectRect) { + adjustedPoint = core.getRectCenter(slicedSubjectRect); + } + } + this.coordAdjust = core.diffPoints(adjustedPoint, origPoint); + } + else { + this.coordAdjust = { left: 0, top: 0 }; + } + }; + HitDragging.prototype.handleMove = function (ev, forceHandle) { + var hit = this.queryHitForOffset(ev.pageX + this.coordAdjust.left, ev.pageY + this.coordAdjust.top); + if (forceHandle || !isHitsEqual(this.movingHit, hit)) { + this.movingHit = hit; + this.emitter.trigger('hitupdate', hit, false, ev); + } + }; + HitDragging.prototype.prepareHits = function () { + this.offsetTrackers = core.mapHash(this.droppableStore, function (interactionSettings) { + interactionSettings.component.buildPositionCaches(); + return new OffsetTracker(interactionSettings.el); + }); + }; + HitDragging.prototype.releaseHits = function () { + var offsetTrackers = this.offsetTrackers; + for (var id in offsetTrackers) { + offsetTrackers[id].destroy(); + } + this.offsetTrackers = {}; + }; + HitDragging.prototype.queryHitForOffset = function (offsetLeft, offsetTop) { + var _a = this, droppableStore = _a.droppableStore, offsetTrackers = _a.offsetTrackers; + var bestHit = null; + for (var id in droppableStore) { + var component = droppableStore[id].component; + var offsetTracker = offsetTrackers[id]; + if (offsetTracker.isWithinClipping(offsetLeft, offsetTop)) { + var originLeft = offsetTracker.computeLeft(); + var originTop = offsetTracker.computeTop(); + var positionLeft = offsetLeft - originLeft; + var positionTop = offsetTop - originTop; + var origRect = offsetTracker.origRect; + var width = origRect.right - origRect.left; + var height = origRect.bottom - origRect.top; + if ( + // must be within the element's bounds + positionLeft >= 0 && positionLeft < width && + positionTop >= 0 && positionTop < height) { + var hit = component.queryHit(positionLeft, positionTop, width, height); + if (hit && + ( + // make sure the hit is within activeRange, meaning it's not a deal cell + !component.props.dateProfile || // hack for DayTile + core.rangeContainsRange(component.props.dateProfile.activeRange, hit.dateSpan.range)) && + (!bestHit || hit.layer > bestHit.layer)) { + // TODO: better way to re-orient rectangle + hit.rect.left += originLeft; + hit.rect.right += originLeft; + hit.rect.top += originTop; + hit.rect.bottom += originTop; + bestHit = hit; + } + } + } + } + return bestHit; + }; + return HitDragging; + }()); + function isHitsEqual(hit0, hit1) { + if (!hit0 && !hit1) { + return true; + } + if (Boolean(hit0) !== Boolean(hit1)) { + return false; + } + return core.isDateSpansEqual(hit0.dateSpan, hit1.dateSpan); + } + + /* + Monitors when the user clicks on a specific date/time of a component. + A pointerdown+pointerup on the same "hit" constitutes a click. + */ + var DateClicking = /** @class */ (function (_super) { + __extends(DateClicking, _super); + function DateClicking(settings) { + var _this = _super.call(this, settings) || this; + _this.handlePointerDown = function (ev) { + var dragging = _this.dragging; + // do this in pointerdown (not dragend) because DOM might be mutated by the time dragend is fired + dragging.setIgnoreMove(!_this.component.isValidDateDownEl(dragging.pointer.downEl)); + }; + // won't even fire if moving was ignored + _this.handleDragEnd = function (ev) { + var component = _this.component; + var pointer = _this.dragging.pointer; + if (!pointer.wasTouchScroll) { + var _a = _this.hitDragging, initialHit = _a.initialHit, finalHit = _a.finalHit; + if (initialHit && finalHit && isHitsEqual(initialHit, finalHit)) { + component.calendar.triggerDateClick(initialHit.dateSpan, initialHit.dayEl, component.view, ev.origEvent); + } + } + }; + var component = settings.component; + // we DO want to watch pointer moves because otherwise finalHit won't get populated + _this.dragging = new FeaturefulElementDragging(component.el); + _this.dragging.autoScroller.isEnabled = false; + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings)); + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragend', _this.handleDragEnd); + return _this; + } + DateClicking.prototype.destroy = function () { + this.dragging.destroy(); + }; + return DateClicking; + }(core.Interaction)); + + /* + Tracks when the user selects a portion of time of a component, + constituted by a drag over date cells, with a possible delay at the beginning of the drag. + */ + var DateSelecting = /** @class */ (function (_super) { + __extends(DateSelecting, _super); + function DateSelecting(settings) { + var _this = _super.call(this, settings) || this; + _this.dragSelection = null; + _this.handlePointerDown = function (ev) { + var _a = _this, component = _a.component, dragging = _a.dragging; + var canSelect = component.opt('selectable') && + component.isValidDateDownEl(ev.origEvent.target); + // don't bother to watch expensive moves if component won't do selection + dragging.setIgnoreMove(!canSelect); + // if touch, require user to hold down + dragging.delay = ev.isTouch ? getComponentTouchDelay(component) : null; + }; + _this.handleDragStart = function (ev) { + _this.component.calendar.unselect(ev); // unselect previous selections + }; + _this.handleHitUpdate = function (hit, isFinal) { + var calendar = _this.component.calendar; + var dragSelection = null; + var isInvalid = false; + if (hit) { + dragSelection = joinHitsIntoSelection(_this.hitDragging.initialHit, hit, calendar.pluginSystem.hooks.dateSelectionTransformers); + if (!dragSelection || !_this.component.isDateSelectionValid(dragSelection)) { + isInvalid = true; + dragSelection = null; + } + } + if (dragSelection) { + calendar.dispatch({ type: 'SELECT_DATES', selection: dragSelection }); + } + else if (!isFinal) { // only unselect if moved away while dragging + calendar.dispatch({ type: 'UNSELECT_DATES' }); + } + if (!isInvalid) { + core.enableCursor(); + } + else { + core.disableCursor(); + } + if (!isFinal) { + _this.dragSelection = dragSelection; // only clear if moved away from all hits while dragging + } + }; + _this.handlePointerUp = function (pev) { + if (_this.dragSelection) { + // selection is already rendered, so just need to report selection + _this.component.calendar.triggerDateSelect(_this.dragSelection, pev); + _this.dragSelection = null; + } + }; + var component = settings.component; + var dragging = _this.dragging = new FeaturefulElementDragging(component.el); + dragging.touchScrollAllowed = false; + dragging.minDistance = component.opt('selectMinDistance') || 0; + dragging.autoScroller.isEnabled = component.opt('dragScroll'); + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings)); + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragstart', _this.handleDragStart); + hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); + hitDragging.emitter.on('pointerup', _this.handlePointerUp); + return _this; + } + DateSelecting.prototype.destroy = function () { + this.dragging.destroy(); + }; + return DateSelecting; + }(core.Interaction)); + function getComponentTouchDelay(component) { + var delay = component.opt('selectLongPressDelay'); + if (delay == null) { + delay = component.opt('longPressDelay'); + } + return delay; + } + function joinHitsIntoSelection(hit0, hit1, dateSelectionTransformers) { + var dateSpan0 = hit0.dateSpan; + var dateSpan1 = hit1.dateSpan; + var ms = [ + dateSpan0.range.start, + dateSpan0.range.end, + dateSpan1.range.start, + dateSpan1.range.end + ]; + ms.sort(core.compareNumbers); + var props = {}; + for (var _i = 0, dateSelectionTransformers_1 = dateSelectionTransformers; _i < dateSelectionTransformers_1.length; _i++) { + var transformer = dateSelectionTransformers_1[_i]; + var res = transformer(hit0, hit1); + if (res === false) { + return null; + } + else if (res) { + __assign(props, res); + } + } + props.range = { start: ms[0], end: ms[3] }; + props.allDay = dateSpan0.allDay; + return props; + } + + var EventDragging = /** @class */ (function (_super) { + __extends(EventDragging, _super); + function EventDragging(settings) { + var _this = _super.call(this, settings) || this; + // internal state + _this.subjectSeg = null; // the seg being selected/dragged + _this.isDragging = false; + _this.eventRange = null; + _this.relevantEvents = null; // the events being dragged + _this.receivingCalendar = null; + _this.validMutation = null; + _this.mutatedRelevantEvents = null; + _this.handlePointerDown = function (ev) { + var origTarget = ev.origEvent.target; + var _a = _this, component = _a.component, dragging = _a.dragging; + var mirror = dragging.mirror; + var initialCalendar = component.calendar; + var subjectSeg = _this.subjectSeg = core.getElSeg(ev.subjectEl); + var eventRange = _this.eventRange = subjectSeg.eventRange; + var eventInstanceId = eventRange.instance.instanceId; + _this.relevantEvents = core.getRelevantEvents(initialCalendar.state.eventStore, eventInstanceId); + dragging.minDistance = ev.isTouch ? 0 : component.opt('eventDragMinDistance'); + dragging.delay = + // only do a touch delay if touch and this event hasn't been selected yet + (ev.isTouch && eventInstanceId !== component.props.eventSelection) ? + getComponentTouchDelay$1(component) : + null; + mirror.parentNode = initialCalendar.el; + mirror.revertDuration = component.opt('dragRevertDuration'); + var isValid = component.isValidSegDownEl(origTarget) && + !core.elementClosest(origTarget, '.fc-resizer'); // NOT on a resizer + dragging.setIgnoreMove(!isValid); + // disable dragging for elements that are resizable (ie, selectable) + // but are not draggable + _this.isDragging = isValid && + ev.subjectEl.classList.contains('fc-draggable'); + }; + _this.handleDragStart = function (ev) { + var initialCalendar = _this.component.calendar; + var eventRange = _this.eventRange; + var eventInstanceId = eventRange.instance.instanceId; + if (ev.isTouch) { + // need to select a different event? + if (eventInstanceId !== _this.component.props.eventSelection) { + initialCalendar.dispatch({ type: 'SELECT_EVENT', eventInstanceId: eventInstanceId }); + } + } + else { + // if now using mouse, but was previous touch interaction, clear selected event + initialCalendar.dispatch({ type: 'UNSELECT_EVENT' }); + } + if (_this.isDragging) { + initialCalendar.unselect(ev); // unselect *date* selection + initialCalendar.publiclyTrigger('eventDragStart', [ + { + el: _this.subjectSeg.el, + event: new core.EventApi(initialCalendar, eventRange.def, eventRange.instance), + jsEvent: ev.origEvent, + view: _this.component.view + } + ]); + } + }; + _this.handleHitUpdate = function (hit, isFinal) { + if (!_this.isDragging) { + return; + } + var relevantEvents = _this.relevantEvents; + var initialHit = _this.hitDragging.initialHit; + var initialCalendar = _this.component.calendar; + // states based on new hit + var receivingCalendar = null; + var mutation = null; + var mutatedRelevantEvents = null; + var isInvalid = false; + var interaction = { + affectedEvents: relevantEvents, + mutatedEvents: core.createEmptyEventStore(), + isEvent: true, + origSeg: _this.subjectSeg + }; + if (hit) { + var receivingComponent = hit.component; + receivingCalendar = receivingComponent.calendar; + if (initialCalendar === receivingCalendar || + receivingComponent.opt('editable') && receivingComponent.opt('droppable')) { + mutation = computeEventMutation(initialHit, hit, receivingCalendar.pluginSystem.hooks.eventDragMutationMassagers); + if (mutation) { + mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, receivingCalendar.eventUiBases, mutation, receivingCalendar); + interaction.mutatedEvents = mutatedRelevantEvents; + if (!receivingComponent.isInteractionValid(interaction)) { + isInvalid = true; + mutation = null; + mutatedRelevantEvents = null; + interaction.mutatedEvents = core.createEmptyEventStore(); + } + } + } + else { + receivingCalendar = null; + } + } + _this.displayDrag(receivingCalendar, interaction); + if (!isInvalid) { + core.enableCursor(); + } + else { + core.disableCursor(); + } + if (!isFinal) { + if (initialCalendar === receivingCalendar && // TODO: write test for this + isHitsEqual(initialHit, hit)) { + mutation = null; + } + _this.dragging.setMirrorNeedsRevert(!mutation); + // render the mirror if no already-rendered mirror + // TODO: wish we could somehow wait for dispatch to guarantee render + _this.dragging.setMirrorIsVisible(!hit || !document.querySelector('.fc-mirror')); + // assign states based on new hit + _this.receivingCalendar = receivingCalendar; + _this.validMutation = mutation; + _this.mutatedRelevantEvents = mutatedRelevantEvents; + } + }; + _this.handlePointerUp = function () { + if (!_this.isDragging) { + _this.cleanup(); // because handleDragEnd won't fire + } + }; + _this.handleDragEnd = function (ev) { + if (_this.isDragging) { + var initialCalendar_1 = _this.component.calendar; + var initialView = _this.component.view; + var _a = _this, receivingCalendar = _a.receivingCalendar, validMutation = _a.validMutation; + var eventDef = _this.eventRange.def; + var eventInstance = _this.eventRange.instance; + var eventApi = new core.EventApi(initialCalendar_1, eventDef, eventInstance); + var relevantEvents_1 = _this.relevantEvents; + var mutatedRelevantEvents = _this.mutatedRelevantEvents; + var finalHit = _this.hitDragging.finalHit; + _this.clearDrag(); // must happen after revert animation + initialCalendar_1.publiclyTrigger('eventDragStop', [ + { + el: _this.subjectSeg.el, + event: eventApi, + jsEvent: ev.origEvent, + view: initialView + } + ]); + if (validMutation) { + // dropped within same calendar + if (receivingCalendar === initialCalendar_1) { + initialCalendar_1.dispatch({ + type: 'MERGE_EVENTS', + eventStore: mutatedRelevantEvents + }); + var transformed = {}; + for (var _i = 0, _b = initialCalendar_1.pluginSystem.hooks.eventDropTransformers; _i < _b.length; _i++) { + var transformer = _b[_i]; + __assign(transformed, transformer(validMutation, initialCalendar_1)); + } + var eventDropArg = __assign({}, transformed, { el: ev.subjectEl, delta: validMutation.datesDelta, oldEvent: eventApi, event: new core.EventApi(// the data AFTER the mutation + initialCalendar_1, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null), revert: function () { + initialCalendar_1.dispatch({ + type: 'MERGE_EVENTS', + eventStore: relevantEvents_1 + }); + }, jsEvent: ev.origEvent, view: initialView }); + initialCalendar_1.publiclyTrigger('eventDrop', [eventDropArg]); + // dropped in different calendar + } + else if (receivingCalendar) { + initialCalendar_1.publiclyTrigger('eventLeave', [ + { + draggedEl: ev.subjectEl, + event: eventApi, + view: initialView + } + ]); + initialCalendar_1.dispatch({ + type: 'REMOVE_EVENT_INSTANCES', + instances: _this.mutatedRelevantEvents.instances + }); + receivingCalendar.dispatch({ + type: 'MERGE_EVENTS', + eventStore: _this.mutatedRelevantEvents + }); + if (ev.isTouch) { + receivingCalendar.dispatch({ + type: 'SELECT_EVENT', + eventInstanceId: eventInstance.instanceId + }); + } + var dropArg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: ev.subjectEl, jsEvent: ev.origEvent, view: finalHit.component // should this be finalHit.component.view? See #4644 + }); + receivingCalendar.publiclyTrigger('drop', [dropArg]); + receivingCalendar.publiclyTrigger('eventReceive', [ + { + draggedEl: ev.subjectEl, + event: new core.EventApi(// the data AFTER the mutation + receivingCalendar, mutatedRelevantEvents.defs[eventDef.defId], mutatedRelevantEvents.instances[eventInstance.instanceId]), + view: finalHit.component // should this be finalHit.component.view? See #4644 + } + ]); + } + } + else { + initialCalendar_1.publiclyTrigger('_noEventDrop'); + } + } + _this.cleanup(); + }; + var component = _this.component; + var dragging = _this.dragging = new FeaturefulElementDragging(component.el); + dragging.pointer.selector = EventDragging.SELECTOR; + dragging.touchScrollAllowed = false; + dragging.autoScroller.isEnabled = component.opt('dragScroll'); + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsStore); + hitDragging.useSubjectCenter = settings.useEventCenter; + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragstart', _this.handleDragStart); + hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); + hitDragging.emitter.on('pointerup', _this.handlePointerUp); + hitDragging.emitter.on('dragend', _this.handleDragEnd); + return _this; + } + EventDragging.prototype.destroy = function () { + this.dragging.destroy(); + }; + // render a drag state on the next receivingCalendar + EventDragging.prototype.displayDrag = function (nextCalendar, state) { + var initialCalendar = this.component.calendar; + var prevCalendar = this.receivingCalendar; + // does the previous calendar need to be cleared? + if (prevCalendar && prevCalendar !== nextCalendar) { + // does the initial calendar need to be cleared? + // if so, don't clear all the way. we still need to to hide the affectedEvents + if (prevCalendar === initialCalendar) { + prevCalendar.dispatch({ + type: 'SET_EVENT_DRAG', + state: { + affectedEvents: state.affectedEvents, + mutatedEvents: core.createEmptyEventStore(), + isEvent: true, + origSeg: state.origSeg + } + }); + // completely clear the old calendar if it wasn't the initial + } + else { + prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + } + if (nextCalendar) { + nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state }); + } + }; + EventDragging.prototype.clearDrag = function () { + var initialCalendar = this.component.calendar; + var receivingCalendar = this.receivingCalendar; + if (receivingCalendar) { + receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + // the initial calendar might have an dummy drag state from displayDrag + if (initialCalendar !== receivingCalendar) { + initialCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + }; + EventDragging.prototype.cleanup = function () { + this.subjectSeg = null; + this.isDragging = false; + this.eventRange = null; + this.relevantEvents = null; + this.receivingCalendar = null; + this.validMutation = null; + this.mutatedRelevantEvents = null; + }; + EventDragging.SELECTOR = '.fc-draggable, .fc-resizable'; // TODO: test this in IE11 + return EventDragging; + }(core.Interaction)); + function computeEventMutation(hit0, hit1, massagers) { + var dateSpan0 = hit0.dateSpan; + var dateSpan1 = hit1.dateSpan; + var date0 = dateSpan0.range.start; + var date1 = dateSpan1.range.start; + var standardProps = {}; + if (dateSpan0.allDay !== dateSpan1.allDay) { + standardProps.allDay = dateSpan1.allDay; + standardProps.hasEnd = hit1.component.opt('allDayMaintainDuration'); + if (dateSpan1.allDay) { + // means date1 is already start-of-day, + // but date0 needs to be converted + date0 = core.startOfDay(date0); + } + } + var delta = core.diffDates(date0, date1, hit0.component.dateEnv, hit0.component === hit1.component ? + hit0.component.largeUnit : + null); + if (delta.milliseconds) { // has hours/minutes/seconds + standardProps.allDay = false; + } + var mutation = { + datesDelta: delta, + standardProps: standardProps + }; + for (var _i = 0, massagers_1 = massagers; _i < massagers_1.length; _i++) { + var massager = massagers_1[_i]; + massager(mutation, hit0, hit1); + } + return mutation; + } + function getComponentTouchDelay$1(component) { + var delay = component.opt('eventLongPressDelay'); + if (delay == null) { + delay = component.opt('longPressDelay'); + } + return delay; + } + + var EventDragging$1 = /** @class */ (function (_super) { + __extends(EventDragging, _super); + function EventDragging(settings) { + var _this = _super.call(this, settings) || this; + // internal state + _this.draggingSeg = null; // TODO: rename to resizingSeg? subjectSeg? + _this.eventRange = null; + _this.relevantEvents = null; + _this.validMutation = null; + _this.mutatedRelevantEvents = null; + _this.handlePointerDown = function (ev) { + var component = _this.component; + var seg = _this.querySeg(ev); + var eventRange = _this.eventRange = seg.eventRange; + _this.dragging.minDistance = component.opt('eventDragMinDistance'); + // if touch, need to be working with a selected event + _this.dragging.setIgnoreMove(!_this.component.isValidSegDownEl(ev.origEvent.target) || + (ev.isTouch && _this.component.props.eventSelection !== eventRange.instance.instanceId)); + }; + _this.handleDragStart = function (ev) { + var calendar = _this.component.calendar; + var eventRange = _this.eventRange; + _this.relevantEvents = core.getRelevantEvents(calendar.state.eventStore, _this.eventRange.instance.instanceId); + _this.draggingSeg = _this.querySeg(ev); + calendar.unselect(); + calendar.publiclyTrigger('eventResizeStart', [ + { + el: _this.draggingSeg.el, + event: new core.EventApi(calendar, eventRange.def, eventRange.instance), + jsEvent: ev.origEvent, + view: _this.component.view + } + ]); + }; + _this.handleHitUpdate = function (hit, isFinal, ev) { + var calendar = _this.component.calendar; + var relevantEvents = _this.relevantEvents; + var initialHit = _this.hitDragging.initialHit; + var eventInstance = _this.eventRange.instance; + var mutation = null; + var mutatedRelevantEvents = null; + var isInvalid = false; + var interaction = { + affectedEvents: relevantEvents, + mutatedEvents: core.createEmptyEventStore(), + isEvent: true, + origSeg: _this.draggingSeg + }; + if (hit) { + mutation = computeMutation(initialHit, hit, ev.subjectEl.classList.contains('fc-start-resizer'), eventInstance.range, calendar.pluginSystem.hooks.eventResizeJoinTransforms); + } + if (mutation) { + mutatedRelevantEvents = core.applyMutationToEventStore(relevantEvents, calendar.eventUiBases, mutation, calendar); + interaction.mutatedEvents = mutatedRelevantEvents; + if (!_this.component.isInteractionValid(interaction)) { + isInvalid = true; + mutation = null; + mutatedRelevantEvents = null; + interaction.mutatedEvents = null; + } + } + if (mutatedRelevantEvents) { + calendar.dispatch({ + type: 'SET_EVENT_RESIZE', + state: interaction + }); + } + else { + calendar.dispatch({ type: 'UNSET_EVENT_RESIZE' }); + } + if (!isInvalid) { + core.enableCursor(); + } + else { + core.disableCursor(); + } + if (!isFinal) { + if (mutation && isHitsEqual(initialHit, hit)) { + mutation = null; + } + _this.validMutation = mutation; + _this.mutatedRelevantEvents = mutatedRelevantEvents; + } + }; + _this.handleDragEnd = function (ev) { + var calendar = _this.component.calendar; + var view = _this.component.view; + var eventDef = _this.eventRange.def; + var eventInstance = _this.eventRange.instance; + var eventApi = new core.EventApi(calendar, eventDef, eventInstance); + var relevantEvents = _this.relevantEvents; + var mutatedRelevantEvents = _this.mutatedRelevantEvents; + calendar.publiclyTrigger('eventResizeStop', [ + { + el: _this.draggingSeg.el, + event: eventApi, + jsEvent: ev.origEvent, + view: view + } + ]); + if (_this.validMutation) { + calendar.dispatch({ + type: 'MERGE_EVENTS', + eventStore: mutatedRelevantEvents + }); + calendar.publiclyTrigger('eventResize', [ + { + el: _this.draggingSeg.el, + startDelta: _this.validMutation.startDelta || core.createDuration(0), + endDelta: _this.validMutation.endDelta || core.createDuration(0), + prevEvent: eventApi, + event: new core.EventApi(// the data AFTER the mutation + calendar, mutatedRelevantEvents.defs[eventDef.defId], eventInstance ? mutatedRelevantEvents.instances[eventInstance.instanceId] : null), + revert: function () { + calendar.dispatch({ + type: 'MERGE_EVENTS', + eventStore: relevantEvents + }); + }, + jsEvent: ev.origEvent, + view: view + } + ]); + } + else { + calendar.publiclyTrigger('_noEventResize'); + } + // reset all internal state + _this.draggingSeg = null; + _this.relevantEvents = null; + _this.validMutation = null; + // okay to keep eventInstance around. useful to set it in handlePointerDown + }; + var component = settings.component; + var dragging = _this.dragging = new FeaturefulElementDragging(component.el); + dragging.pointer.selector = '.fc-resizer'; + dragging.touchScrollAllowed = false; + dragging.autoScroller.isEnabled = component.opt('dragScroll'); + var hitDragging = _this.hitDragging = new HitDragging(_this.dragging, core.interactionSettingsToStore(settings)); + hitDragging.emitter.on('pointerdown', _this.handlePointerDown); + hitDragging.emitter.on('dragstart', _this.handleDragStart); + hitDragging.emitter.on('hitupdate', _this.handleHitUpdate); + hitDragging.emitter.on('dragend', _this.handleDragEnd); + return _this; + } + EventDragging.prototype.destroy = function () { + this.dragging.destroy(); + }; + EventDragging.prototype.querySeg = function (ev) { + return core.getElSeg(core.elementClosest(ev.subjectEl, this.component.fgSegSelector)); + }; + return EventDragging; + }(core.Interaction)); + function computeMutation(hit0, hit1, isFromStart, instanceRange, transforms) { + var dateEnv = hit0.component.dateEnv; + var date0 = hit0.dateSpan.range.start; + var date1 = hit1.dateSpan.range.start; + var delta = core.diffDates(date0, date1, dateEnv, hit0.component.largeUnit); + var props = {}; + for (var _i = 0, transforms_1 = transforms; _i < transforms_1.length; _i++) { + var transform = transforms_1[_i]; + var res = transform(hit0, hit1); + if (res === false) { + return null; + } + else if (res) { + __assign(props, res); + } + } + if (isFromStart) { + if (dateEnv.add(instanceRange.start, delta) < instanceRange.end) { + props.startDelta = delta; + return props; + } + } + else { + if (dateEnv.add(instanceRange.end, delta) > instanceRange.start) { + props.endDelta = delta; + return props; + } + } + return null; + } + + var UnselectAuto = /** @class */ (function () { + function UnselectAuto(calendar) { + var _this = this; + this.isRecentPointerDateSelect = false; // wish we could use a selector to detect date selection, but uses hit system + this.onSelect = function (selectInfo) { + if (selectInfo.jsEvent) { + _this.isRecentPointerDateSelect = true; + } + }; + this.onDocumentPointerUp = function (pev) { + var _a = _this, calendar = _a.calendar, documentPointer = _a.documentPointer; + var state = calendar.state; + // touch-scrolling should never unfocus any type of selection + if (!documentPointer.wasTouchScroll) { + if (state.dateSelection && // an existing date selection? + !_this.isRecentPointerDateSelect // a new pointer-initiated date selection since last onDocumentPointerUp? + ) { + var unselectAuto = calendar.viewOpt('unselectAuto'); + var unselectCancel = calendar.viewOpt('unselectCancel'); + if (unselectAuto && (!unselectAuto || !core.elementClosest(documentPointer.downEl, unselectCancel))) { + calendar.unselect(pev); + } + } + if (state.eventSelection && // an existing event selected? + !core.elementClosest(documentPointer.downEl, EventDragging.SELECTOR) // interaction DIDN'T start on an event + ) { + calendar.dispatch({ type: 'UNSELECT_EVENT' }); + } + } + _this.isRecentPointerDateSelect = false; + }; + this.calendar = calendar; + var documentPointer = this.documentPointer = new PointerDragging(document); + documentPointer.shouldIgnoreMove = true; + documentPointer.shouldWatchScroll = false; + documentPointer.emitter.on('pointerup', this.onDocumentPointerUp); + /* + TODO: better way to know about whether there was a selection with the pointer + */ + calendar.on('select', this.onSelect); + } + UnselectAuto.prototype.destroy = function () { + this.calendar.off('select', this.onSelect); + this.documentPointer.destroy(); + }; + return UnselectAuto; + }()); + + /* + Given an already instantiated draggable object for one-or-more elements, + Interprets any dragging as an attempt to drag an events that lives outside + of a calendar onto a calendar. + */ + var ExternalElementDragging = /** @class */ (function () { + function ExternalElementDragging(dragging, suppliedDragMeta) { + var _this = this; + this.receivingCalendar = null; + this.droppableEvent = null; // will exist for all drags, even if create:false + this.suppliedDragMeta = null; + this.dragMeta = null; + this.handleDragStart = function (ev) { + _this.dragMeta = _this.buildDragMeta(ev.subjectEl); + }; + this.handleHitUpdate = function (hit, isFinal, ev) { + var dragging = _this.hitDragging.dragging; + var receivingCalendar = null; + var droppableEvent = null; + var isInvalid = false; + var interaction = { + affectedEvents: core.createEmptyEventStore(), + mutatedEvents: core.createEmptyEventStore(), + isEvent: _this.dragMeta.create, + origSeg: null + }; + if (hit) { + receivingCalendar = hit.component.calendar; + if (_this.canDropElOnCalendar(ev.subjectEl, receivingCalendar)) { + droppableEvent = computeEventForDateSpan(hit.dateSpan, _this.dragMeta, receivingCalendar); + interaction.mutatedEvents = core.eventTupleToStore(droppableEvent); + isInvalid = !core.isInteractionValid(interaction, receivingCalendar); + if (isInvalid) { + interaction.mutatedEvents = core.createEmptyEventStore(); + droppableEvent = null; + } + } + } + _this.displayDrag(receivingCalendar, interaction); + // show mirror if no already-rendered mirror element OR if we are shutting down the mirror (?) + // TODO: wish we could somehow wait for dispatch to guarantee render + dragging.setMirrorIsVisible(isFinal || !droppableEvent || !document.querySelector('.fc-mirror')); + if (!isInvalid) { + core.enableCursor(); + } + else { + core.disableCursor(); + } + if (!isFinal) { + dragging.setMirrorNeedsRevert(!droppableEvent); + _this.receivingCalendar = receivingCalendar; + _this.droppableEvent = droppableEvent; + } + }; + this.handleDragEnd = function (pev) { + var _a = _this, receivingCalendar = _a.receivingCalendar, droppableEvent = _a.droppableEvent; + _this.clearDrag(); + if (receivingCalendar && droppableEvent) { + var finalHit = _this.hitDragging.finalHit; + var finalView = finalHit.component.view; + var dragMeta = _this.dragMeta; + var arg = __assign({}, receivingCalendar.buildDatePointApi(finalHit.dateSpan), { draggedEl: pev.subjectEl, jsEvent: pev.origEvent, view: finalView }); + receivingCalendar.publiclyTrigger('drop', [arg]); + if (dragMeta.create) { + receivingCalendar.dispatch({ + type: 'MERGE_EVENTS', + eventStore: core.eventTupleToStore(droppableEvent) + }); + if (pev.isTouch) { + receivingCalendar.dispatch({ + type: 'SELECT_EVENT', + eventInstanceId: droppableEvent.instance.instanceId + }); + } + // signal that an external event landed + receivingCalendar.publiclyTrigger('eventReceive', [ + { + draggedEl: pev.subjectEl, + event: new core.EventApi(receivingCalendar, droppableEvent.def, droppableEvent.instance), + view: finalView + } + ]); + } + } + _this.receivingCalendar = null; + _this.droppableEvent = null; + }; + var hitDragging = this.hitDragging = new HitDragging(dragging, core.interactionSettingsStore); + hitDragging.requireInitial = false; // will start outside of a component + hitDragging.emitter.on('dragstart', this.handleDragStart); + hitDragging.emitter.on('hitupdate', this.handleHitUpdate); + hitDragging.emitter.on('dragend', this.handleDragEnd); + this.suppliedDragMeta = suppliedDragMeta; + } + ExternalElementDragging.prototype.buildDragMeta = function (subjectEl) { + if (typeof this.suppliedDragMeta === 'object') { + return core.parseDragMeta(this.suppliedDragMeta); + } + else if (typeof this.suppliedDragMeta === 'function') { + return core.parseDragMeta(this.suppliedDragMeta(subjectEl)); + } + else { + return getDragMetaFromEl(subjectEl); + } + }; + ExternalElementDragging.prototype.displayDrag = function (nextCalendar, state) { + var prevCalendar = this.receivingCalendar; + if (prevCalendar && prevCalendar !== nextCalendar) { + prevCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + if (nextCalendar) { + nextCalendar.dispatch({ type: 'SET_EVENT_DRAG', state: state }); + } + }; + ExternalElementDragging.prototype.clearDrag = function () { + if (this.receivingCalendar) { + this.receivingCalendar.dispatch({ type: 'UNSET_EVENT_DRAG' }); + } + }; + ExternalElementDragging.prototype.canDropElOnCalendar = function (el, receivingCalendar) { + var dropAccept = receivingCalendar.opt('dropAccept'); + if (typeof dropAccept === 'function') { + return dropAccept(el); + } + else if (typeof dropAccept === 'string' && dropAccept) { + return Boolean(core.elementMatches(el, dropAccept)); + } + return true; + }; + return ExternalElementDragging; + }()); + // Utils for computing event store from the DragMeta + // ---------------------------------------------------------------------------------------------------- + function computeEventForDateSpan(dateSpan, dragMeta, calendar) { + var defProps = __assign({}, dragMeta.leftoverProps); + for (var _i = 0, _a = calendar.pluginSystem.hooks.externalDefTransforms; _i < _a.length; _i++) { + var transform = _a[_i]; + __assign(defProps, transform(dateSpan, dragMeta)); + } + var def = core.parseEventDef(defProps, dragMeta.sourceId, dateSpan.allDay, calendar.opt('forceEventDuration') || Boolean(dragMeta.duration), // hasEnd + calendar); + var start = dateSpan.range.start; + // only rely on time info if drop zone is all-day, + // otherwise, we already know the time + if (dateSpan.allDay && dragMeta.startTime) { + start = calendar.dateEnv.add(start, dragMeta.startTime); + } + var end = dragMeta.duration ? + calendar.dateEnv.add(start, dragMeta.duration) : + calendar.getDefaultEventEnd(dateSpan.allDay, start); + var instance = core.createEventInstance(def.defId, { start: start, end: end }); + return { def: def, instance: instance }; + } + // Utils for extracting data from element + // ---------------------------------------------------------------------------------------------------- + function getDragMetaFromEl(el) { + var str = getEmbeddedElData(el, 'event'); + var obj = str ? + JSON.parse(str) : + { create: false }; // if no embedded data, assume no event creation + return core.parseDragMeta(obj); + } + core.config.dataAttrPrefix = ''; + function getEmbeddedElData(el, name) { + var prefix = core.config.dataAttrPrefix; + var prefixedName = (prefix ? prefix + '-' : '') + name; + return el.getAttribute('data-' + prefixedName) || ''; + } + + /* + Makes an element (that is *external* to any calendar) draggable. + Can pass in data that determines how an event will be created when dropped onto a calendar. + Leverages FullCalendar's internal drag-n-drop functionality WITHOUT a third-party drag system. + */ + var ExternalDraggable = /** @class */ (function () { + function ExternalDraggable(el, settings) { + var _this = this; + if (settings === void 0) { settings = {}; } + this.handlePointerDown = function (ev) { + var dragging = _this.dragging; + var _a = _this.settings, minDistance = _a.minDistance, longPressDelay = _a.longPressDelay; + dragging.minDistance = + minDistance != null ? + minDistance : + (ev.isTouch ? 0 : core.globalDefaults.eventDragMinDistance); + dragging.delay = + ev.isTouch ? // TODO: eventually read eventLongPressDelay instead vvv + (longPressDelay != null ? longPressDelay : core.globalDefaults.longPressDelay) : + 0; + }; + this.handleDragStart = function (ev) { + if (ev.isTouch && + _this.dragging.delay && + ev.subjectEl.classList.contains('fc-event')) { + _this.dragging.mirror.getMirrorEl().classList.add('fc-selected'); + } + }; + this.settings = settings; + var dragging = this.dragging = new FeaturefulElementDragging(el); + dragging.touchScrollAllowed = false; + if (settings.itemSelector != null) { + dragging.pointer.selector = settings.itemSelector; + } + if (settings.appendTo != null) { + dragging.mirror.parentNode = settings.appendTo; // TODO: write tests + } + dragging.emitter.on('pointerdown', this.handlePointerDown); + dragging.emitter.on('dragstart', this.handleDragStart); + new ExternalElementDragging(dragging, settings.eventData); + } + ExternalDraggable.prototype.destroy = function () { + this.dragging.destroy(); + }; + return ExternalDraggable; + }()); + + /* + Detects when a *THIRD-PARTY* drag-n-drop system interacts with elements. + The third-party system is responsible for drawing the visuals effects of the drag. + This class simply monitors for pointer movements and fires events. + It also has the ability to hide the moving element (the "mirror") during the drag. + */ + var InferredElementDragging = /** @class */ (function (_super) { + __extends(InferredElementDragging, _super); + function InferredElementDragging(containerEl) { + var _this = _super.call(this, containerEl) || this; + _this.shouldIgnoreMove = false; + _this.mirrorSelector = ''; + _this.currentMirrorEl = null; + _this.handlePointerDown = function (ev) { + _this.emitter.trigger('pointerdown', ev); + if (!_this.shouldIgnoreMove) { + // fire dragstart right away. does not support delay or min-distance + _this.emitter.trigger('dragstart', ev); + } + }; + _this.handlePointerMove = function (ev) { + if (!_this.shouldIgnoreMove) { + _this.emitter.trigger('dragmove', ev); + } + }; + _this.handlePointerUp = function (ev) { + _this.emitter.trigger('pointerup', ev); + if (!_this.shouldIgnoreMove) { + // fire dragend right away. does not support a revert animation + _this.emitter.trigger('dragend', ev); + } + }; + var pointer = _this.pointer = new PointerDragging(containerEl); + pointer.emitter.on('pointerdown', _this.handlePointerDown); + pointer.emitter.on('pointermove', _this.handlePointerMove); + pointer.emitter.on('pointerup', _this.handlePointerUp); + return _this; + } + InferredElementDragging.prototype.destroy = function () { + this.pointer.destroy(); + }; + InferredElementDragging.prototype.setIgnoreMove = function (bool) { + this.shouldIgnoreMove = bool; + }; + InferredElementDragging.prototype.setMirrorIsVisible = function (bool) { + if (bool) { + // restore a previously hidden element. + // use the reference in case the selector class has already been removed. + if (this.currentMirrorEl) { + this.currentMirrorEl.style.visibility = ''; + this.currentMirrorEl = null; + } + } + else { + var mirrorEl = this.mirrorSelector ? + document.querySelector(this.mirrorSelector) : + null; + if (mirrorEl) { + this.currentMirrorEl = mirrorEl; + mirrorEl.style.visibility = 'hidden'; + } + } + }; + return InferredElementDragging; + }(core.ElementDragging)); + + /* + Bridges third-party drag-n-drop systems with FullCalendar. + Must be instantiated and destroyed by caller. + */ + var ThirdPartyDraggable = /** @class */ (function () { + function ThirdPartyDraggable(containerOrSettings, settings) { + var containerEl = document; + if ( + // wish we could just test instanceof EventTarget, but doesn't work in IE11 + containerOrSettings === document || + containerOrSettings instanceof Element) { + containerEl = containerOrSettings; + settings = settings || {}; + } + else { + settings = (containerOrSettings || {}); + } + var dragging = this.dragging = new InferredElementDragging(containerEl); + if (typeof settings.itemSelector === 'string') { + dragging.pointer.selector = settings.itemSelector; + } + else if (containerEl === document) { + dragging.pointer.selector = '[data-event]'; + } + if (typeof settings.mirrorSelector === 'string') { + dragging.mirrorSelector = settings.mirrorSelector; + } + new ExternalElementDragging(dragging, settings.eventData); + } + ThirdPartyDraggable.prototype.destroy = function () { + this.dragging.destroy(); + }; + return ThirdPartyDraggable; + }()); + + var main = core.createPlugin({ + componentInteractions: [DateClicking, DateSelecting, EventDragging, EventDragging$1], + calendarInteractions: [UnselectAuto], + elementDraggingImpl: FeaturefulElementDragging + }); + + exports.Draggable = ExternalDraggable; + exports.FeaturefulElementDragging = FeaturefulElementDragging; + exports.PointerDragging = PointerDragging; + exports.ThirdPartyDraggable = ThirdPartyDraggable; + exports.default = main; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/public/resource/assets/libs/fullcalendar/interaction/main.min.js b/public/resource/assets/libs/fullcalendar/interaction/main.min.js new file mode 100644 index 0000000..7a36731 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/interaction/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar Interaction Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarInteraction={},e.FullCalendar)}(this,function(e,t){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function r(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var i=function(){return(i=Object.assign||function(e){for(var t,n=1,r=arguments.length;n0&&(this.everMovedDown=!0),o<0?this.everMovedLeft=!0:o>0&&(this.everMovedRight=!0),this.pointerScreenX=n,this.pointerScreenY=r,this.isAnimating||(this.isAnimating=!0,this.requestAnimation(p()))}},e.prototype.stop=function(){if(this.isEnabled){this.isAnimating=!1;for(var e=0,t=this.scrollCaches;e=0&&c>=0&&d>=0&&g>=0&&(d<=n&&this.everMovedUp&&a.canScrollUp()&&(!r||r.distance>d)&&(r={scrollCache:a,name:"top",distance:d}),g<=n&&this.everMovedDown&&a.canScrollDown()&&(!r||r.distance>g)&&(r={scrollCache:a,name:"bottom",distance:g}),s<=n&&this.everMovedLeft&&a.canScrollLeft()&&(!r||r.distance>s)&&(r={scrollCache:a,name:"left",distance:s}),c<=n&&this.everMovedRight&&a.canScrollRight()&&(!r||r.distance>c)&&(r={scrollCache:a,name:"right",distance:c}))}return r},e.prototype.buildCaches=function(){return this.queryScrollEls().map(function(e){return e===window?new h(!1):new u(e,!1)})},e.prototype.queryScrollEls=function(){for(var e=[],t=0,n=this.scrollQuery;t=t*t&&r.handleDistanceSurpassed(e)}r.isDragging&&("scroll"!==e.origEvent.type&&(r.mirror.handleMove(e.pageX,e.pageY),r.autoScroller.handleMove(e.pageX,e.pageY)),r.emitter.trigger("dragmove",e))}},r.onPointerUp=function(e){r.isInteracting&&(r.isInteracting=!1,t.allowSelection(document.body),t.allowContextMenu(document.body),r.emitter.trigger("pointerup",e),r.isDragging&&(r.autoScroller.stop(),r.tryStopDrag(e)),r.delayTimeoutId&&(clearTimeout(r.delayTimeoutId),r.delayTimeoutId=null))};var i=r.pointer=new s(n);return i.emitter.on("pointerdown",r.onPointerDown),i.emitter.on("pointermove",r.onPointerMove),i.emitter.on("pointerup",r.onPointerUp),r.mirror=new d,r.autoScroller=new v,r}return r(n,e),n.prototype.destroy=function(){this.pointer.destroy()},n.prototype.startDelay=function(e){var t=this;"number"==typeof this.delay?this.delayTimeoutId=setTimeout(function(){t.delayTimeoutId=null,t.handleDelayEnd(e)},this.delay):this.handleDelayEnd(e)},n.prototype.handleDelayEnd=function(e){this.isDelayEnded=!0,this.tryStartDrag(e)},n.prototype.handleDistanceSurpassed=function(e){this.isDistanceSurpassed=!0,this.tryStartDrag(e)},n.prototype.tryStartDrag=function(e){this.isDelayEnded&&this.isDistanceSurpassed&&(this.pointer.wasTouchScroll&&!this.touchScrollAllowed||(this.isDragging=!0,this.mirrorNeedsRevert=!1,this.autoScroller.start(e.pageX,e.pageY),this.emitter.trigger("dragstart",e),!1===this.touchScrollAllowed&&this.pointer.cancelTouchScroll()))},n.prototype.tryStopDrag=function(e){this.mirror.stop(this.mirrorNeedsRevert,this.stopDrag.bind(this,e))},n.prototype.stopDrag=function(e){this.isDragging=!1,this.emitter.trigger("dragend",e)},n.prototype.setIgnoreMove=function(e){this.pointer.shouldIgnoreMove=e},n.prototype.setMirrorIsVisible=function(e){this.mirror.setIsVisible(e)},n.prototype.setMirrorNeedsRevert=function(e){this.mirrorNeedsRevert=e},n.prototype.setAutoScrollEnabled=function(e){this.autoScroller.isEnabled=e},n}(t.ElementDragging),E=function(){function e(e){this.origRect=t.computeRect(e),this.scrollCaches=t.getClippingParents(e).map(function(e){return new u(e,!0)})}return e.prototype.destroy=function(){for(var e=0,t=this.scrollCaches;e=0&&g=0&&uo.layer)||(f.rect.left+=c,f.rect.right+=c,f.rect.top+=d,f.rect.bottom+=d,o=f)}}}return o},e}();function S(e,n){return!e&&!n||Boolean(e)===Boolean(n)&&t.isDateSpansEqual(e.dateSpan,n.dateSpan)}var y=function(e){function n(n){var r=e.call(this,n)||this;r.handlePointerDown=function(e){var t=r.dragging;t.setIgnoreMove(!r.component.isValidDateDownEl(t.pointer.downEl))},r.handleDragEnd=function(e){var t=r.component;if(!r.dragging.pointer.wasTouchScroll){var n=r.hitDragging,i=n.initialHit,o=n.finalHit;i&&o&&S(i,o)&&t.calendar.triggerDateClick(i.dateSpan,i.dayEl,t.view,e.origEvent)}};var i=n.component;r.dragging=new f(i.el),r.dragging.autoScroller.isEnabled=!1;var o=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return o.emitter.on("pointerdown",r.handlePointerDown),o.emitter.on("dragend",r.handleDragEnd),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n}(t.Interaction),D=function(e){function n(n){var r=e.call(this,n)||this;r.dragSelection=null,r.handlePointerDown=function(e){var t=r,n=t.component,i=t.dragging,o=n.opt("selectable")&&n.isValidDateDownEl(e.origEvent.target);i.setIgnoreMove(!o),i.delay=e.isTouch?function(e){var t=e.opt("selectLongPressDelay");null==t&&(t=e.opt("longPressDelay"));return t}(n):null},r.handleDragStart=function(e){r.component.calendar.unselect(e)},r.handleHitUpdate=function(e,n){var o=r.component.calendar,a=null,l=!1;e&&((a=function(e,n,r){var o=e.dateSpan,a=n.dateSpan,l=[o.range.start,o.range.end,a.range.start,a.range.end];l.sort(t.compareNumbers);for(var s={},c=0,d=r;co.start)return g.endDelta=d,g;return null}(s,e,o.subjectEl.classList.contains("fc-start-resizer"),c.range,a.pluginSystem.hooks.eventResizeJoinTransforms)),d&&(g=t.applyMutationToEventStore(l,a.eventUiBases,d,a),h.mutatedEvents=g,r.component.isInteractionValid(h)||(u=!0,d=null,g=null,h.mutatedEvents=null)),g?a.dispatch({type:"SET_EVENT_RESIZE",state:h}):a.dispatch({type:"UNSET_EVENT_RESIZE"}),u?t.disableCursor():t.enableCursor(),n||(d&&S(s,e)&&(d=null),r.validMutation=d,r.mutatedRelevantEvents=g)},r.handleDragEnd=function(e){var n=r.component.calendar,i=r.component.view,o=r.eventRange.def,a=r.eventRange.instance,l=new t.EventApi(n,o,a),s=r.relevantEvents,c=r.mutatedRelevantEvents;n.publiclyTrigger("eventResizeStop",[{el:r.draggingSeg.el,event:l,jsEvent:e.origEvent,view:i}]),r.validMutation?(n.dispatch({type:"MERGE_EVENTS",eventStore:c}),n.publiclyTrigger("eventResize",[{el:r.draggingSeg.el,startDelta:r.validMutation.startDelta||t.createDuration(0),endDelta:r.validMutation.endDelta||t.createDuration(0),prevEvent:l,event:new t.EventApi(n,c.defs[o.defId],a?c.instances[a.instanceId]:null),revert:function(){n.dispatch({type:"MERGE_EVENTS",eventStore:s})},jsEvent:e.origEvent,view:i}])):n.publiclyTrigger("_noEventResize"),r.draggingSeg=null,r.relevantEvents=null,r.validMutation=null};var o=n.component,a=r.dragging=new f(o.el);a.pointer.selector=".fc-resizer",a.touchScrollAllowed=!1,a.autoScroller.isEnabled=o.opt("dragScroll");var l=r.hitDragging=new m(r.dragging,t.interactionSettingsToStore(n));return l.emitter.on("pointerdown",r.handlePointerDown),l.emitter.on("dragstart",r.handleDragStart),l.emitter.on("hitupdate",r.handleHitUpdate),l.emitter.on("dragend",r.handleDragEnd),r}return r(n,e),n.prototype.destroy=function(){this.dragging.destroy()},n.prototype.querySeg=function(e){return t.getElSeg(t.elementClosest(e.subjectEl,this.component.fgSegSelector))},n}(t.Interaction);var M=function(){function e(e){var n=this;this.isRecentPointerDateSelect=!1,this.onSelect=function(e){e.jsEvent&&(n.isRecentPointerDateSelect=!0)},this.onDocumentPointerUp=function(e){var r=n,i=r.calendar,o=r.documentPointer,a=i.state;if(!o.wasTouchScroll){if(a.dateSelection&&!n.isRecentPointerDateSelect){var l=i.viewOpt("unselectAuto"),s=i.viewOpt("unselectCancel");!l||l&&t.elementClosest(o.downEl,s)||i.unselect(e)}a.eventSelection&&!t.elementClosest(o.downEl,w.SELECTOR)&&i.dispatch({type:"UNSELECT_EVENT"})}n.isRecentPointerDateSelect=!1},this.calendar=e;var r=this.documentPointer=new s(document);r.shouldIgnoreMove=!0,r.shouldWatchScroll=!1,r.emitter.on("pointerup",this.onDocumentPointerUp),e.on("select",this.onSelect)}return e.prototype.destroy=function(){this.calendar.off("select",this.onSelect),this.documentPointer.destroy()},e}(),b=function(){function e(e,n){var r=this;this.receivingCalendar=null,this.droppableEvent=null,this.suppliedDragMeta=null,this.dragMeta=null,this.handleDragStart=function(e){r.dragMeta=r.buildDragMeta(e.subjectEl)},this.handleHitUpdate=function(e,n,o){var a=r.hitDragging.dragging,l=null,s=null,c=!1,d={affectedEvents:t.createEmptyEventStore(),mutatedEvents:t.createEmptyEventStore(),isEvent:r.dragMeta.create,origSeg:null};e&&(l=e.component.calendar,r.canDropElOnCalendar(o.subjectEl,l)&&(s=function(e,n,r){for(var o=i({},n.leftoverProps),a=0,l=r.pluginSystem.hooks.externalDefTransforms;a tag */ + text-decoration: none; + color: inherit; +} + +.fc-list-item-title a[href]:hover { + /* hover effect only on titles with hrefs */ + text-decoration: underline; +} + +/* message when no events */ +.fc-list-empty-wrap2 { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; +} + +.fc-list-empty-wrap1 { + width: 100%; + height: 100%; + display: table; +} + +.fc-list-empty { + display: table-cell; + vertical-align: middle; + text-align: center; +} + +.fc-unthemed .fc-list-empty { + /* theme will provide own background */ + background-color: #eee; +} diff --git a/public/resource/assets/libs/fullcalendar/list/main.js b/public/resource/assets/libs/fullcalendar/list/main.js new file mode 100644 index 0000000..b855e4e --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/list/main.js @@ -0,0 +1,343 @@ +/*! +FullCalendar List View Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ + +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) : + typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) : + (global = global || self, factory(global.FullCalendarList = {}, global.FullCalendar)); +}(this, function (exports, core) { 'use strict'; + + /*! ***************************************************************************** + Copyright (c) Microsoft Corporation. All rights reserved. + Licensed under the Apache License, Version 2.0 (the "License"); you may not use + this file except in compliance with the License. You may obtain a copy of the + License at http://www.apache.org/licenses/LICENSE-2.0 + + THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED + WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE, + MERCHANTABLITY OR NON-INFRINGEMENT. + + See the Apache Version 2.0 License for specific language governing permissions + and limitations under the License. + ***************************************************************************** */ + /* global Reflect, Promise */ + + var extendStatics = function(d, b) { + extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return extendStatics(d, b); + }; + + function __extends(d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + } + + var ListEventRenderer = /** @class */ (function (_super) { + __extends(ListEventRenderer, _super); + function ListEventRenderer(listView) { + var _this = _super.call(this, listView.context) || this; + _this.listView = listView; + return _this; + } + ListEventRenderer.prototype.attachSegs = function (segs) { + if (!segs.length) { + this.listView.renderEmptyMessage(); + } + else { + this.listView.renderSegList(segs); + } + }; + ListEventRenderer.prototype.detachSegs = function () { + }; + // generates the HTML for a single event row + ListEventRenderer.prototype.renderSegHtml = function (seg) { + var _a = this.context, view = _a.view, theme = _a.theme; + var eventRange = seg.eventRange; + var eventDef = eventRange.def; + var eventInstance = eventRange.instance; + var eventUi = eventRange.ui; + var url = eventDef.url; + var classes = ['fc-list-item'].concat(eventUi.classNames); + var bgColor = eventUi.backgroundColor; + var timeHtml; + if (eventDef.allDay) { + timeHtml = core.getAllDayHtml(view); + } + else if (core.isMultiDayRange(eventRange.range)) { + if (seg.isStart) { + timeHtml = core.htmlEscape(this._getTimeText(eventInstance.range.start, seg.end, false // allDay + )); + } + else if (seg.isEnd) { + timeHtml = core.htmlEscape(this._getTimeText(seg.start, eventInstance.range.end, false // allDay + )); + } + else { // inner segment that lasts the whole day + timeHtml = core.getAllDayHtml(view); + } + } + else { + // Display the normal time text for the *event's* times + timeHtml = core.htmlEscape(this.getTimeText(eventRange)); + } + if (url) { + classes.push('fc-has-url'); + } + return '' + + (this.displayEventTime ? + '' + + (timeHtml || '') + + '' : + '') + + '' + + '' + + '' + + '' + + '' + + core.htmlEscape(eventDef.title || '') + + '' + + '' + + ''; + }; + // like "4:00am" + ListEventRenderer.prototype.computeEventTimeFormat = function () { + return { + hour: 'numeric', + minute: '2-digit', + meridiem: 'short' + }; + }; + return ListEventRenderer; + }(core.FgEventRenderer)); + + /* + Responsible for the scroller, and forwarding event-related actions into the "grid". + */ + var ListView = /** @class */ (function (_super) { + __extends(ListView, _super); + function ListView(context, viewSpec, dateProfileGenerator, parentEl) { + var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this; + _this.computeDateVars = core.memoize(computeDateVars); + _this.eventStoreToSegs = core.memoize(_this._eventStoreToSegs); + var eventRenderer = _this.eventRenderer = new ListEventRenderer(_this); + _this.renderContent = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer)); + _this.el.classList.add('fc-list-view'); + var listViewClassNames = (_this.theme.getClass('listView') || '').split(' '); // wish we didn't have to do this + for (var _i = 0, listViewClassNames_1 = listViewClassNames; _i < listViewClassNames_1.length; _i++) { + var listViewClassName = listViewClassNames_1[_i]; + if (listViewClassName) { // in case input was empty string + _this.el.classList.add(listViewClassName); + } + } + _this.scroller = new core.ScrollComponent('hidden', // overflow x + 'auto' // overflow y + ); + _this.el.appendChild(_this.scroller.el); + _this.contentEl = _this.scroller.el; // shortcut + context.calendar.registerInteractiveComponent(_this, { + el: _this.el + // TODO: make aware that it doesn't do Hits + }); + return _this; + } + ListView.prototype.render = function (props) { + var _a = this.computeDateVars(props.dateProfile), dayDates = _a.dayDates, dayRanges = _a.dayRanges; + this.dayDates = dayDates; + this.renderContent(this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges)); + }; + ListView.prototype.destroy = function () { + _super.prototype.destroy.call(this); + this.renderContent.unrender(); + this.scroller.destroy(); // will remove the Grid too + this.calendar.unregisterInteractiveComponent(this); + }; + ListView.prototype.updateSize = function (isResize, viewHeight, isAuto) { + _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); + this.eventRenderer.computeSizes(isResize); + this.eventRenderer.assignSizes(isResize); + this.scroller.clear(); // sets height to 'auto' and clears overflow + if (!isAuto) { + this.scroller.setHeight(this.computeScrollerHeight(viewHeight)); + } + }; + ListView.prototype.computeScrollerHeight = function (viewHeight) { + return viewHeight - + core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller + }; + ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) { + return this.eventRangesToSegs(core.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.nextDayThreshold).fg, dayRanges); + }; + ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) { + var segs = []; + for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) { + var eventRange = eventRanges_1[_i]; + segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges)); + } + return segs; + }; + ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) { + var _a = this, dateEnv = _a.dateEnv, nextDayThreshold = _a.nextDayThreshold; + var range = eventRange.range; + var allDay = eventRange.def.allDay; + var dayIndex; + var segRange; + var seg; + var segs = []; + for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) { + segRange = core.intersectRanges(range, dayRanges[dayIndex]); + if (segRange) { + seg = { + component: this, + eventRange: eventRange, + start: segRange.start, + end: segRange.end, + isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(), + isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(), + dayIndex: dayIndex + }; + segs.push(seg); + // detect when range won't go fully into the next day, + // and mutate the latest seg to the be the end. + if (!seg.isEnd && !allDay && + dayIndex + 1 < dayRanges.length && + range.end < + dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) { + seg.end = range.end; + seg.isEnd = true; + break; + } + } + } + return segs; + }; + ListView.prototype.renderEmptyMessage = function () { + this.contentEl.innerHTML = + '
' + // TODO: try less wraps + '
' + + '
' + + core.htmlEscape(this.opt('noEventsMessage')) + + '
' + + '
' + + '
'; + }; + // called by ListEventRenderer + ListView.prototype.renderSegList = function (allSegs) { + var segsByDay = this.groupSegsByDay(allSegs); // sparse array + var dayIndex; + var daySegs; + var i; + var tableEl = core.htmlToElement('
'); + var tbodyEl = tableEl.querySelector('tbody'); + for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) { + daySegs = segsByDay[dayIndex]; + if (daySegs) { // sparse array, so might be undefined + // append a day header + tbodyEl.appendChild(this.buildDayHeaderRow(this.dayDates[dayIndex])); + daySegs = this.eventRenderer.sortEventSegs(daySegs); + for (i = 0; i < daySegs.length; i++) { + tbodyEl.appendChild(daySegs[i].el); // append event row + } + } + } + this.contentEl.innerHTML = ''; + this.contentEl.appendChild(tableEl); + }; + // Returns a sparse array of arrays, segs grouped by their dayIndex + ListView.prototype.groupSegsByDay = function (segs) { + var segsByDay = []; // sparse array + var i; + var seg; + for (i = 0; i < segs.length; i++) { + seg = segs[i]; + (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = [])) + .push(seg); + } + return segsByDay; + }; + // generates the HTML for the day headers that live amongst the event rows + ListView.prototype.buildDayHeaderRow = function (dayDate) { + var dateEnv = this.dateEnv; + var mainFormat = core.createFormatter(this.opt('listDayFormat')); // TODO: cache + var altFormat = core.createFormatter(this.opt('listDayAltFormat')); // TODO: cache + return core.createElement('tr', { + className: 'fc-list-heading', + 'data-date': dateEnv.formatIso(dayDate, { omitTime: true }) + }, '' + + (mainFormat ? + core.buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-main' }, core.htmlEscape(dateEnv.format(dayDate, mainFormat)) // inner HTML + ) : + '') + + (altFormat ? + core.buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-alt' }, core.htmlEscape(dateEnv.format(dayDate, altFormat)) // inner HTML + ) : + '') + + ''); + }; + return ListView; + }(core.View)); + ListView.prototype.fgSegSelector = '.fc-list-item'; // which elements accept event actions + function computeDateVars(dateProfile) { + var dayStart = core.startOfDay(dateProfile.renderRange.start); + var viewEnd = dateProfile.renderRange.end; + var dayDates = []; + var dayRanges = []; + while (dayStart < viewEnd) { + dayDates.push(dayStart); + dayRanges.push({ + start: dayStart, + end: core.addDays(dayStart, 1) + }); + dayStart = core.addDays(dayStart, 1); + } + return { dayDates: dayDates, dayRanges: dayRanges }; + } + + var main = core.createPlugin({ + views: { + list: { + class: ListView, + buttonTextKey: 'list', + listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016" + }, + listDay: { + type: 'list', + duration: { days: 1 }, + listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in header + }, + listWeek: { + type: 'list', + duration: { weeks: 1 }, + listDayFormat: { weekday: 'long' }, + listDayAltFormat: { month: 'long', day: 'numeric', year: 'numeric' } + }, + listMonth: { + type: 'list', + duration: { month: 1 }, + listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have + }, + listYear: { + type: 'list', + duration: { year: 1 }, + listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have + } + } + }); + + exports.ListView = ListView; + exports.default = main; + + Object.defineProperty(exports, '__esModule', { value: true }); + +})); diff --git a/public/resource/assets/libs/fullcalendar/list/main.min.css b/public/resource/assets/libs/fullcalendar/list/main.min.css new file mode 100644 index 0000000..18446f4 --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/list/main.min.css @@ -0,0 +1 @@ +.fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt,.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee} \ No newline at end of file diff --git a/public/resource/assets/libs/fullcalendar/list/main.min.js b/public/resource/assets/libs/fullcalendar/list/main.min.js new file mode 100644 index 0000000..f954aac --- /dev/null +++ b/public/resource/assets/libs/fullcalendar/list/main.min.js @@ -0,0 +1,6 @@ +/*! +FullCalendar List View Plugin v4.3.0 +Docs & License: https://fullcalendar.io/ +(c) 2019 Adam Shaw +*/ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("@fullcalendar/core")):"function"==typeof define&&define.amd?define(["exports","@fullcalendar/core"],t):t((e=e||self).FullCalendarList={},e.FullCalendar)}(this,function(e,t){"use strict";var n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function r(e,t){function r(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}var s=function(e){function n(t){var n=e.call(this,t.context)||this;return n.listView=t,n}return r(n,e),n.prototype.attachSegs=function(e){e.length?this.listView.renderSegList(e):this.listView.renderEmptyMessage()},n.prototype.detachSegs=function(){},n.prototype.renderSegHtml=function(e){var n,r=this.context,s=r.view,a=r.theme,i=e.eventRange,o=i.def,l=i.instance,d=i.ui,c=o.url,p=["fc-list-item"].concat(d.classNames),h=d.backgroundColor;return n=o.allDay?t.getAllDayHtml(s):t.isMultiDayRange(i.range)?e.isStart?t.htmlEscape(this._getTimeText(l.range.start,e.end,!1)):e.isEnd?t.htmlEscape(this._getTimeText(e.start,l.range.end,!1)):t.getAllDayHtml(s):t.htmlEscape(this.getTimeText(i)),c&&p.push("fc-has-url"),''+(this.displayEventTime?''+(n||"")+"":"")+'"+t.htmlEscape(o.title||"")+""},n.prototype.computeEventTimeFormat=function(){return{hour:"numeric",minute:"2-digit",meridiem:"short"}},n}(t.FgEventRenderer),a=function(e){function n(n,r,a,o){var l=e.call(this,n,r,a,o)||this;l.computeDateVars=t.memoize(i),l.eventStoreToSegs=t.memoize(l._eventStoreToSegs);var d=l.eventRenderer=new s(l);l.renderContent=t.memoizeRendering(d.renderSegs.bind(d),d.unrender.bind(d)),l.el.classList.add("fc-list-view");for(var c=0,p=(l.theme.getClass("listView")||"").split(" ");c
'+t.htmlEscape(this.opt("noEventsMessage"))+"
"},n.prototype.renderSegList=function(e){var n,r,s,a=this.groupSegsByDay(e),i=t.htmlToElement('
'),o=i.querySelector("tbody");for(n=0;n'+(r?t.buildGotoAnchorHtml(this,e,{class:"fc-list-heading-main"},t.htmlEscape(n.format(e,r))):"")+(s?t.buildGotoAnchorHtml(this,e,{class:"fc-list-heading-alt"},t.htmlEscape(n.format(e,s))):"")+"")},n}(t.View);function i(e){for(var n=t.startOfDay(e.renderRange.start),r=e.renderRange.end,s=[],a=[];n